| author | chaieb | 
| Sun, 05 Apr 2009 05:07:10 +0100 | |
| changeset 30866 | dd5117e2d73e | 
| parent 30198 | 922f944f03b2 | 
| child 31011 | 506e57123cd1 | 
| permissions | -rw-r--r-- | 
| 10358 | 1 | (* Title: HOL/Relation.thy | 
| 1983 | 2 | Author: Lawrence C Paulson, Cambridge University Computer Laboratory | 
| 3 | Copyright 1996 University of Cambridge | |
| 1128 
64b30e3cc6d4
Trancl is now based on Relation which used to be in Integ.
 nipkow parents: diff
changeset | 4 | *) | 
| 
64b30e3cc6d4
Trancl is now based on Relation which used to be in Integ.
 nipkow parents: diff
changeset | 5 | |
| 12905 | 6 | header {* Relations *}
 | 
| 7 | ||
| 15131 | 8 | theory Relation | 
| 29609 | 9 | imports Datatype Finite_Set | 
| 15131 | 10 | begin | 
| 5978 
fa2c2dd74f8c
moved diag (diagonal relation) from Univ to Relation
 paulson parents: 
5608diff
changeset | 11 | |
| 12913 | 12 | subsection {* Definitions *}
 | 
| 13 | ||
| 19656 
09be06943252
tuned concrete syntax -- abbreviation/const_syntax;
 wenzelm parents: 
19363diff
changeset | 14 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 15 |   converse :: "('a * 'b) set => ('b * 'a) set"
 | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 16 |     ("(_^-1)" [1000] 999) where
 | 
| 10358 | 17 |   "r^-1 == {(y, x). (x, y) : r}"
 | 
| 7912 | 18 | |
| 21210 | 19 | notation (xsymbols) | 
| 19656 
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 | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 23 |   rel_comp  :: "[('b * 'c) set, ('a * 'b) set] => ('a * 'c) set"
 | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 24 | (infixr "O" 75) where | 
| 12913 | 25 |   "r O s == {(x,z). EX y. (x, y) : s & (y, z) : r}"
 | 
| 26 | ||
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 27 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 28 |   Image :: "[('a * 'b) set, 'a set] => 'b set"
 | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 29 | (infixl "``" 90) where | 
| 12913 | 30 |   "r `` s == {y. EX x:s. (x,y):r}"
 | 
| 7912 | 31 | |
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 32 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 33 |   Id :: "('a * 'a) set" where -- {* the identity relation *}
 | 
| 12913 | 34 |   "Id == {p. EX x. p = (x,x)}"
 | 
| 7912 | 35 | |
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 36 | definition | 
| 30198 | 37 |   Id_on  :: "'a set => ('a * 'a) set" where -- {* diagonal: identity over a set *}
 | 
| 38 |   "Id_on A == \<Union>x\<in>A. {(x,x)}"
 | |
| 12913 | 39 | |
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 40 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 41 |   Domain :: "('a * 'b) set => 'a set" where
 | 
| 12913 | 42 |   "Domain r == {x. EX y. (x,y):r}"
 | 
| 5978 
fa2c2dd74f8c
moved diag (diagonal relation) from Univ to Relation
 paulson parents: 
5608diff
changeset | 43 | |
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 44 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 45 |   Range  :: "('a * 'b) set => 'b set" where
 | 
| 12913 | 46 | "Range r == Domain(r^-1)" | 
| 5978 
fa2c2dd74f8c
moved diag (diagonal relation) from Univ to Relation
 paulson parents: 
5608diff
changeset | 47 | |
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 48 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 49 |   Field :: "('a * 'a) set => 'a set" where
 | 
| 13830 | 50 | "Field r == Domain r \<union> Range r" | 
| 10786 | 51 | |
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 52 | definition | 
| 30198 | 53 |   refl_on :: "['a set, ('a * 'a) set] => bool" where -- {* reflexivity over a set *}
 | 
| 54 | "refl_on 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 | 55 | |
| 26297 | 56 | abbreviation | 
| 30198 | 57 |   refl :: "('a * 'a) set => bool" where -- {* reflexivity over a type *}
 | 
| 58 | "refl == refl_on UNIV" | |
| 26297 | 59 | |
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 60 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 61 |   sym :: "('a * 'a) set => bool" where -- {* symmetry predicate *}
 | 
| 12913 | 62 | "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 | 63 | |
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 64 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 65 |   antisym :: "('a * 'a) set => bool" where -- {* antisymmetry predicate *}
 | 
| 12913 | 66 | "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 | 67 | |
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 68 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 69 |   trans :: "('a * 'a) set => bool" where -- {* transitivity predicate *}
 | 
| 12913 | 70 | "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 | 71 | |
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 72 | definition | 
| 29859 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 73 | irrefl :: "('a * 'a) set => bool" where
 | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 74 | "irrefl r \<equiv> \<forall>x. (x,x) \<notin> r" | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 75 | |
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 76 | definition | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 77 | total_on :: "'a set => ('a * 'a) set => bool" where
 | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 78 | "total_on A r \<equiv> \<forall>x\<in>A.\<forall>y\<in>A. x\<noteq>y \<longrightarrow> (x,y)\<in>r \<or> (y,x)\<in>r" | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 79 | |
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 80 | abbreviation "total \<equiv> total_on UNIV" | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 81 | |
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 82 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 83 |   single_valued :: "('a * 'b) set => bool" where
 | 
