src/HOL/NewNumberTheory/MiscAlgebra.thy
author haftmann
Tue Jun 23 12:08:34 2009 +0200 (2009-06-23)
changeset 31772 a946fe9a0476
parent 31727 2621a957d417
child 31952 40501bb2d57c
permissions -rw-r--r--
dropped duplicated lemmas, tuned header
nipkow@31719
     1
(*  Title:      MiscAlgebra.thy
nipkow@31719
     2
    Author:     Jeremy Avigad
nipkow@31719
     3
haftmann@31772
     4
These are things that can be added to the Algebra library.
nipkow@31719
     5
*)
nipkow@31719
     6
nipkow@31719
     7
theory MiscAlgebra
haftmann@31772
     8
imports
nipkow@31719
     9
  "~~/src/HOL/Algebra/Ring"
nipkow@31719
    10
  "~~/src/HOL/Algebra/FiniteProduct"
nipkow@31719
    11
begin;
nipkow@31719
    12
nipkow@31719
    13
(* finiteness stuff *)
nipkow@31719
    14
nipkow@31719
    15
lemma int_bounded_set1 [intro]: "finite {(x::int). a < x & x < b & P x}" 
nipkow@31719
    16
  apply (subgoal_tac "{x. a < x & x < b & P x} <= {a<..<b}")
nipkow@31719
    17
  apply (erule finite_subset)
nipkow@31719
    18
  apply auto
nipkow@31719
    19
done
nipkow@31719
    20
nipkow@31719
    21
nipkow@31719
    22
(* The rest is for the algebra libraries *)
nipkow@31719
    23
nipkow@31719
    24
(* These go in Group.thy. *)
nipkow@31719
    25
nipkow@31719
    26
(*
nipkow@31719
    27
  Show that the units in any monoid give rise to a group.
nipkow@31719
    28
nipkow@31719
    29
  The file Residues.thy provides some infrastructure to use
nipkow@31719
    30
  facts about the unit group within the ring locale.
nipkow@31719
    31
*)
nipkow@31719
    32
nipkow@31719
    33
nipkow@31719
    34
constdefs 
nipkow@31719
    35
  units_of :: "('a, 'b) monoid_scheme => 'a monoid"
nipkow@31719
    36
  "units_of G == (| carrier = Units G,
nipkow@31719
    37
     Group.monoid.mult = Group.monoid.mult G,
nipkow@31719
    38
     one  = one G |)";
nipkow@31719
    39
nipkow@31719
    40
(*
nipkow@31719
    41
nipkow@31719
    42
lemma (in monoid) Units_mult_closed [intro]:
nipkow@31719
    43
  "x : Units G ==> y : Units G ==> x \<otimes> y : Units G"
nipkow@31719
    44
  apply (unfold Units_def)
nipkow@31719
    45
  apply (clarsimp)
nipkow@31719
    46
  apply (rule_tac x = "xaa \<otimes> xa" in bexI)
nipkow@31719
    47
  apply auto
nipkow@31719
    48
  apply (subst m_assoc)
nipkow@31719
    49
  apply auto
nipkow@31719
    50
  apply (subst (2) m_assoc [symmetric])
nipkow@31719
    51
  apply auto
nipkow@31719
    52
  apply (subst m_assoc)
nipkow@31719
    53
  apply auto
nipkow@31719
    54
  apply (subst (2) m_assoc [symmetric])
nipkow@31719
    55
  apply auto
nipkow@31719
    56
done
nipkow@31719
    57
nipkow@31719
    58
*)
nipkow@31719
    59
nipkow@31719
    60
lemma (in monoid) units_group: "group(units_of G)"
nipkow@31719
    61
  apply (unfold units_of_def)
nipkow@31719
    62
  apply (rule groupI)
nipkow@31719
    63
  apply auto
nipkow@31719
    64
  apply (subst m_assoc)
nipkow@31719
    65
  apply auto
nipkow@31719
    66
  apply (rule_tac x = "inv x" in bexI)
