| author | wenzelm | 
| Thu, 19 Aug 2010 22:26:15 +0200 | |
| changeset 38563 | f6c9a4f9f66f | 
| parent 36772 | ef97c5006840 | 
| child 40923 | be80c93ac0a2 | 
| 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 | 
| 32850 | 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 | 
| 32235 
8f9b8d14fc9f
"more standard" argument order of relation composition (op O)
 krauss parents: 
31011diff
changeset | 23 |   rel_comp  :: "[('a * 'b) set, ('b * 'c) set] => ('a * 'c) set"
 | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 24 | (infixr "O" 75) where | 
| 32235 
8f9b8d14fc9f
"more standard" argument order of relation composition (op O)
 krauss parents: 
31011diff
changeset | 25 |   "r O s == {(x,z). EX y. (x, y) : r & (y, z) : s}"
 | 
| 12913 | 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 | |
| 35828 
46cfc4b8112e
now use "Named_Thms" for "noatp", and renamed "noatp" to "no_atp"
 blanchet parents: 
33218diff
changeset | 124 | lemma Id_onI [intro!,no_atp]: "a : A ==> (a, a) : Id_on A" | 
| 30198 | 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]: | 
| 32235 
8f9b8d14fc9f
"more standard" argument order of relation composition (op O)
 krauss parents: 
31011diff
changeset | 142 | "(a, b) : r ==> (b, c) : s ==> (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 ==> | 
| 32235 
8f9b8d14fc9f
"more standard" argument order of relation composition (op O)
 krauss parents: 
31011diff
changeset | 146 | (!!x y z. xz = (x, z) ==> (x, y) : r ==> (y, z) : s ==> P) ==> P" | 
| 26271 | 147 | by (unfold rel_comp_def) (iprover elim!: CollectE splitE exE conjE) | 
| 12905 | 148 | |
| 149 | lemma rel_compEpair: | |
| 32235 
8f9b8d14fc9f
"more standard" argument order of relation composition (op O)
 krauss parents: 
31011diff
changeset | 150 | "(a, c) : r O s ==> (!!y. (a, y) : r ==> (y, c) : s ==> 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: | |
| 32235 
8f9b8d14fc9f
"more standard" argument order of relation composition (op O)
 krauss parents: 
31011diff
changeset | 175 | "r \<subseteq> A \<times> B ==> s \<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 | |
| 36772 | 184 | lemma rel_comp_UNION_distrib: "s O UNION I r = UNION I (%i. s O r i)" | 
| 185 | by auto | |
| 186 | ||
| 187 | lemma rel_comp_UNION_distrib2: "UNION I r O s = UNION I (%i. r i O s)" | |
| 188 | by auto | |
| 189 | ||
| 12913 | 190 | |
| 191 | subsection {* Reflexivity *}
 | |
| 192 | ||
| 30198 | 193 | lemma refl_onI: "r \<subseteq> A \<times> A ==> (!!x. x : A ==> (x, x) : r) ==> refl_on A r" | 
| 194 | by (unfold refl_on_def) (iprover intro!: ballI) | |
| 12905 | 195 | |
| 30198 | 196 | lemma refl_onD: "refl_on A r ==> a : A ==> (a, a) : r" | 
| 197 | by (unfold refl_on_def) blast | |
| 12905 | 198 | |
| 30198 | 199 | lemma refl_onD1: "refl_on A r ==> (x, y) : r ==> x : A" | 
| 200 | by (unfold refl_on_def) blast | |
| 19228 | 201 | |
| 30198 | 202 | lemma refl_onD2: "refl_on A r ==> (x, y) : r ==> y : A" | 
| 203 | by (unfold refl_on_def) blast | |
| 19228 | 204 | |
| 30198 | 205 | lemma refl_on_Int: "refl_on A r ==> refl_on B s ==> refl_on (A \<inter> B) (r \<inter> s)" | 
| 206 | by (unfold refl_on_def) blast | |
| 19228 | 207 | |
| 30198 | 208 | lemma refl_on_Un: "refl_on A r ==> refl_on B s ==> refl_on (A \<union> B) (r \<union> s)" | 
| 209 | by (unfold refl_on_def) blast | |
| 19228 | 210 | |
| 30198 | 211 | lemma refl_on_INTER: | 
| 212 | "ALL x:S. refl_on (A x) (r x) ==> refl_on (INTER S A) (INTER S r)" | |
| 213 | by (unfold refl_on_def) fast | |
| 19228 | 214 | |
| 30198 | 215 | lemma refl_on_UNION: | 
| 216 | "ALL x:S. refl_on (A x) (r x) \<Longrightarrow> refl_on (UNION S A) (UNION S r)" | |
| 217 | by (unfold refl_on_def) blast | |
| 19228 | 218 | |
| 30198 | 219 | lemma refl_on_empty[simp]: "refl_on {} {}"
 | 
