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) |
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)) = |