src/HOL/Algebra/abstract/Ring.thy
author wenzelm
Fri, 21 Oct 2005 18:14:34 +0200
changeset 17956 369e2af8ee45
parent 17877 67d5ab1cb0d8
child 20044 92cc2f4c7335
permissions -rw-r--r--
Goal.prove;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7998
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
     1
(*
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
     2
  Title:     The algebraic hierarchy of rings as axiomatic classes
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
     3
  Id:        $Id$
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
     4
  Author:    Clemens Ballarin, started 9 December 1996
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
     5
  Copyright: Clemens Ballarin
7998
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
     6
*)
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
     7
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
     8
header {* The algebraic hierarchy of rings as axiomatic classes *}
7998
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
     9
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 16052
diff changeset
    10
theory Ring imports Main
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 16052
diff changeset
    11
uses ("order.ML") begin
7998
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    12
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    13
section {* Constants *}
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    14
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    15
text {* Most constants are already declared by HOL. *}
7998
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    16
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    17
consts
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    18
  assoc         :: "['a::times, 'a] => bool"              (infixl 50)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    19
  irred         :: "'a::{zero, one, times} => bool"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    20
  prime         :: "'a::{zero, one, times} => bool"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    21
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    22
section {* Axioms *}
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    23
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    24
subsection {* Ring axioms *}
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    25
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    26
axclass ring < zero, one, plus, minus, times, inverse, power
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    27
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    28
  a_assoc:      "(a + b) + c = a + (b + c)"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    29
  l_zero:       "0 + a = a"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    30
  l_neg:        "(-a) + a = 0"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    31
  a_comm:       "a + b = b + a"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    32
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    33
  m_assoc:      "(a * b) * c = a * (b * c)"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    34
  l_one:        "1 * a = a"
7998
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    35
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    36
  l_distr:      "(a + b) * c = a * c + b * c"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    37
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    38
  m_comm:       "a * b = b * a"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    39
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    40
  -- {* Definition of derived operations *}
7998
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    41
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    42
  minus_def:    "a - b = a + (-b)"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    43
  inverse_def:  "inverse a = (if a dvd 1 then THE x. a*x = 1 else 0)"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    44
  divide_def:   "a / b = a * inverse b"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    45
  power_def:    "a ^ n = nat_rec 1 (%u b. b * a) n"
7998
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    46
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    47
defs
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    48
  assoc_def:    "a assoc b == a dvd b & b dvd a"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    49
  irred_def:    "irred a == a ~= 0 & ~ a dvd 1
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    50
                          & (ALL d. d dvd a --> d dvd 1 | a dvd d)"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    51
  prime_def:    "prime p == p ~= 0 & ~ p dvd 1
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    52
                          & (ALL a b. p dvd (a*b) --> p dvd a | p dvd b)"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    53
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    54
subsection {* Integral domains *}
7998
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    55
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    56
axclass
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    57
  "domain" < ring
7998
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    58
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    59
  one_not_zero: "1 ~= 0"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    60
  integral:     "a * b = 0 ==> a = 0 | b = 0"
7998
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    61
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    62
subsection {* Factorial domains *}
7998
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    63
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    64
axclass
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    65
  factorial < "domain"
7998
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    66
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    67
(*
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    68
  Proper definition using divisor chain condition currently not supported.
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    69
  factorial_divisor:    "wf {(a, b). a dvd b & ~ (b dvd a)}"
7998
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    70
*)
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    71
  factorial_divisor:	"True"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    72
  factorial_prime:      "irred a ==> prime a"
7998
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    73
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    74
subsection {* Euclidean domains *}
7998
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    75
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    76
(*
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    77
axclass
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    78
  euclidean < "domain"
7998
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    79
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    80
  euclidean_ax:  "b ~= 0 ==> Ex (% (q, r, e_size::('a::ringS)=>nat).
7998
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    81
                   a = b * q + r & e_size r < e_size b)"
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    82
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    83
  Nothing has been proved about Euclidean domains, yet.
