| author | paulson | 
| Wed, 19 Jul 2006 11:55:26 +0200 | |
| changeset 20153 | 6ff5d35749b0 | 
| parent 19656 | 09be06943252 | 
| child 20716 | a6686a8e1b68 | 
| permissions | -rw-r--r-- | 
| 10358 | 1 | (* Title: HOL/Relation.thy | 
| 1128 
64b30e3cc6d4
Trancl is now based on Relation which used to be in Integ.
 nipkow parents: diff
changeset | 2 | ID: $Id$ | 
| 1983 | 3 | Author: Lawrence C Paulson, Cambridge University Computer Laboratory | 
| 4 | Copyright 1996 University of Cambridge | |
| 1128 
64b30e3cc6d4
Trancl is now based on Relation which used to be in Integ.
 nipkow parents: diff
changeset | 5 | *) | 
| 
64b30e3cc6d4
Trancl is now based on Relation which used to be in Integ.
 nipkow parents: diff
changeset | 6 | |
| 12905 | 7 | header {* Relations *}
 | 
| 8 | ||
| 15131 | 9 | theory Relation | 
| 15140 | 10 | imports Product_Type | 
| 15131 | 11 | begin | 
| 5978 
fa2c2dd74f8c
moved diag (diagonal relation) from Univ to Relation
 paulson parents: 
5608diff
changeset | 12 | |
| 12913 | 13 | subsection {* Definitions *}
 | 
| 14 | ||
| 19656 
09be06943252
tuned concrete syntax -- abbreviation/const_syntax;
 wenzelm parents: 
19363diff
changeset | 15 | definition | 
| 10358 | 16 |   converse :: "('a * 'b) set => ('b * 'a) set"    ("(_^-1)" [1000] 999)
 | 
| 17 |   "r^-1 == {(y, x). (x, y) : r}"
 | |
| 7912 | 18 | |
| 19656 
09be06943252
tuned concrete syntax -- abbreviation/const_syntax;
 wenzelm parents: 
19363diff
changeset | 19 | const_syntax (xsymbols) | 
| 
09be06943252
tuned concrete syntax -- abbreviation/const_syntax;
 wenzelm parents: 
19363diff
changeset | 20 |   converse  ("(_\<inverse>)" [1000] 999)
 | 
| 
09be06943252
tuned concrete syntax -- abbreviation/const_syntax;
 wenzelm parents: 
19363diff
changeset | 21 | |
| 
09be06943252
tuned concrete syntax -- abbreviation/const_syntax;
 wenzelm parents: 
19363diff
changeset | 22 | definition | 
| 12487 | 23 |   rel_comp  :: "[('b * 'c) set, ('a * 'b) set] => ('a * 'c) set"  (infixr "O" 60)
 | 
| 12913 | 24 |   "r O s == {(x,z). EX y. (x, y) : s & (y, z) : r}"
 | 
| 25 | ||
| 11136 | 26 |   Image :: "[('a * 'b) set, 'a set] => 'b set"                (infixl "``" 90)
 | 
| 12913 | 27 |   "r `` s == {y. EX x:s. (x,y):r}"
 | 
| 7912 | 28 | |
| 12905 | 29 |   Id    :: "('a * 'a) set"  -- {* the identity relation *}
 | 
| 12913 | 30 |   "Id == {p. EX x. p = (x,x)}"
 | 
| 7912 | 31 | |
| 12905 | 32 |   diag  :: "'a set => ('a * 'a) set"  -- {* diagonal: identity over a set *}
 | 
| 13830 | 33 |   "diag A == \<Union>x\<in>A. {(x,x)}"
 | 
| 12913 | 34 | |
| 11136 | 35 |   Domain :: "('a * 'b) set => 'a set"
 | 
| 12913 | 36 |   "Domain r == {x. EX y. (x,y):r}"
 | 
| 5978 
fa2c2dd74f8c
moved diag (diagonal relation) from Univ to Relation
 paulson parents: 
5608diff
changeset | 37 | |
| 11136 | 38 |   Range  :: "('a * 'b) set => 'b set"
 | 
| 12913 | 39 | "Range r == Domain(r^-1)" | 
| 5978 
fa2c2dd74f8c
moved diag (diagonal relation) from Univ to Relation
 paulson parents: 
