src/HOL/Algebra/Congruence.thy
author wenzelm
Sun Mar 21 17:12:31 2010 +0100 (2010-03-21)
changeset 35849 b5522b51cb1e
parent 35848 5443079512ea
child 40293 cd932ab8cb59
permissions -rw-r--r--
standard headers;
wenzelm@35849
     1
(*  Title:      Algebra/Congruence.thy
wenzelm@35849
     2
    Author:     Clemens Ballarin, started 3 January 2008
wenzelm@35849
     3
    Copyright:  Clemens Ballarin
ballarin@27701
     4
*)
ballarin@27701
     5
wenzelm@35849
     6
theory Congruence
wenzelm@35849
     7
imports Main
wenzelm@35849
     8
begin
ballarin@27701
     9
ballarin@27701
    10
section {* Objects *}
ballarin@27701
    11
ballarin@27717
    12
subsection {* Structure with Carrier Set. *}
ballarin@27701
    13
ballarin@27701
    14
record 'a partial_object =
ballarin@27701
    15
  carrier :: "'a set"
ballarin@27701
    16
ballarin@27717
    17
ballarin@27717
    18
subsection {* Structure with Carrier and Equivalence Relation @{text eq} *}
ballarin@27701
    19
ballarin@27701
    20
record 'a eq_object = "'a partial_object" +
ballarin@27701
    21
  eq :: "'a \<Rightarrow> 'a \<Rightarrow> bool" (infixl ".=\<index>" 50)
ballarin@27701
    22
wenzelm@35847
    23
definition
ballarin@27701
    24
  elem :: "_ \<Rightarrow> 'a \<Rightarrow> 'a set \<Rightarrow> bool" (infixl ".\<in>\<index>" 50)
wenzelm@35848
    25
  where "x .\<in>\<^bsub>S\<^esub> A \<longleftrightarrow> (\<exists>y \<in> A. x .=\<^bsub>S\<^esub> y)"
ballarin@27701
    26
wenzelm@35847
    27
definition
ballarin@27701
    28
  set_eq :: "_ \<Rightarrow> 'a set \<Rightarrow> 'a set \<Rightarrow> bool" (infixl "{.=}\<index>" 50)
wenzelm@35848
    29
  where "A {.=}\<^bsub>S\<^esub> B \<longleftrightarrow> ((\<forall>x \<in> A. x .\<in>\<^bsub>S\<^esub> B) \<and> (\<forall>x \<in> B. x .\<in>\<^bsub>S\<^esub> A))"
ballarin@27701
    30
wenzelm@35847
    31
definition
ballarin@27701
    32
  eq_class_of :: "_ \<Rightarrow> 'a \<Rightarrow> 'a set" ("class'_of\<index> _")
wenzelm@35848
    33
  where "class_of\<^bsub>S\<^esub> x = {y \<in> carrier S. x .=\<^bsub>S\<^esub> y}"
ballarin@27701
    34
wenzelm@35847
    35
definition
ballarin@27701
    36
  eq_closure_of :: "_ \<Rightarrow> 'a set \<Rightarrow> 'a set" ("closure'_of\<index> _")
wenzelm@35848
    37
  where "closure_of\<^bsub>S\<^esub> A = {y \<in> carrier S. y .\<in>\<^bsub>S\<^esub> A}"
ballarin@27701
    38
wenzelm@35847
    39
definition
ballarin@27701
    40
  eq_is_closed :: "_ \<Rightarrow> 'a set \<Rightarrow> bool" ("is'_closed\<index> _")
wenzelm@35848
    41
  where "is_closed\<^bsub>S\<^esub> A \<longleftrightarrow> A \<subseteq> carrier S \<and> closure_of\<^bsub>S\<^esub> A = A"
ballarin@27701
    42
wenzelm@35355
    43
abbreviation
ballarin@27701
    44
  not_eq :: "_ \<Rightarrow> 'a \<Rightarrow> 'a \<Rightarrow> bool" (infixl ".\<noteq>\<index>" 50)
