src/HOL/Parity.thy
changeset 58645 94bef115c08f
parent 54489 03ff4d1e6784
child 58678 398e05aa84d4
equal deleted inserted replaced
58644:8171ef293634 58645:94bef115c08f
    12 class even_odd = semiring_div_parity
    12 class even_odd = semiring_div_parity
    13 begin
    13 begin
    14 
    14 
    15 definition even :: "'a \<Rightarrow> bool"
    15 definition even :: "'a \<Rightarrow> bool"
    16 where
    16 where
    17   even_def [presburger]: "even a \<longleftrightarrow> a mod 2 = 0"
    17   [algebra]: "even a \<longleftrightarrow> 2 dvd a"
    18 
    18 
    19 lemma even_iff_2_dvd [algebra]:
    19 lemmas even_iff_2_dvd = even_def
    20   "even a \<longleftrightarrow> 2 dvd a"
    20 
       
    21 lemma even_iff_mod_2_eq_zero [presburger]:
       
    22   "even a \<longleftrightarrow> a mod 2 = 0"
    21   by (simp add: even_def dvd_eq_mod_eq_0)
    23   by (simp add: even_def dvd_eq_mod_eq_0)
    22 
    24 
    23 lemma even_zero [simp]:
    25 lemma even_zero [simp]:
    24   "even 0"
    26   "even 0"
    25   by (simp add: even_def)
    27   by (simp add: even_iff_mod_2_eq_zero)
    26 
    28 
    27 lemma even_times_anything:
    29 lemma even_times_anything:
    28   "even a \<Longrightarrow> even (a * b)"
    30   "even a \<Longrightarrow> even (a * b)"
    29   by (simp add: even_iff_2_dvd)
    31   by (simp add: even_iff_2_dvd)
    30 
    32 
    36 where
    38 where
    37   "odd a \<equiv> \<not> even a"
    39   "odd a \<equiv> \<not> even a"
    38 
    40 
    39 lemma odd_times_odd:
    41 lemma odd_times_odd:
    40   "odd a \<Longrightarrow> odd b \<Longrightarrow> odd (a * b)" 
    42   "odd a \<Longrightarrow> odd b \<Longrightarrow> odd (a * b)" 
    41   by (auto simp add: even_def mod_mult_left_eq)
    43   by (auto simp add: even_iff_mod_2_eq_zero mod_mult_left_eq)
    42 
    44 
    43 lemma even_product [simp, presburger]:
    45 lemma even_product [simp, presburger]:
    44   "even (a * b) \<longleftrightarrow> even a \<or> even b"
    46   "even (a * b) \<longleftrightarrow> even a \<or> even b"
    45   apply (auto simp add: even_times_anything anything_times_even)
    47   apply (auto simp add: even_times_anything anything_times_even)
    46   apply (rule ccontr)
    48   apply (rule ccontr)
    51 
    53 
    52 instance nat and int  :: even_odd ..
    54 instance nat and int  :: even_odd ..
    53 
    55 
    54 lemma even_nat_def [presburger]:
    56 lemma even_nat_def [presburger]:
    55   "even x \<longleftrightarrow> even (int x)"
    57   "even x \<longleftrightarrow> even (int x)"
    56   by (auto simp add: even_def int_eq_iff int_mult nat_mult_distrib)
    58   by (auto simp add: even_iff_mod_2_eq_zero int_eq_iff int_mult nat_mult_distrib)
    57   
    59   
    58 lemma transfer_int_nat_relations:
    60 lemma transfer_int_nat_relations:
    59   "even (int x) \<longleftrightarrow> even x"
    61   "even (int x) \<longleftrightarrow> even x"
    60   by (simp add: even_nat_def)
    62   by (simp add: even_nat_def)
    61 
    63 
    70 lemma odd_1_nat [simp]:
    72 lemma odd_1_nat [simp]:
    71   "odd (1::nat)"
    73   "odd (1::nat)"
    72   by presburger
    74   by presburger
    73 
    75 
    74 lemma even_numeral_int [simp]: "even (numeral (Num.Bit0 k) :: int)"
    76 lemma even_numeral_int [simp]: "even (numeral (Num.Bit0 k) :: int)"
    75   unfolding even_def by simp
    77   unfolding even_iff_mod_2_eq_zero by simp
    76 
    78 
    77 lemma odd_numeral_int [simp]: "odd (numeral (Num.Bit1 k) :: int)"
    79 lemma odd_numeral_int [simp]: "odd (numeral (Num.Bit1 k) :: int)"
    78   unfolding even_def by simp
    80   unfolding even_iff_mod_2_eq_zero by simp
    79 
    81 
    80 (* TODO: proper simp rules for Num.Bit0, Num.Bit1 *)
    82 (* TODO: proper simp rules for Num.Bit0, Num.Bit1 *)
    81 declare even_def [of "- numeral v", simp] for v
    83 declare even_iff_mod_2_eq_zero [of "- numeral v", simp] for v
    82 
    84 
    83 lemma even_numeral_nat [simp]: "even (numeral (Num.Bit0 k) :: nat)"
    85 lemma even_numeral_nat [simp]: "even (numeral (Num.Bit0 k) :: nat)"
    84   unfolding even_nat_def by simp
    86   unfolding even_nat_def by simp
    85 
    87 
    86 lemma odd_numeral_nat [simp]: "odd (numeral (Num.Bit1 k) :: nat)"
    88 lemma odd_numeral_nat [simp]: "odd (numeral (Num.Bit1 k) :: nat)"