5608diff
changeset | 40 | |
| 11136 | 41 |   Field :: "('a * 'a) set => 'a set"
 | 
| 13830 | 42 | "Field r == Domain r \<union> Range r" | 
| 10786 | 43 | |
| 12905 | 44 |   refl   :: "['a set, ('a * 'a) set] => bool"  -- {* reflexivity over a set *}
 | 
| 12913 | 45 | "refl A r == r \<subseteq> A \<times> A & (ALL x: A. (x,x) : r)" | 
| 6806 
43c081a0858d
new preficates refl, sym [from Integ/Equiv], antisym
 paulson parents: 
5978diff
changeset | 46 | |
| 12905 | 47 |   sym    :: "('a * 'a) set => bool"  -- {* symmetry predicate *}
 | 
| 12913 | 48 | "sym r == ALL x y. (x,y): r --> (y,x): r" | 
| 6806 
43c081a0858d
new preficates refl, sym [from Integ/Equiv], antisym
 paulson parents: 
5978diff
changeset | 49 | |
| 12905 | 50 |   antisym:: "('a * 'a) set => bool"  -- {* antisymmetry predicate *}
 | 
| 12913 | 51 | "antisym r == ALL x y. (x,y):r --> (y,x):r --> x=y" | 
| 6806 
43c081a0858d
new preficates refl, sym [from Integ/Equiv], antisym
 paulson parents: 
5978diff
changeset | 52 | |
| 12905 | 53 |   trans  :: "('a * 'a) set => bool"  -- {* transitivity predicate *}
 | 
| 12913 | 54 | "trans r == (ALL x y z. (x,y):r --> (y,z):r --> (x,z):r)" | 
| 5978 
fa2c2dd74f8c
moved diag (diagonal relation) from Univ to Relation
 paulson parents: 
5608diff
changeset | 55 | |
| 11136 | 56 |   single_valued :: "('a * 'b) set => bool"
 | 
| 12913 | 57 | "single_valued r == ALL x y. (x,y):r --> (ALL z. (x,z):r --> y=z)" | 
| 7014 
11ee650edcd2
Added some definitions and theorems needed for the
 berghofe parents: 
6806diff
changeset | 58 | |
| 11136 | 59 |   inv_image :: "('b * 'b) set => ('a => 'b) => ('a * 'a) set"
 | 
| 12913 | 60 |   "inv_image r f == {(x, y). (f x, f y) : r}"
 | 
| 11136 | 61 | |
| 19363 | 62 | abbreviation | 
| 12905 | 63 |   reflexive :: "('a * 'a) set => bool"  -- {* reflexivity over a type *}
 | 
| 19363 | 64 | "reflexive == refl UNIV" | 
| 6806 
43c081a0858d
new preficates refl, sym [from Integ/Equiv], antisym
 paulson parents: 
5978diff
changeset | 65 | |
| 12905 | 66 | |
| 12913 | 67 | subsection {* The identity relation *}
 | 
| 12905 | 68 | |
| 69 | lemma IdI [intro]: "(a, a) : Id" | |
| 70 | by (simp add: Id_def) | |
| 71 | ||
| 72 | lemma IdE [elim!]: "p : Id ==> (!!x. p = (x, x) ==> P) ==> P" | |
| 17589 | 73 | by (unfold Id_def) (iprover elim: CollectE) | 
| 12905 | 74 | |
| 75 | lemma pair_in_Id_conv [iff]: "((a, b) : Id) = (a = b)" | |
| 76 | by (unfold Id_def) blast | |
| 77 | ||
| 78 | lemma reflexive_Id: "reflexive Id" | |
| 79 | by (simp add: refl_def) | |
| 80 | ||
| 81 | lemma antisym_Id: "antisym Id" | |
| 82 |   -- {* A strange result, since @{text Id} is also symmetric. *}
 | |
| 83 | by (simp add: antisym_def) | |
| 84 | ||
| 19228 | 85 | lemma sym_Id: "sym Id" | 
| 86 | by (simp add: sym_def) | |
| 87 | ||
| 12905 | 88 | lemma trans_Id: "trans Id" | 
| 89 | by (simp add: trans_def) | |
| 90 | ||
| 91 | ||
| 12913 | 92 | subsection {* Diagonal: identity over a set *}
 | 
