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 |