src/HOL/Algebra/FoldSet.thy
author ballarin
Fri, 14 Feb 2003 17:35:56 +0100
changeset 13817 7e031a968443
permissions -rw-r--r--
Product operator added --- preliminary.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13817
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
     1
(*  Title:      Summation Operator for Abelian Groups
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
     2
    ID:         $Id$
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
     3
    Author:     Clemens Ballarin, started 19 November 2002
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
     4
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
     5
This file is largely based on HOL/Finite_Set.thy.
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
     6
*)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
     7
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
     8
header {* Summation Operator *}
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
     9
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    10
theory FoldSet = Main:
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    11
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    12
(* Instantiation of LC from Finite_Set.thy is not possible,
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    13
   because here we have explicit typing rules like x : carrier G.
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    14
   We introduce an explicit argument for the domain D *)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    15
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    16
consts
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    17
  foldSetD :: "['a set, 'b => 'a => 'a, 'a] => ('b set * 'a) set"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    18
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    19
inductive "foldSetD D f e"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    20
  intros
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    21
    emptyI [intro]: "e : D ==> ({}, e) : foldSetD D f e"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    22
    insertI [intro]: "[| x ~: A; f x y : D; (A, y) : foldSetD D f e |] ==>
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    23
                      (insert x A, f x y) : foldSetD D f e"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    24
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    25
inductive_cases empty_foldSetDE [elim!]: "({}, x) : foldSetD D f e"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    26
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    27
constdefs
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    28
  foldD :: "['a set, 'b => 'a => 'a, 'a, 'b set] => 'a"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    29
  "foldD D f e A == THE x. (A, x) : foldSetD D f e"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    30
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    31
lemma foldSetD_closed:
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    32
  "[| (A, z) : foldSetD D f e ; e : D; !!x y. [| x : A; y : D |] ==> f x y : D 
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    33
      |] ==> z : D";
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    34
  by (erule foldSetD.elims) auto
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    35
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    36
lemma Diff1_foldSetD:
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    37
  "[| (A - {x}, y) : foldSetD D f e; x : A; f x y : D |] ==>
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    38
   (A, f x y) : foldSetD D f e"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    39
  apply (erule insert_Diff [THEN subst], rule foldSetD.intros)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    40
   apply auto
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    41
  done
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    42
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    43
lemma foldSetD_imp_finite [simp]: "(A, x) : foldSetD D f e ==> finite A"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    44
  by (induct set: foldSetD) auto
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    45
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    46
lemma finite_imp_foldSetD:
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    47
  "[| finite A; e : D; !!x y. [| x : A; y : D |] ==> f x y : D |] ==>
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    48
   EX x. (A, x) : foldSetD D f e"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    49
proof (induct set: Finites)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    50
  case empty then show ?case by auto
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    51
next
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    52
  case (insert F x)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    53
  then obtain y where y: "(F, y) : foldSetD D f e" by auto
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    54
  with insert have "y : D" by (auto dest: foldSetD_closed)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    55
  with y and insert have "(insert x F, f x y) : foldSetD D f e"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    56
    by (intro foldSetD.intros) auto
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    57
  then show ?case ..
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    58
qed
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    59
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    60
subsection {* Left-commutative operations *}
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    61
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    62
locale LCD =
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    63
  fixes B :: "'b set"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    64
  and D :: "'a set"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    65
  and f :: "'b => 'a => 'a"    (infixl "\<cdot>" 70)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    66
  assumes left_commute: "[| x : B; y : B; z : D |] ==> x \<cdot> (y \<cdot> z) = y \<cdot> (x \<cdot> z)"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    67
  and f_closed [simp, intro!]: "!!x y. [| x : B; y : D |] ==> f x y : D"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    68
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    69
lemma (in LCD) foldSetD_closed [dest]:
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    70
  "(A, z) : foldSetD D f e ==> z : D";
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    71
  by (erule foldSetD.elims) auto
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    72
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    73
lemma (in LCD) Diff1_foldSetD:
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    74
  "[| (A - {x}, y) : foldSetD D f e; x : A; A <= B |] ==>
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    75
   (A, f x y) : foldSetD D f e"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    76
  apply (subgoal_tac "x : B")
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    77
  prefer 2 apply fast
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    78
  apply (erule insert_Diff [THEN subst], rule foldSetD.intros)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    79
   apply auto
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    80
  done
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    81
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    82
lemma (in LCD) foldSetD_imp_finite [simp]:
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    83
  "(A, x) : foldSetD D f e ==> finite A"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    84
  by (induct set: foldSetD) auto
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    85
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    86
lemma (in LCD) finite_imp_foldSetD:
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    87
  "[| finite A; A <= B; e : D |] ==> EX x. (A, x) : foldSetD D f e"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    88
