src/HOL/Ring_and_Field.thy
changeset 14603 985eb6708207
parent 14569 78b75a9eec01
child 14738 83f1a514dcb4
equal deleted inserted replaced
14602:e06ded775eca 14603:985eb6708207
    17   commute:     "x + y = y + x"
    17   commute:     "x + y = y + x"
    18   assoc:       "(x + y) + z = x + (y + z)"
    18   assoc:       "(x + y) + z = x + (y + z)"
    19   zero [simp]: "0 + x = x"
    19   zero [simp]: "0 + x = x"
    20 
    20 
    21 lemma plus_ac0_left_commute: "x + (y+z) = y + ((x+z)::'a::plus_ac0)"
    21 lemma plus_ac0_left_commute: "x + (y+z) = y + ((x+z)::'a::plus_ac0)"
    22 apply (rule plus_ac0.commute [THEN trans])
    22 by(rule mk_left_commute[of "op +",OF plus_ac0.assoc plus_ac0.commute])
    23 apply (rule plus_ac0.assoc [THEN trans])
       
    24 apply (rule plus_ac0.commute [THEN arg_cong])
       
    25 done
       
    26 
    23 
    27 lemma plus_ac0_zero_right [simp]: "x + 0 = (x ::'a::plus_ac0)"
    24 lemma plus_ac0_zero_right [simp]: "x + 0 = (x ::'a::plus_ac0)"
    28 apply (rule plus_ac0.commute [THEN trans])
    25 apply (rule plus_ac0.commute [THEN trans])
    29 apply (rule plus_ac0.zero)
    26 apply (rule plus_ac0.zero)
    30 done
    27 done
    37   assoc:       "(x * y) * z = x * (y * z)"
    34   assoc:       "(x * y) * z = x * (y * z)"
    38   one [simp]:  "1 * x = x"
    35   one [simp]:  "1 * x = x"
    39 
    36 
    40 theorem times_ac1_left_commute: "(x::'a::times_ac1) * ((y::'a) * z) =
    37 theorem times_ac1_left_commute: "(x::'a::times_ac1) * ((y::'a) * z) =
    41   y * (x * z)"
    38   y * (x * z)"
    42 proof -
    39 by(rule mk_left_commute[of "op *",OF times_ac1.assoc times_ac1.commute])
    43   have "(x::'a::times_ac1) * (y * z) = (x * y) * z"
       
    44     by (rule times_ac1.assoc [THEN sym])
       
    45   also have "x * y = y * x"
       
    46     by (rule times_ac1.commute)
       
    47   also have "(y * x) * z = y * (x * z)"
       
    48     by (rule times_ac1.assoc)
       
    49   finally show ?thesis .
       
    50 qed
       
    51 
    40 
    52 theorem times_ac1_one_right [simp]: "(x::'a::times_ac1) * 1 = x"
    41 theorem times_ac1_one_right [simp]: "(x::'a::times_ac1) * 1 = x"
    53 proof -
    42 proof -
    54   have "x * 1 = 1 * x"
    43   have "x * 1 = 1 * x"
    55     by (rule times_ac1.commute)
    44     by (rule times_ac1.commute)
   523        diff_minus [symmetric]
   512        diff_minus [symmetric]
   524        add_diff_eq diff_add_eq diff_diff_eq diff_diff_eq2
   513        add_diff_eq diff_add_eq diff_diff_eq diff_diff_eq2
   525        diff_less_eq less_diff_eq diff_le_eq le_diff_eq
   514        diff_less_eq less_diff_eq diff_le_eq le_diff_eq
   526        diff_eq_eq eq_diff_eq
   515        diff_eq_eq eq_diff_eq
   527 
   516 
       
   517 text{*This list of rewrites decides ring equalities by ordered rewriting.*}
       
   518 lemmas ring_eq_simps =
       
   519   times_ac1.assoc times_ac1.commute times_ac1_left_commute
       
   520   left_distrib right_distrib left_diff_distrib right_diff_distrib
       
   521   plus_ac0.assoc plus_ac0.commute plus_ac0_left_commute
       
   522   add_diff_eq diff_add_eq diff_diff_eq diff_diff_eq2
       
   523   diff_eq_eq eq_diff_eq
   528 
   524 
   529 subsection{*Lemmas for the @{text cancel_numerals} simproc*}
   525 subsection{*Lemmas for the @{text cancel_numerals} simproc*}
   530 
   526 
   531 lemma eq_iff_diff_eq_0: "(a = b) = (a-b = (0::'a::abelian_group))"
   527 lemma eq_iff_diff_eq_0: "(a = b) = (a-b = (0::'a::abelian_group))"
   532 by (simp add: compare_rls)
   528 by (simp add: compare_rls)