| 220 | by(simp add:refl_on_def) | |
| 26297 | 221 | |
| 30198 | 222 | lemma refl_on_Id_on: "refl_on A (Id_on A)" | 
| 223 | by (rule refl_onI [OF Id_on_subset_Times Id_onI]) | |
| 19228 | 224 | |
| 12913 | 225 | |
| 226 | subsection {* Antisymmetry *}
 | |
| 12905 | 227 | |
| 228 | lemma antisymI: | |
| 229 | "(!!x y. (x, y) : r ==> (y, x) : r ==> x=y) ==> antisym r" | |
| 26271 | 230 | by (unfold antisym_def) iprover | 
| 12905 | 231 | |
| 232 | lemma antisymD: "antisym r ==> (a, b) : r ==> (b, a) : r ==> a = b" | |
| 26271 | 233 | by (unfold antisym_def) iprover | 
| 12905 | 234 | |
| 19228 | 235 | lemma antisym_subset: "r \<subseteq> s ==> antisym s ==> antisym r" | 
| 26271 | 236 | by (unfold antisym_def) blast | 
| 12913 | 237 | |
| 19228 | 238 | lemma antisym_empty [simp]: "antisym {}"
 | 
| 26271 | 239 | by (unfold antisym_def) blast | 
| 19228 | 240 | |
| 30198 | 241 | lemma antisym_Id_on [simp]: "antisym (Id_on A)" | 
| 26271 | 242 | by (unfold antisym_def) blast | 
| 19228 | 243 | |
| 244 | ||
| 245 | subsection {* Symmetry *}
 | |
| 246 | ||
| 247 | lemma symI: "(!!a b. (a, b) : r ==> (b, a) : r) ==> sym r" | |
| 26271 | 248 | by (unfold sym_def) iprover | 
| 15177 | 249 | |
| 250 | lemma symD: "sym r ==> (a, b) : r ==> (b, a) : r" | |
| 26271 | 251 | by (unfold sym_def, blast) | 
| 12905 | 252 | |
| 19228 | 253 | lemma sym_Int: "sym r ==> sym s ==> sym (r \<inter> s)" | 
| 26271 | 254 | by (fast intro: symI dest: symD) | 
| 19228 | 255 | |
| 256 | lemma sym_Un: "sym r ==> sym s ==> sym (r \<union> s)" | |
| 26271 | 257 | by (fast intro: symI dest: symD) | 
| 19228 | 258 | |
| 259 | lemma sym_INTER: "ALL x:S. sym (r x) ==> sym (INTER S r)" | |
| 26271 | 260 | by (fast intro: symI dest: symD) | 
| 19228 | 261 | |
| 262 | lemma sym_UNION: "ALL x:S. sym (r x) ==> sym (UNION S r)" | |
| 26271 | 263 | by (fast intro: symI dest: symD) | 
| 19228 | 264 | |
| 30198 | 265 | lemma sym_Id_on [simp]: "sym (Id_on A)" | 
| 26271 | 266 | by (rule symI) clarify | 
| 19228 | 267 | |
| 268 | ||
| 269 | subsection {* Transitivity *}
 | |
