311 let val (prop', fmap) = Type.varify (prop, []); |
311 let val (prop', fmap) = Type.varify (prop, []); |
312 in subst_TVars (map fst (term_tvars prop) @ map snd fmap ~~ Ts) |
312 in subst_TVars (map fst (term_tvars prop) @ map snd fmap ~~ Ts) |
313 (forall_intr_vfs prop') |
313 (forall_intr_vfs prop') |
314 end; |
314 end; |
315 |
315 |
316 fun prop_of' Hs (PBound i) = nth_elem (i, Hs) |
316 val head_norm = Envir.head_norm (Envir.empty 0); |
317 | prop_of' Hs (Abst (s, Some T, prf)) = |
317 |
318 all T $ (Abs (s, T, prop_of' Hs prf)) |
318 fun prop_of0 Hs (PBound i) = nth_elem (i, Hs) |
319 | prop_of' Hs (AbsP (s, Some t, prf)) = |
319 | prop_of0 Hs (Abst (s, Some T, prf)) = |
320 Logic.mk_implies (t, prop_of' (t :: Hs) prf) |
320 all T $ (Abs (s, T, prop_of0 Hs prf)) |
321 | prop_of' Hs (prf % Some t) = (case prop_of' Hs prf of |
321 | prop_of0 Hs (AbsP (s, Some t, prf)) = |
322 Const ("all", _) $ f => betapply (f, t) |
322 Logic.mk_implies (t, prop_of0 (t :: Hs) prf) |
|
323 | prop_of0 Hs (prf % Some t) = (case head_norm (prop_of0 Hs prf) of |
|
324 Const ("all", _) $ f => f $ t |
323 | _ => error "prop_of: all expected") |
325 | _ => error "prop_of: all expected") |
324 | prop_of' Hs (prf1 %% prf2) = (case prop_of' Hs prf1 of |
326 | prop_of0 Hs (prf1 %% prf2) = (case head_norm (prop_of0 Hs prf1) of |
325 Const ("==>", _) $ P $ Q => Q |
327 Const ("==>", _) $ P $ Q => Q |
326 | _ => error "prop_of: ==> expected") |
328 | _ => error "prop_of: ==> expected") |
327 | prop_of' Hs (Hyp t) = t |
329 | prop_of0 Hs (Hyp t) = t |
328 | prop_of' Hs (PThm (_, _, prop, Some Ts)) = prop_of_atom prop Ts |
330 | prop_of0 Hs (PThm (_, _, prop, Some Ts)) = prop_of_atom prop Ts |
329 | prop_of' Hs (PAxm (_, prop, Some Ts)) = prop_of_atom prop Ts |
331 | prop_of0 Hs (PAxm (_, prop, Some Ts)) = prop_of_atom prop Ts |
330 | prop_of' Hs (Oracle (_, prop, Some Ts)) = prop_of_atom prop Ts |
332 | prop_of0 Hs (Oracle (_, prop, Some Ts)) = prop_of_atom prop Ts |
331 | prop_of' _ _ = error "prop_of: partial proof object"; |
333 | prop_of0 _ _ = error "prop_of: partial proof object"; |
332 |
334 |
|
335 val prop_of' = Pattern.eta_contract oo (Envir.beta_norm oo prop_of0); |
333 val prop_of = prop_of' []; |
336 val prop_of = prop_of' []; |
334 |
337 |
335 |
338 |
336 (**** expand and reconstruct subproofs ****) |
339 (**** expand and reconstruct subproofs ****) |
337 |
340 |