| 12913 | 84 | "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 | 85 | |
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 86 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 87 |   inv_image :: "('b * 'b) set => ('a => 'b) => ('a * 'a) set" where
 | 
| 12913 | 88 |   "inv_image r f == {(x, y). (f x, f y) : r}"
 | 
| 11136 | 89 | |
| 12905 | 90 | |
| 12913 | 91 | subsection {* The identity relation *}
 | 
| 12905 | 92 | |
| 93 | lemma IdI [intro]: "(a, a) : Id" | |
| 26271 | 94 | by (simp add: Id_def) | 
| 12905 | 95 | |
| 96 | lemma IdE [elim!]: "p : Id ==> (!!x. p = (x, x) ==> P) ==> P" | |
| 26271 | 97 | by (unfold Id_def) (iprover elim: CollectE) | 
| 12905 | 98 | |
| 99 | lemma pair_in_Id_conv [iff]: "((a, b) : Id) = (a = b)" | |
| 26271 | 100 | by (unfold Id_def) blast | 
| 12905 | 101 | |
| 30198 | 102 | lemma refl_Id: "refl Id" | 
| 103 | by (simp add: refl_on_def) | |
| 12905 | 104 | |
| 105 | lemma antisym_Id: "antisym Id" | |
| 106 |   -- {* A strange result, since @{text Id} is also symmetric. *}
 | |
| 26271 | 107 | by (simp add: antisym_def) | 
| 12905 | 108 | |
| 19228 | 109 | lemma sym_Id: "sym Id" | 
| 26271 | 110 | by (simp add: sym_def) | 
| 19228 | 111 | |
| 12905 | 112 | lemma trans_Id: "trans Id" | 
| 26271 | 113 | by (simp add: trans_def) | 
| 12905 | 114 | |
| 115 | ||
| 12913 | 116 | subsection {* Diagonal: identity over a set *}
 | 
| 12905 | 117 | |
| 30198 | 118 | lemma Id_on_empty [simp]: "Id_on {} = {}"
 | 
| 119 | by (simp add: Id_on_def) | |
| 13812 
91713a1915ee
converting HOL/UNITY to use unconditional fairness
 paulson parents: 
13639diff
changeset | 120 | |
| 30198 | 121 | lemma Id_on_eqI: "a = b ==> a : A ==> (a, b) : Id_on A" | 
| 122 | by (simp add: Id_on_def) | |
| 12905 | 123 | |
| 30198 | 124 | lemma Id_onI [intro!,noatp]: "a : A ==> (a, a) : Id_on A" | 
| 125 | by (rule Id_on_eqI) (rule refl) | |
| 12905 | 126 | |
| 30198 | 127 | lemma Id_onE [elim!]: | 
| 128 | "c : Id_on A ==> (!!x. x : A ==> c = (x, x) ==> P) ==> P" | |
| 12913 | 129 |   -- {* The general elimination rule. *}
 | 
| 30198 | 130 | by (unfold Id_on_def) (iprover elim!: UN_E singletonE) | 
| 12905 | 131 | |
| 30198 | 132 | lemma Id_on_iff: "((x, y) : Id_on A) = (x = y & x : A)" | 
| 26271 | 133 | by blast | 
| 12905 | 134 | |
| 30198 | 135 | lemma Id_on_subset_Times: "Id_on A \<subseteq> A \<times> A" | 
| 26271 | 136 | by blast | 
| 12905 | 137 | |
| 138 | ||
| 139 | subsection {* Composition of two relations *}
 | |
| 140 | ||
| 12913 | 141 | lemma rel_compI [intro]: | 
| 12905 | 142 | "(a, b) : s ==> (b, c) : r ==> (a, c) : r O s" | 
| 26271 | 143 | by (unfold rel_comp_def) blast | 
| 12905 | 144 | |
| 12913 | 145 | lemma rel_compE [elim!]: "xz : r O s ==> | 
| 12905 | 146 | (!!x y z. xz = (x, z) ==> (x, y) : s ==> (y, z) : r ==> P) ==> P" | 
| 26271 | 147 | by (unfold rel_comp_def) (iprover elim!: CollectE splitE exE conjE) | 
| 12905 | 148 | |
| 149 | lemma rel_compEpair: | |
| 150 | "(a, c) : r O s ==> (!!y. (a, y) : s ==> (y, c) : r ==> P) ==> P" | |
| 26271 | 151 | by (iprover elim: rel_compE Pair_inject ssubst) | 
| 12905 | 152 | |
| 153 | lemma R_O_Id [simp]: "R O Id = R" | |
| 26271 | 154 | by fast | 
| 12905 | 155 | |
| 156 | lemma Id_O_R [simp]: "Id O R = R" | |
| 26271 | 157 | by fast | 
| 12905 | 158 | |
| 23185 | 159 | lemma rel_comp_empty1[simp]: "{} O R = {}"
 | 
