src/HOL/Tools/TFL/rules.ML
changeset 29302 eb782d1dc07c
parent 29270 0eade173f77e
child 30190 479806475f3c
equal deleted inserted replaced
29301:2b845381ba6a 29302:eb782d1dc07c
   672      val dummy = ss_ref  := []
   672      val dummy = ss_ref  := []
   673      val cut_lemma' = cut_lemma RS eq_reflection
   673      val cut_lemma' = cut_lemma RS eq_reflection
   674      fun prover used ss thm =
   674      fun prover used ss thm =
   675      let fun cong_prover ss thm =
   675      let fun cong_prover ss thm =
   676          let val dummy = say "cong_prover:"
   676          let val dummy = say "cong_prover:"
   677              val cntxt = MetaSimplifier.prems_of_ss ss
   677              val cntxt = Simplifier.prems_of_ss ss
   678              val dummy = print_thms "cntxt:" cntxt
   678              val dummy = print_thms "cntxt:" cntxt
   679              val dummy = say "cong rule:"
   679              val dummy = say "cong rule:"
   680              val dummy = say (Display.string_of_thm thm)
   680              val dummy = say (Display.string_of_thm thm)
   681              val dummy = thm_ref := (thm :: !thm_ref)
   681              val dummy = thm_ref := (thm :: !thm_ref)
   682              val dummy = ss_ref := (ss :: !ss_ref)
   682              val dummy = ss_ref := (ss :: !ss_ref)
   685                  let val tych = cterm_of thy
   685                  let val tych = cterm_of thy
   686                      val dummy = print_cterms "To eliminate:" [tych imp]
   686                      val dummy = print_cterms "To eliminate:" [tych imp]
   687                      val ants = map tych (Logic.strip_imp_prems imp)
   687                      val ants = map tych (Logic.strip_imp_prems imp)
   688                      val eq = Logic.strip_imp_concl imp
   688                      val eq = Logic.strip_imp_concl imp
   689                      val lhs = tych(get_lhs eq)
   689                      val lhs = tych(get_lhs eq)
   690                      val ss' = MetaSimplifier.add_prems (map ASSUME ants) ss
   690                      val ss' = Simplifier.add_prems (map ASSUME ants) ss
   691                      val lhs_eq_lhs1 = MetaSimplifier.rewrite_cterm (false,true,false) (prover used) ss' lhs
   691                      val lhs_eq_lhs1 = MetaSimplifier.rewrite_cterm (false,true,false) (prover used) ss' lhs
   692                        handle U.ERR _ => Thm.reflexive lhs
   692                        handle U.ERR _ => Thm.reflexive lhs
   693                      val dummy = print_thms "proven:" [lhs_eq_lhs1]
   693                      val dummy = print_thms "proven:" [lhs_eq_lhs1]
   694                      val lhs_eq_lhs2 = implies_intr_list ants lhs_eq_lhs1
   694                      val lhs_eq_lhs2 = implies_intr_list ants lhs_eq_lhs1
   695                      val lhs_eeq_lhs2 = lhs_eq_lhs2 RS meta_eq_to_obj_eq
   695                      val lhs_eeq_lhs2 = lhs_eq_lhs2 RS meta_eq_to_obj_eq
   706                   val ants1 = map tych (Logic.strip_imp_prems imp_body1)
   706                   val ants1 = map tych (Logic.strip_imp_prems imp_body1)
   707                   val eq1 = Logic.strip_imp_concl imp_body1
   707                   val eq1 = Logic.strip_imp_concl imp_body1
   708                   val Q = get_lhs eq1
   708                   val Q = get_lhs eq1
   709                   val QeqQ1 = pbeta_reduce (tych Q)
   709                   val QeqQ1 = pbeta_reduce (tych Q)
   710                   val Q1 = #2(D.dest_eq(cconcl QeqQ1))
   710                   val Q1 = #2(D.dest_eq(cconcl QeqQ1))
   711                   val ss' = MetaSimplifier.add_prems (map ASSUME ants1) ss
   711                   val ss' = Simplifier.add_prems (map ASSUME ants1) ss
   712                   val Q1eeqQ2 = MetaSimplifier.rewrite_cterm (false,true,false) (prover used') ss' Q1
   712                   val Q1eeqQ2 = MetaSimplifier.rewrite_cterm (false,true,false) (prover used') ss' Q1
   713                                 handle U.ERR _ => Thm.reflexive Q1
   713                                 handle U.ERR _ => Thm.reflexive Q1
   714                   val Q2 = #2 (Logic.dest_equals (Thm.prop_of Q1eeqQ2))
   714                   val Q2 = #2 (Logic.dest_equals (Thm.prop_of Q1eeqQ2))
   715                   val Q3 = tych(list_comb(list_mk_aabs(vstrl,Q2),vstrl))
   715                   val Q3 = tych(list_comb(list_mk_aabs(vstrl,Q2),vstrl))
   716                   val Q2eeqQ3 = Thm.symmetric(pbeta_reduce Q3 RS eq_reflection)
   716                   val Q2eeqQ3 = Thm.symmetric(pbeta_reduce Q3 RS eq_reflection)
   756          in SOME(eliminate (rename thm)) end
   756          in SOME(eliminate (rename thm)) end
   757          handle U.ERR _ => NONE    (* FIXME handle THM as well?? *)
   757          handle U.ERR _ => NONE    (* FIXME handle THM as well?? *)
   758 
   758 
   759         fun restrict_prover ss thm =
   759         fun restrict_prover ss thm =
   760           let val dummy = say "restrict_prover:"
   760           let val dummy = say "restrict_prover:"
   761               val cntxt = rev(MetaSimplifier.prems_of_ss ss)
   761               val cntxt = rev(Simplifier.prems_of_ss ss)
   762               val dummy = print_thms "cntxt:" cntxt
   762               val dummy = print_thms "cntxt:" cntxt
   763               val thy = Thm.theory_of_thm thm
   763               val thy = Thm.theory_of_thm thm
   764               val Const("==>",_) $ (Const("Trueprop",_) $ A) $ _ = Thm.prop_of thm
   764               val Const("==>",_) $ (Const("Trueprop",_) $ A) $ _ = Thm.prop_of thm
   765               fun genl tm = let val vlist = subtract (op aconv) globals
   765               fun genl tm = let val vlist = subtract (op aconv) globals
   766                                            (OldTerm.add_term_frees(tm,[]))
   766                                            (OldTerm.add_term_frees(tm,[]))