src/HOL/Algebra/abstract/Ring.thy
author ballarin
Thu, 23 Jan 2003 09:16:53 +0100
changeset 13783 3294f727e20d
parent 13735 7de9342aca7a
child 14439 0f626a712456
permissions -rw-r--r--
Fixed term order for normal form in rings.
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
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    10
theory Ring = Main
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
    11
files ("order.ML"):
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
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   120
lemma natsum_0 [simp]: "setsum f {..(0::nat)} = (f 0::'a::plus_ac0)"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   121
by simp
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   122
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   123
lemma natsum_Suc [simp]:
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   124
  "setsum f {..Suc n} = (f (Suc n) + setsum f {..n}::'a::plus_ac0)"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   125
by (simp add: atMost_Suc)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   126
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   127
lemma natsum_Suc2:
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   128
  "setsum f {..Suc n} = (setsum (%i. f (Suc i)) {..n} + f 0::'a::plus_ac0)"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   129
proof (induct n)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   130
  case 0 show ?case by simp
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   131
next
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   132
  case Suc thus ?case by (simp add: assoc) 
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   133
qed
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   134
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   135
lemma natsum_cong [cong]:
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   136
  "!!k. [| j = k; !!i::nat. i <= k ==> f i = (g i::'a::plus_ac0) |] ==>
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   137
        setsum f {..j} = setsum g {..k}"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   138
by (induct j) auto
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   139
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   140
lemma natsum_zero [simp]: "setsum (%i. 0) {..n::nat} = (0::'a::plus_ac0)"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   141
by (induct n) simp_all
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   142
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   143
lemma natsum_add [simp]:
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   144
  "!!f::nat=>'a::plus_ac0.
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   145
   setsum (%i. f i + g i) {..n::nat} = setsum f {..n} + setsum g {..n}"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   146
by (induct n) (simp_all add: plus_ac0)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   147
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   148
(* Facts specific to rings *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   149
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   150
instance ring < plus_ac0
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   151
proof
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   152
  fix x y z
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   153
  show "(x::'a::ring) + y = y + x" by (rule a_comm)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   154
  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
   155
  show "0 + (x::'a::ring) = x" by (rule l_zero)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   156
qed
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   157
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   158
ML {*
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   159
  local
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   160
    val lhss = 
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   161
        [read_cterm (sign_of (the_context ()))
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   162
                    ("?t + ?u::'a::ring", TVar (("'z", 0), [])),
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   163
	 read_cterm (sign_of (the_context ()))
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   164
                    ("?t - ?u::'a::ring", TVar (("'z", 0), [])),
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   165
	 read_cterm (sign_of (the_context ()))
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   166
                    ("?t * ?u::'a::ring", TVar (("'z", 0), [])),
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   167
	 read_cterm (sign_of (the_context ()))
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   168
                    ("- ?t::'a::ring", TVar (("'z", 0), []))
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   169
	];
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   170
    fun proc sg _ t = 
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   171
      let val rew = Tactic.prove sg [] []
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   172
            (HOLogic.mk_Trueprop
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   173
              (HOLogic.mk_eq (t, Var (("x", Term.maxidx_of_term t + 1), fastype_of t))))
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   174
                (fn _ => simp_tac ring_ss 1)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   175
            |> mk_meta_eq;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   176
          val (t', u) = Logic.dest_equals (Thm.prop_of rew);
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   177
      in if t' aconv u 
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   178
        then None
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   179
        else Some rew 
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   180
    end;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   181
  in
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   182
    val ring_simproc = mk_simproc "ring" lhss proc;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   183
  end;
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   184
*}
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   185
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   186
ML_setup {* Addsimprocs [ring_simproc] *}
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_ldistr:
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   189
  "!!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
   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
lemma natsum_rdistr:
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   193
  "!!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
   194
by (induct n) simp_all
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
subsection {* Integral Domains *}
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   197
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   198
declare one_not_zero [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 zero_not_one [simp]:
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   201
  "0 ~= (1::'a::domain)" 
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   202
by (rule not_sym) simp
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   203
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   204
lemma integral_iff: (* not by default a simp rule! *)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   205
  "(a * b = (0::'a::domain)) = (a = 0 | b = 0)"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   206
proof
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   207
  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
   208
next
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   209
  assume "a = 0 | b = 0" then show "a * b = 0" by auto
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   210
qed
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   211
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   212
(*
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   213
lemma "(a::'a::ring) - (a - b) = b" apply simp
13783
3294f727e20d Fixed term order for normal form in rings.
ballarin
parents: 13735
diff changeset
   214
 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
   215
*)
13783
3294f727e20d Fixed term order for normal form in rings.
ballarin
parents: 13735
diff changeset
   216
(*
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   217
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
   218
   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
   219
*)
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   220
lemma m_lcancel:
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   221
  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
   222
proof
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   223
  assume eq: "a * b = a * c"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   224
  then have "a * (b - c) = 0" by simp
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   225
  then have "a = 0 | (b - c) = 0" by (simp only: integral_iff)
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   226
  with prem have "b - c = 0" by auto 
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   227
  then have "b = b - (b - c)" by simp 
13783
3294f727e20d Fixed term order for normal form in rings.
ballarin
parents: 13735
diff changeset
   228
  also have "b - (b - c) = c" by simp
13735
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   229
  finally show "b = c" .
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   230
next
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   231
  assume "b = c" then show "a * b = a * c" by simp
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   232
qed
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   233
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   234
lemma m_rcancel:
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   235
  "(a::'a::domain) ~= 0 ==> (b * a = c * a) = (b = c)"
7de9342aca7a HOL-Algebra partially ported to Isar.
ballarin
parents: 11778
diff changeset
   236
by (simp add: m_lcancel)
7998
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
   237
3d0c34795831 Algebra and Polynomial theories, by Clemens Ballarin
paulson
parents:
diff changeset
   238
end