| 26271 | 160 | by blast | 
| 23185 | 161 | |
| 162 | lemma rel_comp_empty2[simp]: "R O {} = {}"
 | |
| 26271 | 163 | by blast | 
| 23185 | 164 | |
| 12905 | 165 | lemma O_assoc: "(R O S) O T = R O (S O T)" | 
| 26271 | 166 | by blast | 
| 12905 | 167 | |
| 12913 | 168 | lemma trans_O_subset: "trans r ==> r O r \<subseteq> r" | 
| 26271 | 169 | by (unfold trans_def) blast | 
| 12905 | 170 | |
| 12913 | 171 | lemma rel_comp_mono: "r' \<subseteq> r ==> s' \<subseteq> s ==> (r' O s') \<subseteq> (r O s)" | 
| 26271 | 172 | by blast | 
| 12905 | 173 | |
| 174 | lemma rel_comp_subset_Sigma: | |
| 12913 | 175 | "s \<subseteq> A \<times> B ==> r \<subseteq> B \<times> C ==> (r O s) \<subseteq> A \<times> C" | 
| 26271 | 176 | by blast | 
| 12905 | 177 | |
| 28008 
f945f8d9ad4d
added distributivity of relation composition over union [simp]
 krauss parents: 
26297diff
changeset | 178 | lemma rel_comp_distrib[simp]: "R O (S \<union> T) = (R O S) \<union> (R O T)" | 
| 
f945f8d9ad4d
added distributivity of relation composition over union [simp]
 krauss parents: 
26297diff
changeset | 179 | by auto | 
| 
f945f8d9ad4d
added distributivity of relation composition over union [simp]
 krauss parents: 
26297diff
changeset | 180 | |
| 
f945f8d9ad4d
added distributivity of relation composition over union [simp]
 krauss parents: 
26297diff
changeset | 181 | lemma rel_comp_distrib2[simp]: "(S \<union> T) O R = (S O R) \<union> (T O R)" | 
| 
f945f8d9ad4d
added distributivity of relation composition over union [simp]
 krauss parents: 
26297diff
changeset | 182 | by auto | 
| 
f945f8d9ad4d
added distributivity of relation composition over union [simp]
 krauss parents: 
26297diff
changeset | 183 | |
| 12913 | 184 | |
| 185 | subsection {* Reflexivity *}
 | |
| 186 | ||
| 30198 | 187 | lemma refl_onI: "r \<subseteq> A \<times> A ==> (!!x. x : A ==> (x, x) : r) ==> refl_on A r" | 
| 188 | by (unfold refl_on_def) (iprover intro!: ballI) | |
| 12905 | 189 | |
| 30198 | 190 | lemma refl_onD: "refl_on A r ==> a : A ==> (a, a) : r" | 
| 191 | by (unfold refl_on_def) blast | |
| 12905 | 192 | |
| 30198 | 193 | lemma refl_onD1: "refl_on A r ==> (x, y) : r ==> x : A" | 
| 194 | by (unfold refl_on_def) blast | |
| 19228 | 195 | |
| 30198 | 196 | lemma refl_onD2: "refl_on A r ==> (x, y) : r ==> y : A" | 
| 197 | by (unfold refl_on_def) blast | |
| 19228 | 198 | |
| 30198 | 199 | lemma refl_on_Int: "refl_on A r ==> refl_on B s ==> refl_on (A \<inter> B) (r \<inter> s)" | 
| 200 | by (unfold refl_on_def) blast | |
| 19228 | 201 | |
| 30198 | 202 | lemma refl_on_Un: "refl_on A r ==> refl_on B s ==> refl_on (A \<union> B) (r \<union> s)" | 
| 203 | by (unfold refl_on_def) blast | |
| 19228 | 204 | |
| 30198 | 205 | lemma refl_on_INTER: | 
| 206 | "ALL x:S. refl_on (A x) (r x) ==> refl_on (INTER S A) (INTER S r)" | |
| 207 | by (unfold refl_on_def) fast | |
| 19228 | 208 | |
| 30198 | 209 | lemma refl_on_UNION: | 
| 210 | "ALL x:S. refl_on (A x) (r x) \<Longrightarrow> refl_on (UNION S A) (UNION S r)" | |
| 211 | by (unfold refl_on_def) blast | |
| 19228 | 212 | |
| 30198 | 213 | lemma refl_on_empty[simp]: "refl_on {} {}"
 | 
| 214 | by(simp add:refl_on_def) | |
| 26297 | 215 | |
| 30198 | 216 | lemma refl_on_Id_on: "refl_on A (Id_on A)" | 
| 217 | by (rule refl_onI [OF Id_on_subset_Times Id_onI]) | |
| 19228 | 218 | |
| 12913 | 219 | |
| 220 | subsection {* Antisymmetry *}
 | |
| 12905 | 221 | |
| 222 | lemma antisymI: | |
| 223 | "(!!x y. (x, y) : r ==> (y, x) : r ==> x=y) ==> antisym r" | |
| 26271 | 224 | by (unfold antisym_def) iprover | 
| 12905 | 225 | |
| 226 | lemma antisymD: "antisym r ==> (a, b) : r ==> (b, a) : r ==> a = b" | |
| 26271 | 227 | by (unfold antisym_def) iprover | 
| 12905 | 228 | |
| 19228 | 229 | lemma antisym_subset: "r \<subseteq> s ==> antisym s ==> antisym r" | 
| 26271 | 230 | by (unfold antisym_def) blast | 
| 12913 | 231 | |
| 19228 | 232 | lemma antisym_empty [simp]: "antisym {}"
 | 