| 12905 | 93 | |
| 13812 
91713a1915ee
converting HOL/UNITY to use unconditional fairness
 paulson parents: 
13639diff
changeset | 94 | lemma diag_empty [simp]: "diag {} = {}"
 | 
| 
91713a1915ee
converting HOL/UNITY to use unconditional fairness
 paulson parents: 
13639diff
changeset | 95 | by (simp add: diag_def) | 
| 
91713a1915ee
converting HOL/UNITY to use unconditional fairness
 paulson parents: 
13639diff
changeset | 96 | |
| 12905 | 97 | lemma diag_eqI: "a = b ==> a : A ==> (a, b) : diag A" | 
| 98 | by (simp add: diag_def) | |
| 99 | ||
| 100 | lemma diagI [intro!]: "a : A ==> (a, a) : diag A" | |
| 101 | by (rule diag_eqI) (rule refl) | |
| 102 | ||
| 103 | lemma diagE [elim!]: | |
| 104 | "c : diag A ==> (!!x. x : A ==> c = (x, x) ==> P) ==> P" | |
| 12913 | 105 |   -- {* The general elimination rule. *}
 | 
| 17589 | 106 | by (unfold diag_def) (iprover elim!: UN_E singletonE) | 
| 12905 | 107 | |
| 108 | lemma diag_iff: "((x, y) : diag A) = (x = y & x : A)" | |
| 109 | by blast | |
| 110 | ||
| 12913 | 111 | lemma diag_subset_Times: "diag A \<subseteq> A \<times> A" | 
| 12905 | 112 | by blast | 
| 113 | ||
| 114 | ||
| 115 | subsection {* Composition of two relations *}
 | |
| 116 | ||
| 12913 | 117 | lemma rel_compI [intro]: | 
| 12905 | 118 | "(a, b) : s ==> (b, c) : r ==> (a, c) : r O s" | 
| 119 | by (unfold rel_comp_def) blast | |
| 120 | ||
| 12913 | 121 | lemma rel_compE [elim!]: "xz : r O s ==> | 
| 12905 | 122 | (!!x y z. xz = (x, z) ==> (x, y) : s ==> (y, z) : r ==> P) ==> P" | 
| 17589 | 123 | by (unfold rel_comp_def) (iprover elim!: CollectE splitE exE conjE) | 
| 12905 | 124 | |
| 125 | lemma rel_compEpair: | |
| 126 | "(a, c) : r O s ==> (!!y. (a, y) : s ==> (y, c) : r ==> P) ==> P" | |
| 17589 | 127 | by (iprover elim: rel_compE Pair_inject ssubst) | 
| 12905 | 128 | |
| 129 | lemma R_O_Id [simp]: "R O Id = R" | |
| 130 | by fast | |
| 131 | ||
| 132 | lemma Id_O_R [simp]: "Id O R = R" | |
| 133 | by fast | |
| 134 | ||
| 135 | lemma O_assoc: "(R O S) O T = R O (S O T)" | |
| 136 | by blast | |
| 137 | ||
| 12913 | 138 | lemma trans_O_subset: "trans r ==> r O r \<subseteq> r" | 
| 12905 | 139 | by (unfold trans_def) blast | 
| 140 | ||
| 12913 | 141 | lemma rel_comp_mono: "r' \<subseteq> r ==> s' \<subseteq> s ==> (r' O s') \<subseteq> (r O s)" | 
| 12905 | 142 | by blast | 
| 143 | ||
| 144 | lemma rel_comp_subset_Sigma: | |
| 12913 | 145 | "s \<subseteq> A \<times> B ==> r \<subseteq> B \<times> C ==> (r O s) \<subseteq> A \<times> C" | 
| 12905 | 146 | by blast | 
| 147 | ||
| 12913 | 148 | |
| 149 | subsection {* Reflexivity *}
 | |
