diff -r fe2529a9f250 -r 670131bcba4a Quot/QuotMain.thy --- a/Quot/QuotMain.thy Mon Dec 14 14:24:08 2009 +0100 +++ b/Quot/QuotMain.thy Tue Dec 15 15:38:17 2009 +0100 @@ -122,6 +122,22 @@ fun OF1 thm1 thm2 = thm2 RS thm1 *} +(* various tactic combinators *) +ML {* +fun SOLVES' tac = tac THEN_ALL_NEW (K no_tac) +*} + +ML {* +(* prints warning, if goal is unsolved *) +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) +*} + + section {* Atomize Infrastructure *} lemma atomize_eqv[atomize]: @@ -410,10 +426,11 @@ by (simp add: equivp_reflp) ML {* -fun quotient_tac ctxt = - REPEAT_ALL_NEW (DETERM o FIRST' +(* test whether DETERM makes any difference *) +fun quotient_tac ctxt = SOLVES' + (REPEAT_ALL_NEW (FIRST' [rtac @{thm identity_quotient}, - resolve_tac (quotient_rules_get ctxt)]) + resolve_tac (quotient_rules_get ctxt)])) fun quotient_solver_tac ss = quotient_tac (Simplifier.the_context ss) val quotient_solver = Simplifier.mk_solver' "Quotient goal solver" quotient_solver_tac @@ -431,7 +448,7 @@ (* 0. preliminary simplification step according to *) -thm ball_reg_eqv bex_reg_eqv (* babs_reg_eqv is of no use *) +thm ball_reg_eqv bex_reg_eqv babs_reg_eqv ball_reg_eqv_range bex_reg_eqv_range (* 1. eliminating simple Ball/Bex instances*) thm ball_reg_right bex_reg_left @@ -453,8 +470,6 @@ val simpset = (mk_minimal_ss ctxt) addsimps @{thms ball_reg_eqv bex_reg_eqv babs_reg_eqv babs_simp} addsimprocs [simproc] addSolver equiv_solver addSolver quotient_solver - (* TODO: Make sure that there are no list_rel, pair_rel etc involved *) - (* can this cause loops in equiv_tac ? *) val eq_eqvs = map (OF1 @{thm eq_imp_rel}) (equiv_rules_get ctxt) in simp_tac simpset THEN' @@ -557,6 +572,8 @@ "QUOT_TRUE x \ True" ML {* +(* looks for QUOT_TRUE assumtions, and in case its argument *) +(* is an application, it returns the function and the argument *) fun find_qt_asm asms = let fun find_fun trm = @@ -659,9 +676,9 @@ *} ML {* -(* FIXME / TODO: what is asmf and asma in the code below *) -(* asmf is the QUOT_TRUE assumption function - asma are QUOT_TRUE assumption arguments *) +(* we apply apply_rsp only in case if the type needs lifting, *) +(* which is the case if the type of the data in the QUOT_TRUE *) +(* assumption is different from the corresponding type in the goal *) val apply_rsp_tac = Subgoal.FOCUS (fn {concl, asms, context,...} => let @@ -669,13 +686,13 @@ val qt_asm = find_qt_asm (map term_of asms) in case (bare_concl, qt_asm) of - (R2 $ (f $ x) $ (g $ y), SOME (asmf, asma)) => - if (fastype_of asmf) = (fastype_of f) - then no_tac - else + (R2 $ (f $ x) $ (g $ y), SOME (qt_fun, qt_arg)) => + if (fastype_of qt_fun) = (fastype_of f) + then no_tac + else let val ty_x = fastype_of x - val ty_b = fastype_of asma + val ty_b = fastype_of qt_arg val ty_f = range_type (fastype_of f) val thy = ProofContext.theory_of context val ty_inst = map (SOME o (ctyp_of thy)) [ty_x, ty_b, ty_f] @@ -688,6 +705,8 @@ end) *} +thm equals_rsp + ML {* fun equals_rsp_tac R ctxt = let @@ -698,16 +717,13 @@ in rtac thm THEN' quotient_tac ctxt end +(* raised by instantiate' *) handle THM _ => K no_tac | TYPE _ => K no_tac | TERM _ => K no_tac *} -thm rep_abs_rsp - ML {* -fun SOLVES' tac = tac THEN_ALL_NEW (K no_tac) - fun rep_abs_rsp_tac ctxt = SUBGOAL (fn (goal, i) => case (bare_concl goal) of @@ -719,7 +735,7 @@ val t_inst = map (SOME o (cterm_of thy)) [rel, abs, rep]; val inst_thm = Drule.instantiate' ty_inst t_inst @{thm rep_abs_rsp} in - (rtac inst_thm THEN' SOLVES' (quotient_tac ctxt)) i + (rtac inst_thm THEN' quotient_tac ctxt) i end handle THM _ => no_tac | TYPE _ => no_tac) | _ => no_tac) @@ -906,7 +922,7 @@ val td = Drule.instantiate ([], [(cterm_of thy insp, cterm_of thy inst)]) te in MetaSimplifier.rewrite_rule (id_simps_get ctxt) td - end); + end) val _ = if not (Term.is_Const a2 andalso fst (dest_Const a2) = @{const_name "id"}) then (tracing "lambda_prs"; tracing ("redex:\n" ^ (Syntax.string_of_term ctxt (term_of ctrm))); @@ -1062,15 +1078,6 @@ section {* Automatic Proofs *} -ML {* -(* prints warning, if goal is unsolved *) -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 {* local