src/HOL/Algebra/abstract/Ring2.thy
author wenzelm
Sat, 21 Jul 2007 23:25:00 +0200
changeset 23894 1a4167d761ac
parent 22997 d4f3b015b50b
child 24993 92dfacb32053
permissions -rw-r--r--
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20318
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
     1
(*
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
     2
  Title:     The algebraic hierarchy of rings as axiomatic classes
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
     3
  Id:        $Id$
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
     4
  Author:    Clemens Ballarin, started 9 December 1996
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
     5
  Copyright: Clemens Ballarin
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
     6
*)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
     7
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
     8
header {* The algebraic hierarchy of rings as axiomatic classes *}
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
     9
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    10
theory Ring2 imports Main
21423
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
    11
begin
20318
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    12
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    13
section {* Constants *}
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    14
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    15
text {* Most constants are already declared by HOL. *}
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    16
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    17
consts
22808
a7daa74e2980 eliminated unnamed infixes, tuned syntax;
wenzelm
parents: 22384
diff changeset
    18
  assoc         :: "['a::times, 'a] => bool"              (infixl "assoc" 50)
20318
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    19
  irred         :: "'a::{zero, one, times} => bool"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    20
  prime         :: "'a::{zero, one, times} => bool"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    21
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    22
section {* Axioms *}
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    23
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    24
subsection {* Ring axioms *}
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    25
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    26
axclass ring < zero, one, plus, minus, times, inverse, power
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    27
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    28
  a_assoc:      "(a + b) + c = a + (b + c)"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    29
  l_zero:       "0 + a = a"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    30
  l_neg:        "(-a) + a = 0"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    31
  a_comm:       "a + b = b + a"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    32
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    33
  m_assoc:      "(a * b) * c = a * (b * c)"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    34
  l_one:        "1 * a = a"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    35
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    36
  l_distr:      "(a + b) * c = a * c + b * c"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    37
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    38
  m_comm:       "a * b = b * a"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    39
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    40
  -- {* Definition of derived operations *}
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    41
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    42
  minus_def:    "a - b = a + (-b)"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    43
  inverse_def:  "inverse a = (if a dvd 1 then THE x. a*x = 1 else 0)"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    44
  divide_def:   "a / b = a * inverse b"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    45
  power_def:    "a ^ n = nat_rec 1 (%u b. b * a) n"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    46
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    47
defs
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    48
  assoc_def:    "a assoc b == a dvd b & b dvd a"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    49
  irred_def:    "irred a == a ~= 0 & ~ a dvd 1
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    50
                          & (ALL d. d dvd a --> d dvd 1 | a dvd d)"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    51
  prime_def:    "prime p == p ~= 0 & ~ p dvd 1
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    52
                          & (ALL a b. p dvd (a*b) --> p dvd a | p dvd b)"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    53
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    54
subsection {* Integral domains *}
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    55
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    56
axclass
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    57
  "domain" < ring
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    58
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    59
  one_not_zero: "1 ~= 0"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    60
  integral:     "a * b = 0 ==> a = 0 | b = 0"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    61
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    62
subsection {* Factorial domains *}
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    63
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    64
axclass
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    65
  factorial < "domain"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    66
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    67
(*
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    68
  Proper definition using divisor chain condition currently not supported.
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    69
  factorial_divisor:    "wf {(a, b). a dvd b & ~ (b dvd a)}"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    70
*)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    71
  factorial_divisor:	"True"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    72
  factorial_prime:      "irred a ==> prime a"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    73
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    74
subsection {* Euclidean domains *}
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    75
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    76
(*
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    77
axclass
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    78
  euclidean < "domain"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    79
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    80
  euclidean_ax:  "b ~= 0 ==> Ex (% (q, r, e_size::('a::ringS)=>nat).
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    81
                   a = b * q + r & e_size r < e_size b)"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    82
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    83
  Nothing has been proved about Euclidean domains, yet.
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    84
  Design question:
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    85
    Fix quo, rem and e_size as constants that are axiomatised with
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    86
    euclidean_ax?
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    87
    - advantage: more pragmatic and easier to use
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    88
    - disadvantage: for every type, one definition of quo and rem will
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    89
        be fixed, users may want to use differing ones;
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    90
        also, it seems not possible to prove that fields are euclidean
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    91
        domains, because that would require generic (type-independent)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    92
        definitions of quo and rem.
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    93
*)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    94
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    95
subsection {* Fields *}
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    96
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    97
axclass
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    98
  field < ring
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
    99
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   100
  field_one_not_zero:    "1 ~= 0"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   101
                (* Avoid a common superclass as the first thing we will
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   102
                   prove about fields is that they are domains. *)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   103
  field_ax:        "a ~= 0 ==> a dvd 1"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   104