proof (induct set: Finites)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    89
  case empty then show ?case by auto
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    90
next
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    91
  case (insert F x)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    92
  then obtain y where y: "(F, y) : foldSetD D f e" by auto
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    93
  with insert have "y : D" by auto
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    94
  with y and insert have "(insert x F, f x y) : foldSetD D f e"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    95
    by (intro foldSetD.intros) auto
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    96
  then show ?case ..
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    97
qed
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    98
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
    99
lemma (in LCD) foldSetD_determ_aux:
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   100
  "e : D ==> ALL A x. A <= B & card A < n --> (A, x) : foldSetD D f e -->
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   101
    (ALL y. (A, y) : foldSetD D f e --> y = x)"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   102
  apply (induct n)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   103
   apply (auto simp add: less_Suc_eq)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   104
  apply (erule foldSetD.cases)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   105
   apply blast
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   106
  apply (erule foldSetD.cases)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   107
   apply blast
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   108
  apply clarify
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   109
  txt {* force simplification of @{text "card A < card (insert ...)"}. *}
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   110
  apply (erule rev_mp)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   111
  apply (simp add: less_Suc_eq_le)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   112
  apply (rule impI)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   113
  apply (rename_tac Aa xa ya Ab xb yb, case_tac "xa = xb")
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   114
   apply (subgoal_tac "Aa = Ab")
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   115
    prefer 2 apply (blast elim!: equalityE)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   116
   apply blast
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   117
  txt {* case @{prop "xa \<notin> xb"}. *}
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   118
  apply (subgoal_tac "Aa - {xb} = Ab - {xa} & xb : Aa & xa : Ab")
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   119
   prefer 2 apply (blast elim!: equalityE)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   120
  apply clarify
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   121
  apply (subgoal_tac "Aa = insert xb Ab - {xa}")
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   122
   prefer 2 apply blast
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   123
  apply (subgoal_tac "card Aa <= card Ab")
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   124
   prefer 2
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   125
   apply (rule Suc_le_mono [THEN subst])
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   126
   apply (simp add: card_Suc_Diff1)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   127
  apply (rule_tac A1 = "Aa - {xb}" in finite_imp_foldSetD [THEN exE])
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   128
  apply (blast intro: foldSetD_imp_finite finite_Diff)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   129