| 270 | ||
| 12905 | 271 | lemma transI: | 
| 272 | "(!!x y z. (x, y) : r ==> (y, z) : r ==> (x, z) : r) ==> trans r" | |
| 26271 | 273 | by (unfold trans_def) iprover | 
| 12905 | 274 | |
| 275 | lemma transD: "trans r ==> (a, b) : r ==> (b, c) : r ==> (a, c) : r" | |
| 26271 | 276 | by (unfold trans_def) iprover | 
| 12905 | 277 | |
| 19228 | 278 | lemma trans_Int: "trans r ==> trans s ==> trans (r \<inter> s)" | 
| 26271 | 279 | by (fast intro: transI elim: transD) | 
| 19228 | 280 | |
| 281 | lemma trans_INTER: "ALL x:S. trans (r x) ==> trans (INTER S r)" | |
| 26271 | 282 | by (fast intro: transI elim: transD) | 
| 19228 | 283 | |
| 30198 | 284 | lemma trans_Id_on [simp]: "trans (Id_on A)" | 
| 26271 | 285 | by (fast intro: transI elim: transD) | 
| 19228 | 286 | |
| 29859 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 287 | 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 | 288 | unfolding antisym_def trans_def by blast | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 289 | |
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 290 | subsection {* Irreflexivity *}
 | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 291 | |
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 292 | 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 | 293 | by(simp add:irrefl_def) | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 294 | |
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 295 | subsection {* Totality *}
 | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 296 | |
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 297 | 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 | 298 | by(simp add:total_on_def) | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 299 | |
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 300 | 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 | 301 | by(simp add: total_on_def) | 
| 12905 | 302 | |
| 12913 | 303 | subsection {* Converse *}
 | 
| 304 | ||
| 305 | lemma converse_iff [iff]: "((a,b): r^-1) = ((b,a) : r)" | |
| 26271 | 306 | by (simp add: converse_def) | 
| 12905 | 307 | |
| 13343 | 308 | lemma converseI[sym]: "(a, b) : r ==> (b, a) : r^-1" | 
| 26271 | 309 | by (simp add: converse_def) | 
| 12905 | 310 | |
| 13343 | 311 | lemma converseD[sym]: "(a,b) : r^-1 ==> (b, a) : r" | 
| 26271 | 312 | by (simp add: converse_def) | 
| 12905 | 313 | |
| 314 | lemma converseE [elim!]: | |
| 315 | "yx : r^-1 ==> (!!x y. yx = (y, x) ==> (x, y) : r ==> P) ==> P" | |
| 12913 | 316 |     -- {* More general than @{text converseD}, as it ``splits'' the member of the relation. *}
 | 
| 26271 | 317 | by (unfold converse_def) (iprover elim!: CollectE splitE bexE) | 
| 12905 | 318 | |
| 319 | lemma converse_converse [simp]: "(r^-1)^-1 = r" | |
| 26271 | 320 | by (unfold converse_def) blast | 
| 12905 | 321 | |
| 322 | lemma converse_rel_comp: "(r O s)^-1 = s^-1 O r^-1" | |
| 26271 | 323 | by blast | 
| 12905 | 324 | |
| 19228 | 325 | lemma converse_Int: "(r \<inter> s)^-1 = r^-1 \<inter> s^-1" | 
| 26271 | 326 | by blast | 
| 19228 | 327 | |
| 328 | lemma converse_Un: "(r \<union> s)^-1 = r^-1 \<union> s^-1" | |
| 26271 | 329 | by blast | 
| 19228 | 330 | |
| 331 | lemma converse_INTER: "(INTER S r)^-1 = (INT x:S. (r x)^-1)" | |
| 26271 | 332 | by fast | 
| 19228 | 333 | |
| 334 | lemma converse_UNION: "(UNION S r)^-1 = (UN x:S. (r x)^-1)" | |
| 26271 | 335 | by blast | 
| 19228 | 336 | |
| 12905 | 337 | lemma converse_Id [simp]: "Id^-1 = Id" | 
| 26271 | 338 | by blast | 
| 12905 | 339 | |
| 30198 | 340 | lemma converse_Id_on [simp]: "(Id_on A)^-1 = Id_on A" | 
| 26271 | 341 | by blast | 
| 12905 | 342 | |
| 30198 | 343 | lemma refl_on_converse [simp]: "refl_on A (converse r) = refl_on A r" | 
| 344 | by (unfold refl_on_def) auto | |
| 12905 | 345 | |
| 19228 | 346 | lemma sym_converse [simp]: "sym (converse r) = sym r" | 
| 26271 | 347 | by (unfold sym_def) blast | 
| 19228 | 348 | |
| 349 | lemma antisym_converse [simp]: "antisym (converse r) = antisym r" | |
| 26271 | 350 | by (unfold antisym_def) blast | 
| 12905 | 351 | |
| 19228 | 352 | lemma trans_converse [simp]: "trans (converse r) = trans r" | 
| 26271 | 353 | by (unfold trans_def) blast | 
| 12905 | 354 | |
| 19228 | 355 | lemma sym_conv_converse_eq: "sym r = (r^-1 = r)" | 
| 26271 | 356 | by (unfold sym_def) fast | 
| 19228 | 357 | |
| 358 | lemma sym_Un_converse: "sym (r \<union> r^-1)" | |
| 26271 | 359 | by (unfold sym_def) blast | 
| 19228 | 360 | |
| 361 | lemma sym_Int_converse: "sym (r \<inter> r^-1)" | |
| 26271 | 362 | by (unfold sym_def) blast | 
| 19228 | 363 | |
| 29859 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 364 | 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 | 365 | by (auto simp: total_on_def) | 
| 
33bff35f1335
Moved Order_Relation into Library and moved some of it into Relation.
 nipkow parents: 