| 150 | ||
| 151 | lemma reflI: "r \<subseteq> A \<times> A ==> (!!x. x : A ==> (x, x) : r) ==> refl A r" | |
| 17589 | 152 | by (unfold refl_def) (iprover intro!: ballI) | 
| 12905 | 153 | |
| 154 | lemma reflD: "refl A r ==> a : A ==> (a, a) : r" | |
| 155 | by (unfold refl_def) blast | |
| 156 | ||
| 19228 | 157 | lemma reflD1: "refl A r ==> (x, y) : r ==> x : A" | 
| 158 | by (unfold refl_def) blast | |
| 159 | ||
| 160 | lemma reflD2: "refl A r ==> (x, y) : r ==> y : A" | |
| 161 | by (unfold refl_def) blast | |
| 162 | ||
| 163 | lemma refl_Int: "refl A r ==> refl B s ==> refl (A \<inter> B) (r \<inter> s)" | |
| 164 | by (unfold refl_def) blast | |
| 165 | ||
| 166 | lemma refl_Un: "refl A r ==> refl B s ==> refl (A \<union> B) (r \<union> s)" | |
| 167 | by (unfold refl_def) blast | |
| 168 | ||
| 169 | lemma refl_INTER: | |
| 170 | "ALL x:S. refl (A x) (r x) ==> refl (INTER S A) (INTER S r)" | |
| 171 | by (unfold refl_def) fast | |
| 172 | ||
| 173 | lemma refl_UNION: | |
| 174 | "ALL x:S. refl (A x) (r x) \<Longrightarrow> refl (UNION S A) (UNION S r)" | |
| 175 | by (unfold refl_def) blast | |
| 176 | ||
| 177 | lemma refl_diag: "refl A (diag A)" | |
| 178 | by (rule reflI [OF diag_subset_Times diagI]) | |
| 179 | ||
| 12913 | 180 | |
| 181 | subsection {* Antisymmetry *}
 | |
| 12905 | 182 | |
| 183 | lemma antisymI: | |
| 184 | "(!!x y. (x, y) : r ==> (y, x) : r ==> x=y) ==> antisym r" | |
| 17589 | 185 | by (unfold antisym_def) iprover | 
| 12905 | 186 | |
| 187 | lemma antisymD: "antisym r ==> (a, b) : r ==> (b, a) : r ==> a = b" | |
| 17589 | 188 | by (unfold antisym_def) iprover | 
| 12905 | 189 | |
| 19228 | 190 | lemma antisym_subset: "r \<subseteq> s ==> antisym s ==> antisym r" | 
| 191 | by (unfold antisym_def) blast | |
| 12913 | 192 | |
| 19228 | 193 | lemma antisym_empty [simp]: "antisym {}"
 | 
| 194 | by (unfold antisym_def) blast | |
| 195 | ||
| 196 | lemma antisym_diag [simp]: "antisym (diag A)" | |
| 197 | by (unfold antisym_def) blast | |
| 198 | ||
| 199 | ||
| 200 | subsection {* Symmetry *}
 | |
| 201 | ||
| 202 | lemma symI: "(!!a b. (a, b) : r ==> (b, a) : r) ==> sym r" | |
| 203 | by (unfold sym_def) iprover | |
| 15177 | 204 | |
| 205 | lemma symD: "sym r ==> (a, b) : r ==> (b, a) : r" | |
| 206 | by (unfold sym_def, blast) | |
| 12905 | 207 | |
| 19228 | 208 | lemma sym_Int: "sym r ==> sym s ==> sym (r \<inter> s)" | 
| 209 | by (fast intro: symI dest: symD) | |
| 210 | ||
| 211 | lemma sym_Un: "sym r ==> sym s ==> sym (r \<union> s)" | |
| 212 | by (fast intro: symI dest: symD) | |
| 213 | ||
| 214 | lemma sym_INTER: "ALL x:S. sym (r x) ==> sym (INTER S r)" | |
| 215 | by (fast intro: symI dest: symD) | |
| 216 | ||
| 217 | lemma sym_UNION: "ALL x:S. sym (r x) ==> sym (UNION S r)" | |
| 218 | by (fast intro: symI dest: symD) | |
| 219 | ||
| 220 | lemma sym_diag [simp]: "sym (diag A)" | |
| 221 | by (rule symI) clarify | |
| 222 | ||
| 223 | ||
| 224 | subsection {* Transitivity *}
 | |