| 26271 | 233 | by (unfold antisym_def) blast | 
| 19228 | 234 | |
| 30198 | 235 | lemma antisym_Id_on [simp]: "antisym (Id_on A)" | 
| 26271 | 236 | by (unfold antisym_def) blast | 
| 19228 | 237 | |
| 238 | ||
| 239 | subsection {* Symmetry *}
 | |
| 240 | ||
| 241 | lemma symI: "(!!a b. (a, b) : r ==> (b, a) : r) ==> sym r" | |
| 26271 | 242 | by (unfold sym_def) iprover | 
| 15177 | 243 | |
| 244 | lemma symD: "sym r ==> (a, b) : r ==> (b, a) : r" | |
| 26271 | 245 | by (unfold sym_def, blast) | 
| 12905 | 246 | |
| 19228 | 247 | lemma sym_Int: "sym r ==> sym s ==> sym (r \<inter> s)" | 
| 26271 | 248 | by (fast intro: symI dest: symD) | 
| 19228 | 249 | |
| 250 | lemma sym_Un: "sym r ==> sym s ==> sym (r \<union> s)" | |
| 26271 | 251 | by (fast intro: symI dest: symD) | 
| 19228 | 252 | |
| 253 | lemma sym_INTER: "ALL x:S. sym (r x) ==> sym (INTER S r)" | |
| 26271 | 254 | by (fast intro: symI dest: symD) | 
| 19228 | 255 | |
| 256 | lemma sym_UNION: "ALL x:S. sym (r x) ==> sym (UNION S r)" | |
| 26271 | 257 | by (fast intro: symI dest: symD) | 
| 19228 | 258 | |
| 30198 | 259 | lemma sym_Id_on [simp]: "sym (Id_on A)" | 
| 26271 | 260 | by (rule symI) clarify | 
| 19228 | 261 | |
| 262 | ||
| 263 | subsection {* Transitivity *}
 | |
| 264 | ||
| 12905 | 265 | lemma transI: | 
| 266 | "(!!x y z. (x, y) : r ==> (y, z) : r ==> (x, z) : r) ==> trans r" | |
| 26271 | 267 | by (unfold trans_def) iprover | 
| 12905 | 268 | |
| 269 | lemma transD: "trans r ==> (a, b) : r ==> (b, c) : r ==> (a, c) : r" | |
| 26271 | 270 | by (unfold trans_def) iprover | 
| 12905 | 271 | |
| 19228 | 272 | lemma trans_Int: "trans r ==> trans s ==> trans (r \<inter> s)" | 
| 26271 | 273 | by (fast intro: transI elim: transD) | 
| 19228 | 274 | |
| 275 | lemma trans_INTER: "ALL x:S. trans (r x) ==> trans (INTER S r)" | |
| 26271 | 276 | by (fast intro: transI elim: transD) | 
| 19228 | 277 | |
| 30198 | 278 | lemma trans_Id_on [simp]: "trans (Id_on A)" | 
| 26271 | 279 | by (fast intro: transI elim: transD) | 
| 19228 | 280 | |
| 29859 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 281 | lemma trans_diff_Id: " trans r \<Longrightarrow> antisym r \<Longrightarrow> trans (r-Id)" | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 282 | unfolding antisym_def trans_def by blast | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 283 | |
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 284 | subsection {* Irreflexivity *}
 | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 285 | |
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 286 | lemma irrefl_diff_Id[simp]: "irrefl(r-Id)" | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 287 | by(simp add:irrefl_def) | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 288 | |
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 289 | subsection {* Totality *}
 | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 290 | |
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 291 | lemma total_on_empty[simp]: "total_on {} r"
 | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 292 | by(simp add:total_on_def) | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 293 | |
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 294 | lemma total_on_diff_Id[simp]: "total_on A (r-Id) = total_on A r" | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 295 | by(simp add: total_on_def) | 
| 12905 | 296 | |
| 12913 | 297 | subsection {* Converse *}
 | 
| 298 | ||
| 299 | lemma converse_iff [iff]: "((a,b): r^-1) = ((b,a) : r)" | |
| 26271 | 300 | by (simp add: converse_def) | 
| 12905 | 301 | |
| 13343 | 302 | lemma converseI[sym]: "(a, b) : r ==> (b, a) : r^-1" | 
| 26271 | 303 | by (simp add: converse_def) | 
| 12905 | 304 | |
| 13343 | 305 | lemma converseD[sym]: "(a,b) : r^-1 ==> (b, a) : r" | 
| 26271 | 306 | by (simp add: converse_def) | 
| 12905 | 307 | |
| 308 | lemma converseE [elim!]: | |
| 309 | "yx : r^-1 ==> (!!x y. yx = (y, x) ==> (x, y) : r ==> P) ==> P" | |
| 12913 | 310 |     -- {* More general than @{text converseD}, as it ``splits'' the member of the relation. *}
 | 