29609diff
changeset | 366 | |
| 12913 | 367 | |
| 12905 | 368 | subsection {* Domain *}
 | 
| 369 | ||
| 35828 
46cfc4b8112e
now use "Named_Thms" for "noatp", and renamed "noatp" to "no_atp"
 blanchet parents: 
33218diff
changeset | 370 | declare Domain_def [no_atp] | 
| 24286 
7619080e49f0
ATP blacklisting is now in theory data, attribute noatp
 paulson parents: 
23709diff
changeset | 371 | |
| 12905 | 372 | lemma Domain_iff: "(a : Domain r) = (EX y. (a, y) : r)" | 
| 26271 | 373 | by (unfold Domain_def) blast | 
| 12905 | 374 | |
| 375 | lemma DomainI [intro]: "(a, b) : r ==> a : Domain r" | |
| 26271 | 376 | by (iprover intro!: iffD2 [OF Domain_iff]) | 
| 12905 | 377 | |
| 378 | lemma DomainE [elim!]: | |
| 379 | "a : Domain r ==> (!!y. (a, y) : r ==> P) ==> P" | |
| 26271 | 380 | by (iprover dest!: iffD1 [OF Domain_iff]) | 
| 12905 | 381 | |
| 382 | lemma Domain_empty [simp]: "Domain {} = {}"
 | |
| 26271 | 383 | by blast | 
| 12905 | 384 | |
| 32876 | 385 | lemma Domain_empty_iff: "Domain r = {} \<longleftrightarrow> r = {}"
 | 
| 386 | by auto | |
| 387 | ||
| 12905 | 388 | lemma Domain_insert: "Domain (insert (a, b) r) = insert a (Domain r)" | 
| 26271 | 389 | by blast | 
| 12905 | 390 | |
| 391 | lemma Domain_Id [simp]: "Domain Id = UNIV" | |
| 26271 | 392 | by blast | 
| 12905 | 393 | |
| 30198 | 394 | lemma Domain_Id_on [simp]: "Domain (Id_on A) = A" | 
| 26271 | 395 | by blast | 
| 12905 | 396 | |
| 13830 | 397 | lemma Domain_Un_eq: "Domain(A \<union> B) = Domain(A) \<union> Domain(B)" | 
| 26271 | 398 | by blast | 
| 12905 | 399 | |
| 13830 | 400 | lemma Domain_Int_subset: "Domain(A \<inter> B) \<subseteq> Domain(A) \<inter> Domain(B)" | 
| 26271 | 401 | by blast | 
| 12905 | 402 | |
| 12913 | 403 | lemma Domain_Diff_subset: "Domain(A) - Domain(B) \<subseteq> Domain(A - B)" | 
| 26271 | 404 | by blast | 
| 12905 | 405 | |
| 13830 | 406 | lemma Domain_Union: "Domain (Union S) = (\<Union>A\<in>S. Domain A)" | 
| 26271 | 407 | by blast | 
| 408 | ||
| 409 | lemma Domain_converse[simp]: "Domain(r^-1) = Range r" | |
| 410 | by(auto simp:Range_def) | |
| 12905 | 411 | |
| 12913 | 412 | lemma Domain_mono: "r \<subseteq> s ==> Domain r \<subseteq> Domain s" | 
| 26271 | 413 | by blast | 
| 12905 | 414 | |
| 36729 | 415 | lemma fst_eq_Domain: "fst ` R = Domain R" | 
| 26271 | 416 | by (auto intro!:image_eqI) | 
| 22172 | 417 | |
| 29609 | 418 | lemma Domain_dprod [simp]: "Domain (dprod r s) = uprod (Domain r) (Domain s)" | 
| 419 | by auto | |
| 420 | ||
| 421 | lemma Domain_dsum [simp]: "Domain (dsum r s) = usum (Domain r) (Domain s)" | |
| 422 | by auto | |
| 423 | ||
| 12905 | 424 | |
| 425 | subsection {* Range *}
 | |
