moving generic lemmas out of theory parity, disregarding some unused auxiliary lemmas;
authorhaftmann
Thu, 31 Oct 2013 11:44:20 +0100
changeset 54227 63b441f49645
parent 54226 e3df2a4e02fc
child 54228 229282d53781
moving generic lemmas out of theory parity, disregarding some unused auxiliary lemmas; tuned presburger
NEWS
src/HOL/Decision_Procs/Rat_Pair.thy
src/HOL/Divides.thy
src/HOL/Library/Code_Target_Int.thy
src/HOL/Parity.thy
src/HOL/Presburger.thy
src/HOL/Tools/Qelim/qelim.ML
--- a/NEWS	Thu Oct 31 11:44:20 2013 +0100
+++ b/NEWS	Thu Oct 31 11:44:20 2013 +0100
@@ -4,6 +4,11 @@
 New in this Isabelle version
 ----------------------------
 
+*** HOL ***
+
+* Fact name generalization and consolidation:
+  neq_one_mod_two, mod_2_not_eq_zero_eq_one_int ~> not_mod_2_eq_0_eq_1
+
 
 
 New in Isabelle2013-1 (November 2013)
--- a/src/HOL/Divides.thy	Thu Oct 31 11:44:20 2013 +0100
+++ b/src/HOL/Divides.thy	Thu Oct 31 11:44:20 2013 +0100
@@ -2620,11 +2620,6 @@
   "Suc 0 mod numeral v' = nat (1 mod numeral v')"
   by (subst nat_mod_distrib) simp_all
 