wenzelm@35355
    45
  where "x .\<noteq>\<^bsub>S\<^esub> y == ~(x .=\<^bsub>S\<^esub> y)"
ballarin@27701
    46
wenzelm@35355
    47
abbreviation
wenzelm@35355
    48
  not_elem :: "_ \<Rightarrow> 'a \<Rightarrow> 'a set \<Rightarrow> bool" (infixl ".\<notin>\<index>" 50)
wenzelm@35355
    49
  where "x .\<notin>\<^bsub>S\<^esub> A == ~(x .\<in>\<^bsub>S\<^esub> A)"
wenzelm@35355
    50
wenzelm@35355
    51
abbreviation
wenzelm@35355
    52
  set_not_eq :: "_ \<Rightarrow> 'a set \<Rightarrow> 'a set \<Rightarrow> bool" (infixl "{.\<noteq>}\<index>" 50)
wenzelm@35355
    53
  where "A {.\<noteq>}\<^bsub>S\<^esub> B == ~(A {.=}\<^bsub>S\<^esub> B)"
ballarin@27701
    54
ballarin@27701
    55
locale equivalence =
ballarin@27701
    56
  fixes S (structure)
ballarin@27701
    57
  assumes refl [simp, intro]: "x \<in> carrier S \<Longrightarrow> x .= x"
ballarin@27701
    58
    and sym [sym]: "\<lbrakk> x .= y; x \<in> carrier S; y \<in> carrier S \<rbrakk> \<Longrightarrow> y .= x"
ballarin@27701
    59
    and trans [trans]: "\<lbrakk> x .= y; y .= z; x \<in> carrier S; y \<in> carrier S; z \<in> carrier S \<rbrakk> \<Longrightarrow> x .= z"
ballarin@27701
    60
ballarin@27717
    61
(* Lemmas by Stephan Hohe *)
ballarin@27717
    62
ballarin@27701
    63
lemma elemI:
ballarin@27701
    64
  fixes R (structure)
ballarin@27701
    65
  assumes "a' \<in> A" and "a .= a'"
ballarin@27701
    66
  shows "a .\<in> A"
ballarin@27701
    67
unfolding elem_def
ballarin@27701
    68
using assms
ballarin@27701
    69
by fast
ballarin@27701
    70
ballarin@27701
    71
lemma (in equivalence) elem_exact:
ballarin@27701
    72
  assumes "a \<in> carrier S" and "a \<in> A"
ballarin@27701
    73
  shows "a .\<in> A"
ballarin@27701
    74
using assms
ballarin@27701
    75
by (fast intro: elemI)
ballarin@27701
    76
ballarin@27701
    77
lemma elemE:
ballarin@27701
    78
  fixes S (structure)
ballarin@27701
    79
  assumes "a .\<in> A"
ballarin@27701
    80
    and "\<And>a'. \<lbrakk>a' \<in> A; a .= a'\<rbrakk> \<Longrightarrow> P"
ballarin@27701
    81
  shows "P"
ballarin@27701
    82
using assms
ballarin@27701
    83
unfolding elem_def
ballarin@27701
    84
by fast
ballarin@27701
    85
ballarin@27701
    86
lemma (in equivalence) elem_cong_l [trans]:
ballarin@27701
    87
  assumes cong: "a' .= a"
ballarin@27701
    88
    and a: "a .\<in> A"
ballarin@27701
    89
    and carr: "a \<in> carrier S"  "a' \<in> carrier S"
ballarin@27701
    90
    and Acarr: "A \<subseteq> carrier S"
ballarin@27701
    91
  shows "a' .\<in> A"
ballarin@27701
    92
using a
ballarin@27701
    93
apply (elim elemE, intro elemI)
ballarin@27701
    94
proof assumption
ballarin@27701
    95
  fix b
ballarin@27701
    96
  assume bA: "b \<in> A"
ballarin@27701
    97
  note [simp] = carr bA[THEN subsetD[OF Acarr]]
ballarin@27701
    98
  note cong
ballarin@27701
    99
  also assume "a .= b"
ballarin@27701
   100
  finally show "a' .= b" by simp