| 426 | ||
| 427 | lemma Range_iff: "(a : Range r) = (EX y. (y, a) : r)" | |
| 26271 | 428 | by (simp add: Domain_def Range_def) | 
| 12905 | 429 | |
| 430 | lemma RangeI [intro]: "(a, b) : r ==> b : Range r" | |
| 26271 | 431 | by (unfold Range_def) (iprover intro!: converseI DomainI) | 
| 12905 | 432 | |
| 433 | lemma RangeE [elim!]: "b : Range r ==> (!!x. (x, b) : r ==> P) ==> P" | |
| 26271 | 434 | by (unfold Range_def) (iprover elim!: DomainE dest!: converseD) | 
| 12905 | 435 | |
| 436 | lemma Range_empty [simp]: "Range {} = {}"
 | |
| 26271 | 437 | by blast | 
| 12905 | 438 | |
| 32876 | 439 | lemma Range_empty_iff: "Range r = {} \<longleftrightarrow> r = {}"
 | 
| 440 | by auto | |
| 441 | ||
| 12905 | 442 | lemma Range_insert: "Range (insert (a, b) r) = insert b (Range r)" | 
| 26271 | 443 | by blast | 
| 12905 | 444 | |
| 445 | lemma Range_Id [simp]: "Range Id = UNIV" | |
| 26271 | 446 | by blast | 
| 12905 | 447 | |
| 30198 | 448 | lemma Range_Id_on [simp]: "Range (Id_on A) = A" | 
| 26271 | 449 | by auto | 
| 12905 | 450 | |
| 13830 | 451 | lemma Range_Un_eq: "Range(A \<union> B) = Range(A) \<union> Range(B)" | 
| 26271 | 452 | by blast | 
| 12905 | 453 | |
| 13830 | 454 | lemma Range_Int_subset: "Range(A \<inter> B) \<subseteq> Range(A) \<inter> Range(B)" | 
| 26271 | 455 | by blast | 
| 12905 | 456 | |
| 12913 | 457 | lemma Range_Diff_subset: "Range(A) - Range(B) \<subseteq> Range(A - B)" | 
| 26271 | 458 | by blast | 
| 12905 | 459 | |
| 13830 | 460 | lemma Range_Union: "Range (Union S) = (\<Union>A\<in>S. Range A)" | 
| 26271 | 461 | by blast | 
| 462 | ||
| 463 | lemma Range_converse[simp]: "Range(r^-1) = Domain r" | |
| 464 | by blast | |
| 12905 | 465 | |
| 36729 | 466 | lemma snd_eq_Range: "snd ` R = Range R" | 
| 26271 | 467 | by (auto intro!:image_eqI) | 
| 468 | ||
| 469 | ||
| 470 | subsection {* Field *}
 | |
| 471 | ||
| 472 | lemma mono_Field: "r \<subseteq> s \<Longrightarrow> Field r \<subseteq> Field s" | |
| 473 | by(auto simp:Field_def Domain_def Range_def) | |
| 474 | ||
| 475 | lemma Field_empty[simp]: "Field {} = {}"
 | |
| 476 | by(auto simp:Field_def) | |
| 477 | ||
| 478 | lemma Field_insert[simp]: "Field (insert (a,b) r) = {a,b} \<union> Field r"
 | |
| 479 | by(auto simp:Field_def) | |
| 480 | ||
| 481 | lemma Field_Un[simp]: "Field (r \<union> s) = Field r \<union> Field s" | |
| 482 | by(auto simp:Field_def) | |
| 483 | ||
| 484 | lemma Field_Union[simp]: "Field (\<Union>R) = \<Union>(Field ` R)" | |
| 485 | by(auto simp:Field_def) | |
| 486 | ||
| 487 | lemma Field_converse[simp]: "Field(r^-1) = Field r" | |
| 488 | by(auto simp:Field_def) | |
| 22172 | 489 | |
| 12905 | 490 | |
| 491 | subsection {* Image of a set under a relation *}
 | |