| 26271 | 311 | by (unfold converse_def) (iprover elim!: CollectE splitE bexE) | 
| 12905 | 312 | |
| 313 | lemma converse_converse [simp]: "(r^-1)^-1 = r" | |
| 26271 | 314 | by (unfold converse_def) blast | 
| 12905 | 315 | |
| 316 | lemma converse_rel_comp: "(r O s)^-1 = s^-1 O r^-1" | |
| 26271 | 317 | by blast | 
| 12905 | 318 | |
| 19228 | 319 | lemma converse_Int: "(r \<inter> s)^-1 = r^-1 \<inter> s^-1" | 
| 26271 | 320 | by blast | 
| 19228 | 321 | |
| 322 | lemma converse_Un: "(r \<union> s)^-1 = r^-1 \<union> s^-1" | |
| 26271 | 323 | by blast | 
| 19228 | 324 | |
| 325 | lemma converse_INTER: "(INTER S r)^-1 = (INT x:S. (r x)^-1)" | |
| 26271 | 326 | by fast | 
| 19228 | 327 | |
| 328 | lemma converse_UNION: "(UNION S r)^-1 = (UN x:S. (r x)^-1)" | |
| 26271 | 329 | by blast | 
| 19228 | 330 | |
| 12905 | 331 | lemma converse_Id [simp]: "Id^-1 = Id" | 
| 26271 | 332 | by blast | 
| 12905 | 333 | |
| 30198 | 334 | lemma converse_Id_on [simp]: "(Id_on A)^-1 = Id_on A" | 
| 26271 | 335 | by blast | 
| 12905 | 336 | |
| 30198 | 337 | lemma refl_on_converse [simp]: "refl_on A (converse r) = refl_on A r" | 
| 338 | by (unfold refl_on_def) auto | |
| 12905 | 339 | |
| 19228 | 340 | lemma sym_converse [simp]: "sym (converse r) = sym r" | 
| 26271 | 341 | by (unfold sym_def) blast | 
| 19228 | 342 | |
| 343 | lemma antisym_converse [simp]: "antisym (converse r) = antisym r" | |
| 26271 | 344 | by (unfold antisym_def) blast | 
| 12905 | 345 | |
| 19228 | 346 | lemma trans_converse [simp]: "trans (converse r) = trans r" | 
| 26271 | 347 | by (unfold trans_def) blast | 
| 12905 | 348 | |
| 19228 | 349 | lemma sym_conv_converse_eq: "sym r = (r^-1 = r)" | 
| 26271 | 350 | by (unfold sym_def) fast | 
| 19228 | 351 | |
| 352 | lemma sym_Un_converse: "sym (r \<union> r^-1)" | |
| 26271 | 353 | by (unfold sym_def) blast | 
| 19228 | 354 | |
| 355 | lemma sym_Int_converse: "sym (r \<inter> r^-1)" | |
| 26271 | 356 | by (unfold sym_def) blast | 
| 19228 | 357 | |
| 29859 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 358 | lemma total_on_converse[simp]: "total_on A (r^-1) = total_on A r" | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 359 | by (auto simp: total_on_def) | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 360 | |
| 12913 | 361 | |
| 12905 | 362 | subsection {* Domain *}
 | 
| 363 | ||
| 24286 
7619080e49f0
ATP blacklisting is now in theory data, attribute noatp
 paulson parents: 
23709diff
changeset | 364 | declare Domain_def [noatp] | 
| 
7619080e49f0
ATP blacklisting is now in theory data, attribute noatp
 paulson parents: 
23709diff
changeset | 365 | |
| 12905 | 366 | lemma Domain_iff: "(a : Domain r) = (EX y. (a, y) : r)" | 
| 26271 | 367 | by (unfold Domain_def) blast | 
| 12905 | 368 | |
| 369 | lemma DomainI [intro]: "(a, b) : r ==> a : Domain r" | |
| 26271 | 370 | by (iprover intro!: iffD2 [OF Domain_iff]) | 
| 12905 | 371 | |
| 372 | lemma DomainE [elim!]: | |
| 373 | "a : Domain r ==> (!!y. (a, y) : r ==> P) ==> P" | |
| 26271 | 374 | by (iprover dest!: iffD1 [OF Domain_iff]) | 
| 12905 | 375 | |
| 376 | lemma Domain_empty [simp]: "Domain {} = {}"
 | |