ballarin@27701
   101
qed
ballarin@27701
   102
ballarin@27701
   103
lemma (in equivalence) elem_subsetD:
ballarin@27701
   104
  assumes "A \<subseteq> B"
ballarin@27701
   105
    and aA: "a .\<in> A"
ballarin@27701
   106
  shows "a .\<in> B"
ballarin@27701
   107
using assms
ballarin@27701
   108
by (fast intro: elemI elim: elemE dest: subsetD)
ballarin@27701
   109
ballarin@27701
   110
lemma (in equivalence) mem_imp_elem [simp, intro]:
ballarin@27701
   111
  "[| x \<in> A; x \<in> carrier S |] ==> x .\<in> A"
ballarin@27701
   112
  unfolding elem_def by blast
ballarin@27701
   113
ballarin@27701
   114
lemma set_eqI:
ballarin@27701
   115
  fixes R (structure)
ballarin@27701
   116
  assumes ltr: "\<And>a. a \<in> A \<Longrightarrow> a .\<in> B"
ballarin@27701
   117
    and rtl: "\<And>b. b \<in> B \<Longrightarrow> b .\<in> A"
ballarin@27701
   118
  shows "A {.=} B"
ballarin@27701
   119
unfolding set_eq_def
ballarin@27701
   120
by (fast intro: ltr rtl)
ballarin@27701
   121
ballarin@27701
   122
lemma set_eqI2:
ballarin@27701
   123
  fixes R (structure)
ballarin@27701
   124
  assumes ltr: "\<And>a b. a \<in> A \<Longrightarrow> \<exists>b\<in>B. a .= b"
ballarin@27701
   125
    and rtl: "\<And>b. b \<in> B \<Longrightarrow> \<exists>a\<in>A. b .= a"
ballarin@27701
   126
  shows "A {.=} B"
ballarin@27701
   127
  by (intro set_eqI, unfold elem_def) (fast intro: ltr rtl)+
ballarin@27701
   128
ballarin@27701
   129
lemma set_eqD1:
ballarin@27701
   130
  fixes R (structure)
ballarin@27701
   131
  assumes AA': "A {.=} A'"
ballarin@27701
   132
    and "a \<in> A"
ballarin@27701
   133
  shows "\<exists>a'\<in>A'. a .= a'"
ballarin@27701
   134
using assms
ballarin@27701
   135
unfolding set_eq_def elem_def
ballarin@27701
   136
by fast
ballarin@27701
   137
ballarin@27701
   138
lemma set_eqD2:
ballarin@27701
   139
  fixes R (structure)
ballarin@27701
   140
  assumes AA': "A {.=} A'"
ballarin@27701
   141
    and "a' \<in> A'"
ballarin@27701
   142
  shows "\<exists>a\<in>A. a' .= a"
ballarin@27701
   143
using assms
ballarin@27701
   144
unfolding set_eq_def elem_def
ballarin@27701
   145
by fast
ballarin@27701
   146
ballarin@27701
   147
lemma set_eqE:
ballarin@27701
   148
  fixes R (structure)
ballarin@27701
   149
  assumes AB: "A {.=} B"
ballarin@27701
   150
    and r: "\<lbrakk>\<forall>a\<in>A. a .\<in> B; \<forall>b\<in>B. b .\<in> A\<rbrakk> \<Longrightarrow> P"
ballarin@27701
   151
  shows "P"
ballarin@27701
   152
using AB
ballarin@27701
   153
unfolding set_eq_def
ballarin@27701
   154
by (blast dest: r)
ballarin@27701
   155
ballarin@27701
   156
lemma set_eqE2:
ballarin@27701
   157
  fixes R (structure)
ballarin@27701
   158
  assumes AB: "A {.=} B"
ballarin@27701
   159
    and r: "\<lbrakk>\<forall>a\<in>A. (\<exists>b\<in>B. a .= b); \<forall>b\<in>B. (\<exists>a\<in>A. b .= a)\<rbrakk> \<Longrightarrow> P"
ballarin@27701
   160
  shows "P"
ballarin@27701
   161