21423
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   105
20318
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   106
section {* Basic facts *}
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   107
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   108
subsection {* Normaliser for rings *}
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   109
21423
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   110
(* derived rewrite rules *)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   111
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   112
lemma a_lcomm: "(a::'a::ring)+(b+c) = b+(a+c)"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   113
  apply (rule a_comm [THEN trans])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   114
  apply (rule a_assoc [THEN trans])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   115
  apply (rule a_comm [THEN arg_cong])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   116
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   117
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   118
lemma r_zero: "(a::'a::ring) + 0 = a"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   119
  apply (rule a_comm [THEN trans])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   120
  apply (rule l_zero)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   121
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   122
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   123
lemma r_neg: "(a::'a::ring) + (-a) = 0"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   124
  apply (rule a_comm [THEN trans])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   125
  apply (rule l_neg)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   126
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   127
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   128
lemma r_neg2: "(a::'a::ring) + (-a + b) = b"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   129
  apply (rule a_assoc [symmetric, THEN trans])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   130
  apply (simp add: r_neg l_zero)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   131
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   132
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   133
lemma r_neg1: "-(a::'a::ring) + (a + b) = b"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   134
  apply (rule a_assoc [symmetric, THEN trans])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   135
  apply (simp add: l_neg l_zero)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   136
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   137
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   138
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   139
(* auxiliary *)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   140
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   141
lemma a_lcancel: "!! a::'a::ring. a + b = a + c ==> b = c"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   142
  apply (rule box_equals)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   143
  prefer 2
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   144
  apply (rule l_zero)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   145
  prefer 2
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   146
  apply (rule l_zero)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   147
  apply (rule_tac a1 = a in l_neg [THEN subst])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   148
  apply (simp add: a_assoc)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   149
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   150
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   151
lemma minus_add: "-((a::'a::ring) + b) = (-a) + (-b)"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   152
  apply (rule_tac a = "a + b" in a_lcancel)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   153
  apply (simp add: r_neg l_neg l_zero a_assoc a_comm a_lcomm)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   154
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   155
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   156
lemma minus_minus: "-(-(a::'a::ring)) = a"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   157
  apply (rule a_lcancel)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   158
  apply (rule r_neg [THEN trans])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   159
  apply (rule l_neg [symmetric])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   160
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   161
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   162
lemma minus0: "- 0 = (0::'a::ring)"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   163
  apply (rule a_lcancel)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   164
  apply (rule r_neg [THEN trans])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   165
  apply (rule l_zero [symmetric])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   166
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   167
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   168
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   169
(* derived rules for multiplication *)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   170
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   171
lemma m_lcomm: "(a::'a::ring)*(b*c) = b*(a*c)"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   172
  apply (rule m_comm [THEN trans])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   173
  apply (rule m_assoc [THEN trans])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   174
  apply (rule m_comm [THEN arg_cong])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   175
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   176
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   177
lemma r_one: "(a::'a::ring) * 1 = a"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   178
  apply (rule m_comm [THEN trans])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   179
  apply (rule l_one)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   180
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   181
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   182
lemma r_distr: "(a::'a::ring) * (b + c) = a * b + a * c"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   183
  apply (rule m_comm [THEN trans])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   184
  apply (rule l_distr [THEN trans])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   185
  apply (simp add: m_comm)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   186
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   187
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   188
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   189
(* the following proof is from Jacobson, Basic Algebra I, pp. 88-89 *)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   190
lemma l_null: "0 * (a::'a::ring) = 0"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   191
  apply (rule a_lcancel)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   192
  apply (rule l_distr [symmetric, THEN trans])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   193
  apply (simp add: r_zero)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   194
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   195
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   196
lemma r_null: "(a::'a::ring) * 0 = 0"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   197
  apply (rule m_comm [THEN trans])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   198
  apply (rule l_null)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   199
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   200
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   201
lemma l_minus: "(-(a::'a::ring)) * b = - (a * b)"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   202
  apply (rule a_lcancel)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   203
  apply (rule r_neg [symmetric, THEN [2] trans])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   204
  apply (rule l_distr [symmetric, THEN trans])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   205
  apply (simp add: l_null r_neg)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   206
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   207
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   208
lemma r_minus: "(a::'a::ring) * (-b) = - (a * b)"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   209
  apply (rule a_lcancel)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   210
  apply (rule r_neg [symmetric, THEN [2] trans])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   211
  apply (rule r_distr [symmetric, THEN trans])
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   212
  apply (simp add: r_null r_neg)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   213
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   214
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   215
(*** Term order for commutative rings ***)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   216
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   217
ML {*
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   218
fun ring_ord (Const (a, _)) =
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   219
    find_index (fn a' => a = a')
22997
d4f3b015b50b canonical prefixing of class constants
haftmann
parents: 22808
diff changeset
   220
      [@{const_name HOL.zero}, @{const_name HOL.plus}, @{const_name HOL.uminus},
d4f3b015b50b canonical prefixing of class constants
haftmann
parents: 22808
diff changeset
   221
        @{const_name HOL.minus}, @{const_name HOL.one}, @{const_name HOL.times}]
21423
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   222
  | ring_ord _ = ~1;
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   223
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   224
fun termless_ring (a, b) = (Term.term_lpo ring_ord (a, b) = LESS);
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   225
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   226
val ring_ss = HOL_basic_ss settermless termless_ring addsimps
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   227
  [thm "a_assoc", thm "l_zero", thm "l_neg", thm "a_comm", thm "m_assoc",
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   228
   thm "l_one", thm "l_distr", thm "m_comm", thm "minus_def",
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   229
   thm "r_zero", thm "r_neg", thm "r_neg2", thm "r_neg1", thm "minus_add",
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   230
   thm "minus_minus", thm "minus0", thm "a_lcomm", thm "m_lcomm", (*thm "r_one",*)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   231
   thm "r_distr", thm "l_null", thm "r_null", thm "l_minus", thm "r_minus"];
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   232
*}   (* Note: r_one is not necessary in ring_ss *)
20318
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   233
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   234
method_setup ring =
21588
cd0dc678a205 simplified method setup;
wenzelm
parents: 21423
diff changeset
   235
  {* Method.no_args (Method.SIMPLE_METHOD' (full_simp_tac ring_ss)) *}
20318
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   236
  {* computes distributive normal form in rings *}
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   237
21423
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   238
lemmas ring_simps =
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   239
  l_zero r_zero l_neg r_neg minus_minus minus0
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   240
  l_one r_one l_null r_null l_minus r_minus
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   241
20318
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   242
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   243
subsection {* Rings and the summation operator *}
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   244
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   245
(* Basic facts --- move to HOL!!! *)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   246
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   247
(* needed because natsum_cong (below) disables atMost_0 *)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   248
lemma natsum_0 [simp]: "setsum f {..(0::nat)} = (f 0::'a::comm_monoid_add)"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   249
by simp
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   250
(*
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   251
lemma natsum_Suc [simp]:
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   252
  "setsum f {..Suc n} = (f (Suc n) + setsum f {..n}::'a::comm_monoid_add)"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   253
by (simp add: atMost_Suc)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   254
*)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   255
lemma natsum_Suc2:
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   256
  "setsum f {..Suc n} = (f 0::'a::comm_monoid_add) + (setsum (%i. f (Suc i)) {..n})"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   257
proof (induct n)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   258
  case 0 show ?case by simp
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   259
next
22384
33a46e6c7f04 prefix of class interpretation not mandatory any longer
haftmann
parents: 21588
diff changeset
   260
  case Suc thus ?case by (simp add: add_assoc) 
20318
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   261
qed
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   262
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   263
lemma natsum_cong [cong]:
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   264
  "!!k. [| j = k; !!i::nat. i <= k ==> f i = (g i::'a::comm_monoid_add) |] ==>
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   265
        setsum f {..j} = setsum g {..k}"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   266
by (induct j) auto
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   267
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   268
lemma natsum_zero [simp]: "setsum (%i. 0) {..n::nat} = (0::'a::comm_monoid_add)"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   269
by (induct n) simp_all
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   270
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   271
lemma natsum_add [simp]:
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   272
  "!!f::nat=>'a::comm_monoid_add.
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   273
   setsum (%i. f i + g i) {..n::nat} = setsum f {..n} + setsum g {..n}"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   274
by (induct n) (simp_all add: add_ac)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   275
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   276
(* Facts specific to rings *)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   277
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   278
instance ring < comm_monoid_add
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   279
proof
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   280
  fix x y z
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   281
  show "(x::'a::ring) + y = y + x" by (rule a_comm)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   282
  show "((x::'a::ring) + y) + z = x + (y + z)" by (rule a_assoc)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   283
  show "0 + (x::'a::ring) = x" by (rule l_zero)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   284
qed
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   285
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   286
ML {*
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   287
  local
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   288
    val lhss = 
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   289
        ["t + u::'a::ring",
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   290
	 "t - u::'a::ring",
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   291
	 "t * u::'a::ring",
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   292
	 "- t::'a::ring"];
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   293
    fun proc ss t = 
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   294
      let val rew = Goal.prove (Simplifier.the_context ss) [] []
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   295
            (HOLogic.mk_Trueprop
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   296
              (HOLogic.mk_eq (t, Var (("x", Term.maxidx_of_term t + 1), fastype_of t))))
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   297
                (fn _ => simp_tac (Simplifier.inherit_context ss ring_ss) 1)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   298
            |> mk_meta_eq;
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   299
          val (t', u) = Logic.dest_equals (Thm.prop_of rew);
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   300
      in if t' aconv u 
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   301
        then NONE
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   302
        else SOME rew 
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   303
    end;
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   304
  in
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   305
    val ring_simproc = Simplifier.simproc (the_context ()) "ring" lhss (K proc);
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   306
  end;
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   307
*}
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   308
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   309
ML_setup {* Addsimprocs [ring_simproc] *}
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   310
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   311
lemma natsum_ldistr:
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   312
  "!!a::'a::ring. setsum f {..n::nat} * a = setsum (%i. f i * a) {..n}"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   313
by (induct n) simp_all
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   314
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   315
lemma natsum_rdistr:
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   316
  "!!a::'a::ring. a * setsum f {..n::nat} = setsum (%i. a * f i) {..n}"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   317
by (induct n) simp_all
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   318
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   319
subsection {* Integral Domains *}
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   320
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   321
declare one_not_zero [simp]
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   322
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   323
lemma zero_not_one [simp]:
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   324
  "0 ~= (1::'a::domain)" 
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   325
by (rule not_sym) simp
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   326
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   327
lemma integral_iff: (* not by default a simp rule! *)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   328
  "(a * b = (0::'a::domain)) = (a = 0 | b = 0)"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   329
proof
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   330
  assume "a * b = 0" then show "a = 0 | b = 0" by (simp add: integral)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   331
next
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   332
  assume "a = 0 | b = 0" then show "a * b = 0" by auto
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   333
qed
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   334
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   335
(*
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   336
lemma "(a::'a::ring) - (a - b) = b" apply simp
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   337
 simproc seems to fail on this example (fixed with new term order)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   338
*)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   339
(*
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   340
lemma bug: "(b::'a::ring) - (b - a) = a" by simp
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   341
   simproc for rings cannot prove "(a::'a::ring) - (a - b) = b" 
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   342
*)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   343
lemma m_lcancel:
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   344
  assumes prem: "(a::'a::domain) ~= 0" shows conc: "(a * b = a * c) = (b = c)"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   345
proof
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   346
  assume eq: "a * b = a * c"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   347
  then have "a * (b - c) = 0" by simp
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   348
  then have "a = 0 | (b - c) = 0" by (simp only: integral_iff)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   349
  with prem have "b - c = 0" by auto 
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   350
  then have "b = b - (b - c)" by simp 
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   351
  also have "b - (b - c) = c" by simp
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   352
  finally show "b = c" .
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   353
next
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   354
  assume "b = c" then show "a * b = a * c" by simp
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   355
qed
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   356
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   357
lemma m_rcancel:
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   358
  "(a::'a::domain) ~= 0 ==> (b * a = c * a) = (b = c)"
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   359
by (simp add: m_lcancel)
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   360
21416
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   361
lemma power_0 [simp]:
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   362
  "(a::'a::ring) ^ 0 = 1" unfolding power_def by simp
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   363
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   364
lemma power_Suc [simp]:
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   365
  "(a::'a::ring) ^ Suc n = a ^ n * a" unfolding power_def by simp
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   366
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   367
lemma power_one [simp]:
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   368
  "1 ^ n = (1::'a::ring)" by (induct n) simp_all
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   369
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   370
lemma power_zero [simp]:
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   371
  "n \<noteq> 0 \<Longrightarrow> 0 ^ n = (0::'a::ring)" by (induct n) simp_all
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   372
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   373
lemma power_mult [simp]:
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   374
  "(a::'a::ring) ^ m * a ^ n = a ^ (m + n)"
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   375
  by (induct m) simp_all
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   376
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   377
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   378
section "Divisibility"
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   379
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   380
lemma dvd_zero_right [simp]:
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   381
  "(a::'a::ring) dvd 0"
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   382
proof
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   383
  show "0 = a * 0" by simp
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   384
qed
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   385
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   386
lemma dvd_zero_left:
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   387
  "0 dvd (a::'a::ring) \<Longrightarrow> a = 0" unfolding dvd_def by simp
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   388
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   389
lemma dvd_refl_ring [simp]:
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   390
  "(a::'a::ring) dvd a"
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   391
proof
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   392
  show "a = a * 1" by simp
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   393
qed
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   394
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   395
lemma dvd_trans_ring:
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   396
  fixes a b c :: "'a::ring"
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   397
  assumes a_dvd_b: "a dvd b"
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   398
  and b_dvd_c: "b dvd c"
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   399
  shows "a dvd c"
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   400
proof -
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   401
  from a_dvd_b obtain l where "b = a * l" using dvd_def by blast
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   402
  moreover from b_dvd_c obtain j where "c = b * j" using dvd_def by blast
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   403
  ultimately have "c = a * (l * j)" by simp
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   404
  then have "\<exists>k. c = a * k" ..
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   405
  then show ?thesis using dvd_def by blast
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   406
qed
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   407
21423
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   408
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   409
lemma unit_mult: 
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   410
  "!!a::'a::ring. [| a dvd 1; b dvd 1 |] ==> a * b dvd 1"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   411
  apply (unfold dvd_def)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   412
  apply clarify
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   413
  apply (rule_tac x = "k * ka" in exI)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   414
  apply simp
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   415
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   416
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   417
lemma unit_power: "!!a::'a::ring. a dvd 1 ==> a^n dvd 1"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   418
  apply (induct_tac n)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   419
   apply simp
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   420
  apply (simp add: unit_mult)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   421
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   422
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   423
lemma dvd_add_right [simp]:
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   424
  "!! a::'a::ring. [| a dvd b; a dvd c |] ==> a dvd b + c"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   425
  apply (unfold dvd_def)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   426
  apply clarify
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   427
  apply (rule_tac x = "k + ka" in exI)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   428
  apply (simp add: r_distr)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   429
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   430
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   431
lemma dvd_uminus_right [simp]:
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   432
  "!! a::'a::ring. a dvd b ==> a dvd -b"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   433
  apply (unfold dvd_def)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   434
  apply clarify
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   435
  apply (rule_tac x = "-k" in exI)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   436
  apply (simp add: r_minus)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   437
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   438
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   439
lemma dvd_l_mult_right [simp]:
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   440
  "!! a::'a::ring. a dvd b ==> a dvd c*b"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   441
  apply (unfold dvd_def)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   442
  apply clarify
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   443
  apply (rule_tac x = "c * k" in exI)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   444
  apply simp
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   445
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   446
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   447
lemma dvd_r_mult_right [simp]:
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   448
  "!! a::'a::ring. a dvd b ==> a dvd b*c"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   449
  apply (unfold dvd_def)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   450
  apply clarify
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   451
  apply (rule_tac x = "k * c" in exI)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   452
  apply simp
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   453
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   454
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   455
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   456
(* Inverse of multiplication *)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   457
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   458
section "inverse"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   459
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   460
lemma inverse_unique: "!! a::'a::ring. [| a * x = 1; a * y = 1 |] ==> x = y"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   461
  apply (rule_tac a = "(a*y) * x" and b = "y * (a*x)" in box_equals)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   462
    apply (simp (no_asm))
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   463
  apply auto
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   464
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   465
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   466
lemma r_inverse_ring: "!! a::'a::ring. a dvd 1 ==> a * inverse a = 1"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   467
  apply (unfold inverse_def dvd_def)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   468
  apply (tactic {* asm_full_simp_tac (simpset () delsimprocs [ring_simproc]) 1 *})
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   469
  apply clarify
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   470
  apply (rule theI)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   471
   apply assumption
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   472
  apply (rule inverse_unique)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   473
   apply assumption
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   474
  apply assumption
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   475
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   476
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   477
lemma l_inverse_ring: "!! a::'a::ring. a dvd 1 ==> inverse a * a = 1"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   478
  by (simp add: r_inverse_ring)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   479
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   480
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   481
(* Fields *)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   482
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   483
section "Fields"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   484
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   485
lemma field_unit [simp]: "!! a::'a::field. (a dvd 1) = (a ~= 0)"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   486
  by (auto dest: field_ax dvd_zero_left simp add: field_one_not_zero)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   487
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   488
lemma r_inverse [simp]: "!! a::'a::field. a ~= 0 ==> a * inverse a = 1"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   489
  by (simp add: r_inverse_ring)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   490
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   491
lemma l_inverse [simp]: "!! a::'a::field. a ~= 0 ==> inverse a * a= 1"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   492
  by (simp add: l_inverse_ring)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   493
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   494
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   495
(* fields are integral domains *)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   496
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   497
lemma field_integral: "!! a::'a::field. a * b = 0 ==> a = 0 | b = 0"
23894
1a4167d761ac tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
wenzelm
parents: 22997
diff changeset
   498
  apply (tactic "step_tac @{claset} 1")
21423
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   499
  apply (rule_tac a = " (a*b) * inverse b" in box_equals)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   500
    apply (rule_tac [3] refl)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   501
   prefer 2
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   502
   apply (simp (no_asm))
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   503
   apply auto
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   504
  done
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   505
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   506
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   507
(* fields are factorial domains *)
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   508
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   509
lemma field_fact_prime: "!! a::'a::field. irred a ==> prime a"
6cdd0589aa73 HOL-Algebra: converted legacy ML scripts;
wenzelm
parents: 21416
diff changeset
   510
  unfolding prime_def irred_def by (blast intro: field_ax)
21416
f23e4e75dfd3 dvd_def now with object equality
haftmann
parents: 20318
diff changeset
   511
20318
0e0ea63fe768 Restructured algebra library, added ideals and quotient rings.
ballarin
parents:
diff changeset
   512
end