| 26271 | 377 | by blast | 
| 12905 | 378 | |
| 379 | lemma Domain_insert: "Domain (insert (a, b) r) = insert a (Domain r)" | |
| 26271 | 380 | by blast | 
| 12905 | 381 | |
| 382 | lemma Domain_Id [simp]: "Domain Id = UNIV" | |
| 26271 | 383 | by blast | 
| 12905 | 384 | |
| 30198 | 385 | lemma Domain_Id_on [simp]: "Domain (Id_on A) = A" | 
| 26271 | 386 | by blast | 
| 12905 | 387 | |
| 13830 | 388 | lemma Domain_Un_eq: "Domain(A \<union> B) = Domain(A) \<union> Domain(B)" | 
| 26271 | 389 | by blast | 
| 12905 | 390 | |
| 13830 | 391 | lemma Domain_Int_subset: "Domain(A \<inter> B) \<subseteq> Domain(A) \<inter> Domain(B)" | 
| 26271 | 392 | by blast | 
| 12905 | 393 | |
| 12913 | 394 | lemma Domain_Diff_subset: "Domain(A) - Domain(B) \<subseteq> Domain(A - B)" | 
| 26271 | 395 | by blast | 
| 12905 | 396 | |
| 13830 | 397 | lemma Domain_Union: "Domain (Union S) = (\<Union>A\<in>S. Domain A)" | 
| 26271 | 398 | by blast | 
| 399 | ||
| 400 | lemma Domain_converse[simp]: "Domain(r^-1) = Range r" | |
| 401 | by(auto simp:Range_def) | |
| 12905 | 402 | |
| 12913 | 403 | lemma Domain_mono: "r \<subseteq> s ==> Domain r \<subseteq> Domain s" | 
| 26271 | 404 | by blast | 
| 12905 | 405 | |
| 22172 | 406 | lemma fst_eq_Domain: "fst ` R = Domain R"; | 
| 26271 | 407 | by (auto intro!:image_eqI) | 
| 22172 | 408 | |
| 29609 | 409 | lemma Domain_dprod [simp]: "Domain (dprod r s) = uprod (Domain r) (Domain s)" | 
| 410 | by auto | |
| 411 | ||
| 412 | lemma Domain_dsum [simp]: "Domain (dsum r s) = usum (Domain r) (Domain s)" | |
| 413 | by auto | |
| 414 | ||
| 12905 | 415 | |
| 416 | subsection {* Range *}
 | |
| 417 | ||
| 418 | lemma Range_iff: "(a : Range r) = (EX y. (y, a) : r)" | |
| 26271 | 419 | by (simp add: Domain_def Range_def) | 
| 12905 | 420 | |
| 421 | lemma RangeI [intro]: "(a, b) : r ==> b : Range r" | |
| 26271 | 422 | by (unfold Range_def) (iprover intro!: converseI DomainI) | 
| 12905 | 423 | |
| 424 | lemma RangeE [elim!]: "b : Range r ==> (!!x. (x, b) : r ==> P) ==> P" | |
| 26271 | 425 | by (unfold Range_def) (iprover elim!: DomainE dest!: converseD) | 
| 12905 | 426 | |
| 427 | lemma Range_empty [simp]: "Range {} = {}"
 | |
| 26271 | 428 | by blast | 
| 12905 | 429 | |
| 430 | lemma Range_insert: "Range (insert (a, b) r) = insert b (Range r)" | |
| 26271 | 431 | by blast | 
| 12905 | 432 | |
| 433 | lemma Range_Id [simp]: "Range Id = UNIV" | |
| 26271 | 434 | by blast | 
| 12905 | 435 | |
| 30198 | 436 | lemma Range_Id_on [simp]: "Range (Id_on A) = A" | 
| 26271 | 437 | by auto | 
| 12905 | 438 | |
| 13830 | 439 | lemma Range_Un_eq: "Range(A \<union> B) = Range(A) \<union> Range(B)" | 
| 26271 | 440 | by blast | 
| 12905 | 441 | |
| 13830 | 442 | lemma Range_Int_subset: "Range(A \<inter> B) \<subseteq> Range(A) \<inter> Range(B)" | 
| 26271 | 443 | by blast | 
| 12905 | 444 | |
| 12913 | 445 | lemma Range_Diff_subset: "Range(A) - Range(B) \<subseteq> Range(A - B)" | 
| 26271 | 446 | by blast | 
| 12905 | 447 | |
| 13830 | 448 | lemma Range_Union: "Range (Union S) = (\<Union>A\<in>S. Range A)" | 
| 26271 | 449 | by blast | 
| 450 | ||
| 451 | lemma Range_converse[simp]: "Range(r^-1) = Domain r" | |
| 452 | by blast | |
| 12905 | 453 | |
| 22172 | 454 | lemma snd_eq_Range: "snd ` R = Range R"; | 
| 26271 | 455 | by (auto intro!:image_eqI) | 
| 456 | ||
| 457 | ||
| 458 | subsection {* Field *}
 | |
| 459 | ||
| 460 | lemma mono_Field: "r \<subseteq> s \<Longrightarrow> Field r \<subseteq> Field s" | |
| 461 | by(auto simp:Field_def Domain_def Range_def) | |
| 462 | ||
| 463 | lemma Field_empty[simp]: "Field {} = {}"
 | |
| 464 | by(auto simp:Field_def) | |
| 465 | ||
| 466 | lemma Field_insert[simp]: "Field (insert (a,b) r) = {a,b} \<union> Field r"
 | |
| 467 | by(auto simp:Field_def) | |
| 468 | ||
| 469 | lemma Field_Un[simp]: "Field (r \<union> s) = Field r \<union> Field s" | |
| 470 | by(auto simp:Field_def) | |
| 471 | ||
| 472 | lemma Field_Union[simp]: "Field (\<Union>R) = \<Union>(Field ` R)" | |
| 473 | by(auto simp:Field_def) | |
| 474 | ||
| 475 | lemma Field_converse[simp]: "Field(r^-1) = Field r" | |
| 476 | by(auto simp:Field_def) | |
| 22172 | 477 | |
| 12905 | 478 | |
| 479 | subsection {* Image of a set under a relation *}
 | |