(* new subgoal from finite_imp_foldSetD *)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   130
    apply best (* blast doesn't seem to solve this *)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   131
   apply assumption
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   132
  apply (frule (1) Diff1_foldSetD)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   133
(* new subgoal from Diff1_foldSetD *)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   134
    apply best
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   135
(*
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   136
apply (best del: foldSetD_closed elim: foldSetD_closed)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   137
    apply (rule f_closed) apply assumption apply (rule foldSetD_closed)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   138
    prefer 3 apply assumption apply (rule e_closed)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   139
    apply (rule f_closed) apply force apply assumption
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   140
*)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   141
  apply (subgoal_tac "ya = f xb x")
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   142
   prefer 2
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   143
(* new subgoal to make IH applicable *) 
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   144
  apply (subgoal_tac "Aa <= B")
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   145
   prefer 2 apply best
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   146
   apply (blast del: equalityCE)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   147
  apply (subgoal_tac "(Ab - {xa}, x) : foldSetD D f e")
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   148
   prefer 2 apply simp
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   149
  apply (subgoal_tac "yb = f xa x")
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   150
   prefer 2 
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   151
(*   apply (drule_tac x = xa in Diff1_foldSetD)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   152
     apply assumption
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   153
     apply (rule f_closed) apply best apply (rule foldSetD_closed)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   154
     prefer 3 apply assumption apply (rule e_closed)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   155
     apply (rule f_closed) apply best apply assumption
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   156
*)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   157
   apply (blast del: equalityCE dest: Diff1_foldSetD)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   158
   apply (simp (no_asm_simp))
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   159
   apply (rule left_commute)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   160
   apply assumption apply best apply best
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   161
 done
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   162
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   163
lemma (in LCD) foldSetD_determ:
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   164
  "[| (A, x) : foldSetD D f e; (A, y) : foldSetD D f e; e : D; A <= B |]
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   165
   ==> y = x"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   166
  by (blast intro: foldSetD_determ_aux [rule_format])
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   167
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   168
lemma (in LCD) foldD_equality:
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   169
  "[| (A, y) : foldSetD D f e; e : D; A <= B |] ==> foldD D f e A = y"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   170
  by (unfold foldD_def) (blast intro: foldSetD_determ)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   171
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   172
lemma foldD_empty [simp]:
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   173
  "e : D ==> foldD D f e {} = e"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   174
  by (unfold foldD_def) blast
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   175
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   176
lemma (in LCD) foldD_insert_aux:
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   177
  "[| x ~: A; x : B; e : D; A <= B |] ==>
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   178
    ((insert x A, v) : foldSetD D f e) =
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   179
    (EX y. (A, y) : foldSetD D f e & v = f x y)"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   180
  apply auto
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   181
  apply (rule_tac A1 = A in finite_imp_foldSetD [THEN exE])
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   182
   apply (fastsimp dest: foldSetD_imp_finite)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   183
(* new subgoal by finite_imp_foldSetD *)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   184
    apply assumption
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   185
    apply assumption
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   186
  apply (blast intro: foldSetD_determ)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   187
  done
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   188
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   189
lemma (in LCD) foldD_insert:
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   190
    "[| finite A; x ~: A; x : B; e : D; A <= B |] ==>
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   191
     foldD D f e (insert x A) = f x (foldD D f e A)"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   192
  apply (unfold foldD_def)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   193
  apply (simp add: foldD_insert_aux)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   194
  apply (rule the_equality)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   195
  apply (auto intro: finite_imp_foldSetD
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   196
    cong add: conj_cong simp add: foldD_def [symmetric] foldD_equality)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   197
  done
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   198
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   199
lemma (in LCD) foldD_closed [simp]:
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   200
  "[| finite A; e : D; A <= B |] ==> foldD D f e A : D"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   201
proof (induct set: Finites)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   202
  case empty then show ?case by (simp add: foldD_empty)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   203
next
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   204
  case insert then show ?case by (simp add: foldD_insert)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   205
qed
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   206
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   207
lemma (in LCD) foldD_commute:
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   208
  "[| finite A; x : B; e : D; A <= B |] ==>
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   209
   f x (foldD D f e A) = foldD D f (f x e) A"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   210
  apply (induct set: Finites)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   211
   apply simp
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   212
  apply (auto simp add: left_commute foldD_insert)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   213
  done
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   214
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   215
lemma Int_mono2:
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   216
  "[| A <= C; B <= C |] ==> A Int B <= C"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   217
  by blast
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   218
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   219
lemma (in LCD) foldD_nest_Un_Int:
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   220
  "[| finite A; finite C; e : D; A <= B; C <= B |] ==>
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   221
   foldD D f (foldD D f e C) A = foldD D f (foldD D f e (A Int C)) (A Un C)"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   222
  apply (induct set: Finites)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   223
   apply simp
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   224
  apply (simp add: foldD_insert foldD_commute Int_insert_left insert_absorb
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   225
    Int_mono2 Un_subset_iff)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   226
  done
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   227
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   228
lemma (in LCD) foldD_nest_Un_disjoint:
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   229
  "[| finite A; finite B; A Int B = {}; e : D; A <= B; C <= B |]
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   230
    ==> foldD D f e (A Un B) = foldD D f (foldD D f e B) A"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   231
  by (simp add: foldD_nest_Un_Int)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   232
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   233
-- {* Delete rules to do with @{text foldSetD} relation. *}
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   234
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   235
declare foldSetD_imp_finite [simp del]
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   236
  empty_foldSetDE [rule del]
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   237
  foldSetD.intros [rule del]
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   238
declare (in LCD)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   239
  foldSetD_closed [rule del]
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   240
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   241
subsection {* Commutative monoids *}
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   242
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   243
text {*
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   244
  We enter a more restrictive context, with @{text "f :: 'a => 'a => 'a"}
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   245
  instead of @{text "'b => 'a => 'a"}.
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   246
*}
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   247
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   248
locale ACeD =
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   249
  fixes D :: "'a set"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   250
    and f :: "'a => 'a => 'a"    (infixl "\<cdot>" 70)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   251
    and e :: 'a
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   252
  assumes ident [simp]: "x : D ==> x \<cdot> e = x"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   253
    and commute: "[| x : D; y : D |] ==> x \<cdot> y = y \<cdot> x"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   254
    and assoc: "[| x : D; y : D; z : D |] ==> (x \<cdot> y) \<cdot> z = x \<cdot> (y \<cdot> z)"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   255
    and e_closed [simp]: "e : D"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   256
    and f_closed [simp]: "[| x : D; y : D |] ==> x \<cdot> y : D"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   257
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   258
lemma (in ACeD) left_commute:
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   259
  "[| x : D; y : D; z : D |] ==> x \<cdot> (y \<cdot> z) = y \<cdot> (x \<cdot> z)"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   260
proof -
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   261
  assume D: "x : D" "y : D" "z : D"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   262
  then have "x \<cdot> (y \<cdot> z) = (y \<cdot> z) \<cdot> x" by (simp add: commute)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   263
  also from D have "... = y \<cdot> (z \<cdot> x)" by (simp add: assoc)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   264
  also from D have "z \<cdot> x = x \<cdot> z" by (simp add: commute)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   265
  finally show ?thesis .
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   266
qed
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   267
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   268
lemmas (in ACeD) AC = assoc commute left_commute
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   269
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   270
lemma (in ACeD) left_ident [simp]: "x : D ==> e \<cdot> x = x"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   271
proof -
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   272
  assume D: "x : D"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   273
  have "x \<cdot> e = x" by (rule ident)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   274
  with D show ?thesis by (simp add: commute)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   275
qed
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   276
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   277
lemma (in ACeD) foldD_Un_Int:
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   278
  "[| finite A; finite B; A <= D; B <= D |] ==>
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   279
    foldD D f e A \<cdot> foldD D f e B =
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   280
    foldD D f e (A Un B) \<cdot> foldD D f e (A Int B)"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   281
  apply (induct set: Finites)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   282
   apply (simp add: left_commute LCD.foldD_closed [OF LCD.intro [of D]])
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   283
(* left_commute is required to show premise of LCD.intro *)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   284
  apply (simp add: AC insert_absorb Int_insert_left
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   285
    LCD.foldD_insert [OF LCD.intro [of D]]
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   286
    LCD.foldD_closed [OF LCD.intro [of D]]
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   287
    Int_mono2 Un_subset_iff)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   288
  done
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   289
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   290
lemma (in ACeD) foldD_Un_disjoint:
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   291
  "[| finite A; finite B; A Int B = {}; A <= D; B <= D |] ==>
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   292
    foldD D f e (A Un B) = foldD D f e A \<cdot> foldD D f e B"
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   293
  by (simp add: foldD_Un_Int
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   294
    left_commute LCD.foldD_closed [OF LCD.intro [of D]] Un_subset_iff)
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   295
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   296
end
7e031a968443 Product operator added --- preliminary.
ballarin
parents:
diff changeset
   297