| 225 | ||
| 12905 | 226 | lemma transI: | 
| 227 | "(!!x y z. (x, y) : r ==> (y, z) : r ==> (x, z) : r) ==> trans r" | |
| 17589 | 228 | by (unfold trans_def) iprover | 
| 12905 | 229 | |
| 230 | lemma transD: "trans r ==> (a, b) : r ==> (b, c) : r ==> (a, c) : r" | |
| 17589 | 231 | by (unfold trans_def) iprover | 
| 12905 | 232 | |
| 19228 | 233 | lemma trans_Int: "trans r ==> trans s ==> trans (r \<inter> s)" | 
| 234 | by (fast intro: transI elim: transD) | |
| 235 | ||
| 236 | lemma trans_INTER: "ALL x:S. trans (r x) ==> trans (INTER S r)" | |
| 237 | by (fast intro: transI elim: transD) | |
| 238 | ||
| 239 | lemma trans_diag [simp]: "trans (diag A)" | |
| 240 | by (fast intro: transI elim: transD) | |
| 241 | ||
| 12905 | 242 | |
| 12913 | 243 | subsection {* Converse *}
 | 
| 244 | ||
| 245 | lemma converse_iff [iff]: "((a,b): r^-1) = ((b,a) : r)" | |
| 12905 | 246 | by (simp add: converse_def) | 
| 247 | ||
| 13343 | 248 | lemma converseI[sym]: "(a, b) : r ==> (b, a) : r^-1" | 
| 12905 | 249 | by (simp add: converse_def) | 
| 250 | ||
| 13343 | 251 | lemma converseD[sym]: "(a,b) : r^-1 ==> (b, a) : r" | 
| 12905 | 252 | by (simp add: converse_def) | 
| 253 | ||
| 254 | lemma converseE [elim!]: | |
| 255 | "yx : r^-1 ==> (!!x y. yx = (y, x) ==> (x, y) : r ==> P) ==> P" | |
| 12913 | 256 |     -- {* More general than @{text converseD}, as it ``splits'' the member of the relation. *}
 | 
| 17589 | 257 | by (unfold converse_def) (iprover elim!: CollectE splitE bexE) | 
| 12905 | 258 | |
| 259 | lemma converse_converse [simp]: "(r^-1)^-1 = r" | |
| 260 | by (unfold converse_def) blast | |
| 261 | ||
| 262 | lemma converse_rel_comp: "(r O s)^-1 = s^-1 O r^-1" | |
| 263 | by blast | |
| 264 | ||
| 19228 | 265 | lemma converse_Int: "(r \<inter> s)^-1 = r^-1 \<inter> s^-1" | 
| 266 | by blast | |
| 267 | ||
| 268 | lemma converse_Un: "(r \<union> s)^-1 = r^-1 \<union> s^-1" | |
| 269 | by blast | |
| 270 | ||
| 271 | lemma converse_INTER: "(INTER S r)^-1 = (INT x:S. (r x)^-1)" | |
| 272 | by fast | |
| 273 | ||
| 274 | lemma converse_UNION: "(UNION S r)^-1 = (UN x:S. (r x)^-1)" | |
| 275 | by blast | |
| 276 | ||
| 12905 | 277 | lemma converse_Id [simp]: "Id^-1 = Id" | 
| 278 | by blast | |
| 279 | ||
| 12913 | 280 | lemma converse_diag [simp]: "(diag A)^-1 = diag A" | 
| 12905 | 281 | by blast | 
| 282 | ||
| 19228 | 283 | lemma refl_converse [simp]: "refl A (converse r) = refl A r" | 
| 284 | by (unfold refl_def) auto | |
| 12905 | 285 | |
| 19228 | 286 | lemma sym_converse [simp]: "sym (converse r) = sym r" | 
| 287 | by (unfold sym_def) blast | |
| 288 | ||
| 289 | lemma antisym_converse [simp]: "antisym (converse r) = antisym r" | |
| 12905 | 290 | by (unfold antisym_def) blast | 
| 291 | ||
| 19228 | 292 | lemma trans_converse [simp]: "trans (converse r) = trans r" | 
| 12905 | 293 | by (unfold trans_def) blast | 
| 294 | ||
| 19228 | 295 | lemma sym_conv_converse_eq: "sym r = (r^-1 = r)" | 
| 296 | by (unfold sym_def) fast | |
| 297 | ||
| 298 | lemma sym_Un_converse: "sym (r \<union> r^-1)" | |
| 299 | by (unfold sym_def) blast | |
| 300 | ||
| 301 | lemma sym_Int_converse: "sym (r \<inter> r^-1)" | |
| 302 | by (unfold sym_def) blast | |
| 303 | ||
| 12913 | 304 | |
| 12905 | 305 | subsection {* Domain *}
 | 
