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