src/CCL/Set.thy
author haftmann
Tue, 10 Jul 2007 17:30:50 +0200
changeset 23709 fd31da8f752a
parent 20140 98acc6d0fab6
child 24825 c4f13ab78f9d
permissions -rw-r--r--
moved lfp_induct2 here
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
     1
(*  Title:      CCL/Set.thy
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     3
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     4
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
     5
header {* Extending FOL by a modified version of HOL set theory *}
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
     6
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
     7
theory Set
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
     8
imports FOL
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
     9
begin
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
3935
52c14fe8f16b adapted to qualified names;
wenzelm
parents: 3837
diff changeset
    11
global
52c14fe8f16b adapted to qualified names;
wenzelm
parents: 3837
diff changeset
    12
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    13
typedecl 'a set
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    14
arities set :: ("term") "term"
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    15
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    16
consts
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
  Collect       :: "['a => o] => 'a set"                    (*comprehension*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
  Compl         :: "('a set) => 'a set"                     (*complement*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    19
  Int           :: "['a set, 'a set] => 'a set"         (infixl 70)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    20
  Un            :: "['a set, 'a set] => 'a set"         (infixl 65)
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    21
  Union         :: "(('a set)set) => 'a set"                (*...of a set*)
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    22
  Inter         :: "(('a set)set) => 'a set"                (*...of a set*)
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    23
  UNION         :: "['a set, 'a => 'b set] => 'b set"       (*general*)
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    24
  INTER         :: "['a set, 'a => 'b set] => 'b set"       (*general*)
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    25
  Ball          :: "['a set, 'a => o] => o"                 (*bounded quants*)
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    26
  Bex           :: "['a set, 'a => o] => o"                 (*bounded quants*)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
  mono          :: "['a set => 'b set] => o"                (*monotonicity*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    28
  ":"           :: "['a, 'a set] => o"                  (infixl 50) (*membership*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
  "<="          :: "['a set, 'a set] => o"              (infixl 50)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
  singleton     :: "'a => 'a set"                       ("{_}")
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
  empty         :: "'a set"                             ("{}")
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
  "oo"          :: "['b => 'c, 'a => 'b, 'a] => 'c"     (infixr 50) (*composition*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
3935
52c14fe8f16b adapted to qualified names;
wenzelm
parents: 3837
diff changeset
    34
syntax
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
  "@Coll"       :: "[idt, o] => 'a set"                 ("(1{_./ _})") (*collection*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
  (* Big Intersection / Union *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
  "@INTER"      :: "[idt, 'a set, 'b set] => 'b set"    ("(INT _:_./ _)" [0, 0, 0] 10)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
  "@UNION"      :: "[idt, 'a set, 'b set] => 'b set"    ("(UN _:_./ _)" [0, 0, 0] 10)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
  (* Bounded Quantifiers *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
  "@Ball"       :: "[idt, 'a set, o] => o"              ("(ALL _:_./ _)" [0, 0, 0] 10)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
  "@Bex"        :: "[idt, 'a set, o] => o"              ("(EX _:_./ _)" [0, 0, 0] 10)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
translations
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
  "{x. P}"      == "Collect(%x. P)"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
  "INT x:A. B"  == "INTER(A, %x. B)"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
  "UN x:A. B"   == "UNION(A, %x. B)"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
  "ALL x:A. P"  == "Ball(A, %x. P)"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
  "EX x:A. P"   == "Bex(A, %x. P)"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
3935
52c14fe8f16b adapted to qualified names;
wenzelm
parents: 3837
diff changeset
    54
local
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    56
axioms
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    57
  mem_Collect_iff:       "(a : {x. P(x)}) <-> P(a)"
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    58
  set_extension:         "A=B <-> (ALL x. x:A <-> x:B)"
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
17456
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    60
defs
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    61
  Ball_def:      "Ball(A, P)  == ALL x. x:A --> P(x)"
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    62
  Bex_def:       "Bex(A, P)   == EX x. x:A & P(x)"
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    63
  mono_def:      "mono(f)     == (ALL A B. A <= B --> f(A) <= f(B))"
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    64
  subset_def:    "A <= B      == ALL x:A. x:B"
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    65
  singleton_def: "{a}         == {x. x=a}"
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    66
  empty_def:     "{}          == {x. False}"
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    67
  Un_def:        "A Un B      == {x. x:A | x:B}"
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    68
  Int_def:       "A Int B     == {x. x:A & x:B}"
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    69
  Compl_def:     "Compl(A)    == {x. ~x:A}"
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    70
  INTER_def:     "INTER(A, B) == {y. ALL x:A. y: B(x)}"
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    71
  UNION_def:     "UNION(A, B) == {y. EX x:A. y: B(x)}"
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    72
  Inter_def:     "Inter(S)    == (INT x:S. x)"
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    73
  Union_def:     "Union(S)    == (UN x:S. x)"
bcf7544875b2 converted to Isar theory format;
wenzelm
parents: 3935
diff changeset
    74
20140
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    75
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    76
lemma CollectI: "[| P(a) |] ==> a : {x. P(x)}"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    77
  apply (rule mem_Collect_iff [THEN iffD2])
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    78
  apply assumption
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    79
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    80
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    81
lemma CollectD: "[| a : {x. P(x)} |] ==> P(a)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    82
  apply (erule mem_Collect_iff [THEN iffD1])
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    83
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    84
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    85
lemmas CollectE = CollectD [elim_format]
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    86
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    87
lemma set_ext: "[| !!x. x:A <-> x:B |] ==> A = B"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    88
  apply (rule set_extension [THEN iffD2])
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    89
  apply simp
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    90
  done
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    91
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    92
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    93
subsection {* Bounded quantifiers *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    94
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    95
lemma ballI: "[| !!x. x:A ==> P(x) |] ==> ALL x:A. P(x)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    96
  by (simp add: Ball_def)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    97
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    98
lemma bspec: "[| ALL x:A. P(x);  x:A |] ==> P(x)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
    99
  by (simp add: Ball_def)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   100
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   101
lemma ballE: "[| ALL x:A. P(x);  P(x) ==> Q;  ~ x:A ==> Q |] ==> Q"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   102
  unfolding Ball_def by blast
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   103
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   104
lemma bexI: "[| P(x);  x:A |] ==> EX x:A. P(x)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   105
  unfolding Bex_def by blast
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   106
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   107
lemma bexCI: "[| EX x:A. ~P(x) ==> P(a);  a:A |] ==> EX x:A. P(x)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   108
  unfolding Bex_def by blast
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   109
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   110
lemma bexE: "[| EX x:A. P(x);  !!x. [| x:A; P(x) |] ==> Q  |] ==> Q"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   111
  unfolding Bex_def by blast
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   112
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   113
(*Trival rewrite rule;   (! x:A.P)=P holds only if A is nonempty!*)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   114
lemma ball_rew: "(ALL x:A. True) <-> True"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   115
  by (blast intro: ballI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   116
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   117
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   118
subsection {* Congruence rules *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   119
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   120
lemma ball_cong:
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   121
  "[| A=A';  !!x. x:A' ==> P(x) <-> P'(x) |] ==>
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   122
    (ALL x:A. P(x)) <-> (ALL x:A'. P'(x))"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   123
  by (blast intro: ballI elim: ballE)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   124
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   125
lemma bex_cong:
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   126
  "[| A=A';  !!x. x:A' ==> P(x) <-> P'(x) |] ==>
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   127
    (EX x:A. P(x)) <-> (EX x:A'. P'(x))"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   128
  by (blast intro: bexI elim: bexE)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   129
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   130
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   131
subsection {* Rules for subsets *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   132
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   133
lemma subsetI: "(!!x. x:A ==> x:B) ==> A <= B"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   134
  unfolding subset_def by (blast intro: ballI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   135
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   136
(*Rule in Modus Ponens style*)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   137
lemma subsetD: "[| A <= B;  c:A |] ==> c:B"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   138
  unfolding subset_def by (blast elim: ballE)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   139
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   140
(*Classical elimination rule*)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   141
lemma subsetCE: "[| A <= B;  ~(c:A) ==> P;  c:B ==> P |] ==> P"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   142
  by (blast dest: subsetD)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   143
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   144
lemma subset_refl: "A <= A"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   145
  by (blast intro: subsetI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   146
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   147
lemma subset_trans: "[| A<=B;  B<=C |] ==> A<=C"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   148
  by (blast intro: subsetI dest: subsetD)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   149
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   150
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   151
subsection {* Rules for equality *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   152
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   153
(*Anti-symmetry of the subset relation*)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   154
lemma subset_antisym: "[| A <= B;  B <= A |] ==> A = B"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   155
  by (blast intro: set_ext dest: subsetD)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   156
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   157
lemmas equalityI = subset_antisym
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   158
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   159
(* Equality rules from ZF set theory -- are they appropriate here? *)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   160
lemma equalityD1: "A = B ==> A<=B"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   161
  and equalityD2: "A = B ==> B<=A"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   162
  by (simp_all add: subset_refl)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   163
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   164
lemma equalityE: "[| A = B;  [| A<=B; B<=A |] ==> P |]  ==>  P"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   165
  by (simp add: subset_refl)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   166
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   167
lemma equalityCE:
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   168
    "[| A = B;  [| c:A; c:B |] ==> P;  [| ~ c:A; ~ c:B |] ==> P |]  ==>  P"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   169
  by (blast elim: equalityE subsetCE)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   170
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   171
lemma trivial_set: "{x. x:A} = A"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   172
  by (blast intro: equalityI subsetI CollectI dest: CollectD)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   173
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   174
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   175
subsection {* Rules for binary union *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   176
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   177
lemma UnI1: "c:A ==> c : A Un B"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   178
  and UnI2: "c:B ==> c : A Un B"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   179
  unfolding Un_def by (blast intro: CollectI)+
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   180
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   181
(*Classical introduction rule: no commitment to A vs B*)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   182
lemma UnCI: "(~c:B ==> c:A) ==> c : A Un B"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   183
  by (blast intro: UnI1 UnI2)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   184
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   185
lemma UnE: "[| c : A Un B;  c:A ==> P;  c:B ==> P |] ==> P"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   186
  unfolding Un_def by (blast dest: CollectD)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   187
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   188
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   189
subsection {* Rules for small intersection *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   190
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   191
lemma IntI: "[| c:A;  c:B |] ==> c : A Int B"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   192
  unfolding Int_def by (blast intro: CollectI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   193
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   194
lemma IntD1: "c : A Int B ==> c:A"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   195
  and IntD2: "c : A Int B ==> c:B"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   196
  unfolding Int_def by (blast dest: CollectD)+
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   197
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   198
lemma IntE: "[| c : A Int B;  [| c:A; c:B |] ==> P |] ==> P"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   199
  by (blast dest: IntD1 IntD2)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   200
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   201
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   202
subsection {* Rules for set complement *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   203
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   204
lemma ComplI: "[| c:A ==> False |] ==> c : Compl(A)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   205
  unfolding Compl_def by (blast intro: CollectI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   206
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   207
(*This form, with negated conclusion, works well with the Classical prover.
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   208
  Negated assumptions behave like formulae on the right side of the notional
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   209
  turnstile...*)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   210
lemma ComplD: "[| c : Compl(A) |] ==> ~c:A"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   211
  unfolding Compl_def by (blast dest: CollectD)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   212
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   213
lemmas ComplE = ComplD [elim_format]
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   214
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   215
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   216
subsection {* Empty sets *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   217
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   218
lemma empty_eq: "{x. False} = {}"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   219
  by (simp add: empty_def)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   220
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   221
lemma emptyD: "a : {} ==> P"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   222
  unfolding empty_def by (blast dest: CollectD)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   223
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   224
lemmas emptyE = emptyD [elim_format]
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   225
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   226
lemma not_emptyD:
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   227
  assumes "~ A={}"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   228
  shows "EX x. x:A"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   229
proof -
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   230
  have "\<not> (EX x. x:A) \<Longrightarrow> A = {}"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   231
    by (rule equalityI) (blast intro!: subsetI elim!: emptyD)+
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   232
  with prems show ?thesis by blast
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   233
qed
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   234
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   235
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   236
subsection {* Singleton sets *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   237
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   238
lemma singletonI: "a : {a}"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   239
  unfolding singleton_def by (blast intro: CollectI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   240
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   241
lemma singletonD: "b : {a} ==> b=a"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   242
  unfolding singleton_def by (blast dest: CollectD)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   243
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   244
lemmas singletonE = singletonD [elim_format]
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   245
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   246
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   247
subsection {* Unions of families *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   248
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   249
(*The order of the premises presupposes that A is rigid; b may be flexible*)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   250
lemma UN_I: "[| a:A;  b: B(a) |] ==> b: (UN x:A. B(x))"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   251
  unfolding UNION_def by (blast intro: bexI CollectI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   252
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   253
lemma UN_E: "[| b : (UN x:A. B(x));  !!x.[| x:A;  b: B(x) |] ==> R |] ==> R"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   254
  unfolding UNION_def by (blast dest: CollectD elim: bexE)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   255
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   256
lemma UN_cong:
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   257
  "[| A=B;  !!x. x:B ==> C(x) = D(x) |] ==>
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   258
    (UN x:A. C(x)) = (UN x:B. D(x))"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   259
  by (simp add: UNION_def cong: bex_cong)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   260
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   261
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   262
subsection {* Intersections of families *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   263
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   264
lemma INT_I: "(!!x. x:A ==> b: B(x)) ==> b : (INT x:A. B(x))"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   265
  unfolding INTER_def by (blast intro: CollectI ballI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   266
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   267
lemma INT_D: "[| b : (INT x:A. B(x));  a:A |] ==> b: B(a)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   268
  unfolding INTER_def by (blast dest: CollectD bspec)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   269
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   270
(*"Classical" elimination rule -- does not require proving X:C *)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   271
lemma INT_E: "[| b : (INT x:A. B(x));  b: B(a) ==> R;  ~ a:A ==> R |] ==> R"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   272
  unfolding INTER_def by (blast dest: CollectD bspec)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   273
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   274
lemma INT_cong:
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   275
  "[| A=B;  !!x. x:B ==> C(x) = D(x) |] ==>
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   276
    (INT x:A. C(x)) = (INT x:B. D(x))"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   277
  by (simp add: INTER_def cong: ball_cong)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   278
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   279
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   280
subsection {* Rules for Unions *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   281
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   282
(*The order of the premises presupposes that C is rigid; A may be flexible*)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   283
lemma UnionI: "[| X:C;  A:X |] ==> A : Union(C)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   284
  unfolding Union_def by (blast intro: UN_I)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   285
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   286
lemma UnionE: "[| A : Union(C);  !!X.[| A:X;  X:C |] ==> R |] ==> R"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   287
  unfolding Union_def by (blast elim: UN_E)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   288
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   289
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   290
subsection {* Rules for Inter *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   291
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   292
lemma InterI: "[| !!X. X:C ==> A:X |] ==> A : Inter(C)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   293
  unfolding Inter_def by (blast intro: INT_I)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   294
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   295
(*A "destruct" rule -- every X in C contains A as an element, but
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   296
  A:X can hold when X:C does not!  This rule is analogous to "spec". *)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   297
lemma InterD: "[| A : Inter(C);  X:C |] ==> A:X"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   298
  unfolding Inter_def by (blast dest: INT_D)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   299
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   300
(*"Classical" elimination rule -- does not require proving X:C *)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   301
lemma InterE: "[| A : Inter(C);  A:X ==> R;  ~ X:C ==> R |] ==> R"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   302
  unfolding Inter_def by (blast elim: INT_E)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   303
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   304
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   305
section {* Derived rules involving subsets; Union and Intersection as lattice operations *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   306
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   307
subsection {* Big Union -- least upper bound of a set *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   308
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   309
lemma Union_upper: "B:A ==> B <= Union(A)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   310
  by (blast intro: subsetI UnionI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   311
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   312
lemma Union_least: "[| !!X. X:A ==> X<=C |] ==> Union(A) <= C"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   313
  by (blast intro: subsetI dest: subsetD elim: UnionE)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   314
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   315
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   316
subsection {* Big Intersection -- greatest lower bound of a set *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   317
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   318
lemma Inter_lower: "B:A ==> Inter(A) <= B"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   319
  by (blast intro: subsetI dest: InterD)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   320
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   321
lemma Inter_greatest: "[| !!X. X:A ==> C<=X |] ==> C <= Inter(A)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   322
  by (blast intro: subsetI InterI dest: subsetD)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   323
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   324
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   325
subsection {* Finite Union -- the least upper bound of 2 sets *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   326
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   327
lemma Un_upper1: "A <= A Un B"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   328
  by (blast intro: subsetI UnI1)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   329
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   330
lemma Un_upper2: "B <= A Un B"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   331
  by (blast intro: subsetI UnI2)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   332
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   333
lemma Un_least: "[| A<=C;  B<=C |] ==> A Un B <= C"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   334
  by (blast intro: subsetI elim: UnE dest: subsetD)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   335
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   336
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   337
subsection {* Finite Intersection -- the greatest lower bound of 2 sets *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   338
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   339
lemma Int_lower1: "A Int B <= A"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   340
  by (blast intro: subsetI elim: IntE)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   341
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   342
lemma Int_lower2: "A Int B <= B"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   343
  by (blast intro: subsetI elim: IntE)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   344
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   345
lemma Int_greatest: "[| C<=A;  C<=B |] ==> C <= A Int B"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   346
  by (blast intro: subsetI IntI dest: subsetD)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   347
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   348
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   349
subsection {* Monotonicity *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   350
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   351
lemma monoI: "[| !!A B. A <= B ==> f(A) <= f(B) |] ==> mono(f)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   352
  unfolding mono_def by blast
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   353
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   354
lemma monoD: "[| mono(f);  A <= B |] ==> f(A) <= f(B)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   355
  unfolding mono_def by blast
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   356
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   357
lemma mono_Un: "mono(f) ==> f(A) Un f(B) <= f(A Un B)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   358
  by (blast intro: Un_least dest: monoD intro: Un_upper1 Un_upper2)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   359
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   360
lemma mono_Int: "mono(f) ==> f(A Int B) <= f(A) Int f(B)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   361
  by (blast intro: Int_greatest dest: monoD intro: Int_lower1 Int_lower2)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   362
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   363
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   364
subsection {* Automated reasoning setup *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   365
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   366
lemmas [intro!] = ballI subsetI InterI INT_I CollectI ComplI IntI UnCI singletonI
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   367
  and [intro] = bexI UnionI UN_I
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   368
  and [elim!] = bexE UnionE UN_E CollectE ComplE IntE UnE emptyE singletonE
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   369
  and [elim] = ballE InterD InterE INT_D INT_E subsetD subsetCE
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   370
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   371
lemma mem_rews:
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   372
  "(a : A Un B)   <->  (a:A | a:B)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   373
  "(a : A Int B)  <->  (a:A & a:B)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   374
  "(a : Compl(B)) <->  (~a:B)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   375
  "(a : {b})      <->  (a=b)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   376
  "(a : {})       <->   False"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   377
  "(a : {x. P(x)}) <->  P(a)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   378
  by blast+
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   379
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   380
lemmas [simp] = trivial_set empty_eq mem_rews
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   381
  and [cong] = ball_cong bex_cong INT_cong UN_cong
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   382
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   383
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   384
section {* Equalities involving union, intersection, inclusion, etc. *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   385
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   386
subsection {* Binary Intersection *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   387
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   388
lemma Int_absorb: "A Int A = A"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   389
  by (blast intro: equalityI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   390
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   391
lemma Int_commute: "A Int B  =  B Int A"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   392
  by (blast intro: equalityI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   393
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   394
lemma Int_assoc: "(A Int B) Int C  =  A Int (B Int C)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   395
  by (blast intro: equalityI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   396
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   397
lemma Int_Un_distrib: "(A Un B) Int C  =  (A Int C) Un (B Int C)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   398
  by (blast intro: equalityI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   399
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   400
lemma subset_Int_eq: "(A<=B) <-> (A Int B = A)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   401
  by (blast intro: equalityI elim: equalityE)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   402
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   403
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   404
subsection {* Binary Union *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   405
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   406
lemma Un_absorb: "A Un A = A"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   407
  by (blast intro: equalityI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   408
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   409
lemma Un_commute: "A Un B  =  B Un A"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   410
  by (blast intro: equalityI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   411
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   412
lemma Un_assoc: "(A Un B) Un C  =  A Un (B Un C)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   413
  by (blast intro: equalityI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   414
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   415
lemma Un_Int_distrib: "(A Int B) Un C  =  (A Un C) Int (B Un C)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   416
  by (blast intro: equalityI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   417
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   418
lemma Un_Int_crazy:
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   419
    "(A Int B) Un (B Int C) Un (C Int A) = (A Un B) Int (B Un C) Int (C Un A)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   420
  by (blast intro: equalityI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   421
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   422
lemma subset_Un_eq: "(A<=B) <-> (A Un B = B)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   423
  by (blast intro: equalityI elim: equalityE)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   424
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   425
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   426
subsection {* Simple properties of @{text "Compl"} -- complement of a set *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   427
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   428
lemma Compl_disjoint: "A Int Compl(A) = {x. False}"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   429
  by (blast intro: equalityI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   430
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   431
lemma Compl_partition: "A Un Compl(A) = {x. True}"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   432
  by (blast intro: equalityI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   433
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   434
lemma double_complement: "Compl(Compl(A)) = A"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   435
  by (blast intro: equalityI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   436
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   437
lemma Compl_Un: "Compl(A Un B) = Compl(A) Int Compl(B)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   438
  by (blast intro: equalityI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   439
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   440
lemma Compl_Int: "Compl(A Int B) = Compl(A) Un Compl(B)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   441
  by (blast intro: equalityI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   442
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   443
lemma Compl_UN: "Compl(UN x:A. B(x)) = (INT x:A. Compl(B(x)))"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   444
  by (blast intro: equalityI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   445
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   446
lemma Compl_INT: "Compl(INT x:A. B(x)) = (UN x:A. Compl(B(x)))"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   447
  by (blast intro: equalityI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   448
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   449
(*Halmos, Naive Set Theory, page 16.*)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   450
lemma Un_Int_assoc_eq: "((A Int B) Un C = A Int (B Un C)) <-> (C<=A)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   451
  by (blast intro: equalityI elim: equalityE)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   452
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   453
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   454
subsection {* Big Union and Intersection *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   455
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   456
lemma Union_Un_distrib: "Union(A Un B) = Union(A) Un Union(B)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   457
  by (blast intro: equalityI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   458
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   459
lemma Union_disjoint:
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   460
    "(Union(C) Int A = {x. False}) <-> (ALL B:C. B Int A = {x. False})"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   461
  by (blast intro: equalityI elim: equalityE)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   462
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   463
lemma Inter_Un_distrib: "Inter(A Un B) = Inter(A) Int Inter(B)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   464
  by (blast intro: equalityI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   465
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   466
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   467
subsection {* Unions and Intersections of Families *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   468
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   469
lemma UN_eq: "(UN x:A. B(x)) = Union({Y. EX x:A. Y=B(x)})"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   470
  by (blast intro: equalityI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   471
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   472
(*Look: it has an EXISTENTIAL quantifier*)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   473
lemma INT_eq: "(INT x:A. B(x)) = Inter({Y. EX x:A. Y=B(x)})"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   474
  by (blast intro: equalityI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   475
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   476
lemma Int_Union_image: "A Int Union(B) = (UN C:B. A Int C)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   477
  by (blast intro: equalityI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   478
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   479
lemma Un_Inter_image: "A Un Inter(B) = (INT C:B. A Un C)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   480
  by (blast intro: equalityI)
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   481
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   482
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   483
section {* Monotonicity of various operations *}
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   484
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   485
lemma Union_mono: "A<=B ==> Union(A) <= Union(B)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   486
  by blast
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   487
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   488
lemma Inter_anti_mono: "[| B<=A |] ==> Inter(A) <= Inter(B)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   489
  by blast
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   490
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   491
lemma UN_mono:
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   492
  "[| A<=B;  !!x. x:A ==> f(x)<=g(x) |] ==>  
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   493
    (UN x:A. f(x)) <= (UN x:B. g(x))"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   494
  by blast
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   495
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   496
lemma INT_anti_mono:
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   497
  "[| B<=A;  !!x. x:A ==> f(x)<=g(x) |] ==>  
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   498
    (INT x:A. f(x)) <= (INT x:A. g(x))"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   499
  by blast
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   500
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   501
lemma Un_mono: "[| A<=C;  B<=D |] ==> A Un B <= C Un D"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   502
  by blast
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   503
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   504
lemma Int_mono: "[| A<=C;  B<=D |] ==> A Int B <= C Int D"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   505
  by blast
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   506
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   507
lemma Compl_anti_mono: "[| A<=B |] ==> Compl(B) <= Compl(A)"
98acc6d0fab6 removed obsolete ML files;
wenzelm
parents: 17456
diff changeset
   508
  by blast
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   509
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   510
end