| 306 | ||
| 307 | lemma Domain_iff: "(a : Domain r) = (EX y. (a, y) : r)" | |
| 308 | by (unfold Domain_def) blast | |
| 309 | ||
| 310 | lemma DomainI [intro]: "(a, b) : r ==> a : Domain r" | |
| 17589 | 311 | by (iprover intro!: iffD2 [OF Domain_iff]) | 
| 12905 | 312 | |
| 313 | lemma DomainE [elim!]: | |
| 314 | "a : Domain r ==> (!!y. (a, y) : r ==> P) ==> P" | |
| 17589 | 315 | by (iprover dest!: iffD1 [OF Domain_iff]) | 
| 12905 | 316 | |
| 317 | lemma Domain_empty [simp]: "Domain {} = {}"
 | |
| 318 | by blast | |
| 319 | ||
| 320 | lemma Domain_insert: "Domain (insert (a, b) r) = insert a (Domain r)" | |
| 321 | by blast | |
| 322 | ||
| 323 | lemma Domain_Id [simp]: "Domain Id = UNIV" | |
| 324 | by blast | |
| 325 | ||
| 326 | lemma Domain_diag [simp]: "Domain (diag A) = A" | |
| 327 | by blast | |
| 328 | ||
| 13830 | 329 | lemma Domain_Un_eq: "Domain(A \<union> B) = Domain(A) \<union> Domain(B)" | 
| 12905 | 330 | by blast | 
| 331 | ||
| 13830 | 332 | lemma Domain_Int_subset: "Domain(A \<inter> B) \<subseteq> Domain(A) \<inter> Domain(B)" | 
| 12905 | 333 | by blast | 
| 334 | ||
| 12913 | 335 | lemma Domain_Diff_subset: "Domain(A) - Domain(B) \<subseteq> Domain(A - B)" | 
| 12905 | 336 | by blast | 
| 337 | ||
| 13830 | 338 | lemma Domain_Union: "Domain (Union S) = (\<Union>A\<in>S. Domain A)" | 
| 12905 | 339 | by blast | 
| 340 | ||
| 12913 | 341 | lemma Domain_mono: "r \<subseteq> s ==> Domain r \<subseteq> Domain s" | 
| 12905 | 342 | by blast | 
| 343 | ||
| 344 | ||
| 345 | subsection {* Range *}
 | |
| 346 | ||
| 347 | lemma Range_iff: "(a : Range r) = (EX y. (y, a) : r)" | |
| 348 | by (simp add: Domain_def Range_def) | |
| 349 | ||
| 350 | lemma RangeI [intro]: "(a, b) : r ==> b : Range r" | |
| 17589 | 351 | by (unfold Range_def) (iprover intro!: converseI DomainI) | 
| 12905 | 352 | |
| 353 | lemma RangeE [elim!]: "b : Range r ==> (!!x. (x, b) : r ==> P) ==> P" | |
| 17589 | 354 | by (unfold Range_def) (iprover elim!: DomainE dest!: converseD) | 
| 12905 | 355 | |
| 356 | lemma Range_empty [simp]: "Range {} = {}"
 | |