| 492 | ||
| 35828 
46cfc4b8112e
now use "Named_Thms" for "noatp", and renamed "noatp" to "no_atp"
 blanchet parents: 
33218diff
changeset | 493 | declare Image_def [no_atp] | 
| 24286 
7619080e49f0
ATP blacklisting is now in theory data, attribute noatp
 paulson parents: 
23709diff
changeset | 494 | |
| 12913 | 495 | lemma Image_iff: "(b : r``A) = (EX x:A. (x, b) : r)" | 
| 26271 | 496 | by (simp add: Image_def) | 
| 12905 | 497 | |
| 12913 | 498 | lemma Image_singleton: "r``{a} = {b. (a, b) : r}"
 | 
| 26271 | 499 | by (simp add: Image_def) | 
| 12905 | 500 | |
| 12913 | 501 | lemma Image_singleton_iff [iff]: "(b : r``{a}) = ((a, b) : r)"
 | 
| 26271 | 502 | by (rule Image_iff [THEN trans]) simp | 
| 12905 | 503 | |
| 35828 
46cfc4b8112e
now use "Named_Thms" for "noatp", and renamed "noatp" to "no_atp"
 blanchet parents: 
33218diff
changeset | 504 | lemma ImageI [intro,no_atp]: "(a, b) : r ==> a : A ==> b : r``A" | 
| 26271 | 505 | by (unfold Image_def) blast | 
| 12905 | 506 | |
| 507 | lemma ImageE [elim!]: | |
| 12913 | 508 | "b : r `` A ==> (!!x. (x, b) : r ==> x : A ==> P) ==> P" | 
| 26271 | 509 | by (unfold Image_def) (iprover elim!: CollectE bexE) | 
| 12905 | 510 | |
| 511 | lemma rev_ImageI: "a : A ==> (a, b) : r ==> b : r `` A" | |
| 512 |   -- {* This version's more effective when we already have the required @{text a} *}
 | |
| 26271 | 513 | by blast | 
| 12905 | 514 | |
| 515 | lemma Image_empty [simp]: "R``{} = {}"
 | |
| 26271 | 516 | by blast | 
| 12905 | 517 | |
| 518 | lemma Image_Id [simp]: "Id `` A = A" | |
| 26271 | 519 | by blast | 
| 12905 | 520 | |
| 30198 | 521 | lemma Image_Id_on [simp]: "Id_on A `` B = A \<inter> B" | 
| 26271 | 522 | by blast | 
| 13830 | 523 | |
| 524 | lemma Image_Int_subset: "R `` (A \<inter> B) \<subseteq> R `` A \<inter> R `` B" | |
| 26271 | 525 | by blast | 
| 12905 | 526 | |
| 13830 | 527 | lemma Image_Int_eq: | 
| 528 | "single_valued (converse R) ==> R `` (A \<inter> B) = R `` A \<inter> R `` B" | |
| 26271 | 529 | by (simp add: single_valued_def, blast) | 
| 12905 | 530 | |
| 13830 | 531 | lemma Image_Un: "R `` (A \<union> B) = R `` A \<union> R `` B" | 
| 26271 | 532 | by blast | 
| 12905 | 533 | |
| 13812 
91713a1915ee
converting HOL/UNITY to use unconditional fairness
 paulson parents: 
13639diff
changeset | 534 | lemma Un_Image: "(R \<union> S) `` A = R `` A \<union> S `` A" | 
| 26271 | 535 | by blast | 
| 13812 
91713a1915ee
converting HOL/UNITY to use unconditional fairness
 paulson parents: 
13639diff
changeset | 536 | |
| 12913 | 537 | lemma Image_subset: "r \<subseteq> A \<times> B ==> r``C \<subseteq> B" | 
| 26271 | 538 | by (iprover intro!: subsetI elim!: ImageE dest!: subsetD SigmaD2) | 
| 12905 | 539 | |
| 13830 | 540 | lemma Image_eq_UN: "r``B = (\<Union>y\<in> B. r``{y})"
 | 
| 12905 | 541 |   -- {* NOT suitable for rewriting *}
 | 
| 26271 | 542 | by blast | 
| 12905 | 543 | |
| 12913 | 544 | lemma Image_mono: "r' \<subseteq> r ==> A' \<subseteq> A ==> (r' `` A') \<subseteq> (r `` A)" | 
| 26271 | 545 | by blast | 
| 12905 | 546 | |
| 13830 | 547 | lemma Image_UN: "(r `` (UNION A B)) = (\<Union>x\<in>A. r `` (B x))" | 
| 26271 | 548 | by blast | 
| 13830 | 549 | |
| 550 | lemma Image_INT_subset: "(r `` INTER A B) \<subseteq> (\<Inter>x\<in>A. r `` (B x))" | |
| 26271 | 551 | by blast | 
| 12905 | 552 | |
| 13830 | 553 | text{*Converse inclusion requires some assumptions*}
 | 
| 554 | lemma Image_INT_eq: | |
| 555 |      "[|single_valued (r\<inverse>); A\<noteq>{}|] ==> r `` INTER A B = (\<Inter>x\<in>A. r `` B x)"
 | |
| 556 | apply (rule equalityI) | |
| 557 | apply (rule Image_INT_subset) | |
| 558 | apply (simp add: single_valued_def, blast) | |
| 559 | done | |
| 12905 | 560 | |
| 12913 | 561 | lemma Image_subset_eq: "(r``A \<subseteq> B) = (A \<subseteq> - ((r^-1) `` (-B)))" | 
| 26271 | 562 | by blast | 
| 12905 | 563 | |
| 564 | ||
| 12913 | 565 | subsection {* Single valued relations *}
 | 
| 566 | ||
| 567 | lemma single_valuedI: | |
| 12905 | 568 | "ALL x y. (x,y):r --> (ALL z. (x,z):r --> y=z) ==> single_valued r" | 
| 26271 | 569 | by (unfold single_valued_def) | 
| 12905 | 570 | |
| 571 | lemma single_valuedD: | |
| 572 | "single_valued r ==> (x, y) : r ==> (x, z) : r ==> y = z" | |
| 26271 | 573 | by (simp add: single_valued_def) | 
| 12905 | 574 | |
| 19228 | 575 | lemma single_valued_rel_comp: | 
| 576 | "single_valued r ==> single_valued s ==> single_valued (r O s)" | |
| 26271 | 577 | by (unfold single_valued_def) blast | 
| 19228 | 578 | |
| 579 | lemma single_valued_subset: | |
| 580 | "r \<subseteq> s ==> single_valued s ==> single_valued r" | |
| 26271 | 581 | by (unfold single_valued_def) blast | 
| 19228 | 582 | |
| 583 | lemma single_valued_Id [simp]: "single_valued Id" | |
| 26271 | 584 | by (unfold single_valued_def) blast | 
| 19228 | 585 | |
| 30198 | 586 | lemma single_valued_Id_on [simp]: "single_valued (Id_on A)" | 
| 26271 | 587 | by (unfold single_valued_def) blast | 
| 19228 | 588 | |
| 12905 | 589 | |
| 590 | subsection {* Graphs given by @{text Collect} *}
 | |
| 591 | ||
| 592 | lemma Domain_Collect_split [simp]: "Domain{(x,y). P x y} = {x. EX y. P x y}"
 | |
| 26271 | 593 | by auto | 
| 12905 | 594 | |
| 595 | lemma Range_Collect_split [simp]: "Range{(x,y). P x y} = {y. EX x. P x y}"
 | |
| 26271 | 596 | by auto | 
| 12905 | 597 | |
| 598 | lemma Image_Collect_split [simp]: "{(x,y). P x y} `` A = {y. EX x:A. P x y}"
 | |
| 26271 | 599 | by auto | 
| 12905 | 600 | |
| 601 | ||
| 12913 | 602 | subsection {* Inverse image *}
 | 
| 12905 | 603 | |
| 19228 | 604 | lemma sym_inv_image: "sym r ==> sym (inv_image r f)" | 
| 26271 | 605 | by (unfold sym_def inv_image_def) blast | 
| 19228 | 606 | |
| 12913 | 607 | lemma trans_inv_image: "trans r ==> trans (inv_image r f)" | 
| 12905 | 608 | apply (unfold trans_def inv_image_def) | 
| 609 | apply (simp (no_asm)) | |
| 610 | apply blast | |
| 611 | done | |
| 612 | ||
| 32463 
3a0a65ca2261
moved lemma Wellfounded.in_inv_image to Relation.thy
 krauss parents: 
32235diff
changeset | 613 | lemma in_inv_image[simp]: "((x,y) : inv_image r f) = ((f x, f y) : r)" | 
| 
3a0a65ca2261
moved lemma Wellfounded.in_inv_image to Relation.thy
 krauss parents: 
32235diff
changeset | 614 | by (auto simp:inv_image_def) | 
| 
3a0a65ca2261
moved lemma Wellfounded.in_inv_image to Relation.thy
 krauss parents: 
32235diff
changeset | 615 | |
| 33218 | 616 | lemma converse_inv_image[simp]: "(inv_image R f)^-1 = inv_image (R^-1) f" | 
| 617 | unfolding inv_image_def converse_def by auto | |
| 618 | ||
| 23709 | 619 | |
| 29609 | 620 | subsection {* Finiteness *}
 | 
| 621 | ||
| 622 | lemma finite_converse [iff]: "finite (r^-1) = finite r" | |
| 623 | apply (subgoal_tac "r^-1 = (%(x,y). (y,x))`r") | |
| 624 | apply simp | |
| 625 | apply (rule iffI) | |
| 626 | apply (erule finite_imageD [unfolded inj_on_def]) | |
| 627 | apply (simp split add: split_split) | |
| 628 | apply (erule finite_imageI) | |
| 629 | apply (simp add: converse_def image_def, auto) | |
| 630 | apply (rule bexI) | |
| 631 | prefer 2 apply assumption | |
| 632 | apply simp | |
| 633 | done | |
| 634 | ||
| 32876 | 635 | lemma finite_Domain: "finite r ==> finite (Domain r)" | 
| 636 | by (induct set: finite) (auto simp add: Domain_insert) | |
| 637 | ||
| 638 | lemma finite_Range: "finite r ==> finite (Range r)" | |
| 639 | by (induct set: finite) (auto simp add: Range_insert) | |
| 29609 | 640 | |
| 641 | lemma finite_Field: "finite r ==> finite (Field r)" | |
| 642 |   -- {* A finite relation has a finite field (@{text "= domain \<union> range"}. *}
 | |
| 643 | apply (induct set: finite) | |
| 644 | apply (auto simp add: Field_def Domain_insert Range_insert) | |
| 645 | done | |
| 646 | ||
| 647 | ||
| 36728 
ae397b810c8b
rule subrelI (for nice Isar proofs of relation inequalities)
 krauss parents: 
35828diff
changeset | 648 | subsection {* Miscellaneous *}
 | 
| 
ae397b810c8b
rule subrelI (for nice Isar proofs of relation inequalities)
 krauss parents: 
35828diff
changeset | 649 | |
| 
ae397b810c8b
rule subrelI (for nice Isar proofs of relation inequalities)
 krauss parents: 
35828diff
changeset | 650 | text {* Version of @{thm[source] lfp_induct} for binary relations *}
 | 
| 23709 | 651 | |
| 652 | lemmas lfp_induct2 = | |
| 653 | lfp_induct_set [of "(a, b)", split_format (complete)] | |
| 654 | ||
| 36728 
ae397b810c8b
rule subrelI (for nice Isar proofs of relation inequalities)
 krauss parents: 
35828diff
changeset | 655 | text {* Version of @{thm[source] subsetI} for binary relations *}
 | 
| 
ae397b810c8b
rule subrelI (for nice Isar proofs of relation inequalities)
 krauss parents: 
35828diff
changeset | 656 | |
| 
ae397b810c8b
rule subrelI (for nice Isar proofs of relation inequalities)
 krauss parents: 
35828diff
changeset | 657 | lemma subrelI: "(\<And>x y. (x, y) \<in> r \<Longrightarrow> (x, y) \<in> s) \<Longrightarrow> r \<subseteq> s" | 
| 
ae397b810c8b
rule subrelI (for nice Isar proofs of relation inequalities)
 krauss parents: 
35828diff
changeset | 658 | by auto | 
| 
ae397b810c8b
rule subrelI (for nice Isar proofs of relation inequalities)
 krauss parents: 
35828diff
changeset | 659 | |
| 1128 
64b30e3cc6d4
Trancl is now based on Relation which used to be in Integ.
 nipkow parents: diff
changeset | 660 | end |