nipkow@31719
    67
  apply auto
nipkow@31719
    68
done
nipkow@31719
    69
nipkow@31719
    70
lemma (in comm_monoid) units_comm_group: "comm_group(units_of G)"
nipkow@31719
    71
  apply (rule group.group_comm_groupI)
nipkow@31719
    72
  apply (rule units_group)
nipkow@31719
    73
  apply (insert prems)
nipkow@31719
    74
  apply (unfold units_of_def Units_def comm_monoid_def comm_monoid_axioms_def)
nipkow@31719
    75
  apply auto;
nipkow@31719
    76
done;
nipkow@31719
    77
nipkow@31719
    78
lemma units_of_carrier: "carrier (units_of G) = Units G"
nipkow@31719
    79
  by (unfold units_of_def, auto)
nipkow@31719
    80
nipkow@31719
    81
lemma units_of_mult: "mult(units_of G) = mult G"
nipkow@31719
    82
  by (unfold units_of_def, auto)
nipkow@31719
    83
nipkow@31719
    84
lemma units_of_one: "one(units_of G) = one G"
nipkow@31719
    85
  by (unfold units_of_def, auto)
nipkow@31719
    86
nipkow@31719
    87
lemma (in monoid) units_of_inv: "x : Units G ==> 
nipkow@31719
    88
    m_inv (units_of G) x = m_inv G x"
nipkow@31719
    89
  apply (rule sym)
nipkow@31719
    90
  apply (subst m_inv_def)
nipkow@31719
    91
  apply (rule the1_equality)
nipkow@31719
    92
  apply (rule ex_ex1I)
nipkow@31719
    93
  apply (subst (asm) Units_def)
nipkow@31719
    94
  apply auto
nipkow@31719
    95
  apply (erule inv_unique)
nipkow@31719
    96
  apply auto
nipkow@31719
    97
  apply (rule Units_closed)
nipkow@31719
    98
  apply (simp_all only: units_of_carrier [symmetric])
nipkow@31719
    99
  apply (insert units_group)
nipkow@31719
   100
  apply auto
nipkow@31719
   101
  apply (subst units_of_mult [symmetric])
nipkow@31719
   102
  apply (subst units_of_one [symmetric])
nipkow@31719
   103
  apply (erule group.r_inv, assumption)
nipkow@31719
   104
  apply (subst units_of_mult [symmetric])
nipkow@31719
   105
  apply (subst units_of_one [symmetric])
nipkow@31719
   106
  apply (erule group.l_inv, assumption)
nipkow@31719
   107
done
nipkow@31719
   108
nipkow@31719
   109
lemma (in group) inj_on_const_mult: "a: (carrier G) ==> 
nipkow@31719
   110
    inj_on (%x. a \<otimes> x) (carrier G)"
nipkow@31719
   111
  by (unfold inj_on_def, auto)
nipkow@31719
   112
nipkow@31719
   113