| 357 | by blast | |
| 358 | ||
| 359 | lemma Range_insert: "Range (insert (a, b) r) = insert b (Range r)" | |
| 360 | by blast | |
| 361 | ||
| 362 | lemma Range_Id [simp]: "Range Id = UNIV" | |
| 363 | by blast | |
| 364 | ||
| 365 | lemma Range_diag [simp]: "Range (diag A) = A" | |
| 366 | by auto | |
| 367 | ||
| 13830 | 368 | lemma Range_Un_eq: "Range(A \<union> B) = Range(A) \<union> Range(B)" | 
| 12905 | 369 | by blast | 
| 370 | ||
| 13830 | 371 | lemma Range_Int_subset: "Range(A \<inter> B) \<subseteq> Range(A) \<inter> Range(B)" | 
| 12905 | 372 | by blast | 
| 373 | ||
| 12913 | 374 | lemma Range_Diff_subset: "Range(A) - Range(B) \<subseteq> Range(A - B)" | 
| 12905 | 375 | by blast | 
| 376 | ||
| 13830 | 377 | lemma Range_Union: "Range (Union S) = (\<Union>A\<in>S. Range A)" | 
| 12905 | 378 | by blast | 
| 379 | ||
| 380 | ||
| 381 | subsection {* Image of a set under a relation *}
 | |
| 382 | ||
| 12913 | 383 | lemma Image_iff: "(b : r``A) = (EX x:A. (x, b) : r)" | 
| 12905 | 384 | by (simp add: Image_def) | 
| 385 | ||
| 12913 | 386 | lemma Image_singleton: "r``{a} = {b. (a, b) : r}"
 | 
| 12905 | 387 | by (simp add: Image_def) | 
| 388 | ||
| 12913 | 389 | lemma Image_singleton_iff [iff]: "(b : r``{a}) = ((a, b) : r)"
 | 
