diff -r 7af81ea081d6 -r 13ea9a34c269 QuotMain.thy --- a/QuotMain.thy Thu Nov 12 13:57:20 2009 +0100 +++ b/QuotMain.thy Fri Nov 13 16:44:36 2009 +0100 @@ -250,7 +250,12 @@ | _ => HOLogic.eq_const ty) *} -(* ML {* cterm_of @{theory} (tyRel @{typ "'a \ 'a list \ 't \ 't"} (Logic.varifyT @{typ "'a list"}) @{term "f::('a list \ 'a list \ bool)"} @{context}) *} *) +(* +ML {* cterm_of @{theory} + (tyRel @{typ "'a \ 'a list \ 't \ 't"} (Logic.varifyT @{typ "'a list"}) + @{term "f::('a list \ 'a list \ bool)"} @{context}) +*} +*) definition Babs :: "('a \ bool) \ ('a \ 'b) \ 'a \ 'b" @@ -1069,29 +1074,60 @@ ML {* -fun lift_thm lthy qty qty_name rsp_thms defs t = let +fun lift_thm lthy qty qty_name rsp_thms defs rthm = let + val _ = tracing ("raw theorem:\n" ^ Syntax.string_of_term lthy (prop_of rthm)) + val (rty, rel, rel_refl, rel_eqv) = lookup_quot_data lthy qty; val (trans2, reps_same, absrep, quot) = lookup_quot_thms lthy qty_name; val consts = lookup_quot_consts defs; - val t_a = atomize_thm t; + val t_a = atomize_thm rthm; + + val _ = tracing ("raw atomized theorem:\n" ^ Syntax.string_of_term lthy (prop_of t_a)) + val t_r = regularize t_a rty rel rel_eqv rel_refl lthy; + + val _ = tracing ("regularised theorem:\n" ^ Syntax.string_of_term lthy (prop_of t_r)) + val t_t = repabs lthy t_r consts rty qty quot rel_refl trans2 rsp_thms; + + val _ = tracing ("rep/abs injected theorem:\n" ^ Syntax.string_of_term lthy (prop_of t_t)) + val (alls, exs) = findallex lthy rty qty (prop_of t_a); val allthms = map (make_allex_prs_thm lthy quot @{thm FORALL_PRS}) alls val exthms = map (make_allex_prs_thm lthy quot @{thm EXISTS_PRS}) exs val t_a = MetaSimplifier.rewrite_rule (allthms @ exthms) t_t + + val _ = tracing ("??:\n" ^ Syntax.string_of_term lthy (prop_of t_a)) + val abs = findabs rty (prop_of t_a); val aps = findaps rty (prop_of t_a); val app_prs_thms = map (applic_prs lthy rty qty absrep) aps; val lam_prs_thms = map (make_simp_prs_thm lthy quot @{thm LAMBDA_PRS}) abs; val t_l = repeat_eqsubst_thm lthy (lam_prs_thms @ app_prs_thms) t_a; + + val _ = tracing ("??:\n" ^ Syntax.string_of_term lthy (prop_of t_l)) + val defs_sym = flat (map (add_lower_defs lthy) defs); val defs_sym_eq = map (fn x => eq_reflection OF [x]) defs_sym; val t_id = simp_ids lthy t_l; + + val _ = tracing ("??:\n" ^ Syntax.string_of_term lthy (prop_of t_id)) + val t_d0 = MetaSimplifier.rewrite_rule defs_sym_eq t_id; + + val _ = tracing ("??:\n" ^ Syntax.string_of_term lthy (prop_of t_d0)) + val t_d = repeat_eqsubst_thm lthy defs_sym t_d0; + + val _ = tracing ("??:\n" ^ Syntax.string_of_term lthy (prop_of t_d)) + val t_r = MetaSimplifier.rewrite_rule [reps_same] t_d; + + val _ = tracing ("??:\n" ^ Syntax.string_of_term lthy (prop_of t_r)) + val t_rv = ObjectLogic.rulify t_r + + val _ = tracing ("lifted theorem:\n" ^ Syntax.string_of_term lthy (prop_of t_rv)) in Thm.varifyT t_rv end