-lemma mod_2_not_eq_zero_eq_one_int:
-  fixes k :: int
-  shows "k mod 2 \<noteq> 0 \<longleftrightarrow> k mod 2 = 1"
-  by auto
-
 instance int :: semiring_numeral_div
   by intro_classes (auto intro: zmod_le_nonneg_dividend
     simp add: zmult_div_cancel
--- a/src/HOL/Library/Code_Target_Int.thy	Thu Oct 31 11:44:20 2013 +0100
+++ b/src/HOL/Library/Code_Target_Int.thy	Thu Oct 31 11:44:20 2013 +0100
@@ -99,7 +99,7 @@
 proof -
   from mod_div_equality have *: "of_int k = of_int (k div 2 * 2 + k mod 2)" by simp
   show ?thesis
-    by (simp add: Let_def divmod_int_mod_div mod_2_not_eq_zero_eq_one_int
+    by (simp add: Let_def divmod_int_mod_div not_mod_2_eq_0_eq_1
       of_int_add [symmetric]) (simp add: * mult_commute)
 qed
 
--- a/src/HOL/Parity.thy	Thu Oct 31 11:44:20 2013 +0100
+++ b/src/HOL/Parity.thy	Thu Oct 31 11:44:20 2013 +0100
@@ -11,11 +11,14 @@
 
 class even_odd = 
   fixes even :: "'a \<Rightarrow> bool"
+begin
 
-abbreviation
-  odd :: "'a\<Colon>even_odd \<Rightarrow> bool" where
+abbreviation odd :: "'a \<Rightarrow> bool"
+where
   "odd x \<equiv> \<not> even x"
 
+end
+
 instantiation nat and int  :: even_odd
 begin
 
@@ -52,7 +55,7 @@
   unfolding even_def by simp
 
 (* TODO: proper simp rules for Num.Bit0, Num.Bit1 *)
-declare even_def[of "neg_numeral v", simp] for v
+declare even_def [of "neg_numeral v", simp] for v
 
 lemma even_numeral_nat [simp]: "even (numeral (Num.Bit0 k) :: nat)"
   unfolding even_nat_def by simp
@@ -62,13 +65,6 @@
 
 subsection {* Even and odd are mutually exclusive *}
 
-lemma int_pos_lt_two_imp_zero_or_one:
-    "0 <= x ==> (x::int) < 2 ==> x = 0 | x = 1"
-  by presburger
-
-lemma neq_one_mod_two [simp, presburger]: 
-  "((x::int) mod 2 ~= 0) = (x mod 2 = 1)" by presburger
-
 
 subsection {* Behavior under integer arithmetic operations *}
 declare dvd_def[algebra]
@@ -158,10 +154,6 @@
 
 subsection {* Equivalent definitions *}
 
-lemma nat_lt_two_imp_zero_or_one:
-  "(x::nat) < Suc (Suc 0) ==> x = 0 | x = Suc 0"
-by presburger
-
 lemma even_nat_mod_two_eq_zero: "even (x::nat) ==> x mod (Suc (Suc 0)) = 0"
 by presburger
 
@@ -244,7 +236,7 @@
 apply (metis field_power_not_zero divisors_zero order_antisym_conv zero_le_square)
 done
 
-lemma zero_le_power_eq[presburger]: "(0 <= (x::'a::{linordered_idom}) ^ n) =
+lemma zero_le_power_eq [presburger]: "(0 <= (x::'a::{linordered_idom}) ^ n) =
     (even n | (odd n & 0 <= x))"
   apply auto
   apply (subst zero_le_odd_power [symmetric])
@@ -277,9 +269,6 @@
   apply (simp add: zero_le_even_power)
   done
 
-lemma zero_less_power_nat_eq[presburger]: "(0 < (x::nat) ^ n) = (n = 0 | 0 < x)"
-  by (induct n) auto
-
 lemma power_minus_even [simp]: "even n ==>
     (- x)^n = (x^n::'a::{comm_ring_1})"
   apply (subst power_minus)
@@ -336,13 +325,6 @@
 
 lemma odd_add [simp]: "odd(m + n::nat) = (odd m \<noteq> odd n)" by presburger
 
-lemma div_Suc: "Suc a div c = a div c + Suc 0 div c +
-    (a mod c + Suc 0 mod c) div c" 
-  apply (subgoal_tac "Suc a = a + Suc 0")
-  apply (erule ssubst)
-  apply (rule div_add1_eq, simp)
-  done
-
 lemma lemma_even_div2 [simp]: "even (n::nat) ==> (n + 1) div 2 = n div 2" by presburger
 
 lemma lemma_not_even_div2 [simp]: "~even n ==> (n + 1) div 2 = Suc (n div 2)"
@@ -359,31 +341,29 @@
 text {* Simplify, when the exponent is a numeral *}
 
 lemmas zero_le_power_eq_numeral [simp] =
-    zero_le_power_eq [of _ "numeral w"] for w
+  zero_le_power_eq [of _ "numeral w"] for w
 
 lemmas zero_less_power_eq_numeral [simp] =
-    zero_less_power_eq [of _ "numeral w"] for w
+  zero_less_power_eq [of _ "numeral w"] for w
 
 lemmas power_le_zero_eq_numeral [simp] =
-    power_le_zero_eq [of _ "numeral w"] for w
+  power_le_zero_eq [of _ "numeral w"] for w
 
 lemmas power_less_zero_eq_numeral [simp] =
-    power_less_zero_eq [of _ "numeral w"] for w
+  power_less_zero_eq [of _ "numeral w"] for w
 
 lemmas zero_less_power_nat_eq_numeral [simp] =
-    zero_less_power_nat_eq [of _ "numeral w"] for w
+  nat_zero_less_power_iff [of _ "numeral w"] for w
 
-lemmas power_eq_0_iff_numeral [simp] = power_eq_0_iff [of _ "numeral w"] for w
+lemmas power_eq_0_iff_numeral [simp] =
+  power_eq_0_iff [of _ "numeral w"] for w
 
-lemmas power_even_abs_numeral [simp] = power_even_abs [of "numeral w" _] for w
+lemmas power_even_abs_numeral [simp] =
+  power_even_abs [of "numeral w" _] for w
 
 
 subsection {* An Equivalence for @{term [source] "0 \<le> a^n"} *}
 
-lemma even_power_le_0_imp_0:
-    "a ^ (2*k) \<le> (0::'a::{linordered_idom}) ==> a=0"
-  by (induct k) (auto simp add: zero_le_mult_iff mult_le_0_iff)
-
 lemma zero_le_power_iff[presburger]:
   "(0 \<le> a^n) = (0 \<le> (a::'a::{linordered_idom}) | even n)"
 proof cases
@@ -395,9 +375,10 @@
   assume odd: "odd n"
   then obtain k where "n = Suc(2*k)"
     by (auto simp add: odd_nat_equiv_def2 numeral_2_eq_2)
-  thus ?thesis
-    by (auto simp add: zero_le_mult_iff zero_le_even_power
-             dest!: even_power_le_0_imp_0)
+  moreover have "a ^ (2 * k) \<le> 0 \<Longrightarrow> a = 0"
+    by (induct k) (auto simp add: zero_le_mult_iff mult_le_0_iff)
+  ultimately show ?thesis
+    by (auto simp add: zero_le_mult_iff zero_le_even_power)
 qed
 
 
@@ -409,7 +390,6 @@
 lemma odd_plus_one_div_two: "odd (x::int) ==> (x + 1) div 2 = x div 2 + 1" by presburger
 
 lemma [presburger]: "(Suc x) div Suc (Suc 0) = x div Suc (Suc 0) \<longleftrightarrow> even x" by presburger
-lemma [presburger]: "(Suc x) div Suc (Suc 0) = x div Suc (Suc 0) \<longleftrightarrow> even x" by presburger
 lemma even_nat_plus_one_div_two: "even (x::nat) ==>
     (Suc x) div Suc (Suc 0) = x div Suc (Suc 0)" by presburger
 
@@ -417,3 +397,4 @@
     (Suc x) div Suc (Suc 0) = Suc (x div Suc (Suc 0))" by presburger
 
 end
+
--- a/src/HOL/Presburger.thy	Thu Oct 31 11:44:20 2013 +0100
+++ b/src/HOL/Presburger.thy	Thu Oct 31 11:44:20 2013 +0100
@@ -360,11 +360,15 @@
   apply simp
   done
 
-lemma zdvd_mono: assumes not0: "(k::int) \<noteq> 0"
-shows "((m::int) dvd t) \<equiv> (k*m dvd k*t)" 
-  using not0 by (simp add: dvd_def)
+lemma zdvd_mono:
+  fixes k m t :: int
+  assumes "k \<noteq> 0"
+  shows "m dvd t \<equiv> k * m dvd k * t" 
+  using assms by simp
 
-lemma uminus_dvd_conv: "(d dvd (t::int)) \<equiv> (-d dvd t)" "(d dvd (t::int)) \<equiv> (d dvd -t)"
+lemma uminus_dvd_conv:
+  fixes d t :: int
+  shows "d dvd t \<equiv> - d dvd t" and "d dvd t \<equiv> d dvd - t"
   by simp_all
 
 text {* \bigskip Theorems for transforming predicates on nat to predicates on @{text int}*}
@@ -406,24 +410,23 @@
   end
 *} "Cooper's algorithm for Presburger arithmetic"
 
-declare dvd_eq_mod_eq_0[symmetric, presburger]
-declare mod_1[presburger] 
-declare mod_0[presburger]
-declare mod_by_1[presburger]
-declare mod_self[presburger]
-declare mod_by_0[presburger]
-declare mod_div_trivial[presburger]
-declare div_mod_equality2[presburger]
-declare div_mod_equality[presburger]
-declare mod_div_equality2[presburger]
-declare mod_div_equality[presburger]
-declare mod_mult_self1[presburger]
-declare mod_mult_self2[presburger]
-declare div_mod_equality[presburger]
-declare div_mod_equality2[presburger]
+declare dvd_eq_mod_eq_0 [symmetric, presburger]
+declare mod_1 [presburger] 
+declare mod_0 [presburger]
+declare mod_by_1 [presburger]
+declare mod_self [presburger]
+declare div_by_0 [presburger]
+declare mod_by_0 [presburger]
+declare mod_div_trivial [presburger]
+declare div_mod_equality2 [presburger]
+declare div_mod_equality [presburger]
+declare mod_div_equality2 [presburger]
+declare mod_div_equality [presburger]
+declare mod_mult_self1 [presburger]
+declare mod_mult_self2 [presburger]
 declare mod2_Suc_Suc[presburger]
-lemma [presburger]: "(a::int) div 0 = 0" and [presburger]: "a mod 0 = a"
-by simp_all
+declare not_mod_2_eq_0_eq_1 [presburger] 
+declare nat_zero_less_power_iff [presburger]
 
 lemma [presburger, algebra]: "m mod 2 = (1::nat) \<longleftrightarrow> \<not> 2 dvd m " by presburger
 lemma [presburger, algebra]: "m mod 2 = Suc 0 \<longleftrightarrow> \<not> 2 dvd m " by presburger
@@ -432,3 +435,4 @@
 lemma [presburger, algebra]: "m mod 2 = (1::int) \<longleftrightarrow> \<not> 2 dvd m " by presburger
 
 end
+
--- a/src/HOL/Tools/Qelim/qelim.ML	Thu Oct 31 11:44:20 2013 +0100
+++ b/src/HOL/Tools/Qelim/qelim.ML	Thu Oct 31 11:44:20 2013 +0100
@@ -37,7 +37,7 @@
      val th = Thm.abstract_rule s x ((conv env' then_conv ncv env') p')
                    |> Drule.arg_cong_rule e
      val th' = simpex_conv (Thm.rhs_of th)
-     val (l,r) = Thm.dest_equals (cprop_of th')
+     val (_, r) = Thm.dest_equals (cprop_of th')
     in if Thm.is_reflexive th' then Thm.transitive th (qcv env (Thm.rhs_of th))
        else Thm.transitive (Thm.transitive th th') (conv env r) end
   | Const(@{const_name Ex},_)$ _ => (Thm.eta_long_conversion then_conv conv env) p