using AB
ballarin@27701
   162
unfolding set_eq_def elem_def
ballarin@27701
   163
by (blast dest: r)
ballarin@27701
   164
ballarin@27701
   165
lemma set_eqE':
ballarin@27701
   166
  fixes R (structure)
ballarin@27701
   167
  assumes AB: "A {.=} B"
ballarin@27701
   168
    and aA: "a \<in> A" and bB: "b \<in> B"
ballarin@27701
   169
    and r: "\<And>a' b'. \<lbrakk>a' \<in> A; b .= a'; b' \<in> B; a .= b'\<rbrakk> \<Longrightarrow> P"
ballarin@27701
   170
  shows "P"
ballarin@27701
   171
proof -
ballarin@27701
   172
  from AB aA
ballarin@27701
   173
      have "\<exists>b'\<in>B. a .= b'" by (rule set_eqD1)
ballarin@27701
   174
  from this obtain b'
ballarin@27701
   175
      where b': "b' \<in> B" "a .= b'" by auto
ballarin@27701
   176
ballarin@27701
   177
  from AB bB
ballarin@27701
   178
      have "\<exists>a'\<in>A. b .= a'" by (rule set_eqD2)
ballarin@27701
   179
  from this obtain a'
ballarin@27701
   180
      where a': "a' \<in> A" "b .= a'" by auto
ballarin@27701
   181
ballarin@27701
   182
  from a' b'
ballarin@27701
   183
      show "P" by (rule r)
ballarin@27701
   184
qed
ballarin@27701
   185
ballarin@27701
   186
lemma (in equivalence) eq_elem_cong_r [trans]:
ballarin@27701
   187
  assumes a: "a .\<in> A"
ballarin@27701
   188
    and cong: "A {.=} A'"
ballarin@27701
   189
    and carr: "a \<in> carrier S"
ballarin@27701
   190
    and Carr: "A \<subseteq> carrier S" "A' \<subseteq> carrier S"
ballarin@27701
   191
  shows "a .\<in> A'"
ballarin@27701
   192
using a cong
ballarin@27701
   193
proof (elim elemE set_eqE)
ballarin@27701
   194
  fix b
ballarin@27701
   195
  assume bA: "b \<in> A"
ballarin@27701
   196
     and inA': "\<forall>b\<in>A. b .\<in> A'"
ballarin@27701
   197
  note [simp] = carr Carr Carr[THEN subsetD] bA
ballarin@27701
   198
  assume "a .= b"
ballarin@27701
   199
  also from bA inA'
ballarin@27701
   200
       have "b .\<in> A'" by fast
ballarin@27701
   201
  finally
ballarin@27701
   202
       show "a .\<in> A'" by simp
ballarin@27701
   203
qed
ballarin@27701
   204
ballarin@27701
   205
lemma (in equivalence) set_eq_sym [sym]:
ballarin@27701
   206
  assumes "A {.=} B"
ballarin@27701
   207
    and "A \<subseteq> carrier S" "B \<subseteq> carrier S"
ballarin@27701
   208
  shows "B {.=} A"
ballarin@27701
   209
using assms
ballarin@27701
   210
unfolding set_eq_def elem_def
ballarin@27701
   211
by fast
ballarin@27701
   212
ballarin@27701
   213
(* FIXME: the following two required in Isabelle 2008, not Isabelle 2007 *)
ballarin@27717
   214
