src/Pure/Proof/reconstruct.ML
changeset 15531 08c8dad8e399
parent 14981 e73f8140af78
child 15570 8d8c70b41bab
equal deleted inserted replaced
15530:6f43714517ee 15531:08c8dad8e399
    33 fun forall_intr_vfs prop = foldr forall_intr
    33 fun forall_intr_vfs prop = foldr forall_intr
    34   (vars_of prop @ sort (make_ord atless) (term_frees prop), prop);
    34   (vars_of prop @ sort (make_ord atless) (term_frees prop), prop);
    35 
    35 
    36 fun forall_intr_prf (t, prf) =
    36 fun forall_intr_prf (t, prf) =
    37   let val (a, T) = (case t of Var ((a, _), T) => (a, T) | Free p => p)
    37   let val (a, T) = (case t of Var ((a, _), T) => (a, T) | Free p => p)
    38   in Abst (a, Some T, prf_abstract_over t prf) end;
    38   in Abst (a, SOME T, prf_abstract_over t prf) end;
    39 
    39 
    40 fun forall_intr_vfs_prf prop prf = foldr forall_intr_prf
    40 fun forall_intr_vfs_prf prop prf = foldr forall_intr_prf
    41   (vars_of prop @ sort (make_ord atless) (term_frees prop), prf);
    41   (vars_of prop @ sort (make_ord atless) (term_frees prop), prf);
    42 
    42 
    43 fun merge_envs (Envir.Envir {asol=asol1, iTs=iTs1, maxidx=maxidx1})
    43 fun merge_envs (Envir.Envir {asol=asol1, iTs=iTs1, maxidx=maxidx1})
    66   in Envir.Envir {asol=asol, iTs=iTs', maxidx=maxidx'} end
    66   in Envir.Envir {asol=asol, iTs=iTs', maxidx=maxidx'} end
    67   handle Type.TUNIFY => error ("Non-unifiable types:\n" ^
    67   handle Type.TUNIFY => error ("Non-unifiable types:\n" ^
    68     Sign.string_of_typ sg T ^ "\n\n" ^ Sign.string_of_typ sg U);
    68     Sign.string_of_typ sg T ^ "\n\n" ^ Sign.string_of_typ sg U);
    69 
    69 
    70 fun chaseT (env as Envir.Envir {iTs, ...}) (T as TVar (ixn, _)) =
    70 fun chaseT (env as Envir.Envir {iTs, ...}) (T as TVar (ixn, _)) =
    71       (case Vartab.lookup (iTs, ixn) of None => T | Some T' => chaseT env T')
    71       (case Vartab.lookup (iTs, ixn) of NONE => T | SOME T' => chaseT env T')
    72   | chaseT _ T = T;
    72   | chaseT _ T = T;
    73 
    73 
    74 fun infer_type sg (env as Envir.Envir {maxidx, asol, iTs}) Ts vTs
    74 fun infer_type sg (env as Envir.Envir {maxidx, asol, iTs}) Ts vTs
    75       (t as Const (s, T)) = if T = dummyT then (case Sign.const_type sg s of
    75       (t as Const (s, T)) = if T = dummyT then (case Sign.const_type sg s of
    76           None => error ("reconstruct_proof: No such constant: " ^ quote s)
    76           NONE => error ("reconstruct_proof: No such constant: " ^ quote s)
    77         | Some T => 
    77         | SOME T => 
    78             let val T' = incr_tvar (maxidx + 1) T
    78             let val T' = incr_tvar (maxidx + 1) T
    79             in (Const (s, T'), T', vTs,
    79             in (Const (s, T'), T', vTs,
    80               Envir.Envir {maxidx = maxidx + 1, asol = asol, iTs = iTs})
    80               Envir.Envir {maxidx = maxidx + 1, asol = asol, iTs = iTs})
    81             end)
    81             end)
    82       else (t, T, vTs, env)
    82       else (t, T, vTs, env)
    83   | infer_type sg env Ts vTs (t as Free (s, T)) =
    83   | infer_type sg env Ts vTs (t as Free (s, T)) =
    84       if T = dummyT then (case Symtab.lookup (vTs, s) of
    84       if T = dummyT then (case Symtab.lookup (vTs, s) of
    85           None =>
    85           NONE =>
    86             let val (env', T) = mk_tvar (env, [])
    86             let val (env', T) = mk_tvar (env, [])
    87             in (Free (s, T), T, Symtab.update_new ((s, T), vTs), env') end
    87             in (Free (s, T), T, Symtab.update_new ((s, T), vTs), env') end
    88         | Some T => (Free (s, T), T, vTs, env))
    88         | SOME T => (Free (s, T), T, vTs, env))
    89       else (t, T, vTs, env)
    89       else (t, T, vTs, env)
    90   | infer_type sg env Ts vTs (Var _) = error "reconstruct_proof: internal error"
    90   | infer_type sg env Ts vTs (Var _) = error "reconstruct_proof: internal error"
    91   | infer_type sg env Ts vTs (Abs (s, T, t)) =
    91   | infer_type sg env Ts vTs (Abs (s, T, t)) =
    92       let
    92       let
    93         val (env', T') = if T = dummyT then mk_tvar (env, []) else (env, T);
    93         val (env', T') = if T = dummyT then mk_tvar (env, []) else (env, T);
   144           let
   144           let
   145             val tvars = term_tvars prop;
   145             val tvars = term_tvars prop;
   146             val tfrees = term_tfrees prop;
   146             val tfrees = term_tfrees prop;
   147             val (prop', fmap) = Type.varify (prop, []);
   147             val (prop', fmap) = Type.varify (prop, []);
   148             val (env', Ts) = (case opTs of
   148             val (env', Ts) = (case opTs of
   149                 None => foldl_map mk_tvar (env, map snd tvars @ map snd tfrees)
   149                 NONE => foldl_map mk_tvar (env, map snd tvars @ map snd tfrees)
   150               | Some Ts => (env, Ts));
   150               | SOME Ts => (env, Ts));
   151             val prop'' = subst_TVars (map fst tvars @ map snd fmap ~~ Ts)
   151             val prop'' = subst_TVars (map fst tvars @ map snd fmap ~~ Ts)
   152               (forall_intr_vfs prop') handle LIST _ =>
   152               (forall_intr_vfs prop') handle LIST _ =>
   153                 error ("Wrong number of type arguments for " ^
   153                 error ("Wrong number of type arguments for " ^
   154                   quote (fst (get_name_tags [] prop prf)))
   154                   quote (fst (get_name_tags [] prop prf)))
   155           in (prop'', change_type (Some Ts) prf, [], env', vTs) end;
   155           in (prop'', change_type (SOME Ts) prf, [], env', vTs) end;
   156 
   156 
   157     fun head_norm (prop, prf, cnstrts, env, vTs) =
   157     fun head_norm (prop, prf, cnstrts, env, vTs) =
   158       (Envir.head_norm env prop, prf, cnstrts, env, vTs);
   158       (Envir.head_norm env prop, prf, cnstrts, env, vTs);
   159  
   159  
   160     fun mk_cnstrts env _ Hs vTs (PBound i) = (nth_elem (i, Hs), PBound i, [], env, vTs)
   160     fun mk_cnstrts env _ Hs vTs (PBound i) = (nth_elem (i, Hs), PBound i, [], env, vTs)
   161       | mk_cnstrts env Ts Hs vTs (Abst (s, opT, cprf)) =
   161       | mk_cnstrts env Ts Hs vTs (Abst (s, opT, cprf)) =
   162           let
   162           let
   163             val (env', T) = (case opT of
   163             val (env', T) = (case opT of
   164               None => mk_tvar (env, []) | Some T => (env, T));
   164               NONE => mk_tvar (env, []) | SOME T => (env, T));
   165             val (t, prf, cnstrts, env'', vTs') =
   165             val (t, prf, cnstrts, env'', vTs') =
   166               mk_cnstrts env' (T::Ts) (map (incr_boundvars 1) Hs) vTs cprf;
   166               mk_cnstrts env' (T::Ts) (map (incr_boundvars 1) Hs) vTs cprf;
   167           in (Const ("all", (T --> propT) --> propT) $ Abs (s, T, t), Abst (s, Some T, prf),
   167           in (Const ("all", (T --> propT) --> propT) $ Abs (s, T, t), Abst (s, SOME T, prf),
   168             cnstrts, env'', vTs')
   168             cnstrts, env'', vTs')
   169           end
   169           end
   170       | mk_cnstrts env Ts Hs vTs (AbsP (s, Some t, cprf)) =
   170       | mk_cnstrts env Ts Hs vTs (AbsP (s, SOME t, cprf)) =
   171           let
   171           let
   172             val (t', _, vTs', env') = infer_type sg env Ts vTs t;
   172             val (t', _, vTs', env') = infer_type sg env Ts vTs t;
   173             val (u, prf, cnstrts, env'', vTs'') = mk_cnstrts env' Ts (t'::Hs) vTs' cprf;
   173             val (u, prf, cnstrts, env'', vTs'') = mk_cnstrts env' Ts (t'::Hs) vTs' cprf;
   174           in (Logic.mk_implies (t', u), AbsP (s, Some t', prf), cnstrts, env'', vTs'')
   174           in (Logic.mk_implies (t', u), AbsP (s, SOME t', prf), cnstrts, env'', vTs'')
   175           end
   175           end
   176       | mk_cnstrts env Ts Hs vTs (AbsP (s, None, cprf)) =
   176       | mk_cnstrts env Ts Hs vTs (AbsP (s, NONE, cprf)) =
   177           let
   177           let
   178             val (env', t) = mk_var env Ts propT;
   178             val (env', t) = mk_var env Ts propT;
   179             val (u, prf, cnstrts, env'', vTs') = mk_cnstrts env' Ts (t::Hs) vTs cprf;
   179             val (u, prf, cnstrts, env'', vTs') = mk_cnstrts env' Ts (t::Hs) vTs cprf;
   180           in (Logic.mk_implies (t, u), AbsP (s, Some t, prf), cnstrts, env'', vTs')
   180           in (Logic.mk_implies (t, u), AbsP (s, SOME t, prf), cnstrts, env'', vTs')
   181           end
   181           end
   182       | mk_cnstrts env Ts Hs vTs (cprf1 %% cprf2) =
   182       | mk_cnstrts env Ts Hs vTs (cprf1 %% cprf2) =
   183           let val (u, prf2, cnstrts, env', vTs') = mk_cnstrts env Ts Hs vTs cprf2
   183           let val (u, prf2, cnstrts, env', vTs') = mk_cnstrts env Ts Hs vTs cprf2
   184           in (case head_norm (mk_cnstrts env' Ts Hs vTs' cprf1) of
   184           in (case head_norm (mk_cnstrts env' Ts Hs vTs' cprf1) of
   185               (Const ("==>", _) $ u' $ t', prf1, cnstrts', env'', vTs'') =>
   185               (Const ("==>", _) $ u' $ t', prf1, cnstrts', env'', vTs'') =>
   189                 let val (env''', v) = mk_var env'' Ts propT
   189                 let val (env''', v) = mk_var env'' Ts propT
   190                 in add_cnstrt Ts v (prf1 %% prf2) (cnstrts' @ cnstrts)
   190                 in add_cnstrt Ts v (prf1 %% prf2) (cnstrts' @ cnstrts)
   191                   env''' vTs'' (t, Logic.mk_implies (u, v))
   191                   env''' vTs'' (t, Logic.mk_implies (u, v))
   192                 end)
   192                 end)
   193           end
   193           end
   194       | mk_cnstrts env Ts Hs vTs (cprf % Some t) =
   194       | mk_cnstrts env Ts Hs vTs (cprf % SOME t) =
   195           let val (t', U, vTs1, env1) = infer_type sg env Ts vTs t
   195           let val (t', U, vTs1, env1) = infer_type sg env Ts vTs t
   196           in (case head_norm (mk_cnstrts env1 Ts Hs vTs1 cprf) of
   196           in (case head_norm (mk_cnstrts env1 Ts Hs vTs1 cprf) of
   197              (Const ("all", Type ("fun", [Type ("fun", [T, _]), _])) $ f,
   197              (Const ("all", Type ("fun", [Type ("fun", [T, _]), _])) $ f,
   198                  prf, cnstrts, env2, vTs2) =>
   198                  prf, cnstrts, env2, vTs2) =>
   199                let val env3 = unifyT sg env2 T U
   199                let val env3 = unifyT sg env2 T U
   200                in (betapply (f, t'), prf % Some t', cnstrts, env3, vTs2)
   200                in (betapply (f, t'), prf % SOME t', cnstrts, env3, vTs2)
   201                end
   201                end
   202            | (u, prf, cnstrts, env2, vTs2) =>
   202            | (u, prf, cnstrts, env2, vTs2) =>
   203                let val (env3, v) = mk_var env2 Ts (U --> propT);
   203                let val (env3, v) = mk_var env2 Ts (U --> propT);
   204                in
   204                in
   205                  add_cnstrt Ts (v $ t') (prf % Some t') cnstrts env3 vTs2
   205                  add_cnstrt Ts (v $ t') (prf % SOME t') cnstrts env3 vTs2
   206                    (u, Const ("all", (U --> propT) --> propT) $ v)
   206                    (u, Const ("all", (U --> propT) --> propT) $ v)
   207                end)
   207                end)
   208           end
   208           end
   209       | mk_cnstrts env Ts Hs vTs (cprf % None) =
   209       | mk_cnstrts env Ts Hs vTs (cprf % NONE) =
   210           (case head_norm (mk_cnstrts env Ts Hs vTs cprf) of
   210           (case head_norm (mk_cnstrts env Ts Hs vTs cprf) of
   211              (Const ("all", Type ("fun", [Type ("fun", [T, _]), _])) $ f,
   211              (Const ("all", Type ("fun", [Type ("fun", [T, _]), _])) $ f,
   212                  prf, cnstrts, env', vTs') =>
   212                  prf, cnstrts, env', vTs') =>
   213                let val (env'', t) = mk_var env' Ts T
   213                let val (env'', t) = mk_var env' Ts T
   214                in (betapply (f, t), prf % Some t, cnstrts, env'', vTs')
   214                in (betapply (f, t), prf % SOME t, cnstrts, env'', vTs')
   215                end
   215                end
   216            | (u, prf, cnstrts, env', vTs') =>
   216            | (u, prf, cnstrts, env', vTs') =>
   217                let
   217                let
   218                  val (env1, T) = mk_tvar (env', []);
   218                  val (env1, T) = mk_tvar (env', []);
   219                  val (env2, v) = mk_var env1 Ts (T --> propT);
   219                  val (env2, v) = mk_var env1 Ts (T --> propT);
   220                  val (env3, t) = mk_var env2 Ts T
   220                  val (env3, t) = mk_var env2 Ts T
   221                in
   221                in
   222                  add_cnstrt Ts (v $ t) (prf % Some t) cnstrts env3 vTs'
   222                  add_cnstrt Ts (v $ t) (prf % SOME t) cnstrts env3 vTs'
   223                    (u, Const ("all", (T --> propT) --> propT) $ v)
   223                    (u, Const ("all", (T --> propT) --> propT) $ v)
   224                end)
   224                end)
   225       | mk_cnstrts env _ _ vTs (prf as PThm (_, _, prop, opTs)) =
   225       | mk_cnstrts env _ _ vTs (prf as PThm (_, _, prop, opTs)) =
   226           mk_cnstrts_atom env vTs prop opTs prf
   226           mk_cnstrts_atom env vTs prop opTs prf
   227       | mk_cnstrts env _ _ vTs (prf as PAxm (_, prop, opTs)) =
   227       | mk_cnstrts env _ _ vTs (prf as PAxm (_, prop, opTs)) =
   292 
   292 
   293 (**** reconstruction of proofs ****)
   293 (**** reconstruction of proofs ****)
   294 
   294 
   295 fun reconstruct_proof sg prop cprf =
   295 fun reconstruct_proof sg prop cprf =
   296   let
   296   let
   297     val (cprf' % Some prop', thawf) = freeze_thaw_prf (cprf % Some prop);
   297     val (cprf' % SOME prop', thawf) = freeze_thaw_prf (cprf % SOME prop);
   298     val _ = message "Collecting constraints...";
   298     val _ = message "Collecting constraints...";
   299     val (t, prf, cs, env, _) = make_constraints_cprf sg
   299     val (t, prf, cs, env, _) = make_constraints_cprf sg
   300       (Envir.empty (maxidx_of_proof cprf)) cprf';
   300       (Envir.empty (maxidx_of_proof cprf)) cprf';
   301     val cs' = map (fn p => (true, p, op union
   301     val cs' = map (fn p => (true, p, op union
   302       (pairself (map (fst o dest_Var) o term_vars) p))) (map (pairself (Envir.norm_term env)) ((t, prop')::cs));
   302       (pairself (map (fst o dest_Var) o term_vars) p))) (map (pairself (Envir.norm_term env)) ((t, prop')::cs));
   313   end;
   313   end;
   314 
   314 
   315 val head_norm = Envir.head_norm (Envir.empty 0);
   315 val head_norm = Envir.head_norm (Envir.empty 0);
   316 
   316 
   317 fun prop_of0 Hs (PBound i) = nth_elem (i, Hs)
   317 fun prop_of0 Hs (PBound i) = nth_elem (i, Hs)
   318   | prop_of0 Hs (Abst (s, Some T, prf)) =
   318   | prop_of0 Hs (Abst (s, SOME T, prf)) =
   319       all T $ (Abs (s, T, prop_of0 Hs prf))
   319       all T $ (Abs (s, T, prop_of0 Hs prf))
   320   | prop_of0 Hs (AbsP (s, Some t, prf)) =
   320   | prop_of0 Hs (AbsP (s, SOME t, prf)) =
   321       Logic.mk_implies (t, prop_of0 (t :: Hs) prf)
   321       Logic.mk_implies (t, prop_of0 (t :: Hs) prf)
   322   | prop_of0 Hs (prf % Some t) = (case head_norm (prop_of0 Hs prf) of
   322   | prop_of0 Hs (prf % SOME t) = (case head_norm (prop_of0 Hs prf) of
   323       Const ("all", _) $ f => f $ t
   323       Const ("all", _) $ f => f $ t
   324     | _ => error "prop_of: all expected")
   324     | _ => error "prop_of: all expected")
   325   | prop_of0 Hs (prf1 %% prf2) = (case head_norm (prop_of0 Hs prf1) of
   325   | prop_of0 Hs (prf1 %% prf2) = (case head_norm (prop_of0 Hs prf1) of
   326       Const ("==>", _) $ P $ Q => Q
   326       Const ("==>", _) $ P $ Q => Q
   327     | _ => error "prop_of: ==> expected")
   327     | _ => error "prop_of: ==> expected")
   328   | prop_of0 Hs (Hyp t) = t
   328   | prop_of0 Hs (Hyp t) = t
   329   | prop_of0 Hs (PThm (_, _, prop, Some Ts)) = prop_of_atom prop Ts
   329   | prop_of0 Hs (PThm (_, _, prop, SOME Ts)) = prop_of_atom prop Ts
   330   | prop_of0 Hs (PAxm (_, prop, Some Ts)) = prop_of_atom prop Ts
   330   | prop_of0 Hs (PAxm (_, prop, SOME Ts)) = prop_of_atom prop Ts
   331   | prop_of0 Hs (Oracle (_, prop, Some Ts)) = prop_of_atom prop Ts
   331   | prop_of0 Hs (Oracle (_, prop, SOME Ts)) = prop_of_atom prop Ts
   332   | prop_of0 _ _ = error "prop_of: partial proof object";
   332   | prop_of0 _ _ = error "prop_of: partial proof object";
   333 
   333 
   334 val prop_of' = Pattern.eta_contract oo (Envir.beta_norm oo prop_of0);
   334 val prop_of' = Pattern.eta_contract oo (Envir.beta_norm oo prop_of0);
   335 val prop_of = prop_of' [];
   335 val prop_of = prop_of' [];
   336 
   336 
   351             val (maxidx'', prfs'', prf2') = expand maxidx' prfs' prf2;
   351             val (maxidx'', prfs'', prf2') = expand maxidx' prfs' prf2;
   352           in (maxidx'', prfs'', prf1' %% prf2') end
   352           in (maxidx'', prfs'', prf1' %% prf2') end
   353       | expand maxidx prfs (prf % t) =
   353       | expand maxidx prfs (prf % t) =
   354           let val (maxidx', prfs', prf') = expand maxidx prfs prf
   354           let val (maxidx', prfs', prf') = expand maxidx prfs prf
   355           in (maxidx', prfs', prf' % t) end
   355           in (maxidx', prfs', prf' % t) end
   356       | expand maxidx prfs (prf as PThm ((a, _), cprf, prop, Some Ts)) =
   356       | expand maxidx prfs (prf as PThm ((a, _), cprf, prop, SOME Ts)) =
   357           if not (exists
   357           if not (exists
   358             (fn (b, None) => a = b
   358             (fn (b, NONE) => a = b
   359               | (b, Some prop') => a = b andalso prop = prop') thms)
   359               | (b, SOME prop') => a = b andalso prop = prop') thms)
   360           then (maxidx, prfs, prf) else
   360           then (maxidx, prfs, prf) else
   361           let
   361           let
   362             fun inc i =
   362             fun inc i =
   363               map_proof_terms (Logic.incr_indexes ([], i)) (incr_tvar i);
   363               map_proof_terms (Logic.incr_indexes ([], i)) (incr_tvar i);
   364             val (maxidx', prf, prfs') = (case assoc (prfs, (a, prop)) of
   364             val (maxidx', prf, prfs') = (case assoc (prfs, (a, prop)) of
   365                 None =>
   365                 NONE =>
   366                   let
   366                   let
   367                     val _ = message ("Reconstructing proof of " ^ a);
   367                     val _ = message ("Reconstructing proof of " ^ a);
   368                     val _ = message (Sign.string_of_term sg prop);
   368                     val _ = message (Sign.string_of_term sg prop);
   369                     val prf' = forall_intr_vfs_prf prop
   369                     val prf' = forall_intr_vfs_prf prop
   370                       (reconstruct_proof sg prop cprf);
   370                       (reconstruct_proof sg prop cprf);
   371                     val (maxidx', prfs', prf) = expand
   371                     val (maxidx', prfs', prf) = expand
   372                       (maxidx_of_proof prf') prfs prf'
   372                       (maxidx_of_proof prf') prfs prf'
   373                   in (maxidx' + maxidx + 1, inc (maxidx + 1) prf,
   373                   in (maxidx' + maxidx + 1, inc (maxidx + 1) prf,
   374                     ((a, prop), (maxidx', prf)) :: prfs')
   374                     ((a, prop), (maxidx', prf)) :: prfs')
   375                   end
   375                   end
   376               | Some (maxidx', prf) => (maxidx' + maxidx + 1,
   376               | SOME (maxidx', prf) => (maxidx' + maxidx + 1,
   377                   inc (maxidx + 1) prf, prfs));
   377                   inc (maxidx + 1) prf, prfs));
   378             val tfrees = term_tfrees prop;
   378             val tfrees = term_tfrees prop;
   379             val tye = map (fn ((s, j), _) => (s, maxidx + 1 + j))
   379             val tye = map (fn ((s, j), _) => (s, maxidx + 1 + j))
   380               (term_tvars prop) @ map (rpair ~1 o fst) tfrees ~~ Ts;
   380               (term_tvars prop) @ map (rpair ~1 o fst) tfrees ~~ Ts;
   381             val varify = map_type_tfree (fn p as (a, S) =>
   381             val varify = map_type_tfree (fn p as (a, S) =>