src/HOL/Ring_and_Field.thy
changeset 14353 79f9fbef9106
parent 14348 744c868ee0b7
child 14365 3d4df8c166ae
equal deleted inserted replaced
14352:a8b1a44d8264 14353:79f9fbef9106
     5     License: GPL (GNU GENERAL PUBLIC LICENSE)
     5     License: GPL (GNU GENERAL PUBLIC LICENSE)
     6 *)
     6 *)
     7 
     7 
     8 header {*
     8 header {*
     9   \title{Ring and field structures}
     9   \title{Ring and field structures}
    10   \author{Gertrud Bauer and Markus Wenzel}
    10   \author{Gertrud Bauer, L. C. Paulson and Markus Wenzel}
    11 *}
    11 *}
    12 
    12 
    13 theory Ring_and_Field = Inductive:
    13 theory Ring_and_Field = Inductive:
    14 
       
    15 text{*Lemmas and extension to semirings by L. C. Paulson*}
       
    16 
    14 
    17 subsection {* Abstract algebraic structures *}
    15 subsection {* Abstract algebraic structures *}
    18 
    16 
    19 axclass semiring \<subseteq> zero, one, plus, times
    17 axclass semiring \<subseteq> zero, one, plus, times
    20   add_assoc: "(a + b) + c = a + (b + c)"
    18   add_assoc: "(a + b) + c = a + (b + c)"
   165 lemma mult_left_commute: "a * (b * c) = b * (a * (c::'a::semiring))"
   163 lemma mult_left_commute: "a * (b * c) = b * (a * (c::'a::semiring))"
   166   by (rule mk_left_commute [of "op *", OF mult_assoc mult_commute])
   164   by (rule mk_left_commute [of "op *", OF mult_assoc mult_commute])
   167 
   165 
   168 theorems mult_ac = mult_assoc mult_commute mult_left_commute
   166 theorems mult_ac = mult_assoc mult_commute mult_left_commute
   169 
   167 
   170 lemma mult_left_zero [simp]: "0 * a = (0::'a::semiring)"
   168 lemma mult_zero_left [simp]: "0 * a = (0::'a::semiring)"
   171 proof -
   169 proof -
   172   have "0*a + 0*a = 0*a + 0"
   170   have "0*a + 0*a = 0*a + 0"
   173     by (simp add: left_distrib [symmetric])
   171     by (simp add: left_distrib [symmetric])
   174   thus ?thesis by (simp only: add_left_cancel)
   172   thus ?thesis by (simp only: add_left_cancel)
   175 qed
   173 qed
   176 
   174 
   177 lemma mult_right_zero [simp]: "a * 0 = (0::'a::semiring)"
   175 lemma mult_zero_right [simp]: "a * 0 = (0::'a::semiring)"
   178   by (simp add: mult_commute)
   176   by (simp add: mult_commute)
   179 
   177 
   180 
   178 
   181 subsection {* Distribution rules *}
   179 subsection {* Distribution rules *}
   182 
   180 
  1331      "(c/a = c/b) = (c = 0 | a = (b::'a::{field,division_by_zero}))" 
  1329      "(c/a = c/b) = (c = 0 | a = (b::'a::{field,division_by_zero}))" 
  1332 apply (case_tac "c=0", simp) 
  1330 apply (case_tac "c=0", simp) 
  1333 apply (simp add: divide_inverse_zero field_mult_cancel_left) 
  1331 apply (simp add: divide_inverse_zero field_mult_cancel_left) 
  1334 done
  1332 done
  1335 
  1333 
       
  1334 subsection {* Division and the Number One *}
       
  1335 
       
  1336 text{*Simplify expressions equated with 1*}
       
  1337 lemma divide_eq_1_iff [simp]:
       
  1338      "(a/b = 1) = (b \<noteq> 0 & a = (b::'a::{field,division_by_zero}))"
       
  1339 apply (case_tac "b=0", simp) 
       
  1340 apply (simp add: right_inverse_eq) 
       
  1341 done
       
  1342 
       
  1343 
       
  1344 lemma one_eq_divide_iff [simp]:
       
  1345      "(1 = a/b) = (b \<noteq> 0 & a = (b::'a::{field,division_by_zero}))"
       
  1346 by (simp add: eq_commute [of 1])  
       
  1347 
       
  1348 lemma zero_eq_1_divide_iff [simp]:
       
  1349      "((0::'a::{ordered_field,division_by_zero}) = 1/a) = (a = 0)"
       
  1350 apply (case_tac "a=0", simp) 
       
  1351 apply (auto simp add: nonzero_eq_divide_eq) 
       
  1352 done
       
  1353 
       
  1354 lemma one_divide_eq_0_iff [simp]:
       
  1355      "(1/a = (0::'a::{ordered_field,division_by_zero})) = (a = 0)"
       
  1356 apply (case_tac "a=0", simp) 
       
  1357 apply (insert zero_neq_one [THEN not_sym]) 
       
  1358 apply (auto simp add: nonzero_divide_eq_eq) 
       
  1359 done
       
  1360 
       
  1361 text{*Simplify expressions such as @{text "0 < 1/x"} to @{text "0 < x"}*}
       
  1362 declare zero_less_divide_iff [of "1", simp]
       
  1363 declare divide_less_0_iff [of "1", simp]
       
  1364 declare zero_le_divide_iff [of "1", simp]
       
  1365 declare divide_le_0_iff [of "1", simp]
       
  1366 
  1336 
  1367 
  1337 subsection {* Ordering Rules for Division *}
  1368 subsection {* Ordering Rules for Division *}
  1338 
  1369 
  1339 lemma divide_strict_right_mono:
  1370 lemma divide_strict_right_mono:
  1340      "[|a < b; 0 < c|] ==> a / c < b / (c::'a::ordered_field)"
  1371      "[|a < b; 0 < c|] ==> a / c < b / (c::'a::ordered_field)"
  1410 apply (case_tac "a=0 | b=0", force) 
  1441 apply (case_tac "a=0 | b=0", force) 
  1411 apply (auto elim: order_less_asym
  1442 apply (auto elim: order_less_asym
  1412             simp add: abs_if mult_less_0_iff linorder_neq_iff
  1443             simp add: abs_if mult_less_0_iff linorder_neq_iff
  1413                   minus_mult_left [symmetric] minus_mult_right [symmetric])  
  1444                   minus_mult_left [symmetric] minus_mult_right [symmetric])  
  1414 done
  1445 done
  1415 
       
  1416 
  1446 
  1417 lemma abs_mult_self: "abs a * abs a = a * (a::'a::ordered_ring)"
  1447 lemma abs_mult_self: "abs a * abs a = a * (a::'a::ordered_ring)"
  1418 by (simp add: abs_if) 
  1448 by (simp add: abs_if) 
  1419 
  1449 
  1420 lemma abs_eq_0 [simp]: "(abs a = 0) = (a = (0::'a::ordered_ring))"
  1450 lemma abs_eq_0 [simp]: "(abs a = 0) = (a = (0::'a::ordered_ring))"
  1569 val equation_minus_iff = thm"equation_minus_iff";
  1599 val equation_minus_iff = thm"equation_minus_iff";
  1570 val minus_equation_iff = thm"minus_equation_iff";
  1600 val minus_equation_iff = thm"minus_equation_iff";
  1571 val mult_1 = thm"mult_1";
  1601 val mult_1 = thm"mult_1";
  1572 val mult_1_right = thm"mult_1_right";
  1602 val mult_1_right = thm"mult_1_right";
  1573 val mult_left_commute = thm"mult_left_commute";
  1603 val mult_left_commute = thm"mult_left_commute";
  1574 val mult_left_zero = thm"mult_left_zero";
  1604 val mult_zero_left = thm"mult_zero_left";
  1575 val mult_right_zero = thm"mult_right_zero";
  1605 val mult_zero_right = thm"mult_zero_right";
  1576 val left_distrib = thm "left_distrib";
  1606 val left_distrib = thm "left_distrib";
  1577 val right_distrib = thm"right_distrib";
  1607 val right_distrib = thm"right_distrib";
  1578 val combine_common_factor = thm"combine_common_factor";
  1608 val combine_common_factor = thm"combine_common_factor";
  1579 val minus_add_distrib = thm"minus_add_distrib";
  1609 val minus_add_distrib = thm"minus_add_distrib";
  1580 val minus_mult_left = thm"minus_mult_left";
  1610 val minus_mult_left = thm"minus_mult_left";