7998
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    84
  Design question:
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    85
    Fix quo, rem and e_size as constants that are axiomatised with
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    86
    euclidean_ax?
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    87
    - advantage: more pragmatic and easier to use
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    88
    - disadvantage: for every type, one definition of quo and rem will
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    89
        be fixed, users may want to use differing ones;
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    90
        also, it seems not possible to prove that fields are euclidean
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    91
        domains, because that would require generic (type-independent)
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    92
        definitions of quo and rem.
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    93
*)
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    94
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    95
subsection {* Fields *}
7998
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    96
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    97
axclass
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    98
  field < ring
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
    99
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   100
  field_one_not_zero:    "1 ~= 0"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   101
                (* Avoid a common superclass as the first thing we will
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   102
                   prove about fields is that they are domains. *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   103
  field_ax:        "a ~= 0 ==> a dvd 1"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   104
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   105
section {* Basic facts *}
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   106
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   107
subsection {* Normaliser for rings *}
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   108
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   109
use "order.ML"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   110
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   111
method_setup ring =
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   112
  {* Method.no_args (Method.SIMPLE_METHOD' HEADGOAL (full_simp_tac ring_ss)) *}
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   113
  {* computes distributive normal form in rings *}
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   114
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   115
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   116
subsection {* Rings and the summation operator *}
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   117
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   118
(* Basic facts --- move to HOL!!! *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   119
16052
880b0e786c1b tuned setsum rewrites
nipkow
parents: 15531
diff changeset
   120
(* needed because natsum_cong (below) disables atMost_0 *)
14738
83f1a514dcb4 changes made due to new Ring_and_Field theory
obua
parents: 14439
diff changeset
   121
lemma natsum_0 [simp]: "setsum f {..(0::nat)} = (f 0::'a::comm_monoid_add)"
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   122
by simp
16052
880b0e786c1b tuned setsum rewrites
nipkow
parents: 15531
diff changeset
   123
(*
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   124
lemma natsum_Suc [simp]:
14738
83f1a514dcb4 changes made due to new Ring_and_Field theory
obua
parents: 14439
diff changeset
   125
  "setsum f {..Suc n} = (f (Suc n) + setsum f {..n}::'a::comm_monoid_add)"
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   126
by (simp add: atMost_Suc)
16052
880b0e786c1b tuned setsum rewrites
nipkow
parents: 15531
diff changeset
   127
*)
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   128
lemma natsum_Suc2:
16052
880b0e786c1b tuned setsum rewrites
nipkow
parents: 15531
diff changeset
   129
  "setsum f {..Suc n} = (f 0::'a::comm_monoid_add) + (setsum (%i. f (Suc i)) {..n})"
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   130
proof (induct n)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   131
  case 0 show ?case by simp
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   132
next
17274
746bb4c56800 axclass: name space prefix is now "c_class" instead of just "c";
wenzelm
parents: 16973
diff changeset
   133
  case Suc thus ?case by (simp add: semigroup_add_class.add_assoc) 
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   134
qed
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   135
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   136
lemma natsum_cong [cong]:
14738
83f1a514dcb4 changes made due to new Ring_and_Field theory
obua
parents: 14439
diff changeset
   137
  "!!k. [| j = k; !!i::nat. i <= k ==> f i = (g i::'a::comm_monoid_add) |] ==>
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   138
        setsum f {..j} = setsum g {..k}"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   139
by (induct j) auto
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   140
14738
83f1a514dcb4 changes made due to new Ring_and_Field theory
obua
parents: 14439
diff changeset
   141
lemma natsum_zero [simp]: "setsum (%i. 0) {..n::nat} = (0::'a::comm_monoid_add)"
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   142
by (induct n) simp_all
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   143
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   144
lemma natsum_add [simp]:
14738
83f1a514dcb4 changes made due to new Ring_and_Field theory
obua
parents: 14439
diff changeset
   145
  "!!f::nat=>'a::comm_monoid_add.
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   146
   setsum (%i. f i + g i) {..n::nat} = setsum f {..n} + setsum g {..n}"
14738
83f1a514dcb4 changes made due to new Ring_and_Field theory
obua
parents: 14439
diff changeset
   147
by (induct n) (simp_all add: add_ac)
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   148
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   149
(* Facts specific to rings *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   150
14738
83f1a514dcb4 changes made due to new Ring_and_Field theory
obua
parents: 14439
diff changeset
   151
instance ring < comm_monoid_add
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   152
proof
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   153
  fix x y z
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   154
  show "(x::'a::ring) + y = y + x" by (rule a_comm)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   155
  show "((x::'a::ring) + y) + z = x + (y + z)" by (rule a_assoc)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   156
  show "0 + (x::'a::ring) = x" by (rule l_zero)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   157
qed
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   158
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   159
ML {*
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   160
  local
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   161
    val lhss = 
15020
wenzelm
parents: 14738
diff changeset
   162
        ["t + u::'a::ring",
wenzelm
parents: 14738
diff changeset
   163
	 "t - u::'a::ring",
wenzelm
parents: 14738
diff changeset
   164
	 "t * u::'a::ring",
wenzelm
parents: 14738
diff changeset
   165
	 "- t::'a::ring"];
16973
b2a894562b8f simprocs: Simplifier.inherit_bounds;
wenzelm
parents: 16417
diff changeset
   166
    fun proc sg ss t = 
17956
369e2af8ee45 Goal.prove;
wenzelm
parents: 17877
diff changeset
   167
      let val rew = Goal.prove sg [] []
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   168
            (HOLogic.mk_Trueprop
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   169
              (HOLogic.mk_eq (t, Var (("x", Term.maxidx_of_term t + 1), fastype_of t))))
17877
67d5ab1cb0d8 Simplifier.inherit_context instead of Simplifier.inherit_bounds;
wenzelm
parents: 17274
diff changeset
   170
                (fn _ => simp_tac (Simplifier.inherit_context ss ring_ss) 1)
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   171
            |> mk_meta_eq;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   172
          val (t', u) = Logic.dest_equals (Thm.prop_of rew);
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   173
      in if t' aconv u 
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15020
diff changeset
   174
        then NONE
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15020
diff changeset
   175
        else SOME rew 
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   176
    end;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   177
  in
16973
b2a894562b8f simprocs: Simplifier.inherit_bounds;
wenzelm
parents: 16417
diff changeset
   178
    val ring_simproc = Simplifier.simproc (the_context ()) "ring" lhss proc;
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   179
  end;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   180
*}
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   181
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   182
ML_setup {* Addsimprocs [ring_simproc] *}
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   183
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   184
lemma natsum_ldistr:
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   185
  "!!a::'a::ring. setsum f {..n::nat} * a = setsum (%i. f i * a) {..n}"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   186
by (induct n) simp_all
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   187
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   188
lemma natsum_rdistr:
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   189
  "!!a::'a::ring. a * setsum f {..n::nat} = setsum (%i. a * f i) {..n}"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   190
by (induct n) simp_all
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   191
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   192
subsection {* Integral Domains *}
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   193
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   194
declare one_not_zero [simp]
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   195
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   196
lemma zero_not_one [simp]:
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   197
  "0 ~= (1::'a::domain)" 
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   198
by (rule not_sym) simp
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   199
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   200
lemma integral_iff: (* not by default a simp rule! *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   201
  "(a * b = (0::'a::domain)) = (a = 0 | b = 0)"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   202
proof
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   203
  assume "a * b = 0" then show "a = 0 | b = 0" by (simp add: integral)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   204
next
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   205
  assume "a = 0 | b = 0" then show "a * b = 0" by auto
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   206
qed
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   207
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   208
(*
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   209
lemma "(a::'a::ring) - (a - b) = b" apply simp
13783
3294f727e20d Fixed term order for normal form in rings.
ballarin
parents: 13735
diff changeset
   210
 simproc seems to fail on this example (fixed with new term order)
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   211
*)
13783
3294f727e20d Fixed term order for normal form in rings.
ballarin
parents: 13735
diff changeset
   212
(*
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   213
lemma bug: "(b::'a::ring) - (b - a) = a" by simp
13783
3294f727e20d Fixed term order for normal form in rings.
ballarin
parents: 13735
diff changeset
   214
   simproc for rings cannot prove "(a::'a::ring) - (a - b) = b" 
3294f727e20d Fixed term order for normal form in rings.
ballarin
parents: 13735
diff changeset
   215
*)
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   216
lemma m_lcancel:
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   217
  assumes prem: "(a::'a::domain) ~= 0" shows conc: "(a * b = a * c) = (b = c)"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   218
proof
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   219
  assume eq: "a * b = a * c"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   220
  then have "a * (b - c) = 0" by simp
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   221
  then have "a = 0 | (b - c) = 0" by (simp only: integral_iff)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   222
  with prem have "b - c = 0" by auto 
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   223
  then have "b = b - (b - c)" by simp 
13783
3294f727e20d Fixed term order for normal form in rings.
ballarin
parents: 13735
diff changeset
   224
  also have "b - (b - c) = c" by simp
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   225
  finally show "b = c" .
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   226
next
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   227
  assume "b = c" then show "a * b = a * c" by simp
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   228
qed
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   229
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   230
lemma m_rcancel:
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   231
  "(a::'a::domain) ~= 0 ==> (b * a = c * a) = (b = c)"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   232
by (simp add: m_lcancel)
7998
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
   233
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
   234
end