diff -r 51a4208162ed -r 386a6b1a5203 Quot/QuotMain.thy --- a/Quot/QuotMain.thy Tue Dec 08 01:25:43 2009 +0100 +++ b/Quot/QuotMain.thy Tue Dec 08 04:14:02 2009 +0100 @@ -144,6 +144,7 @@ declare [[map * = (prod_fun, prod_rel)]] declare [[map "fun" = (fun_map, fun_rel)]] + (* Throws now an exception: *) (* declare [[map "option" = (bla, blu)]] *) @@ -253,7 +254,7 @@ fun NDT ctxt s tac thm = tac thm *} -section {* Matching of terms and types *} +section {* Matching of Terms and Types *} ML {* fun matches_typ (ty, ty') = @@ -266,9 +267,7 @@ then (List.all matches_typ (tys ~~ tys')) else false | _ => false -*} -ML {* fun matches_term (trm, trm') = case (trm, trm') of (_, Var _) => true @@ -453,9 +452,7 @@ fun equiv_tac ctxt = (K (print_tac "equiv tac")) THEN' REPEAT_ALL_NEW (resolve_tac (equiv_rules_get ctxt)) -*} -ML {* fun equiv_solver_tac ss = equiv_tac (Simplifier.the_context ss) val equiv_solver = Simplifier.mk_solver' "Equivalence goal solver" equiv_solver_tac *} @@ -497,7 +494,7 @@ SOME thm2 end handle _ => NONE -(* FIXME/TODO: what is the place where the exception can be raised: matching_prs? *) +(* FIXME/TODO: what is the place where the exception is raised: matching_prs? *) *} ML {* @@ -616,8 +613,7 @@ val yvar = Free (y, T) val result = Term.lambda_name (y, yvar) (inj_repabs_trm lthy (s, s')) in - if rty = qty - then result + if rty = qty then result else mk_repabs lthy (rty, qty) result end @@ -625,8 +621,7 @@ (inj_repabs_trm lthy (t, t')) $ (inj_repabs_trm lthy (s, s')) | (Free (_, T), Free (_, T')) => - if T = T' - then rtrm + if T = T' then rtrm else mk_repabs lthy (T, T') rtrm | (_, Const (@{const_name "op ="}, _)) => rtrm @@ -636,8 +631,7 @@ let val rty = fastype_of rtrm in - if rty = T' - then rtrm + if rty = T' then rtrm else mk_repabs lthy (rty, T') rtrm end @@ -651,10 +645,7 @@ REPEAT_ALL_NEW (FIRST' [rtac @{thm identity_quotient}, resolve_tac (quotient_rules_get ctxt)]) -*} -(* solver for the simplifier *) -ML {* fun quotient_solver_tac ss = quotient_tac (Simplifier.the_context ss) val quotient_solver = Simplifier.mk_solver' "Quotient goal solver" quotient_solver_tac *} @@ -940,15 +931,12 @@ in inj_repabs_step_tac ctxt rel_refl trans2 end -*} -ML {* fun all_inj_repabs_tac ctxt = REPEAT_ALL_NEW (inj_repabs_tac ctxt) -(* if this is too slow we can inline the code above *) *} -section {* Cleaning of the theorem *} +section {* Cleaning of the Theorem *} ML {* fun make_inst lhs t = @@ -1034,8 +1022,8 @@ (* 2. folding of definitions: (rep ---> abs) oldConst == newconst *) (* and simplification with *) thm all_prs ex_prs -(* 3. simplification with id_simps and *) -thm fun_map.simps Quotient_abs_rep Quotient_rel_rep +(* 3. simplification with *) +thm fun_map.simps Quotient_abs_rep Quotient_rel_rep id_simps (* 4. Test for refl *) ML {* @@ -1043,7 +1031,7 @@ let val thy = ProofContext.theory_of lthy; val defs = map (Thm.varifyT o symmetric o #def) (qconsts_dest thy) - (* FIXME: shouldn't the definitions already be varified? *) + (* FIXME: why is the Thm.varifyT needed: example where it fails is LamEx *) val thms1 = @{thms all_prs ex_prs} @ defs val thms2 = @{thms eq_reflection[OF fun_map.simps]} @ (id_simps_get lthy) @ @{thms Quotient_abs_rep Quotient_rel_rep} @@ -1155,12 +1143,22 @@ *} ML {* -(* automated tactics *) +fun SOLVES' tac = tac THEN_ALL_NEW (fn _ => no_tac) + +fun WARN (tac, msg) i st = + case Seq.pull ((SOLVES' tac) i st) of + NONE => (warning msg; Seq.single st) + | seqcell => Seq.make (fn () => seqcell) + +fun RANGE_WARN xs = RANGE (map WARN xs) +*} + +ML {* fun lift_tac ctxt rthm = procedure_tac ctxt rthm - THEN' RANGE [regularize_tac ctxt, - all_inj_repabs_tac ctxt, - clean_tac ctxt] + THEN' RANGE_WARN [(regularize_tac ctxt, "Regularize proof failed."), + (all_inj_repabs_tac ctxt, "Injection proof failed."), + (clean_tac ctxt, "Cleaning proof failed.")] *} end