lemma (in group) surj_const_mult: "a : (carrier G) ==>
nipkow@31719
   114
    (%x. a \<otimes> x) ` (carrier G) = (carrier G)" 
nipkow@31719
   115
  apply (auto simp add: image_def)
nipkow@31719
   116
  apply (rule_tac x = "(m_inv G a) \<otimes> x" in bexI)
nipkow@31719
   117
  apply auto
nipkow@31719
   118
(* auto should get this. I suppose we need "comm_monoid_simprules"
nipkow@31719
   119
   for mult_ac rewriting. *)
nipkow@31719
   120
  apply (subst m_assoc [symmetric])
nipkow@31719
   121
  apply auto
nipkow@31719
   122
done
nipkow@31719
   123
nipkow@31719
   124
lemma (in group) l_cancel_one [simp]: "x : carrier G \<Longrightarrow> a : carrier G \<Longrightarrow>
nipkow@31719
   125
    (x \<otimes> a = x) = (a = one G)"
nipkow@31719
   126
  apply auto
nipkow@31719
   127
  apply (subst l_cancel [symmetric])
nipkow@31719
   128
  prefer 4
nipkow@31719
   129
  apply (erule ssubst)
nipkow@31719
   130
  apply auto
nipkow@31719
   131
done
nipkow@31719
   132
nipkow@31719
   133
lemma (in group) r_cancel_one [simp]: "x : carrier G \<Longrightarrow> a : carrier G \<Longrightarrow>
nipkow@31719
   134
    (a \<otimes> x = x) = (a = one G)"
nipkow@31719
   135
  apply auto
nipkow@31719
   136
  apply (subst r_cancel [symmetric])
nipkow@31719
   137
  prefer 4
nipkow@31719
   138
  apply (erule ssubst)
nipkow@31719
   139
  apply auto
nipkow@31719
   140
done
nipkow@31719
   141
nipkow@31719
   142
(* Is there a better way to do this? *)
nipkow@31719
   143
nipkow@31719
   144
lemma (in group) l_cancel_one' [simp]: "x : carrier G \<Longrightarrow> a : carrier G \<Longrightarrow>
nipkow@31719
   145
    (x = x \<otimes> a) = (a = one G)"
nipkow@31719
   146
  by (subst eq_commute, simp)
nipkow@31719
   147
nipkow@31719
   148
lemma (in group) r_cancel_one' [simp]: "x : carrier G \<Longrightarrow> a : carrier G \<Longrightarrow>
nipkow@31719
   149
    (x = a \<otimes> x) = (a = one G)"
nipkow@31719
   150
  by (subst eq_commute, simp)
nipkow@31719
   151
nipkow@31719
   152
(* This should be generalized to arbitrary groups, not just commutative
nipkow@31719
   153
   ones, using Lagrange's theorem. *)
nipkow@31719
   154
nipkow@31719
   155
lemma (in comm_group) power_order_eq_one:
nipkow@31719
   156
    assumes fin [simp]: "finite (carrier G)"
nipkow@31719
   157
        and a [simp]: "a : carrier G" 
nipkow@31719
   158
      shows "a (^) card(carrier G) = one G" 
nipkow@31719
   159
proof -
nipkow@31719
   160
  have "(\<Otimes>x:carrier G. x) = (\<Otimes>x:carrier G. a \<otimes> x)"
nipkow@31719
   161
    by (subst (2) finprod_reindex [symmetric], 
nipkow@31719
   162
      auto simp add: Pi_def inj_on_const_mult surj_const_mult)
nipkow@31719
   163
  also have "\<dots> = (\<Otimes>x:carrier G. a) \<otimes> (\<Otimes>x:carrier G. x)"
nipkow@31719
   164
    by (auto simp add: finprod_multf Pi_def)
nipkow@31719
   165
  also have "(\<Otimes>x:carrier G. a) = a (^) card(carrier G)"
nipkow@31719
   166
    by (auto simp add: finprod_const)
nipkow@31719
   167
  finally show ?thesis
nipkow@31719
   168
(* uses the preceeding lemma *)
nipkow@31719
   169
    by auto
nipkow@31719
   170
qed
nipkow@31719
   171
nipkow@31719
   172
nipkow@31719
   173
(* Miscellaneous *)
nipkow@31719
   174
nipkow@31719
   175
lemma (in cring) field_intro2: "\<zero>\<^bsub>R\<^esub> ~= \<one>\<^bsub>R\<^esub> \<Longrightarrow> ALL x : carrier R - {\<zero>\<^bsub>R\<^esub>}.
nipkow@31719
   176
    x : Units R \<Longrightarrow> field R"
nipkow@31719
   177
  apply (unfold_locales)
nipkow@31719
   178
  apply (insert prems, auto)
nipkow@31719
   179
  apply (rule trans)
nipkow@31719
   180
  apply (subgoal_tac "a = (a \<otimes> b) \<otimes> inv b")
nipkow@31719
   181
  apply assumption
nipkow@31719
   182
  apply (subst m_assoc) 
nipkow@31719
   183
  apply (auto simp add: Units_r_inv)
nipkow@31719
   184
  apply (unfold Units_def)
nipkow@31719
   185
  apply auto
nipkow@31719
   186
done
nipkow@31719
   187
nipkow@31719
   188
lemma (in monoid) inv_char: "x : carrier G \<Longrightarrow> y : carrier G \<Longrightarrow>
nipkow@31719
   189
  x \<otimes> y = \<one> \<Longrightarrow> y \<otimes> x = \<one> \<Longrightarrow> inv x = y"
nipkow@31719
   190
  apply (subgoal_tac "x : Units G")
nipkow@31719
   191
  apply (subgoal_tac "y = inv x \<otimes> \<one>")
nipkow@31719
   192
  apply simp
nipkow@31719
   193
  apply (erule subst)
nipkow@31719
   194
  apply (subst m_assoc [symmetric])
nipkow@31719
   195
  apply auto
nipkow@31719
   196
  apply (unfold Units_def)
nipkow@31719
   197
  apply auto
nipkow@31719
   198
done
nipkow@31719
   199
nipkow@31719
   200
lemma (in comm_monoid) comm_inv_char: "x : carrier G \<Longrightarrow> y : carrier G \<Longrightarrow>
nipkow@31719
   201
  x \<otimes> y = \<one> \<Longrightarrow> inv x = y"
nipkow@31719
   202
  apply (rule inv_char)
nipkow@31719
   203
  apply auto
nipkow@31719
   204
  apply (subst m_comm, auto) 
nipkow@31719
   205
done
nipkow@31719
   206
nipkow@31719
   207
lemma (in ring) inv_neg_one [simp]: "inv (\<ominus> \<one>) = \<ominus> \<one>"  
nipkow@31719
   208
  apply (rule inv_char)
nipkow@31719
   209
  apply (auto simp add: l_minus r_minus)
nipkow@31719
   210
done
nipkow@31719
   211
nipkow@31719
   212
lemma (in monoid) inv_eq_imp_eq: "x : Units G \<Longrightarrow> y : Units G \<Longrightarrow> 
nipkow@31719
   213
    inv x = inv y \<Longrightarrow> x = y"
nipkow@31719
   214
  apply (subgoal_tac "inv(inv x) = inv(inv y)")
nipkow@31719
   215
  apply (subst (asm) Units_inv_inv)+
nipkow@31719
   216
  apply auto
nipkow@31719
   217
done
nipkow@31719
   218
nipkow@31719
   219
lemma (in ring) Units_minus_one_closed [intro]: "\<ominus> \<one> : Units R"
nipkow@31719
   220
  apply (unfold Units_def)
nipkow@31719
   221
  apply auto
nipkow@31719
   222
  apply (rule_tac x = "\<ominus> \<one>" in bexI)
nipkow@31719
   223
  apply auto
nipkow@31719
   224
  apply (simp add: l_minus r_minus)
nipkow@31719
   225
done
nipkow@31719
   226
nipkow@31719
   227
lemma (in monoid) inv_one [simp]: "inv \<one> = \<one>"
nipkow@31719
   228
  apply (rule inv_char)
nipkow@31719
   229
  apply auto
nipkow@31719
   230
done
nipkow@31719
   231
nipkow@31719
   232
lemma (in ring) inv_eq_neg_one_eq: "x : Units R \<Longrightarrow> (inv x = \<ominus> \<one>) = (x = \<ominus> \<one>)"
nipkow@31719
   233
  apply auto
nipkow@31719
   234
  apply (subst Units_inv_inv [symmetric])
nipkow@31719
   235
  apply auto
nipkow@31719
   236
done
nipkow@31719
   237
nipkow@31719
   238
lemma (in monoid) inv_eq_one_eq: "x : Units G \<Longrightarrow> (inv x = \<one>) = (x = \<one>)"
nipkow@31719
   239
  apply auto
nipkow@31719
   240
  apply (subst Units_inv_inv [symmetric])
nipkow@31719
   241
  apply auto
nipkow@31719
   242
done
nipkow@31719
   243
nipkow@31719
   244
nipkow@31719
   245
(* This goes in FiniteProduct *)
nipkow@31719
   246
nipkow@31719
   247
lemma (in comm_monoid) finprod_UN_disjoint:
nipkow@31719
   248
  "finite I \<Longrightarrow> (ALL i:I. finite (A i)) \<longrightarrow> (ALL i:I. ALL j:I. i ~= j \<longrightarrow>
nipkow@31719
   249
     (A i) Int (A j) = {}) \<longrightarrow>
nipkow@31719
   250
      (ALL i:I. ALL x: (A i). g x : carrier G) \<longrightarrow>
nipkow@31719
   251
        finprod G g (UNION I A) = finprod G (%i. finprod G g (A i)) I"
nipkow@31719
   252
  apply (induct set: finite)
nipkow@31719
   253
  apply force
nipkow@31719
   254
  apply clarsimp
nipkow@31719
   255
  apply (subst finprod_Un_disjoint)
nipkow@31719
   256
  apply blast
nipkow@31719
   257
  apply (erule finite_UN_I)
nipkow@31719
   258
  apply blast
nipkow@31721
   259
  apply (fastsimp)
nipkow@31719
   260
  apply (auto intro!: funcsetI finprod_closed) 
nipkow@31719
   261
done
nipkow@31719
   262
nipkow@31719
   263
lemma (in comm_monoid) finprod_Union_disjoint:
nipkow@31719
   264
  "[| finite C; (ALL A:C. finite A & (ALL x:A. f x : carrier G));
nipkow@31719
   265
      (ALL A:C. ALL B:C. A ~= B --> A Int B = {}) |] 
nipkow@31719
   266
   ==> finprod G f (Union C) = finprod G (finprod G f) C" 
nipkow@31719
   267
  apply (frule finprod_UN_disjoint [of C id f])
nipkow@31719
   268
  apply (unfold Union_def id_def, auto)
nipkow@31719
   269
done
nipkow@31719
   270
nipkow@31719
   271
lemma (in comm_monoid) finprod_one [rule_format]: 
nipkow@31719
   272
  "finite A \<Longrightarrow> (ALL x:A. f x = \<one>) \<longrightarrow>
nipkow@31719
   273
     finprod G f A = \<one>"
nipkow@31727
   274
by (induct set: finite) auto
nipkow@31719
   275
nipkow@31719
   276
nipkow@31719
   277
(* need better simplification rules for rings *)
nipkow@31719
   278
(* the next one holds more generally for abelian groups *)
nipkow@31719
   279
nipkow@31719
   280
lemma (in cring) sum_zero_eq_neg:
nipkow@31719
   281
  "x : carrier R \<Longrightarrow> y : carrier R \<Longrightarrow> x \<oplus> y = \<zero> \<Longrightarrow> x = \<ominus> y"
nipkow@31719
   282
  apply (subgoal_tac "\<ominus> y = \<zero> \<oplus> \<ominus> y") 
nipkow@31719
   283
  apply (erule ssubst)back
nipkow@31719
   284
  apply (erule subst)
nipkow@31719
   285
  apply (simp add: ring_simprules)+
nipkow@31719
   286
done
nipkow@31719
   287
nipkow@31719
   288
(* there's a name conflict -- maybe "domain" should be
nipkow@31719
   289
   "integral_domain" *)
nipkow@31719
   290
nipkow@31719
   291
lemma (in Ring.domain) square_eq_one: 
nipkow@31719
   292
  fixes x
nipkow@31719
   293
  assumes [simp]: "x : carrier R" and
nipkow@31719
   294
    "x \<otimes> x = \<one>"
nipkow@31719
   295
  shows "x = \<one> | x = \<ominus>\<one>"
nipkow@31719
   296
proof -
nipkow@31719
   297
  have "(x \<oplus> \<one>) \<otimes> (x \<oplus> \<ominus> \<one>) = x \<otimes> x \<oplus> \<ominus> \<one>"
nipkow@31719
   298
    by (simp add: ring_simprules)
nipkow@31719
   299
  also with `x \<otimes> x = \<one>` have "\<dots> = \<zero>"
nipkow@31719
   300
    by (simp add: ring_simprules)
nipkow@31719
   301
  finally have "(x \<oplus> \<one>) \<otimes> (x \<oplus> \<ominus> \<one>) = \<zero>" .
nipkow@31719
   302
  hence "(x \<oplus> \<one>) = \<zero> | (x \<oplus> \<ominus> \<one>) = \<zero>"
nipkow@31719
   303
    by (intro integral, auto)
nipkow@31719
   304
  thus ?thesis
nipkow@31719
   305
    apply auto
nipkow@31719
   306
    apply (erule notE)
nipkow@31719
   307
    apply (rule sum_zero_eq_neg)
nipkow@31719
   308
    apply auto
nipkow@31719
   309
    apply (subgoal_tac "x = \<ominus> (\<ominus> \<one>)")
nipkow@31719
   310
    apply (simp add: ring_simprules) 
nipkow@31719
   311
    apply (rule sum_zero_eq_neg)
nipkow@31719
   312
    apply auto
nipkow@31719
   313
    done
nipkow@31719
   314
qed
nipkow@31719
   315
nipkow@31719
   316
lemma (in Ring.domain) inv_eq_self: "x : Units R \<Longrightarrow>
nipkow@31719
   317
    x = inv x \<Longrightarrow> x = \<one> | x = \<ominus> \<one>"
nipkow@31719
   318
  apply (rule square_eq_one)
nipkow@31719
   319
  apply auto
nipkow@31719
   320
  apply (erule ssubst)back
nipkow@31719
   321
  apply (erule Units_r_inv)
nipkow@31719
   322
done
nipkow@31719
   323
nipkow@31719
   324
nipkow@31719
   325
(*
nipkow@31719
   326
  The following translates theorems about groups to the facts about
nipkow@31719
   327
  the units of a ring. (The list should be expanded as more things are
nipkow@31719
   328
  needed.)
nipkow@31719
   329
*)
nipkow@31719
   330
nipkow@31719
   331
lemma (in ring) finite_ring_finite_units [intro]: "finite (carrier R) \<Longrightarrow> 
nipkow@31719
   332
    finite (Units R)"
nipkow@31719
   333
  by (rule finite_subset, auto)
nipkow@31719
   334
nipkow@31719
   335
(* this belongs with MiscAlgebra.thy *)
nipkow@31719
   336
lemma (in monoid) units_of_pow: 
nipkow@31719
   337
    "x : Units G \<Longrightarrow> x (^)\<^bsub>units_of G\<^esub> (n::nat) = x (^)\<^bsub>G\<^esub> n"
nipkow@31719
   338
  apply (induct n)
nipkow@31719
   339
  apply (auto simp add: units_group group.is_monoid  
nipkow@31719
   340
    monoid.nat_pow_0 monoid.nat_pow_Suc units_of_one units_of_mult
nipkow@31719
   341
    One_nat_def)
nipkow@31719
   342
done
nipkow@31719
   343
nipkow@31719
   344
lemma (in cring) units_power_order_eq_one: "finite (Units R) \<Longrightarrow> a : Units R
nipkow@31719
   345
    \<Longrightarrow> a (^) card(Units R) = \<one>"
nipkow@31719
   346
  apply (subst units_of_carrier [symmetric])
nipkow@31719
   347
  apply (subst units_of_one [symmetric])
nipkow@31719
   348
  apply (subst units_of_pow [symmetric])
nipkow@31719
   349
  apply assumption
nipkow@31719
   350
  apply (rule comm_group.power_order_eq_one)
nipkow@31719
   351
  apply (rule units_comm_group)
nipkow@31719
   352
  apply (unfold units_of_def, auto)
nipkow@31719
   353
done
nipkow@31719
   354
nipkow@31719
   355
end