| 12905 | 390 | by (rule Image_iff [THEN trans]) simp | 
| 391 | ||
| 12913 | 392 | lemma ImageI [intro]: "(a, b) : r ==> a : A ==> b : r``A" | 
| 12905 | 393 | by (unfold Image_def) blast | 
| 394 | ||
| 395 | lemma ImageE [elim!]: | |
| 12913 | 396 | "b : r `` A ==> (!!x. (x, b) : r ==> x : A ==> P) ==> P" | 
| 17589 | 397 | by (unfold Image_def) (iprover elim!: CollectE bexE) | 
| 12905 | 398 | |
| 399 | lemma rev_ImageI: "a : A ==> (a, b) : r ==> b : r `` A" | |
| 400 |   -- {* This version's more effective when we already have the required @{text a} *}
 | |
| 401 | by blast | |
| 402 | ||
| 403 | lemma Image_empty [simp]: "R``{} = {}"
 | |
| 404 | by blast | |
| 405 | ||
| 406 | lemma Image_Id [simp]: "Id `` A = A" | |
| 407 | by blast | |
| 408 | ||
| 13830 | 409 | lemma Image_diag [simp]: "diag A `` B = A \<inter> B" | 
| 410 | by blast | |
| 411 | ||
| 412 | lemma Image_Int_subset: "R `` (A \<inter> B) \<subseteq> R `` A \<inter> R `` B" | |
| 12905 | 413 | by blast | 
| 414 | ||
| 13830 | 415 | lemma Image_Int_eq: | 
| 416 | "single_valued (converse R) ==> R `` (A \<inter> B) = R `` A \<inter> R `` B" | |
| 417 | by (simp add: single_valued_def, blast) | |
| 12905 | 418 | |
| 13830 | 419 | lemma Image_Un: "R `` (A \<union> B) = R `` A \<union> R `` B" | 
| 12905 | 420 | by blast | 
| 421 | ||
| 13812 
91713a1915ee
converting HOL/UNITY to use unconditional fairness
 paulson parents: 
13639diff
changeset | 422 | lemma Un_Image: "(R \<union> S) `` A = R `` A \<union> S `` A" | 
| 
91713a1915ee
converting HOL/UNITY to use unconditional fairness
 paulson parents: 
13639diff
changeset | 423 | by blast | 
| 
91713a1915ee
converting HOL/UNITY to use unconditional fairness
 paulson parents: 
13639diff
changeset | 424 | |
| 12913 | 425 | lemma Image_subset: "r \<subseteq> A \<times> B ==> r``C \<subseteq> B" | 
| 17589 | 426 | by (iprover intro!: subsetI elim!: ImageE dest!: subsetD SigmaD2) | 
| 12905 | 427 | |
| 13830 | 428 | lemma Image_eq_UN: "r``B = (\<Union>y\<in> B. r``{y})"
 | 
| 12905 | 429 |   -- {* NOT suitable for rewriting *}
 | 
| 430 | by blast | |
| 431 | ||
| 12913 | 432 | lemma Image_mono: "r' \<subseteq> r ==> A' \<subseteq> A ==> (r' `` A') \<subseteq> (r `` A)" | 
| 12905 | 433 | by blast | 
| 434 | ||
| 13830 | 435 | lemma Image_UN: "(r `` (UNION A B)) = (\<Union>x\<in>A. r `` (B x))" | 
| 436 | by blast | |
| 437 | ||
| 438 | lemma Image_INT_subset: "(r `` INTER A B) \<subseteq> (\<Inter>x\<in>A. r `` (B x))" | |
| 12905 | 439 | by blast | 
| 440 | ||
| 13830 | 441 | text{*Converse inclusion requires some assumptions*}
 | 
| 442 | lemma Image_INT_eq: | |
| 443 |      "[|single_valued (r\<inverse>); A\<noteq>{}|] ==> r `` INTER A B = (\<Inter>x\<in>A. r `` B x)"
 | |
| 444 | apply (rule equalityI) | |
| 445 | apply (rule Image_INT_subset) | |
| 446 | apply (simp add: single_valued_def, blast) | |
| 447 | done | |
| 12905 | 448 | |
| 12913 | 449 | lemma Image_subset_eq: "(r``A \<subseteq> B) = (A \<subseteq> - ((r^-1) `` (-B)))" | 
| 12905 | 450 | by blast | 
| 451 | ||
| 452 | ||
| 12913 | 453 | subsection {* Single valued relations *}
 | 
| 454 | ||
| 455 | lemma single_valuedI: | |
| 12905 | 456 | "ALL x y. (x,y):r --> (ALL z. (x,z):r --> y=z) ==> single_valued r" | 
| 457 | by (unfold single_valued_def) | |
| 458 | ||
| 459 | lemma single_valuedD: | |
| 460 | "single_valued r ==> (x, y) : r ==> (x, z) : r ==> y = z" | |
| 461 | by (simp add: single_valued_def) | |
| 462 | ||
| 19228 | 463 | lemma single_valued_rel_comp: | 
| 464 | "single_valued r ==> single_valued s ==> single_valued (r O s)" | |
| 465 | by (unfold single_valued_def) blast | |
| 466 | ||
| 467 | lemma single_valued_subset: | |
| 468 | "r \<subseteq> s ==> single_valued s ==> single_valued r" | |
| 469 | by (unfold single_valued_def) blast | |
| 470 | ||
| 471 | lemma single_valued_Id [simp]: "single_valued Id" | |
| 472 | by (unfold single_valued_def) blast | |
| 473 | ||
| 474 | lemma single_valued_diag [simp]: "single_valued (diag A)" | |
| 475 | by (unfold single_valued_def) blast | |
| 476 | ||
| 12905 | 477 | |
| 478 | subsection {* Graphs given by @{text Collect} *}
 | |
| 479 | ||
| 480 | lemma Domain_Collect_split [simp]: "Domain{(x,y). P x y} = {x. EX y. P x y}"
 | |
| 481 | by auto | |
| 482 | ||
| 483 | lemma Range_Collect_split [simp]: "Range{(x,y). P x y} = {y. EX x. P x y}"
 | |
| 484 | by auto | |
| 485 | ||
| 486 | lemma Image_Collect_split [simp]: "{(x,y). P x y} `` A = {y. EX x:A. P x y}"
 | |
| 487 | by auto | |
| 488 | ||
| 489 | ||
| 12913 | 490 | subsection {* Inverse image *}
 | 
| 12905 | 491 | |
| 19228 | 492 | lemma sym_inv_image: "sym r ==> sym (inv_image r f)" | 
| 493 | by (unfold sym_def inv_image_def) blast | |
| 494 | ||
| 12913 | 495 | lemma trans_inv_image: "trans r ==> trans (inv_image r f)" | 
| 12905 | 496 | apply (unfold trans_def inv_image_def) | 
| 497 | apply (simp (no_asm)) | |
| 498 | apply blast | |
| 499 | done | |
| 500 | ||
| 1128 
64b30e3cc6d4
Trancl is now based on Relation which used to be in Integ.
 nipkow parents: diff
changeset | 501 | end |