(* alternatively, could declare lemmas [trans] = ssubst [where 'a = "'a set"] *)
ballarin@27701
   215
ballarin@27701
   216
lemma (in equivalence) equal_set_eq_trans [trans]:
ballarin@27701
   217
  assumes AB: "A = B" and BC: "B {.=} C"
ballarin@27701
   218
  shows "A {.=} C"
ballarin@27701
   219
  using AB BC by simp
ballarin@27701
   220
ballarin@27701
   221
lemma (in equivalence) set_eq_equal_trans [trans]:
ballarin@27701
   222
  assumes AB: "A {.=} B" and BC: "B = C"
ballarin@27701
   223
  shows "A {.=} C"
ballarin@27701
   224
  using AB BC by simp
ballarin@27701
   225
ballarin@27717
   226
ballarin@27701
   227
lemma (in equivalence) set_eq_trans [trans]:
ballarin@27701
   228
  assumes AB: "A {.=} B" and BC: "B {.=} C"
ballarin@27701
   229
    and carr: "A \<subseteq> carrier S"  "B \<subseteq> carrier S"  "C \<subseteq> carrier S"
ballarin@27701
   230
  shows "A {.=} C"
ballarin@27701
   231
proof (intro set_eqI)
ballarin@27701
   232
  fix a
ballarin@27701
   233
  assume aA: "a \<in> A"
ballarin@27701
   234
  with carr have "a \<in> carrier S" by fast
ballarin@27701
   235
  note [simp] = carr this
ballarin@27701
   236
ballarin@27701
   237
  from aA
ballarin@27701
   238
       have "a .\<in> A" by (simp add: elem_exact)
ballarin@27701
   239
  also note AB
ballarin@27701
   240
  also note BC
ballarin@27701
   241
  finally
ballarin@27701
   242
       show "a .\<in> C" by simp
ballarin@27701
   243
next
ballarin@27701
   244
  fix c
ballarin@27701
   245
  assume cC: "c \<in> C"
ballarin@27701
   246
  with carr have "c \<in> carrier S" by fast
ballarin@27701
   247
  note [simp] = carr this
ballarin@27701
   248
ballarin@27701
   249
  from cC
ballarin@27701
   250
       have "c .\<in> C" by (simp add: elem_exact)
ballarin@27701
   251
  also note BC[symmetric]
ballarin@27701
   252
  also note AB[symmetric]
ballarin@27701
   253
  finally
ballarin@27701
   254
       show "c .\<in> A" by simp
ballarin@27701
   255
qed
ballarin@27701
   256
ballarin@27701
   257
(* FIXME: generalise for insert *)
ballarin@27701
   258
ballarin@27701
   259
(*
ballarin@27701
   260
lemma (in equivalence) set_eq_insert:
ballarin@27701
   261
  assumes x: "x .= x'"
ballarin@27701
   262
    and carr: "x \<in> carrier S" "x' \<in> carrier S" "A \<subseteq> carrier S"
ballarin@27701
   263
  shows "insert x A {.=} insert x' A"
ballarin@27701
   264
  unfolding set_eq_def elem_def
ballarin@27701
   265
apply rule
ballarin@27701
   266
apply rule
ballarin@27701
   267
apply (case_tac "xa = x")
ballarin@27701
   268
using x apply fast
ballarin@27701
   269
apply (subgoal_tac "xa \<in> A") prefer 2 apply fast
ballarin@27701
   270
apply (rule_tac x=xa in bexI)
ballarin@27701
   271
using carr apply (rule_tac refl) apply auto [1]
ballarin@27701
   272
apply safe
ballarin@27701
   273
*)
ballarin@27701
   274
ballarin@27701
   275
lemma (in equivalence) set_eq_pairI:
ballarin@27701
   276
  assumes xx': "x .= x'"
ballarin@27701
   277
    and carr: "x \<in> carrier S" "x' \<in> carrier S" "y \<in> carrier S"
ballarin@27701
   278
  shows "{x, y} {.=} {x', y}"
ballarin@27701
   279
unfolding set_eq_def elem_def
ballarin@27701
   280
proof safe
ballarin@27701
   281
  have "x' \<in> {x', y}" by fast
ballarin@27701
   282
  with xx' show "\<exists>b\<in>{x', y}. x .= b" by fast
ballarin@27701
   283
next
ballarin@27701
   284
  have "y \<in> {x', y}" by fast
ballarin@27701
   285
  with carr show "\<exists>b\<in>{x', y}. y .= b" by fast
ballarin@27701
   286
next
ballarin@27701
   287
  have "x \<in> {x, y}" by fast
ballarin@27701
   288
  with xx'[symmetric] carr
ballarin@27701
   289
  show "\<exists>a\<in>{x, y}. x' .= a" by fast
ballarin@27701
   290
next
ballarin@27701
   291
  have "y \<in> {x, y}" by fast
ballarin@27701
   292
  with carr show "\<exists>a\<in>{x, y}. y .= a" by fast
ballarin@27701
   293
qed
ballarin@27701
   294
ballarin@27701
   295
lemma (in equivalence) is_closedI:
ballarin@27701
   296
  assumes closed: "!!x y. [| x .= y; x \<in> A; y \<in> carrier S |] ==> y \<in> A"
ballarin@27701
   297
    and S: "A \<subseteq> carrier S"
ballarin@27701
   298
  shows "is_closed A"
ballarin@27701
   299
  unfolding eq_is_closed_def eq_closure_of_def elem_def
ballarin@27701
   300
  using S
ballarin@27701
   301
  by (blast dest: closed sym)
ballarin@27701
   302
ballarin@27701
   303
lemma (in equivalence) closure_of_eq:
ballarin@27701
   304
  "[| x .= x'; A \<subseteq> carrier S; x \<in> closure_of A; x \<in> carrier S; x' \<in> carrier S |] ==> x' \<in> closure_of A"
ballarin@27701
   305
  unfolding eq_closure_of_def elem_def
ballarin@27701
   306
  by (blast intro: trans sym)
ballarin@27701
   307
ballarin@27701
   308
lemma (in equivalence) is_closed_eq [dest]:
ballarin@27701
   309
  "[| x .= x'; x \<in> A; is_closed A; x \<in> carrier S; x' \<in> carrier S |] ==> x' \<in> A"
ballarin@27701
   310
  unfolding eq_is_closed_def
ballarin@27701
   311
  using closure_of_eq [where A = A]
ballarin@27701
   312
  by simp
ballarin@27701
   313
ballarin@27701
   314
lemma (in equivalence) is_closed_eq_rev [dest]:
ballarin@27701
   315
  "[| x .= x'; x' \<in> A; is_closed A; x \<in> carrier S; x' \<in> carrier S |] ==> x \<in> A"
ballarin@27701
   316
  by (drule sym) (simp_all add: is_closed_eq)
ballarin@27701
   317
ballarin@27701
   318
lemma closure_of_closed [simp, intro]:
ballarin@27701
   319
  fixes S (structure)
ballarin@27701
   320
  shows "closure_of A \<subseteq> carrier S"
ballarin@27701
   321
unfolding eq_closure_of_def
ballarin@27701
   322
by fast
ballarin@27701
   323
ballarin@27701
   324
lemma closure_of_memI:
ballarin@27701
   325
  fixes S (structure)
ballarin@27701
   326
  assumes "a .\<in> A"
ballarin@27701
   327
    and "a \<in> carrier S"
ballarin@27701
   328
  shows "a \<in> closure_of A"
ballarin@27701
   329
unfolding eq_closure_of_def
ballarin@27701
   330
using assms
ballarin@27701
   331
by fast
ballarin@27701
   332
ballarin@27701
   333
lemma closure_ofI2:
ballarin@27701
   334
  fixes S (structure)
ballarin@27701
   335
  assumes "a .= a'"
ballarin@27701
   336
    and "a' \<in> A"
ballarin@27701
   337
    and "a \<in> carrier S"
ballarin@27701
   338
  shows "a \<in> closure_of A"
ballarin@27701
   339
unfolding eq_closure_of_def elem_def
ballarin@27701
   340
using assms
ballarin@27701
   341
by fast
ballarin@27701
   342
ballarin@27701
   343
lemma closure_of_memE:
ballarin@27701
   344
  fixes S (structure)
ballarin@27701
   345
  assumes p: "a \<in> closure_of A"
ballarin@27701
   346
    and r: "\<lbrakk>a \<in> carrier S; a .\<in> A\<rbrakk> \<Longrightarrow> P"
ballarin@27701
   347
  shows "P"
ballarin@27701
   348
proof -
ballarin@27701
   349
  from p
ballarin@27701
   350
      have acarr: "a \<in> carrier S"
ballarin@27701
   351
      and "a .\<in> A"
ballarin@27701
   352
      by (simp add: eq_closure_of_def)+
ballarin@27701
   353
  thus "P" by (rule r)
ballarin@27701
   354
qed
ballarin@27701
   355
ballarin@27701
   356
lemma closure_ofE2:
ballarin@27701
   357
  fixes S (structure)
ballarin@27701
   358
  assumes p: "a \<in> closure_of A"
ballarin@27701
   359
    and r: "\<And>a'. \<lbrakk>a \<in> carrier S; a' \<in> A; a .= a'\<rbrakk> \<Longrightarrow> P"
ballarin@27701
   360
  shows "P"
ballarin@27701
   361
proof -
ballarin@27701
   362
  from p have acarr: "a \<in> carrier S" by (simp add: eq_closure_of_def)
ballarin@27701
   363
ballarin@27701
   364
  from p have "\<exists>a'\<in>A. a .= a'" by (simp add: eq_closure_of_def elem_def)
ballarin@27701
   365
  from this obtain a'
ballarin@27701
   366
      where "a' \<in> A" and "a .= a'" by auto
ballarin@27701
   367
ballarin@27701
   368
  from acarr and this
ballarin@27701
   369
      show "P" by (rule r)
ballarin@27701
   370
qed
ballarin@27701
   371
ballarin@27701
   372
(*
ballarin@27701
   373
lemma (in equivalence) classes_consistent:
ballarin@27701
   374
  assumes Acarr: "A \<subseteq> carrier S"
ballarin@27701
   375
  shows "is_closed (closure_of A)"
ballarin@27701
   376
apply (blast intro: elemI elim elemE)
ballarin@27701
   377
using assms
ballarin@27701
   378
apply (intro is_closedI closure_of_memI, simp)
ballarin@27701
   379
 apply (elim elemE closure_of_memE)
ballarin@27701
   380
proof -
ballarin@27701
   381
  fix x a' a''
ballarin@27701
   382
  assume carr: "x \<in> carrier S" "a' \<in> carrier S"
ballarin@27701
   383
  assume a''A: "a'' \<in> A"
ballarin@27701
   384
  with Acarr have "a'' \<in> carrier S" by fast
ballarin@27701
   385
  note [simp] = carr this Acarr
ballarin@27701
   386
ballarin@27701
   387
  assume "x .= a'"
ballarin@27701
   388
  also assume "a' .= a''"
ballarin@27701
   389
  also from a''A
ballarin@27701
   390
       have "a'' .\<in> A" by (simp add: elem_exact)
ballarin@27701
   391
  finally show "x .\<in> A" by simp
ballarin@27701
   392
qed
ballarin@27701
   393
*)
ballarin@27701
   394
(*
ballarin@27701
   395
lemma (in equivalence) classes_small:
ballarin@27701
   396
  assumes "is_closed B"
ballarin@27701
   397
    and "A \<subseteq> B"
ballarin@27701
   398
  shows "closure_of A \<subseteq> B"
ballarin@27701
   399
using assms
ballarin@27701
   400
by (blast dest: is_closedD2 elem_subsetD elim: closure_of_memE)
ballarin@27701
   401
ballarin@27701
   402
lemma (in equivalence) classes_eq:
ballarin@27701
   403
  assumes "A \<subseteq> carrier S"
ballarin@27701
   404
  shows "A {.=} closure_of A"
ballarin@27701
   405
using assms
ballarin@27701
   406
by (blast intro: set_eqI elem_exact closure_of_memI elim: closure_of_memE)
ballarin@27701
   407
ballarin@27701
   408
lemma (in equivalence) complete_classes:
ballarin@27701
   409
  assumes c: "is_closed A"
ballarin@27701
   410
  shows "A = closure_of A"
ballarin@27701
   411
using assms
ballarin@27701
   412
by (blast intro: closure_of_memI elem_exact dest: is_closedD1 is_closedD2 closure_of_memE)
ballarin@27701
   413
*)
ballarin@27701
   414
ballarin@27701
   415
end