src/Pure/Proof/reconstruct.ML
changeset 12001 81be0a855397
parent 11660 780ffc4d4600
child 12236 67a617b231aa
equal deleted inserted replaced
12000:715fe3909682 12001:81be0a855397
    28   let val (a, T) = (case t of Var ((a, _), T) => (a, T) | Free p => p)
    28   let val (a, T) = (case t of Var ((a, _), T) => (a, T) | Free p => p)
    29   in all T $ Abs (a, T, abstract_over (t, prop)) end;
    29   in all T $ Abs (a, T, abstract_over (t, prop)) end;
    30 
    30 
    31 fun forall_intr_vfs prop = foldr forall_intr
    31 fun forall_intr_vfs prop = foldr forall_intr
    32   (vars_of prop @ sort (make_ord atless) (term_frees prop), prop);
    32   (vars_of prop @ sort (make_ord atless) (term_frees prop), prop);
       
    33 
       
    34 fun forall_intr_prf (t, prf) =
       
    35   let val (a, T) = (case t of Var ((a, _), T) => (a, T) | Free p => p)
       
    36   in Abst (a, Some T, prf_abstract_over t prf) end;
       
    37 
       
    38 fun forall_intr_vfs_prf prop prf = foldr forall_intr_prf
       
    39   (vars_of prop @ sort (make_ord atless) (term_frees prop), prf);
    33 
    40 
    34 fun merge_envs (Envir.Envir {asol=asol1, iTs=iTs1, maxidx=maxidx1})
    41 fun merge_envs (Envir.Envir {asol=asol1, iTs=iTs1, maxidx=maxidx1})
    35   (Envir.Envir {asol=asol2, iTs=iTs2, maxidx=maxidx2}) =
    42   (Envir.Envir {asol=asol2, iTs=iTs2, maxidx=maxidx2}) =
    36     Envir.Envir {asol=Vartab.merge (op aconv) (asol1, asol2),
    43     Envir.Envir {asol=Vartab.merge (op aconv) (asol1, asol2),
    37                  iTs=Vartab.merge (op =) (iTs1, iTs2),
    44                  iTs=Vartab.merge (op =) (iTs1, iTs2),
   106   | decompose sg env Ts t u = (env, [(mk_abs Ts t, mk_abs Ts u)]);
   113   | decompose sg env Ts t u = (env, [(mk_abs Ts t, mk_abs Ts u)]);
   107 
   114 
   108 fun cantunify sg t u = error ("Non-unifiable terms:\n" ^
   115 fun cantunify sg t u = error ("Non-unifiable terms:\n" ^
   109   Sign.string_of_term sg t ^ "\n\n" ^ Sign.string_of_term sg u);
   116   Sign.string_of_term sg t ^ "\n\n" ^ Sign.string_of_term sg u);
   110 
   117 
       
   118 (*finds type of term without checking that combinations are consistent
       
   119   rbinder holds types of bound variables*)
       
   120 fun fastype (Envir.Envir {iTs, ...}) =
       
   121   let
       
   122     fun devar (T as TVar (ixn, _)) = (case Vartab.lookup (iTs, ixn) of
       
   123           None => T | Some U => devar U)
       
   124       | devar T = T;
       
   125     fun fast Ts (f $ u) = (case devar (fast Ts f) of
       
   126            Type("fun",[_,T]) => T
       
   127          | _ => raise TERM ("fastype: expected function type", [f $ u]))
       
   128       | fast Ts (Const (_, T)) = T
       
   129       | fast Ts (Free (_, T)) = T
       
   130       | fast Ts (Bound i) =
       
   131         (nth_elem (i, Ts)
       
   132          handle LIST _=> raise TERM("fastype: Bound", [Bound i]))
       
   133       | fast Ts (Var (_, T)) = T 
       
   134       | fast Ts (Abs (_, T, u)) = T --> fast (T :: Ts) u
       
   135   in fast end;
       
   136 
   111 fun make_constraints_cprf sg env ts cprf =
   137 fun make_constraints_cprf sg env ts cprf =
   112   let
   138   let
   113     fun add_cnstrt Ts prop prf cs env ts (t, u) =
   139     fun add_cnstrt Ts prop prf cs env ts (t, u) =
   114       let
   140       let
   115         val t' = mk_abs Ts t;
   141         val t' = mk_abs Ts t;
   116         val u' = mk_abs Ts u;
   142         val u' = mk_abs Ts u;
   117         val nt = Envir.norm_term env t';
   143         val nt = Envir.beta_norm t';
   118         val nu = Envir.norm_term env u'
   144         val nu = Envir.beta_norm u'
       
   145 
   119       in
   146       in
   120         if Pattern.pattern nt andalso Pattern.pattern nu then
   147         ((prop, prf, cs, Pattern.unify (sg, env, [(nt, nu)]), ts)
   121           let
   148          handle Pattern.Pattern =>
   122             val env' = (Pattern.unify (sg, env, [(nt, nu)]) handle Pattern.Unif =>
   149            let
   123                        cantunify sg nt nu);
   150              val nt' = Envir.norm_term env nt;
   124           in (Envir.norm_term env' prop, prf, cs, env', ts) end
   151              val nu' = Envir.norm_term env nu
   125         else
   152            in
   126           let val (env', cs') = decompose sg env [] nt nu
   153              (prop, prf, cs, Pattern.unify (sg, env, [(nt', nu')]), ts)
   127           in (Envir.norm_term env' prop, prf, cs @ cs', env', ts) end
   154              handle Pattern.Pattern =>
       
   155                let val (env', cs') = decompose sg env [] nt' nu'
       
   156                in (prop, prf, cs @ cs', env', ts) end
       
   157            end) handle Pattern.Unif =>
       
   158         cantunify sg (Envir.norm_term env t') (Envir.norm_term env u')
   128       end;
   159       end;
   129 
   160 
   130     fun mk_cnstrts_atom env ts prop opTs mk_prf =
   161     fun mk_cnstrts_atom env ts prop opTs mk_prf =
   131           let
   162           let
   132             val tvars = term_tvars prop;
   163             val tvars = term_tvars prop;
   169       | mk_cnstrts env Ts Hs (t::ts) (cprf % Some _) =
   200       | mk_cnstrts env Ts Hs (t::ts) (cprf % Some _) =
   170           let val t' = strip_abs Ts t
   201           let val t' = strip_abs Ts t
   171           in (case mk_cnstrts env Ts Hs ts cprf of
   202           in (case mk_cnstrts env Ts Hs ts cprf of
   172              (Const ("all", Type ("fun", [Type ("fun", [T, _]), _])) $ f,
   203              (Const ("all", Type ("fun", [Type ("fun", [T, _]), _])) $ f,
   173                  prf, cnstrts, env', ts') =>
   204                  prf, cnstrts, env', ts') =>
   174                let val env'' = unifyT sg env' T
   205                let val env'' = unifyT sg env' T (fastype env' Ts t')
   175                  (fastype_of1 (map (Envir.norm_type env') Ts, t'))
       
   176                in (betapply (f, t'), prf % Some t', cnstrts, env'', ts')
   206                in (betapply (f, t'), prf % Some t', cnstrts, env'', ts')
   177                end
   207                end
   178            | (u, prf, cnstrts, env', ts') =>
   208            | (u, prf, cnstrts, env', ts') =>
   179                let
   209                let
   180                  val T = fastype_of1 (map (Envir.norm_type env') Ts, t');
   210                  val T = fastype env' Ts t';
   181                  val (env'', v) = mk_var env' Ts (T --> propT);
   211                  val (env'', v) = mk_var env' Ts (T --> propT);
   182                in
   212                in
   183                  add_cnstrt Ts (v $ t') (prf % Some t') cnstrts env'' ts'
   213                  add_cnstrt Ts (v $ t') (prf % Some t') cnstrts env'' ts'
   184                    (u, Const ("all", (T --> propT) --> propT) $ v)
   214                    (u, Const ("all", (T --> propT) --> propT) $ v)
   185                end)
   215                end)
   305 
   335 
   306 (********************************************************************************
   336 (********************************************************************************
   307   expand and reconstruct subproofs
   337   expand and reconstruct subproofs
   308 *********************************************************************************)
   338 *********************************************************************************)
   309 
   339 
   310 fun full_forall_intr_proof prf x a T = Abst (a, Some T, prf_abstract_over x prf);
       
   311 
       
   312 fun expand_proof sg names prf =
   340 fun expand_proof sg names prf =
   313   let
   341   let
   314     fun expand prfs (AbsP (s, t, prf)) = 
   342     fun expand prfs (AbsP (s, t, prf)) = 
   315           let val (prfs', prf') = expand prfs prf
   343           let val (prfs', prf') = expand prfs prf
   316           in (prfs', AbsP (s, t, prf')) end
   344           in (prfs', AbsP (s, t, prf')) end
   331             val (prf, prfs') = (case assoc (prfs, (a, prop)) of
   359             val (prf, prfs') = (case assoc (prfs, (a, prop)) of
   332                 None =>
   360                 None =>
   333                   let
   361                   let
   334                     val _ = message ("Reconstructing proof of " ^ a);
   362                     val _ = message ("Reconstructing proof of " ^ a);
   335                     val _ = message (Sign.string_of_term sg prop);
   363                     val _ = message (Sign.string_of_term sg prop);
   336                     val prf = reconstruct_proof sg prop cprf
   364                     val (prfs', prf) = expand prfs (forall_intr_vfs_prf prop
   337                   in (prf, ((a, prop), prf)::prfs) end
   365                       (reconstruct_proof sg prop cprf))
       
   366                   in (prf, ((a, prop), prf) :: prfs') end
   338               | Some prf => (prf, prfs));
   367               | Some prf => (prf, prfs));
   339             val tvars = term_tvars prop;
   368             val tye = map fst (term_tvars prop) ~~ Ts
   340             val vars = vars_of prop;
       
   341             val tye = map fst tvars ~~ Ts;
       
   342             fun abst (t as Var ((s, _), T), prf) = full_forall_intr_proof prf t s T;
       
   343             val prf' = map_proof_terms (subst_TVars tye) (typ_subst_TVars tye) prf
       
   344           in
   369           in
   345             expand prfs' (foldr abst (map (subst_TVars tye) vars, prf'))
   370             (prfs', map_proof_terms (subst_TVars tye) (typ_subst_TVars tye) prf)
   346           end
   371           end
   347       | expand prfs prf = (prfs, prf);
   372       | expand prfs prf = (prfs, prf);
   348 
   373 
   349   in snd (expand [] prf) end;
   374   in snd (expand [] prf) end;
   350 
   375