src/HOL/Algebra/More_Finite_Product.thy
author nipkow
Thu, 31 Aug 2017 09:50:11 +0200
changeset 66566 a14bbbaa628d
parent 65416 f707dbcf11e3
child 66760 d44ea023ac09
permissions -rw-r--r--
merged
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
65416
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
     1
(*  Title:      HOL/Algebra/More_Finite_Product.thy
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
     2
    Author:     Jeremy Avigad
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
     3
*)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
     4
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
     5
section \<open>More on finite products\<close>
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
     6
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
     7
theory More_Finite_Product
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
     8
imports
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
     9
  More_Group
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    10
begin
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    11
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    12
lemma (in comm_monoid) finprod_UN_disjoint:
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    13
  "finite I \<Longrightarrow> (ALL i:I. finite (A i)) \<longrightarrow> (ALL i:I. ALL j:I. i ~= j \<longrightarrow>
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    14
     (A i) Int (A j) = {}) \<longrightarrow>
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    15
      (ALL i:I. ALL x: (A i). g x : carrier G) \<longrightarrow>
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    16
        finprod G g (UNION I A) = finprod G (%i. finprod G g (A i)) I"
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    17
  apply (induct set: finite)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    18
  apply force
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    19
  apply clarsimp
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    20
  apply (subst finprod_Un_disjoint)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    21
  apply blast
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    22
  apply (erule finite_UN_I)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    23
  apply blast
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    24
  apply (fastforce)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    25
  apply (auto intro!: funcsetI finprod_closed)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    26
  done
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    27
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    28
lemma (in comm_monoid) finprod_Union_disjoint:
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    29
  "[| finite C; (ALL A:C. finite A & (ALL x:A. f x : carrier G));
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    30
      (ALL A:C. ALL B:C. A ~= B --> A Int B = {}) |]
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    31
   ==> finprod G f (\<Union>C) = finprod G (finprod G f) C"
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    32
  apply (frule finprod_UN_disjoint [of C id f])
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    33
  apply auto
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    34
  done
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    35
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    36
lemma (in comm_monoid) finprod_one:
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    37
    "finite A \<Longrightarrow> (\<And>x. x:A \<Longrightarrow> f x = \<one>) \<Longrightarrow> finprod G f A = \<one>"
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    38
  by (induct set: finite) auto
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    39
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    40
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    41
(* need better simplification rules for rings *)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    42
(* the next one holds more generally for abelian groups *)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    43
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    44
lemma (in cring) sum_zero_eq_neg: "x : carrier R \<Longrightarrow> y : carrier R \<Longrightarrow> x \<oplus> y = \<zero> \<Longrightarrow> x = \<ominus> y"
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    45
  by (metis minus_equality)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    46
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    47
lemma (in domain) square_eq_one:
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    48
  fixes x
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    49
  assumes [simp]: "x : carrier R"
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    50
    and "x \<otimes> x = \<one>"
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    51
  shows "x = \<one> | x = \<ominus>\<one>"
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    52
proof -
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    53
  have "(x \<oplus> \<one>) \<otimes> (x \<oplus> \<ominus> \<one>) = x \<otimes> x \<oplus> \<ominus> \<one>"
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    54
    by (simp add: ring_simprules)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    55
  also from \<open>x \<otimes> x = \<one>\<close> have "\<dots> = \<zero>"
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    56
    by (simp add: ring_simprules)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    57
  finally have "(x \<oplus> \<one>) \<otimes> (x \<oplus> \<ominus> \<one>) = \<zero>" .
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    58
  then have "(x \<oplus> \<one>) = \<zero> | (x \<oplus> \<ominus> \<one>) = \<zero>"
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    59
    by (intro integral, auto)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    60
  then show ?thesis
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    61
    apply auto
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    62
    apply (erule notE)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    63
    apply (rule sum_zero_eq_neg)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    64
    apply auto
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    65
    apply (subgoal_tac "x = \<ominus> (\<ominus> \<one>)")
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    66
    apply (simp add: ring_simprules)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    67
    apply (rule sum_zero_eq_neg)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    68
    apply auto
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    69
    done
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    70
qed
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    71
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    72
lemma (in Ring.domain) inv_eq_self: "x : Units R \<Longrightarrow> x = inv x \<Longrightarrow> x = \<one> \<or> x = \<ominus>\<one>"
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    73
  by (metis Units_closed Units_l_inv square_eq_one)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    74
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    75
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    76
text \<open>
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    77
  The following translates theorems about groups to the facts about
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    78
  the units of a ring. (The list should be expanded as more things are
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    79
  needed.)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    80
\<close>
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    81
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    82
lemma (in ring) finite_ring_finite_units [intro]: "finite (carrier R) \<Longrightarrow> finite (Units R)"
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    83
  by (rule finite_subset) auto
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    84
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    85
lemma (in monoid) units_of_pow:
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    86
  fixes n :: nat
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    87
  shows "x \<in> Units G \<Longrightarrow> x (^)\<^bsub>units_of G\<^esub> n = x (^)\<^bsub>G\<^esub> n"
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    88
  apply (induct n)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    89
  apply (auto simp add: units_group group.is_monoid
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    90
    monoid.nat_pow_0 monoid.nat_pow_Suc units_of_one units_of_mult)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    91
  done
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    92
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    93
lemma (in cring) units_power_order_eq_one: "finite (Units R) \<Longrightarrow> a : Units R
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    94
    \<Longrightarrow> a (^) card(Units R) = \<one>"
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    95
  apply (subst units_of_carrier [symmetric])
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    96
  apply (subst units_of_one [symmetric])
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    97
  apply (subst units_of_pow [symmetric])
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    98
  apply assumption
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
    99
  apply (rule comm_group.power_order_eq_one)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
   100
  apply (rule units_comm_group)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
   101
  apply (unfold units_of_def, auto)
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
   102
  done
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
   103
f707dbcf11e3 more approproiate placement of theories MiscAlgebra and Multiplicate_Group
haftmann
parents:
diff changeset
   104
end