src/HOL/Rings.thy
changeset 60516 0826b7025d07
parent 60429 d3d1e185cd63
child 60517 f16e4fb20652
equal deleted inserted replaced
60515:484559628038 60516:0826b7025d07
   438   case True then show ?thesis by auto
   438   case True then show ?thesis by auto
   439 qed
   439 qed
   440 
   440 
   441 end
   441 end
   442 
   442 
   443 class ring_no_zero_divisors = ring + semiring_no_zero_divisors
   443 class semiring_no_zero_divisors_cancel = semiring_no_zero_divisors +
   444 begin
   444   assumes mult_cancel_right [simp]: "a * c = b * c \<longleftrightarrow> c = 0 \<or> a = b"
   445 
   445     and mult_cancel_left [simp]: "c * a = c * b \<longleftrightarrow> c = 0 \<or> a = b"
   446 text{*Cancellation of equalities with a common factor*}
   446 begin
   447 lemma mult_cancel_right [simp]:
       
   448   "a * c = b * c \<longleftrightarrow> c = 0 \<or> a = b"
       
   449 proof -
       
   450   have "(a * c = b * c) = ((a - b) * c = 0)"
       
   451     by (simp add: algebra_simps)
       
   452   thus ?thesis by (simp add: disj_commute)
       
   453 qed
       
   454 
       
   455 lemma mult_cancel_left [simp]:
       
   456   "c * a = c * b \<longleftrightarrow> c = 0 \<or> a = b"
       
   457 proof -
       
   458   have "(c * a = c * b) = (c * (a - b) = 0)"
       
   459     by (simp add: algebra_simps)
       
   460   thus ?thesis by simp
       
   461 qed
       
   462 
   447 
   463 lemma mult_left_cancel:
   448 lemma mult_left_cancel:
   464   "c \<noteq> 0 \<Longrightarrow> c * a = c * b \<longleftrightarrow> a = b"
   449   "c \<noteq> 0 \<Longrightarrow> c * a = c * b \<longleftrightarrow> a = b"
   465   by simp 
   450   by simp 
   466 
   451 
   467 lemma mult_right_cancel:
   452 lemma mult_right_cancel:
   468   "c \<noteq> 0 \<Longrightarrow> a * c = b * c \<longleftrightarrow> a = b"
   453   "c \<noteq> 0 \<Longrightarrow> a * c = b * c \<longleftrightarrow> a = b"
   469   by simp 
   454   by simp 
       
   455 
       
   456 end
       
   457 
       
   458 class ring_no_zero_divisors = ring + semiring_no_zero_divisors
       
   459 begin
       
   460 
       
   461 subclass semiring_no_zero_divisors_cancel
       
   462 proof
       
   463   fix a b c
       
   464   have "a * c = b * c \<longleftrightarrow> (a - b) * c = 0"
       
   465     by (simp add: algebra_simps)
       
   466   also have "\<dots> \<longleftrightarrow> c = 0 \<or> a = b"
       
   467     by auto
       
   468   finally show "a * c = b * c \<longleftrightarrow> c = 0 \<or> a = b" .
       
   469   have "c * a = c * b \<longleftrightarrow> c * (a - b) = 0"
       
   470     by (simp add: algebra_simps)
       
   471   also have "\<dots> \<longleftrightarrow> c = 0 \<or> a = b"
       
   472     by auto
       
   473   finally show "c * a = c * b \<longleftrightarrow> c = 0 \<or> a = b" .
       
   474 qed
   470 
   475 
   471 end
   476 end
   472 
   477 
   473 class ring_1_no_zero_divisors = ring_1 + ring_no_zero_divisors
   478 class ring_1_no_zero_divisors = ring_1 + ring_no_zero_divisors
   474 begin
   479 begin
   529   also have "(\<exists>k. b * c = (a * k) * c) \<longleftrightarrow> c = 0 \<or> a dvd b"
   534   also have "(\<exists>k. b * c = (a * k) * c) \<longleftrightarrow> c = 0 \<or> a dvd b"
   530     unfolding dvd_def by simp
   535     unfolding dvd_def by simp
   531   finally show ?thesis .
   536   finally show ?thesis .
   532 qed
   537 qed
   533 
   538 
   534 lemma square_eq_iff: "a * a = b * b \<longleftrightarrow> (a = b \<or> a = - b)"
   539 lemma square_eq_iff: "a * a = b * b \<longleftrightarrow> a = b \<or> a = - b"
   535 proof
   540 proof
   536   assume "a * a = b * b"
   541   assume "a * a = b * b"
   537   then have "(a - b) * (a + b) = 0"
   542   then have "(a - b) * (a + b) = 0"
   538     by (simp add: algebra_simps)
   543     by (simp add: algebra_simps)
   539   then show "a = b \<or> a = - b"
   544   then show "a = b \<or> a = - b"
   591 begin
   596 begin
   592 
   597 
   593 lemma nonzero_mult_divide_cancel_left [simp]:
   598 lemma nonzero_mult_divide_cancel_left [simp]:
   594   "a \<noteq> 0 \<Longrightarrow> (a * b) div a = b"
   599   "a \<noteq> 0 \<Longrightarrow> (a * b) div a = b"
   595   using nonzero_mult_divide_cancel_right [of a b] by (simp add: ac_simps)
   600   using nonzero_mult_divide_cancel_right [of a b] by (simp add: ac_simps)
       
   601 
       
   602 subclass semiring_no_zero_divisors_cancel
       
   603 proof
       
   604   fix a b c
       
   605   { fix a b c
       
   606     show "a * c = b * c \<longleftrightarrow> c = 0 \<or> a = b"
       
   607     proof (cases "c = 0")
       
   608       case True then show ?thesis by simp
       
   609     next
       
   610       case False
       
   611       { assume "a * c = b * c"
       
   612         then have "a * c div c = b * c div c"
       
   613           by simp
       
   614         with False have "a = b"
       
   615           by simp
       
   616       } then show ?thesis by auto
       
   617     qed
       
   618   }
       
   619   from this [of a c b]
       
   620   show "c * a = c * b \<longleftrightarrow> c = 0 \<or> a = b"
       
   621     by (simp add: ac_simps)
       
   622 qed
       
   623 
       
   624 lemma div_self [simp]:
       
   625   assumes "a \<noteq> 0"
       
   626   shows "a div a = 1"
       
   627   using assms nonzero_mult_divide_cancel_left [of a 1] by simp
   596 
   628 
   597 end
   629 end
   598 
   630 
   599 class idom_divide = idom + semidom_divide
   631 class idom_divide = idom + semidom_divide
   600 
   632