| 480 | ||
| 24286 
7619080e49f0
ATP blacklisting is now in theory data, attribute noatp
 paulson parents: 
23709diff
changeset | 481 | declare Image_def [noatp] | 
| 
7619080e49f0
ATP blacklisting is now in theory data, attribute noatp
 paulson parents: 
23709diff
changeset | 482 | |
| 12913 | 483 | lemma Image_iff: "(b : r``A) = (EX x:A. (x, b) : r)" | 
| 26271 | 484 | by (simp add: Image_def) | 
| 12905 | 485 | |
| 12913 | 486 | lemma Image_singleton: "r``{a} = {b. (a, b) : r}"
 | 
| 26271 | 487 | by (simp add: Image_def) | 
| 12905 | 488 | |
| 12913 | 489 | lemma Image_singleton_iff [iff]: "(b : r``{a}) = ((a, b) : r)"
 | 
| 26271 | 490 | by (rule Image_iff [THEN trans]) simp | 
| 12905 | 491 | |
| 24286 
7619080e49f0
ATP blacklisting is now in theory data, attribute noatp
 paulson parents: 
23709diff
changeset | 492 | lemma ImageI [intro,noatp]: "(a, b) : r ==> a : A ==> b : r``A" | 
| 26271 | 493 | by (unfold Image_def) blast | 
| 12905 | 494 | |
| 495 | lemma ImageE [elim!]: | |
| 12913 | 496 | "b : r `` A ==> (!!x. (x, b) : r ==> x : A ==> P) ==> P" | 
| 26271 | 497 | by (unfold Image_def) (iprover elim!: CollectE bexE) | 
| 12905 | 498 | |
| 499 | lemma rev_ImageI: "a : A ==> (a, b) : r ==> b : r `` A" | |
| 500 |   -- {* This version's more effective when we already have the required @{text a} *}
 | |
| 26271 | 501 | by blast | 
| 12905 | 502 | |
| 503 | lemma Image_empty [simp]: "R``{} = {}"
 | |
| 26271 | 504 | by blast | 
| 12905 | 505 | |
| 506 | lemma Image_Id [simp]: "Id `` A = A" | |
| 26271 | 507 | by blast | 
| 12905 | 508 | |
| 30198 | 509 | lemma Image_Id_on [simp]: "Id_on A `` B = A \<inter> B" | 
| 26271 | 510 | by blast | 
| 13830 | 511 | |
| 512 | lemma Image_Int_subset: "R `` (A \<inter> B) \<subseteq> R `` A \<inter> R `` B" | |
| 26271 | 513 | by blast | 
| 12905 | 514 | |
| 13830 | 515 | lemma Image_Int_eq: | 
| 516 | "single_valued (converse R) ==> R `` (A \<inter> B) = R `` A \<inter> R `` B" | |
| 26271 | 517 | by (simp add: single_valued_def, blast) | 
| 12905 | 518 | |
| 13830 | 519 | lemma Image_Un: "R `` (A \<union> B) = R `` A \<union> R `` B" | 
| 26271 | 520 | by blast | 
| 12905 | 521 | |
| 13812 
91713a1915ee
converting HOL/UNITY to use unconditional fairness
 paulson parents: 
13639diff
changeset | 522 | lemma Un_Image: "(R \<union> S) `` A = R `` A \<union> S `` A" | 
| 26271 | 523 | by blast | 
| 13812 
91713a1915ee
converting HOL/UNITY to use unconditional fairness
 paulson parents: 
13639diff
changeset | 524 | |
| 12913 | 525 | lemma Image_subset: "r \<subseteq> A \<times> B ==> r``C \<subseteq> B" | 
| 26271 | 526 | by (iprover intro!: subsetI elim!: ImageE dest!: subsetD SigmaD2) | 
| 12905 | 527 | |
| 13830 | 528 | lemma Image_eq_UN: "r``B = (\<Union>y\<in> B. r``{y})"
 | 
| 12905 | 529 |   -- {* NOT suitable for rewriting *}
 | 
| 26271 | 530 | by blast | 
| 12905 | 531 | |
| 12913 | 532 | lemma Image_mono: "r' \<subseteq> r ==> A' \<subseteq> A ==> (r' `` A') \<subseteq> (r `` A)" | 
| 26271 | 533 | by blast | 
| 12905 | 534 | |
| 13830 | 535 | lemma Image_UN: "(r `` (UNION A B)) = (\<Union>x\<in>A. r `` (B x))" | 
| 26271 | 536 | by blast | 
| 13830 | 537 | |
| 538 | lemma Image_INT_subset: "(r `` INTER A B) \<subseteq> (\<Inter>x\<in>A. r `` (B x))" | |
| 26271 | 539 | by blast | 
| 12905 | 540 | |
| 13830 | 541 | text{*Converse inclusion requires some assumptions*}
 | 
| 542 | lemma Image_INT_eq: | |
| 543 |      "[|single_valued (r\<inverse>); A\<noteq>{}|] ==> r `` INTER A B = (\<Inter>x\<in>A. r `` B x)"
 | |
| 544 | apply (rule equalityI) | |
| 545 | apply (rule Image_INT_subset) | |
| 546 | apply (simp add: single_valued_def, blast) | |
| 547 | done | |
| 12905 | 548 | |
| 12913 | 549 | lemma Image_subset_eq: "(r``A \<subseteq> B) = (A \<subseteq> - ((r^-1) `` (-B)))" | 
| 26271 | 550 | by blast | 
| 12905 | 551 | |
| 552 | ||
| 12913 | 553 | subsection {* Single valued relations *}
 | 
| 554 | ||
| 555 | lemma single_valuedI: | |
| 12905 | 556 | "ALL x y. (x,y):r --> (ALL z. (x,z):r --> y=z) ==> single_valued r" | 
| 26271 | 557 | by (unfold single_valued_def) | 
| 12905 | 558 | |
| 559 | lemma single_valuedD: | |
| 560 | "single_valued r ==> (x, y) : r ==> (x, z) : r ==> y = z" | |
| 26271 | 561 | by (simp add: single_valued_def) | 
| 12905 | 562 | |
| 19228 | 563 | lemma single_valued_rel_comp: | 
| 564 | "single_valued r ==> single_valued s ==> single_valued (r O s)" | |
| 26271 | 565 | by (unfold single_valued_def) blast | 
| 19228 | 566 | |
| 567 | lemma single_valued_subset: | |
| 568 | "r \<subseteq> s ==> single_valued s ==> single_valued r" | |
| 26271 | 569 | by (unfold single_valued_def) blast | 
| 19228 | 570 | |
| 571 | lemma single_valued_Id [simp]: "single_valued Id" | |
| 26271 | 572 | by (unfold single_valued_def) blast | 
| 19228 | 573 | |
| 30198 | 574 | lemma single_valued_Id_on [simp]: "single_valued (Id_on A)" | 
| 26271 | 575 | by (unfold single_valued_def) blast | 
| 19228 | 576 | |
| 12905 | 577 | |
| 578 | subsection {* Graphs given by @{text Collect} *}
 | |
| 579 | ||
| 580 | lemma Domain_Collect_split [simp]: "Domain{(x,y). P x y} = {x. EX y. P x y}"
 | |
| 26271 | 581 | by auto | 
| 12905 | 582 | |
| 583 | lemma Range_Collect_split [simp]: "Range{(x,y). P x y} = {y. EX x. P x y}"
 | |
| 26271 | 584 | by auto | 
| 12905 | 585 | |
| 586 | lemma Image_Collect_split [simp]: "{(x,y). P x y} `` A = {y. EX x:A. P x y}"
 | |
| 26271 | 587 | by auto | 
| 12905 | 588 | |
| 589 | ||
| 12913 | 590 | subsection {* Inverse image *}
 | 
| 12905 | 591 | |
| 19228 | 592 | lemma sym_inv_image: "sym r ==> sym (inv_image r f)" | 
| 26271 | 593 | by (unfold sym_def inv_image_def) blast | 
| 19228 | 594 | |
| 12913 | 595 | lemma trans_inv_image: "trans r ==> trans (inv_image r f)" | 
| 12905 | 596 | apply (unfold trans_def inv_image_def) | 
| 597 | apply (simp (no_asm)) | |
| 598 | apply blast | |
| 599 | done | |
| 600 | ||
| 23709 | 601 | |
| 29609 | 602 | subsection {* Finiteness *}
 | 
| 603 | ||
| 604 | lemma finite_converse [iff]: "finite (r^-1) = finite r" | |
| 605 | apply (subgoal_tac "r^-1 = (%(x,y). (y,x))`r") | |
| 606 | apply simp | |
| 607 | apply (rule iffI) | |
| 608 | apply (erule finite_imageD [unfolded inj_on_def]) | |
| 609 | apply (simp split add: split_split) | |
| 610 | apply (erule finite_imageI) | |
| 611 | apply (simp add: converse_def image_def, auto) | |
| 612 | apply (rule bexI) | |
| 613 | prefer 2 apply assumption | |
| 614 | apply simp | |
| 615 | done | |
| 616 | ||
| 617 | text {* \paragraph{Finiteness of transitive closure} (Thanks to Sidi
 | |
| 618 | Ehmety) *} | |
| 619 | ||
| 620 | lemma finite_Field: "finite r ==> finite (Field r)" | |
| 621 |   -- {* A finite relation has a finite field (@{text "= domain \<union> range"}. *}
 | |
| 622 | apply (induct set: finite) | |
| 623 | apply (auto simp add: Field_def Domain_insert Range_insert) | |
| 624 | done | |
| 625 | ||
| 626 | ||
| 23709 | 627 | subsection {* Version of @{text lfp_induct} for binary relations *}
 | 
| 628 | ||
| 629 | lemmas lfp_induct2 = | |
| 630 | lfp_induct_set [of "(a, b)", split_format (complete)] | |
| 631 | ||
| 1128 
64b30e3cc6d4
Trancl is now based on Relation which used to be in Integ.
 nipkow parents: diff
changeset | 632 | end |