src/Pure/Proof/reconstruct.ML
changeset 13669 a9f229eafba7
parent 13610 d4a2ac255447
child 13715 61bfaa892a41
equal deleted inserted replaced
13668:11397ea8b438 13669:a9f229eafba7
    45   (Envir.Envir {asol=asol2, iTs=iTs2, maxidx=maxidx2}) =
    45   (Envir.Envir {asol=asol2, iTs=iTs2, maxidx=maxidx2}) =
    46     Envir.Envir {asol=Vartab.merge (op aconv) (asol1, asol2),
    46     Envir.Envir {asol=Vartab.merge (op aconv) (asol1, asol2),
    47                  iTs=Vartab.merge (op =) (iTs1, iTs2),
    47                  iTs=Vartab.merge (op =) (iTs1, iTs2),
    48                  maxidx=Int.max (maxidx1, maxidx2)};
    48                  maxidx=Int.max (maxidx1, maxidx2)};
    49 
    49 
    50 fun strip_abs (_::Ts) (Abs (_, _, t)) = strip_abs Ts t
    50 
    51   | strip_abs _ t = t;
    51 (**** generate constraints for proof term ****)
    52 
       
    53 
       
    54 (********************************************************************************
       
    55   generate constraints for proof term
       
    56 *********************************************************************************)
       
    57 
    52 
    58 fun mk_var env Ts T = 
    53 fun mk_var env Ts T = 
    59   let val (env', v) = Envir.genvar "a" (env, rev Ts ---> T)
    54   let val (env', v) = Envir.genvar "a" (env, rev Ts ---> T)
    60   in (env', list_comb (v, map Bound (length Ts - 1 downto 0))) end;
    55   in (env', list_comb (v, map Bound (length Ts - 1 downto 0))) end;
    61 
    56 
    62 fun mk_tvar (Envir.Envir {iTs, asol, maxidx}, s) =
    57 fun mk_tvar (Envir.Envir {iTs, asol, maxidx}, s) =
    63   (Envir.Envir {iTs = iTs, asol = asol, maxidx = maxidx+1},
    58   (Envir.Envir {iTs = iTs, asol = asol, maxidx = maxidx+1},
    64    TVar (("'t", maxidx+1), s));
    59    TVar (("'t", maxidx+1), s));
    65 
    60 
    66 fun mk_abs Ts t = foldl (fn (u, T) => Abs ("", T, u)) (t, Ts);
    61 fun mk_abs Ts t = foldl (fn (u, T) => Abs ("", T, u)) (t, Ts);
    67 
       
    68 fun make_Tconstraints_cprf maxidx cprf =
       
    69   let
       
    70     fun mk_Tcnstrts maxidx Ts (Abst (s, Some T, cprf)) =
       
    71           let val (cs, cprf', maxidx') = mk_Tcnstrts maxidx (T::Ts) cprf;
       
    72           in (cs, Abst (s, Some T, cprf'), maxidx') end
       
    73       | mk_Tcnstrts maxidx Ts (Abst (s, None, cprf)) =
       
    74           let
       
    75             val T' = TVar (("'t", maxidx+1), ["logic"]);
       
    76             val (cs, cprf', maxidx') = mk_Tcnstrts (maxidx+1) (T'::Ts) cprf;
       
    77           in (cs, Abst (s, Some T', cprf'), maxidx') end
       
    78       | mk_Tcnstrts maxidx Ts (AbsP (s, Some t, cprf)) =
       
    79           let val (cs, cprf', maxidx') = mk_Tcnstrts maxidx Ts cprf;
       
    80           in ((mk_abs Ts t, rev Ts ---> propT)::cs, AbsP (s, Some t, cprf'), maxidx') end
       
    81       | mk_Tcnstrts maxidx Ts (AbsP (s, None, cprf)) =
       
    82           let val (cs, cprf', maxidx') = mk_Tcnstrts maxidx Ts cprf;
       
    83           in (cs, AbsP (s, None, cprf'), maxidx') end
       
    84       | mk_Tcnstrts maxidx Ts (cprf1 %% cprf2) =
       
    85           let
       
    86             val (cs, cprf1', maxidx') = mk_Tcnstrts maxidx Ts cprf1;
       
    87             val (cs', cprf2', maxidx'') = mk_Tcnstrts maxidx' Ts cprf2;
       
    88           in (cs' @ cs, cprf1' %% cprf2', maxidx'') end
       
    89       | mk_Tcnstrts maxidx Ts (cprf % Some t) =
       
    90           let val (cs, cprf', maxidx') = mk_Tcnstrts maxidx Ts cprf;
       
    91           in ((mk_abs Ts t, rev Ts ---> TypeInfer.logicT)::cs,
       
    92             cprf' % Some t, maxidx')
       
    93           end
       
    94       | mk_Tcnstrts maxidx Ts (cprf % None) =
       
    95           let val (cs, cprf', maxidx') = mk_Tcnstrts maxidx Ts cprf;
       
    96           in (cs, cprf % None, maxidx') end
       
    97       | mk_Tcnstrts maxidx _ cprf = ([], cprf, maxidx);
       
    98   in mk_Tcnstrts maxidx [] cprf end;
       
    99 
    62 
   100 fun unifyT sg env T U =
    63 fun unifyT sg env T U =
   101   let
    64   let
   102     val Envir.Envir {asol, iTs, maxidx} = env;
    65     val Envir.Envir {asol, iTs, maxidx} = env;
   103     val (iTs', maxidx') = Type.unify (Sign.tsig_of sg) (iTs, maxidx) (T, U)
    66     val (iTs', maxidx') = Type.unify (Sign.tsig_of sg) (iTs, maxidx) (T, U)
   104   in Envir.Envir {asol=asol, iTs=iTs', maxidx=maxidx'} end
    67   in Envir.Envir {asol=asol, iTs=iTs', maxidx=maxidx'} end
   105   handle Type.TUNIFY => error ("Non-unifiable types:\n" ^
    68   handle Type.TUNIFY => error ("Non-unifiable types:\n" ^
   106     Sign.string_of_typ sg T ^ "\n\n" ^ Sign.string_of_typ sg U);
    69     Sign.string_of_typ sg T ^ "\n\n" ^ Sign.string_of_typ sg U);
       
    70 
       
    71 fun chaseT (env as Envir.Envir {iTs, ...}) (T as TVar (ixn, _)) =
       
    72       (case Vartab.lookup (iTs, ixn) of None => T | Some T' => chaseT env T')
       
    73   | chaseT _ T = T;
       
    74 
       
    75 fun infer_type sg (env as Envir.Envir {maxidx, asol, iTs}) Ts vTs
       
    76       (t as Const (s, T)) = if T = dummyT then (case Sign.const_type sg s of
       
    77           None => error ("reconstruct_proof: No such constant: " ^ quote s)
       
    78         | Some T => 
       
    79             let val T' = incr_tvar (maxidx + 1) T
       
    80             in (Const (s, T'), T', vTs,
       
    81               Envir.Envir {maxidx = maxidx + 1, asol = asol, iTs = iTs})
       
    82             end)
       
    83       else (t, T, vTs, env)
       
    84   | infer_type sg env Ts vTs (t as Free (s, T)) =
       
    85       if T = dummyT then (case Symtab.lookup (vTs, s) of
       
    86           None =>
       
    87             let val (env', T) = mk_tvar (env, [])
       
    88             in (Free (s, T), T, Symtab.update_new ((s, T), vTs), env') end
       
    89         | Some T => (Free (s, T), T, vTs, env))
       
    90       else (t, T, vTs, env)
       
    91   | infer_type sg env Ts vTs (Var _) = error "reconstruct_proof: internal error"
       
    92   | infer_type sg env Ts vTs (Abs (s, T, t)) =
       
    93       let
       
    94         val (env', T') = if T = dummyT then mk_tvar (env, []) else (env, T);
       
    95         val (t', U, vTs', env'') = infer_type sg env' (T' :: Ts) vTs t
       
    96       in (Abs (s, T', t'), T' --> U, vTs', env'') end
       
    97   | infer_type sg env Ts vTs (t $ u) =
       
    98       let
       
    99         val (t', T, vTs1, env1) = infer_type sg env Ts vTs t;
       
   100         val (u', U, vTs2, env2) = infer_type sg env1 Ts vTs1 u;
       
   101       in (case chaseT env2 T of
       
   102           Type ("fun", [U', V]) => (t' $ u', V, vTs2, unifyT sg env2 U U')
       
   103         | _ =>
       
   104           let val (env3, V) = mk_tvar (env2, [])
       
   105           in (t' $ u', V, vTs2, unifyT sg env3 T (U --> V)) end)
       
   106       end
       
   107   | infer_type sg env Ts vTs (t as Bound i) = (t, nth_elem (i, Ts), vTs, env);
   107 
   108 
   108 fun decompose sg env Ts t u = case (Envir.head_norm env t, Envir.head_norm env u) of
   109 fun decompose sg env Ts t u = case (Envir.head_norm env t, Envir.head_norm env u) of
   109     (Const ("all", _) $ t, Const ("all", _) $ u) => decompose sg env Ts t u
   110     (Const ("all", _) $ t, Const ("all", _) $ u) => decompose sg env Ts t u
   110   | (Const ("==>", _) $ t1 $ t2, Const ("==>", _) $ u1 $ u2) =>
   111   | (Const ("==>", _) $ t1 $ t2, Const ("==>", _) $ u1 $ u2) =>
   111       let val (env', cs) = decompose sg env Ts t1 u1
   112       let val (env', cs) = decompose sg env Ts t1 u1
   115   | (t, u) => (env, [(mk_abs Ts t, mk_abs Ts u)]);
   116   | (t, u) => (env, [(mk_abs Ts t, mk_abs Ts u)]);
   116 
   117 
   117 fun cantunify sg t u = error ("Non-unifiable terms:\n" ^
   118 fun cantunify sg t u = error ("Non-unifiable terms:\n" ^
   118   Sign.string_of_term sg t ^ "\n\n" ^ Sign.string_of_term sg u);
   119   Sign.string_of_term sg t ^ "\n\n" ^ Sign.string_of_term sg u);
   119 
   120 
   120 fun make_constraints_cprf sg env ts cprf =
   121 fun make_constraints_cprf sg env cprf =
   121   let
   122   let
   122     fun add_cnstrt Ts prop prf cs env ts (t, u) =
   123     fun add_cnstrt Ts prop prf cs env vTs (t, u) =
   123       let
   124       let
   124         val t' = mk_abs Ts t;
   125         val t' = mk_abs Ts t;
   125         val u' = mk_abs Ts u
   126         val u' = mk_abs Ts u
   126       in
   127       in
   127         (prop, prf, cs, Pattern.unify (sg, env, [(t', u')]), ts)
   128         (prop, prf, cs, Pattern.unify (sg, env, [(t', u')]), vTs)
   128         handle Pattern.Pattern =>
   129         handle Pattern.Pattern =>
   129             let val (env', cs') = decompose sg env [] t' u'
   130             let val (env', cs') = decompose sg env [] t' u'
   130             in (prop, prf, cs @ cs', env', ts) end
   131             in (prop, prf, cs @ cs', env', vTs) end
   131         | Pattern.Unif =>
   132         | Pattern.Unif =>
   132             cantunify sg (Envir.norm_term env t') (Envir.norm_term env u')
   133             cantunify sg (Envir.norm_term env t') (Envir.norm_term env u')
   133       end;
   134       end;
   134 
   135 
   135     fun mk_cnstrts_atom env ts prop opTs prf =
   136     fun mk_cnstrts_atom env vTs prop opTs prf =
   136           let
   137           let
   137             val tvars = term_tvars prop;
   138             val tvars = term_tvars prop;
   138             val (env', Ts) = if_none (apsome (pair env) opTs)
   139             val tfrees = term_tfrees prop;
   139               (foldl_map (mk_tvar o apsnd snd) (env, tvars));
   140             val (prop', fmap) = Type.varify (prop, []);
   140             val prop' = subst_TVars (map fst tvars ~~ Ts) (forall_intr_vfs prop)
   141             val (env', Ts) = (case opTs of
   141               handle LIST _ => error ("Wrong number of type arguments for " ^
   142                 None => foldl_map mk_tvar (env, map snd tvars @ map snd tfrees)
   142                 quote (fst (get_name_tags [] prop prf)))
   143               | Some Ts => (env, Ts));
   143           in (prop', change_type (Some Ts) prf, [], env', ts) end;
   144             val prop'' = subst_TVars (map fst tvars @ map snd fmap ~~ Ts)
   144 
   145               (forall_intr_vfs prop') handle LIST _ =>
   145     fun mk_cnstrts env _ Hs ts (PBound i) = (nth_elem (i, Hs), PBound i, [], env, ts)
   146                 error ("Wrong number of type arguments for " ^
   146       | mk_cnstrts env Ts Hs ts (Abst (s, Some T, cprf)) =
   147                   quote (fst (get_name_tags [] prop prf)))
   147           let val (t, prf, cnstrts, env', ts') =
   148           in (prop'', change_type (Some Ts) prf, [], env', vTs) end;
   148               mk_cnstrts env (T::Ts) (map (incr_boundvars 1) Hs) ts cprf;
   149 
       
   150     fun head_norm (prop, prf, cnstrts, env, vTs) =
       
   151       (Envir.head_norm env prop, prf, cnstrts, env, vTs);
       
   152  
       
   153     fun mk_cnstrts env _ Hs vTs (PBound i) = (nth_elem (i, Hs), PBound i, [], env, vTs)
       
   154       | mk_cnstrts env Ts Hs vTs (Abst (s, opT, cprf)) =
       
   155           let
       
   156             val (env', T) = (case opT of
       
   157               None => mk_tvar (env, logicS) | Some T => (env, T));
       
   158             val (t, prf, cnstrts, env'', vTs') =
       
   159               mk_cnstrts env' (T::Ts) (map (incr_boundvars 1) Hs) vTs cprf;
   149           in (Const ("all", (T --> propT) --> propT) $ Abs (s, T, t), Abst (s, Some T, prf),
   160           in (Const ("all", (T --> propT) --> propT) $ Abs (s, T, t), Abst (s, Some T, prf),
   150             cnstrts, env', ts')
   161             cnstrts, env'', vTs')
   151           end
   162           end
   152       | mk_cnstrts env Ts Hs (t::ts) (AbsP (s, Some _, cprf)) =
   163       | mk_cnstrts env Ts Hs vTs (AbsP (s, Some t, cprf)) =
   153           let
   164           let
   154             val (u, prf, cnstrts, env', ts') = mk_cnstrts env Ts (t::Hs) ts cprf;
   165             val (t', _, vTs', env') = infer_type sg env Ts vTs t;
   155             val t' = strip_abs Ts t;
   166             val (u, prf, cnstrts, env'', vTs'') = mk_cnstrts env' Ts (t'::Hs) vTs' cprf;
   156           in (Logic.mk_implies (t', u), AbsP (s, Some t', prf), cnstrts, env', ts')
   167           in (Logic.mk_implies (t', u), AbsP (s, Some t', prf), cnstrts, env'', vTs'')
   157           end
   168           end
   158       | mk_cnstrts env Ts Hs ts (AbsP (s, None, cprf)) =
   169       | mk_cnstrts env Ts Hs vTs (AbsP (s, None, cprf)) =
   159           let
   170           let
   160             val (env', t) = mk_var env Ts propT;
   171             val (env', t) = mk_var env Ts propT;
   161             val (u, prf, cnstrts, env'', ts') = mk_cnstrts env' Ts (t::Hs) ts cprf;
   172             val (u, prf, cnstrts, env'', vTs') = mk_cnstrts env' Ts (t::Hs) vTs cprf;
   162           in (Logic.mk_implies (t, u), AbsP (s, Some t, prf), cnstrts, env'', ts')
   173           in (Logic.mk_implies (t, u), AbsP (s, Some t, prf), cnstrts, env'', vTs')
   163           end
   174           end
   164       | mk_cnstrts env Ts Hs ts (cprf1 %% cprf2) =
   175       | mk_cnstrts env Ts Hs vTs (cprf1 %% cprf2) =
   165           let val (u, prf2, cnstrts, env', ts') = mk_cnstrts env Ts Hs ts cprf2
   176           let val (u, prf2, cnstrts, env', vTs') = mk_cnstrts env Ts Hs vTs cprf2
   166           in (case mk_cnstrts env' Ts Hs ts' cprf1 of
   177           in (case head_norm (mk_cnstrts env' Ts Hs vTs' cprf1) of
   167               (Const ("==>", _) $ u' $ t', prf1, cnstrts', env'', ts'') =>
   178               (Const ("==>", _) $ u' $ t', prf1, cnstrts', env'', vTs'') =>
   168                 add_cnstrt Ts t' (prf1 %% prf2) (cnstrts' @ cnstrts)
   179                 add_cnstrt Ts t' (prf1 %% prf2) (cnstrts' @ cnstrts)
   169                   env'' ts'' (u, u')
   180                   env'' vTs'' (u, u')
   170             | (t, prf1, cnstrts', env'', ts'') =>
   181             | (t, prf1, cnstrts', env'', vTs'') =>
   171                 let val (env''', v) = mk_var env'' Ts propT
   182                 let val (env''', v) = mk_var env'' Ts propT
   172                 in add_cnstrt Ts v (prf1 %% prf2) (cnstrts' @ cnstrts)
   183                 in add_cnstrt Ts v (prf1 %% prf2) (cnstrts' @ cnstrts)
   173                   env''' ts'' (t, Logic.mk_implies (u, v))
   184                   env''' vTs'' (t, Logic.mk_implies (u, v))
   174                 end)
   185                 end)
   175           end
   186           end
   176       | mk_cnstrts env Ts Hs (t::ts) (cprf % Some _) =
   187       | mk_cnstrts env Ts Hs vTs (cprf % Some t) =
   177           let val t' = strip_abs Ts t
   188           let val (t', U, vTs1, env1) = infer_type sg env Ts vTs t
   178           in (case mk_cnstrts env Ts Hs ts cprf of
   189           in (case head_norm (mk_cnstrts env1 Ts Hs vTs1 cprf) of
   179              (Const ("all", Type ("fun", [Type ("fun", [T, _]), _])) $ f,
   190              (Const ("all", Type ("fun", [Type ("fun", [T, _]), _])) $ f,
   180                  prf, cnstrts, env', ts') =>
   191                  prf, cnstrts, env2, vTs2) =>
   181                let val env'' = unifyT sg env' T (Envir.fastype env' Ts t')
   192                let val env3 = unifyT sg env2 T U
   182                in (betapply (f, t'), prf % Some t', cnstrts, env'', ts')
   193                in (betapply (f, t'), prf % Some t', cnstrts, env3, vTs2)
   183                end
   194                end
   184            | (u, prf, cnstrts, env', ts') =>
   195            | (u, prf, cnstrts, env2, vTs2) =>
   185                let
   196                let val (env3, v) = mk_var env2 Ts (U --> propT);
   186                  val T = Envir.fastype env' Ts t';
       
   187                  val (env'', v) = mk_var env' Ts (T --> propT);
       
   188                in
   197                in
   189                  add_cnstrt Ts (v $ t') (prf % Some t') cnstrts env'' ts'
   198                  add_cnstrt Ts (v $ t') (prf % Some t') cnstrts env3 vTs2
   190                    (u, Const ("all", (T --> propT) --> propT) $ v)
   199                    (u, Const ("all", (U --> propT) --> propT) $ v)
   191                end)
   200                end)
   192           end
   201           end
   193       | mk_cnstrts env Ts Hs ts (cprf % None) =
   202       | mk_cnstrts env Ts Hs vTs (cprf % None) =
   194           (case mk_cnstrts env Ts Hs ts cprf of
   203           (case head_norm (mk_cnstrts env Ts Hs vTs cprf) of
   195              (Const ("all", Type ("fun", [Type ("fun", [T, _]), _])) $ f,
   204              (Const ("all", Type ("fun", [Type ("fun", [T, _]), _])) $ f,
   196                  prf, cnstrts, env', ts') =>
   205                  prf, cnstrts, env', vTs') =>
   197                let val (env'', t) = mk_var env' Ts T
   206                let val (env'', t) = mk_var env' Ts T
   198                in (betapply (f, t), prf % Some t, cnstrts, env'', ts')
   207                in (betapply (f, t), prf % Some t, cnstrts, env'', vTs')
   199                end
   208                end
   200            | (u, prf, cnstrts, env', ts') =>
   209            | (u, prf, cnstrts, env', vTs') =>
   201                let
   210                let
   202                  val (env1, T) = mk_tvar (env', ["logic"]);
   211                  val (env1, T) = mk_tvar (env', ["logic"]);
   203                  val (env2, v) = mk_var env1 Ts (T --> propT);
   212                  val (env2, v) = mk_var env1 Ts (T --> propT);
   204                  val (env3, t) = mk_var env2 Ts T
   213                  val (env3, t) = mk_var env2 Ts T
   205                in
   214                in
   206                  add_cnstrt Ts (v $ t) (prf % Some t) cnstrts env3 ts'
   215                  add_cnstrt Ts (v $ t) (prf % Some t) cnstrts env3 vTs'
   207                    (u, Const ("all", (T --> propT) --> propT) $ v)
   216                    (u, Const ("all", (T --> propT) --> propT) $ v)
   208                end)
   217                end)
   209       | mk_cnstrts env _ _ ts (prf as PThm (_, _, prop, opTs)) =
   218       | mk_cnstrts env _ _ vTs (prf as PThm (_, _, prop, opTs)) =
   210           mk_cnstrts_atom env ts prop opTs prf
   219           mk_cnstrts_atom env vTs prop opTs prf
   211       | mk_cnstrts env _ _ ts (prf as PAxm (_, prop, opTs)) =
   220       | mk_cnstrts env _ _ vTs (prf as PAxm (_, prop, opTs)) =
   212           mk_cnstrts_atom env ts prop opTs prf
   221           mk_cnstrts_atom env vTs prop opTs prf
   213       | mk_cnstrts env _ _ ts (prf as Oracle (_, prop, opTs)) =
   222       | mk_cnstrts env _ _ vTs (prf as Oracle (_, prop, opTs)) =
   214           mk_cnstrts_atom env ts prop opTs prf
   223           mk_cnstrts_atom env vTs prop opTs prf
   215       | mk_cnstrts env _ _ ts (Hyp t) = (t, Hyp t, [], env, ts)
   224       | mk_cnstrts env _ _ vTs (Hyp t) = (t, Hyp t, [], env, vTs)
   216       | mk_cnstrts _ _ _ _ _ = error "reconstruct_proof: minimal proof object"
   225       | mk_cnstrts _ _ _ _ _ = error "reconstruct_proof: minimal proof object"
   217   in mk_cnstrts env [] [] ts cprf end;
   226   in mk_cnstrts env [] [] Symtab.empty cprf end;
   218 
   227 
   219 fun add_term_ixns (is, Var (i, T)) = add_typ_ixns (i ins is, T)
   228 fun add_term_ixns (is, Var (i, T)) = add_typ_ixns (i ins is, T)
   220   | add_term_ixns (is, Free (_, T)) = add_typ_ixns (is, T)
   229   | add_term_ixns (is, Free (_, T)) = add_typ_ixns (is, T)
   221   | add_term_ixns (is, Const (_, T)) = add_typ_ixns (is, T)
   230   | add_term_ixns (is, Const (_, T)) = add_typ_ixns (is, T)
   222   | add_term_ixns (is, t1 $ t2) = add_term_ixns (add_term_ixns (is, t1), t2)
   231   | add_term_ixns (is, t1 $ t2) = add_term_ixns (add_term_ixns (is, t1), t2)
   223   | add_term_ixns (is, Abs (_, T, t)) = add_term_ixns (add_typ_ixns (is, T), t)
   232   | add_term_ixns (is, Abs (_, T, t)) = add_term_ixns (add_typ_ixns (is, T), t)
   224   | add_term_ixns (is, _) = is;
   233   | add_term_ixns (is, _) = is;
   225 
   234 
   226 
   235 
   227 (********************************************************************************
   236 (**** update list of free variables of constraints ****)
   228   update list of free variables of constraints
       
   229 *********************************************************************************)
       
   230 
   237 
   231 fun upd_constrs env cs =
   238 fun upd_constrs env cs =
   232   let
   239   let
   233     val Envir.Envir {asol, iTs, ...} = env;
   240     val Envir.Envir {asol, iTs, ...} = env;
   234     val dom = Vartab.foldl (uncurry (cons o fst) o Library.swap)
   241     val dom = Vartab.foldl (uncurry (cons o fst) o Library.swap)
   241           in if vs = vs' then (u, p, vs)::check_cs ps
   248           in if vs = vs' then (u, p, vs)::check_cs ps
   242              else (true, p, vs' union vran)::check_cs ps
   249              else (true, p, vs' union vran)::check_cs ps
   243           end
   250           end
   244   in check_cs cs end;
   251   in check_cs cs end;
   245 
   252 
   246 (********************************************************************************
   253 (**** solution of constraints ****)
   247   solution of constraints
       
   248 *********************************************************************************)
       
   249 
   254 
   250 fun solve _ [] bigenv = bigenv
   255 fun solve _ [] bigenv = bigenv
   251   | solve sg cs bigenv =
   256   | solve sg cs bigenv =
   252       let
   257       let
   253         fun search env [] = error ("Unsolvable constraints:\n" ^
   258         fun search env [] = error ("Unsolvable constraints:\n" ^
   254               Pretty.string_of (Pretty.chunks (map (fn (_, p, _) =>
   259               Pretty.string_of (Pretty.chunks (map (fn (_, p, _) =>
   255                 Sign.pretty_term sg (Logic.mk_flexpair (pairself
   260                 Display.pretty_flexpair (Sign.pretty_term sg) (pairself
   256                   (Envir.norm_term bigenv) p))) cs)))
   261                   (Envir.norm_term bigenv) p)) cs)))
   257           | search env ((u, p as (t1, t2), vs)::ps) =
   262           | search env ((u, p as (t1, t2), vs)::ps) =
   258               if u then
   263               if u then
   259                 let
   264                 let
   260                   val tn1 = Envir.norm_term bigenv t1;
   265                   val tn1 = Envir.norm_term bigenv t1;
   261                   val tn2 = Envir.norm_term bigenv t2
   266                   val tn2 = Envir.norm_term bigenv t2
   276       in
   281       in
   277         solve sg (upd_constrs env cs') (merge_envs bigenv env)
   282         solve sg (upd_constrs env cs') (merge_envs bigenv env)
   278       end;
   283       end;
   279 
   284 
   280 
   285 
   281 (********************************************************************************
   286 (**** reconstruction of proofs ****)
   282   reconstruction of proofs
       
   283 *********************************************************************************)
       
   284 
   287 
   285 fun reconstruct_proof sg prop cprf =
   288 fun reconstruct_proof sg prop cprf =
   286   let
   289   let
   287     val (cprf' % Some prop', thawf) = freeze_thaw_prf (cprf % Some prop);
   290     val (cprf' % Some prop', thawf) = freeze_thaw_prf (cprf % Some prop);
   288     val _ = message "Collecting type constraints...";
   291     val _ = message "Collecting constraints...";
   289     val (Tcs, cprf'', maxidx) = make_Tconstraints_cprf 0 cprf';
   292     val (t, prf, cs, env, _) = make_constraints_cprf sg
   290     val (ts, Ts) = ListPair.unzip Tcs;
   293       (Envir.empty (maxidx_of_proof cprf)) cprf';
   291     val tsig = Sign.tsig_of sg;
       
   292     val {classrel, arities, ...} = Type.rep_tsig tsig;
       
   293     val _ = message "Solving type constraints...";
       
   294     val (ts', _, unifier) = TypeInfer.infer_types (Sign.pretty_term sg) (Sign.pretty_typ sg)
       
   295       (Sign.const_type sg) classrel arities [] false (K true) ts Ts;
       
   296     val env = Envir.Envir {asol = Vartab.empty, iTs = Vartab.make unifier, maxidx = maxidx};
       
   297     val _ = message "Collecting term constraints...";
       
   298     val (t, prf, cs, env, _) = make_constraints_cprf sg env ts' cprf'';
       
   299     val cs' = map (fn p => (true, p, op union
   294     val cs' = map (fn p => (true, p, op union
   300       (pairself (map (fst o dest_Var) o term_vars) p))) (map (pairself (Envir.norm_term env)) ((t, prop')::cs));
   295       (pairself (map (fst o dest_Var) o term_vars) p))) (map (pairself (Envir.norm_term env)) ((t, prop')::cs));
   301     val _ = message ("Solving remaining constraints (" ^ string_of_int (length cs') ^ ") ...");
   296     val _ = message ("Solving remaining constraints (" ^ string_of_int (length cs') ^ ") ...");
   302     val env' = solve sg cs' env
   297     val env' = solve sg cs' env
   303   in
   298   in
   304     thawf (norm_proof env' prf)
   299     thawf (norm_proof env' prf)
   305   end;
   300   end;
   306 
   301 
   307 fun prop_of_atom prop Ts =
   302 fun prop_of_atom prop Ts =
   308   subst_TVars (map fst (term_tvars prop) ~~ Ts) (forall_intr_vfs prop);
   303   let val (prop', fmap) = Type.varify (prop, []);
       
   304   in subst_TVars (map fst (term_tvars prop) @ map snd fmap ~~ Ts)
       
   305     (forall_intr_vfs prop')
       
   306   end;
   309 
   307 
   310 fun prop_of' Hs (PBound i) = nth_elem (i, Hs)
   308 fun prop_of' Hs (PBound i) = nth_elem (i, Hs)
   311   | prop_of' Hs (Abst (s, Some T, prf)) =
   309   | prop_of' Hs (Abst (s, Some T, prf)) =
   312       all T $ (Abs (s, T, prop_of' Hs prf))
   310       all T $ (Abs (s, T, prop_of' Hs prf))
   313   | prop_of' Hs (AbsP (s, Some t, prf)) =
   311   | prop_of' Hs (AbsP (s, Some t, prf)) =
   325   | prop_of' _ _ = error "prop_of: partial proof object";
   323   | prop_of' _ _ = error "prop_of: partial proof object";
   326 
   324 
   327 val prop_of = prop_of' [];
   325 val prop_of = prop_of' [];
   328 
   326 
   329 
   327 
   330 (********************************************************************************
   328 (**** expand and reconstruct subproofs ****)
   331   expand and reconstruct subproofs
       
   332 *********************************************************************************)
       
   333 
   329 
   334 fun expand_proof sg thms prf =
   330 fun expand_proof sg thms prf =
   335   let
   331   let
   336     fun expand maxidx prfs (AbsP (s, t, prf)) = 
   332     fun expand maxidx prfs (AbsP (s, t, prf)) = 
   337           let val (maxidx', prfs', prf') = expand maxidx prfs prf
   333           let val (maxidx', prfs', prf') = expand maxidx prfs prf
   353               | (b, Some prop') => a = b andalso prop = prop') thms)
   349               | (b, Some prop') => a = b andalso prop = prop') thms)
   354           then (maxidx, prfs, prf) else
   350           then (maxidx, prfs, prf) else
   355           let
   351           let
   356             fun inc i =
   352             fun inc i =
   357               map_proof_terms (Logic.incr_indexes ([], i)) (incr_tvar i);
   353               map_proof_terms (Logic.incr_indexes ([], i)) (incr_tvar i);
   358             val (maxidx', i, prf, prfs') = (case assoc (prfs, (a, prop)) of
   354             val (maxidx', prf, prfs') = (case assoc (prfs, (a, prop)) of
   359                 None =>
   355                 None =>
   360                   let
   356                   let
   361                     val _ = message ("Reconstructing proof of " ^ a);
   357                     val _ = message ("Reconstructing proof of " ^ a);
   362                     val _ = message (Sign.string_of_term sg prop);
   358                     val _ = message (Sign.string_of_term sg prop);
   363                     val prf' = forall_intr_vfs_prf prop
   359                     val prf' = forall_intr_vfs_prf prop
   364                       (reconstruct_proof sg prop cprf);
   360                       (reconstruct_proof sg prop cprf);
   365                     val (maxidx', prfs', prf) = expand
   361                     val (maxidx', prfs', prf) = expand
   366                       (maxidx_of_proof prf') prfs prf'
   362                       (maxidx_of_proof prf') prfs prf'
   367                   in (maxidx' + maxidx + 1, maxidx + 1, inc (maxidx + 1) prf,
   363                   in (maxidx' + maxidx + 1, inc (maxidx + 1) prf,
   368                     ((a, prop), (maxidx', prf)) :: prfs')
   364                     ((a, prop), (maxidx', prf)) :: prfs')
   369                   end
   365                   end
   370               | Some (maxidx', prf) => (maxidx' + maxidx + 1,
   366               | Some (maxidx', prf) => (maxidx' + maxidx + 1,
   371                   maxidx + 1, inc (maxidx + 1) prf, prfs));
   367                   inc (maxidx + 1) prf, prfs));
   372             val tye = map (fn ((s, j), _) => (s, i + j)) (term_tvars prop) ~~ Ts
   368             val tfrees = term_tfrees prop;
       
   369             val tye = map (fn ((s, j), _) => (s, maxidx + 1 + j))
       
   370               (term_tvars prop) @ map (rpair ~1 o fst) tfrees ~~ Ts;
       
   371             val varify = map_type_tfree (fn p as (a, S) =>
       
   372               if p mem tfrees then TVar ((a, ~1), S) else TFree p)
   373           in
   373           in
   374             (maxidx', prfs',
   374             (maxidx', prfs', map_proof_terms (subst_TVars tye o
   375              map_proof_terms (subst_TVars tye) (typ_subst_TVars tye) prf)
   375                map_term_types varify) (typ_subst_TVars tye o varify) prf)
   376           end
   376           end
   377       | expand maxidx prfs prf = (maxidx, prfs, prf);
   377       | expand maxidx prfs prf = (maxidx, prfs, prf);
   378 
   378 
   379   in #3 (expand (maxidx_of_proof prf) [] prf) end;
   379   in #3 (expand (maxidx_of_proof prf) [] prf) end;
   380 
   380