src/HOL/Tools/Qelim/cooper.ML
changeset 81942 da3c3948a39c
parent 80701 39cd50407f79
equal deleted inserted replaced
81941:cb8f396dd39f 81942:da3c3948a39c
   374          |> HOLogic.mk_Trueprop |> provelin ctxt) RS eq_reflection end
   374          |> HOLogic.mk_Trueprop |> provelin ctxt) RS eq_reflection end
   375   fun nzprop x =
   375   fun nzprop x =
   376    let
   376    let
   377     val th =
   377     val th =
   378      Simplifier.rewrite (put_simpset lin_ss ctxt)
   378      Simplifier.rewrite (put_simpset lin_ss ctxt)
   379       (Thm.apply \<^cterm>\<open>Trueprop\<close> (Thm.apply \<^cterm>\<open>Not\<close>
   379       (HOLogic.mk_judgment (Thm.apply \<^cterm>\<open>Not\<close>
   380            (Thm.apply (Thm.apply \<^cterm>\<open>(=) :: int => _\<close> (Numeral.mk_cnumber \<^ctyp>\<open>int\<close> x))
   380            (Thm.apply (Thm.apply \<^cterm>\<open>(=) :: int => _\<close> (Numeral.mk_cnumber \<^ctyp>\<open>int\<close> x))
   381            \<^cterm>\<open>0::int\<close>)))
   381            \<^cterm>\<open>0::int\<close>)))
   382    in Thm.equal_elim (Thm.symmetric th) TrueI end;
   382    in Thm.equal_elim (Thm.symmetric th) TrueI end;
   383   val notz =
   383   val notz =
   384     let val tab = fold Inttab.update
   384     let val tab = fold Inttab.update
   467  val cd = Numeral.mk_cnumber \<^ctyp>\<open>int\<close> d
   467  val cd = Numeral.mk_cnumber \<^ctyp>\<open>int\<close> d
   468  fun divprop x =
   468  fun divprop x =
   469    let
   469    let
   470     val th =
   470     val th =
   471      Simplifier.rewrite (put_simpset lin_ss ctxt)
   471      Simplifier.rewrite (put_simpset lin_ss ctxt)
   472       (Thm.apply \<^cterm>\<open>Trueprop\<close>
   472       (HOLogic.mk_judgment
   473            (Thm.apply (Thm.apply dvdc (Numeral.mk_cnumber \<^ctyp>\<open>int\<close> x)) cd))
   473            (Thm.apply (Thm.apply dvdc (Numeral.mk_cnumber \<^ctyp>\<open>int\<close> x)) cd))
   474    in Thm.equal_elim (Thm.symmetric th) TrueI end;
   474    in Thm.equal_elim (Thm.symmetric th) TrueI end;
   475  val dvd =
   475  val dvd =
   476    let val tab = fold Inttab.update (ds ~~ (map divprop ds)) Inttab.empty in
   476    let val tab = fold Inttab.update (ds ~~ (map divprop ds)) Inttab.empty in
   477      fn ct => the (Inttab.lookup tab (Thm.term_of ct |> dest_number))
   477      fn ct => the (Inttab.lookup tab (Thm.term_of ct |> dest_number))
   479         (writeln ("dvd: Theorems-Table contains no entry for" ^
   479         (writeln ("dvd: Theorems-Table contains no entry for" ^
   480             Syntax.string_of_term ctxt (Thm.term_of ct)); raise Option.Option)
   480             Syntax.string_of_term ctxt (Thm.term_of ct)); raise Option.Option)
   481    end
   481    end
   482  val dp =
   482  val dp =
   483    let val th = Simplifier.rewrite (put_simpset lin_ss ctxt)
   483    let val th = Simplifier.rewrite (put_simpset lin_ss ctxt)
   484       (Thm.apply \<^cterm>\<open>Trueprop\<close>
   484       (HOLogic.mk_judgment
   485            (Thm.apply (Thm.apply \<^cterm>\<open>(<) :: int => _\<close> \<^cterm>\<open>0::int\<close>) cd))
   485            (Thm.apply (Thm.apply \<^cterm>\<open>(<) :: int => _\<close> \<^cterm>\<open>0::int\<close>) cd))
   486    in Thm.equal_elim (Thm.symmetric th) TrueI end;
   486    in Thm.equal_elim (Thm.symmetric th) TrueI end;
   487     (* A and B set *)
   487     (* A and B set *)
   488    local
   488    local
   489      val insI1 = Thm.instantiate' [SOME \<^ctyp>\<open>int\<close>] [] @{thm "insertI1"}
   489      val insI1 = Thm.instantiate' [SOME \<^ctyp>\<open>int\<close>] [] @{thm "insertI1"}
   734      val (ps, c) = split_last (strip_objimp p)
   734      val (ps, c) = split_last (strip_objimp p)
   735      val qs = filter P ps
   735      val qs = filter P ps
   736      val q = if P c then c else \<^cterm>\<open>False\<close>
   736      val q = if P c then c else \<^cterm>\<open>False\<close>
   737      val ng = fold_rev (fn (a,v) => fn t => Thm.apply a (Thm.lambda v t)) qvs
   737      val ng = fold_rev (fn (a,v) => fn t => Thm.apply a (Thm.lambda v t)) qvs
   738          (fold_rev (fn p => fn q => Thm.apply (Thm.apply \<^cterm>\<open>HOL.implies\<close> p) q) qs q)
   738          (fold_rev (fn p => fn q => Thm.apply (Thm.apply \<^cterm>\<open>HOL.implies\<close> p) q) qs q)
   739      val g = Thm.apply (Thm.apply \<^cterm>\<open>(==>)\<close> (Thm.apply \<^cterm>\<open>Trueprop\<close> ng)) p'
   739      val g = Thm.apply (Thm.apply \<^cterm>\<open>(==>)\<close> (HOLogic.mk_judgment ng)) p'
   740      val ntac = (case qs of [] => q aconvc \<^cterm>\<open>False\<close>
   740      val ntac = (case qs of [] => q aconvc \<^cterm>\<open>False\<close>
   741                          | _ => false)
   741                          | _ => false)
   742     in
   742     in
   743       if ntac then no_tac
   743       if ntac then no_tac
   744       else
   744       else