| author | fleury | 
| Wed, 30 Jul 2014 14:03:12 +0200 | |
| changeset 57704 | c0da3fc313e3 | 
| parent 57398 | 882091eb1e9a | 
| child 57961 | 10b2f60b70f0 | 
| permissions | -rw-r--r-- | 
| 47308 | 1 | (* Title: HOL/Lifting.thy | 
| 2 | Author: Brian Huffman and Ondrej Kuncar | |
| 3 | Author: Cezary Kaliszyk and Christian Urban | |
| 4 | *) | |
| 5 | ||
| 6 | header {* Lifting package *}
 | |
| 7 | ||
| 8 | theory Lifting | |
| 51112 | 9 | imports Equiv_Relations Transfer | 
| 47308 | 10 | keywords | 
| 51374 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 11 | "parametric" and | 
| 53219 
ca237b9e4542
use only one data slot; rename print_quotmaps to print_quot_maps; tuned
 kuncar parents: 
53151diff
changeset | 12 | "print_quot_maps" "print_quotients" :: diag and | 
| 47308 | 13 | "lift_definition" :: thy_goal and | 
| 53651 | 14 | "setup_lifting" "lifting_forget" "lifting_update" :: thy_decl | 
| 47308 | 15 | begin | 
| 16 | ||
| 47325 | 17 | subsection {* Function map *}
 | 
| 47308 | 18 | |
| 53011 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 kuncar parents: 
52307diff
changeset | 19 | context | 
| 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 kuncar parents: 
52307diff
changeset | 20 | begin | 
| 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 kuncar parents: 
52307diff
changeset | 21 | interpretation lifting_syntax . | 
| 47308 | 22 | |
| 23 | lemma map_fun_id: | |
| 24 | "(id ---> id) = id" | |
| 25 | by (simp add: fun_eq_iff) | |
| 26 | ||
| 27 | subsection {* Quotient Predicate *}
 | |
| 28 | ||
| 29 | definition | |
| 30 | "Quotient R Abs Rep T \<longleftrightarrow> | |
| 31 | (\<forall>a. Abs (Rep a) = a) \<and> | |
| 32 | (\<forall>a. R (Rep a) (Rep a)) \<and> | |
| 33 | (\<forall>r s. R r s \<longleftrightarrow> R r r \<and> R s s \<and> Abs r = Abs s) \<and> | |
| 34 | T = (\<lambda>x y. R x x \<and> Abs x = y)" | |
| 35 | ||
| 36 | lemma QuotientI: | |
| 37 | assumes "\<And>a. Abs (Rep a) = a" | |
| 38 | and "\<And>a. R (Rep a) (Rep a)" | |
| 39 | and "\<And>r s. R r s \<longleftrightarrow> R r r \<and> R s s \<and> Abs r = Abs s" | |
| 40 | and "T = (\<lambda>x y. R x x \<and> Abs x = y)" | |
| 41 | shows "Quotient R Abs Rep T" | |
| 42 | using assms unfolding Quotient_def by blast | |
| 43 | ||
| 47536 | 44 | context | 
| 45 | fixes R Abs Rep T | |
| 47308 | 46 | assumes a: "Quotient R Abs Rep T" | 
| 47536 | 47 | begin | 
| 48 | ||
| 49 | lemma Quotient_abs_rep: "Abs (Rep a) = a" | |
| 50 | using a unfolding Quotient_def | |
| 47308 | 51 | by simp | 
| 52 | ||
| 47536 | 53 | lemma Quotient_rep_reflp: "R (Rep a) (Rep a)" | 
| 54 | using a unfolding Quotient_def | |
| 47308 | 55 | by blast | 
| 56 | ||
| 57 | lemma Quotient_rel: | |
| 47536 | 58 |   "R r r \<and> R s s \<and> Abs r = Abs s \<longleftrightarrow> R r s" -- {* orientation does not loop on rewriting *}
 | 
| 59 | using a unfolding Quotient_def | |
| 47308 | 60 | by blast | 
| 61 | ||
| 47536 | 62 | lemma Quotient_cr_rel: "T = (\<lambda>x y. R x x \<and> Abs x = y)" | 
| 47308 | 63 | using a unfolding Quotient_def | 
| 64 | by blast | |
| 65 | ||
| 47536 | 66 | lemma Quotient_refl1: "R r s \<Longrightarrow> R r r" | 
| 67 | using a unfolding Quotient_def | |
| 68 | by fast | |
| 69 | ||
| 70 | lemma Quotient_refl2: "R r s \<Longrightarrow> R s s" | |
| 71 | using a unfolding Quotient_def | |
| 72 | by fast | |
| 73 | ||
| 74 | lemma Quotient_rel_rep: "R (Rep a) (Rep b) \<longleftrightarrow> a = b" | |
| 75 | using a unfolding Quotient_def | |
| 76 | by metis | |
| 77 | ||
| 78 | lemma Quotient_rep_abs: "R r r \<Longrightarrow> R (Rep (Abs r)) r" | |
| 47308 | 79 | using a unfolding Quotient_def | 
| 80 | by blast | |
| 81 | ||
| 55610 
9066b603dff6
refactoring; generate rep_eq always, not only when it would be accepted by the code generator
 kuncar parents: 
55604diff
changeset | 82 | lemma Quotient_rep_abs_eq: "R t t \<Longrightarrow> R \<le> op= \<Longrightarrow> Rep (Abs t) = t" | 
| 
9066b603dff6
refactoring; generate rep_eq always, not only when it would be accepted by the code generator
 kuncar parents: 
55604diff
changeset | 83 | using a unfolding Quotient_def | 
| 
9066b603dff6
refactoring; generate rep_eq always, not only when it would be accepted by the code generator
 kuncar parents: 
55604diff
changeset | 84 | by blast | 
| 
9066b603dff6
refactoring; generate rep_eq always, not only when it would be accepted by the code generator
 kuncar parents: 
55604diff
changeset | 85 | |
| 47937 
70375fa2679d
generate abs_eq, use it as a code equation for total quotients; no_abs_code renamed to no_code; added no_code for quotient_type command
 kuncar parents: 
47936diff
changeset | 86 | lemma Quotient_rep_abs_fold_unmap: | 
| 
70375fa2679d
generate abs_eq, use it as a code equation for total quotients; no_abs_code renamed to no_code; added no_code for quotient_type command
 kuncar parents: 
47936diff
changeset | 87 | assumes "x' \<equiv> Abs x" and "R x x" and "Rep x' \<equiv> Rep' x'" | 
| 
70375fa2679d
generate abs_eq, use it as a code equation for total quotients; no_abs_code renamed to no_code; added no_code for quotient_type command
 kuncar parents: 
47936diff
changeset | 88 | shows "R (Rep' x') x" | 
| 
70375fa2679d
generate abs_eq, use it as a code equation for total quotients; no_abs_code renamed to no_code; added no_code for quotient_type command
 kuncar parents: 
47936diff
changeset | 89 | proof - | 
| 
70375fa2679d
generate abs_eq, use it as a code equation for total quotients; no_abs_code renamed to no_code; added no_code for quotient_type command
 kuncar parents: 
47936diff
changeset | 90 | have "R (Rep x') x" using assms(1-2) Quotient_rep_abs by auto | 
| 
70375fa2679d
generate abs_eq, use it as a code equation for total quotients; no_abs_code renamed to no_code; added no_code for quotient_type command
 kuncar parents: 
47936diff
changeset | 91 | then show ?thesis using assms(3) by simp | 
| 
70375fa2679d
generate abs_eq, use it as a code equation for total quotients; no_abs_code renamed to no_code; added no_code for quotient_type command
 kuncar parents: 
47936diff
changeset | 92 | qed | 
| 
70375fa2679d
generate abs_eq, use it as a code equation for total quotients; no_abs_code renamed to no_code; added no_code for quotient_type command
 kuncar parents: 
47936diff
changeset | 93 | |
| 
70375fa2679d
generate abs_eq, use it as a code equation for total quotients; no_abs_code renamed to no_code; added no_code for quotient_type command
 kuncar parents: 
47936diff
changeset | 94 | lemma Quotient_Rep_eq: | 
| 
70375fa2679d
generate abs_eq, use it as a code equation for total quotients; no_abs_code renamed to no_code; added no_code for quotient_type command
 kuncar parents: 
47936diff
changeset | 95 | assumes "x' \<equiv> Abs x" | 
| 
70375fa2679d
generate abs_eq, use it as a code equation for total quotients; no_abs_code renamed to no_code; added no_code for quotient_type command
 kuncar parents: 
47936diff
changeset | 96 | shows "Rep x' \<equiv> Rep x'" | 
| 
70375fa2679d
generate abs_eq, use it as a code equation for total quotients; no_abs_code renamed to no_code; added no_code for quotient_type command
 kuncar parents: 
47936diff
changeset | 97 | by simp | 
| 
70375fa2679d
generate abs_eq, use it as a code equation for total quotients; no_abs_code renamed to no_code; added no_code for quotient_type command
 kuncar parents: 
47936diff
changeset | 98 | |
| 47536 | 99 | lemma Quotient_rel_abs: "R r s \<Longrightarrow> Abs r = Abs s" | 
| 100 | using a unfolding Quotient_def | |
| 101 | by blast | |
| 102 | ||
| 47937 
70375fa2679d
generate abs_eq, use it as a code equation for total quotients; no_abs_code renamed to no_code; added no_code for quotient_type command
 kuncar parents: 
47936diff
changeset | 103 | lemma Quotient_rel_abs2: | 
| 
70375fa2679d
generate abs_eq, use it as a code equation for total quotients; no_abs_code renamed to no_code; added no_code for quotient_type command
 kuncar parents: 
47936diff
changeset | 104 | assumes "R (Rep x) y" | 
| 
70375fa2679d
generate abs_eq, use it as a code equation for total quotients; no_abs_code renamed to no_code; added no_code for quotient_type command
 kuncar parents: 
47936diff
changeset | 105 | shows "x = Abs y" | 
| 
70375fa2679d
generate abs_eq, use it as a code equation for total quotients; no_abs_code renamed to no_code; added no_code for quotient_type command
 kuncar parents: 
47936diff
changeset | 106 | proof - | 
| 
70375fa2679d
generate abs_eq, use it as a code equation for total quotients; no_abs_code renamed to no_code; added no_code for quotient_type command
 kuncar parents: 
47936diff
changeset | 107 | from assms have "Abs (Rep x) = Abs y" by (auto intro: Quotient_rel_abs) | 
| 
70375fa2679d
generate abs_eq, use it as a code equation for total quotients; no_abs_code renamed to no_code; added no_code for quotient_type command
 kuncar parents: 
47936diff
changeset | 108 | then show ?thesis using assms(1) by (simp add: Quotient_abs_rep) | 
| 
70375fa2679d
generate abs_eq, use it as a code equation for total quotients; no_abs_code renamed to no_code; added no_code for quotient_type command
 kuncar parents: 
47936diff
changeset | 109 | qed | 
| 
70375fa2679d
generate abs_eq, use it as a code equation for total quotients; no_abs_code renamed to no_code; added no_code for quotient_type command
 kuncar parents: 
47936diff
changeset | 110 | |
| 47536 | 111 | lemma Quotient_symp: "symp R" | 
| 47308 | 112 | using a unfolding Quotient_def using sympI by (metis (full_types)) | 
| 113 | ||
| 47536 | 114 | lemma Quotient_transp: "transp R" | 
| 47308 | 115 | using a unfolding Quotient_def using transpI by (metis (full_types)) | 
| 116 | ||
| 47536 | 117 | lemma Quotient_part_equivp: "part_equivp R" | 
| 118 | by (metis Quotient_rep_reflp Quotient_symp Quotient_transp part_equivpI) | |
| 119 | ||
| 120 | end | |
| 47308 | 121 | |
| 122 | lemma identity_quotient: "Quotient (op =) id id (op =)" | |
| 123 | unfolding Quotient_def by simp | |
| 124 | ||
| 47652 
1b722b100301
move alternative definition lemmas into Lifting.thy;
 huffman parents: 
47651diff
changeset | 125 | text {* TODO: Use one of these alternatives as the real definition. *}
 | 
| 
1b722b100301
move alternative definition lemmas into Lifting.thy;
 huffman parents: 
47651diff
changeset | 126 | |
| 47308 | 127 | lemma Quotient_alt_def: | 
| 128 | "Quotient R Abs Rep T \<longleftrightarrow> | |
| 129 | (\<forall>a b. T a b \<longrightarrow> Abs a = b) \<and> | |
| 130 | (\<forall>b. T (Rep b) b) \<and> | |
| 131 | (\<forall>x y. R x y \<longleftrightarrow> T x (Abs x) \<and> T y (Abs y) \<and> Abs x = Abs y)" | |
| 132 | apply safe | |
| 133 | apply (simp (no_asm_use) only: Quotient_def, fast) | |
| 134 | apply (simp (no_asm_use) only: Quotient_def, fast) | |
| 135 | apply (simp (no_asm_use) only: Quotient_def, fast) | |
| 136 | apply (simp (no_asm_use) only: Quotient_def, fast) | |
| 137 | apply (simp (no_asm_use) only: Quotient_def, fast) | |
| 138 | apply (simp (no_asm_use) only: Quotient_def, fast) | |
| 139 | apply (rule QuotientI) | |
| 140 | apply simp | |
| 141 | apply metis | |
| 142 | apply simp | |
| 143 | apply (rule ext, rule ext, metis) | |
| 144 | done | |
| 145 | ||
| 146 | lemma Quotient_alt_def2: | |
| 147 | "Quotient R Abs Rep T \<longleftrightarrow> | |
| 148 | (\<forall>a b. T a b \<longrightarrow> Abs a = b) \<and> | |
| 149 | (\<forall>b. T (Rep b) b) \<and> | |
| 150 | (\<forall>x y. R x y \<longleftrightarrow> T x (Abs y) \<and> T y (Abs x))" | |
| 151 | unfolding Quotient_alt_def by (safe, metis+) | |
| 152 | ||
| 47652 
1b722b100301
move alternative definition lemmas into Lifting.thy;
 huffman parents: 
47651diff
changeset | 153 | lemma Quotient_alt_def3: | 
| 
1b722b100301
move alternative definition lemmas into Lifting.thy;
 huffman parents: 
47651diff
changeset | 154 | "Quotient R Abs Rep T \<longleftrightarrow> | 
| 
1b722b100301
move alternative definition lemmas into Lifting.thy;
 huffman parents: 
47651diff
changeset | 155 | (\<forall>a b. T a b \<longrightarrow> Abs a = b) \<and> (\<forall>b. T (Rep b) b) \<and> | 
| 
1b722b100301
move alternative definition lemmas into Lifting.thy;
 huffman parents: 
47651diff
changeset | 156 | (\<forall>x y. R x y \<longleftrightarrow> (\<exists>z. T x z \<and> T y z))" | 
| 
1b722b100301
move alternative definition lemmas into Lifting.thy;
 huffman parents: 
47651diff
changeset | 157 | unfolding Quotient_alt_def2 by (safe, metis+) | 
| 
1b722b100301
move alternative definition lemmas into Lifting.thy;
 huffman parents: 
47651diff
changeset | 158 | |
| 
1b722b100301
move alternative definition lemmas into Lifting.thy;
 huffman parents: 
47651diff
changeset | 159 | lemma Quotient_alt_def4: | 
| 
1b722b100301
move alternative definition lemmas into Lifting.thy;
 huffman parents: 
47651diff
changeset | 160 | "Quotient R Abs Rep T \<longleftrightarrow> | 
| 
1b722b100301
move alternative definition lemmas into Lifting.thy;
 huffman parents: 
47651diff
changeset | 161 | (\<forall>a b. T a b \<longrightarrow> Abs a = b) \<and> (\<forall>b. T (Rep b) b) \<and> R = T OO conversep T" | 
| 
1b722b100301
move alternative definition lemmas into Lifting.thy;
 huffman parents: 
47651diff
changeset | 162 | unfolding Quotient_alt_def3 fun_eq_iff by auto | 
| 
1b722b100301
move alternative definition lemmas into Lifting.thy;
 huffman parents: 
47651diff
changeset | 163 | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56519diff
changeset | 164 | lemma Quotient_alt_def5: | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56519diff
changeset | 165 | "Quotient R Abs Rep T \<longleftrightarrow> | 
| 57398 | 166 | T \<le> BNF_Def.Grp UNIV Abs \<and> BNF_Def.Grp UNIV Rep \<le> T\<inverse>\<inverse> \<and> R = T OO T\<inverse>\<inverse>" | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56519diff
changeset | 167 | unfolding Quotient_alt_def4 Grp_def by blast | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56519diff
changeset | 168 | |
| 47308 | 169 | lemma fun_quotient: | 
| 170 | assumes 1: "Quotient R1 abs1 rep1 T1" | |
| 171 | assumes 2: "Quotient R2 abs2 rep2 T2" | |
| 172 | shows "Quotient (R1 ===> R2) (rep1 ---> abs2) (abs1 ---> rep2) (T1 ===> T2)" | |
| 173 | using assms unfolding Quotient_alt_def2 | |
| 55945 | 174 | unfolding rel_fun_def fun_eq_iff map_fun_apply | 
| 47308 | 175 | by (safe, metis+) | 
| 176 | ||
| 177 | lemma apply_rsp: | |
| 178 | fixes f g::"'a \<Rightarrow> 'c" | |
| 179 | assumes q: "Quotient R1 Abs1 Rep1 T1" | |
| 180 | and a: "(R1 ===> R2) f g" "R1 x y" | |
| 181 | shows "R2 (f x) (g y)" | |
| 55945 | 182 | using a by (auto elim: rel_funE) | 
| 47308 | 183 | |
| 184 | lemma apply_rsp': | |
| 185 | assumes a: "(R1 ===> R2) f g" "R1 x y" | |
| 186 | shows "R2 (f x) (g y)" | |
| 55945 | 187 | using a by (auto elim: rel_funE) | 
| 47308 | 188 | |
| 189 | lemma apply_rsp'': | |
| 190 | assumes "Quotient R Abs Rep T" | |
| 191 | and "(R ===> S) f f" | |
| 192 | shows "S (f (Rep x)) (f (Rep x))" | |
| 193 | proof - | |
| 194 | from assms(1) have "R (Rep x) (Rep x)" by (rule Quotient_rep_reflp) | |
| 195 | then show ?thesis using assms(2) by (auto intro: apply_rsp') | |
| 196 | qed | |
| 197 | ||
| 198 | subsection {* Quotient composition *}
 | |
| 199 | ||
| 200 | lemma Quotient_compose: | |
| 201 | assumes 1: "Quotient R1 Abs1 Rep1 T1" | |
| 202 | assumes 2: "Quotient R2 Abs2 Rep2 T2" | |
| 203 | shows "Quotient (T1 OO R2 OO conversep T1) (Abs2 \<circ> Abs1) (Rep1 \<circ> Rep2) (T1 OO T2)" | |
| 51994 | 204 | using assms unfolding Quotient_alt_def4 by fastforce | 
| 47308 | 205 | |
| 47521 
69f95ac85c3d
tuned the setup of lifting; generate transfer rules for typedef and Quotient thms
 kuncar parents: 
47501diff
changeset | 206 | lemma equivp_reflp2: | 
| 
69f95ac85c3d
tuned the setup of lifting; generate transfer rules for typedef and Quotient thms
 kuncar parents: 
47501diff
changeset | 207 | "equivp R \<Longrightarrow> reflp R" | 
| 
69f95ac85c3d
tuned the setup of lifting; generate transfer rules for typedef and Quotient thms
 kuncar parents: 
47501diff
changeset | 208 | by (erule equivpE) | 
| 
69f95ac85c3d
tuned the setup of lifting; generate transfer rules for typedef and Quotient thms
 kuncar parents: 
47501diff
changeset | 209 | |
| 47544 | 210 | subsection {* Respects predicate *}
 | 
| 211 | ||
| 212 | definition Respects :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> 'a set"
 | |
| 213 |   where "Respects R = {x. R x x}"
 | |
| 214 | ||
| 215 | lemma in_respects: "x \<in> Respects R \<longleftrightarrow> R x x" | |
| 216 | unfolding Respects_def by simp | |
| 217 | ||
| 47361 
87c0eaf04bad
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
 kuncar parents: 
47354diff
changeset | 218 | lemma UNIV_typedef_to_Quotient: | 
| 47308 | 219 | assumes "type_definition Rep Abs UNIV" | 
| 47361 
87c0eaf04bad
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
 kuncar parents: 
47354diff
changeset | 220 | and T_def: "T \<equiv> (\<lambda>x y. x = Rep y)" | 
| 47308 | 221 | shows "Quotient (op =) Abs Rep T" | 
| 222 | proof - | |
| 223 | interpret type_definition Rep Abs UNIV by fact | |
| 47361 
87c0eaf04bad
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
 kuncar parents: 
47354diff
changeset | 224 | from Abs_inject Rep_inverse Abs_inverse T_def show ?thesis | 
| 
87c0eaf04bad
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
 kuncar parents: 
47354diff
changeset | 225 | by (fastforce intro!: QuotientI fun_eq_iff) | 
| 47308 | 226 | qed | 
| 227 | ||
| 47361 
87c0eaf04bad
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
 kuncar parents: 
47354diff
changeset | 228 | lemma UNIV_typedef_to_equivp: | 
| 47308 | 229 | fixes Abs :: "'a \<Rightarrow> 'b" | 
| 230 | and Rep :: "'b \<Rightarrow> 'a" | |
| 231 | assumes "type_definition Rep Abs (UNIV::'a set)" | |
| 232 | shows "equivp (op=::'a\<Rightarrow>'a\<Rightarrow>bool)" | |
| 233 | by (rule identity_equivp) | |
| 234 | ||
| 47354 | 235 | lemma typedef_to_Quotient: | 
| 47361 
87c0eaf04bad
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
 kuncar parents: 
47354diff
changeset | 236 | assumes "type_definition Rep Abs S" | 
| 
87c0eaf04bad
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
 kuncar parents: 
47354diff
changeset | 237 | and T_def: "T \<equiv> (\<lambda>x y. x = Rep y)" | 
| 56519 
c1048f5bbb45
more appropriate name (Lifting.invariant -> eq_onp)
 kuncar parents: 
56518diff
changeset | 238 | shows "Quotient (eq_onp (\<lambda>x. x \<in> S)) Abs Rep T" | 
| 47361 
87c0eaf04bad
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
 kuncar parents: 
47354diff
changeset | 239 | proof - | 
| 
87c0eaf04bad
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
 kuncar parents: 
47354diff
changeset | 240 | interpret type_definition Rep Abs S by fact | 
| 
87c0eaf04bad
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
 kuncar parents: 
47354diff
changeset | 241 | from Rep Abs_inject Rep_inverse Abs_inverse T_def show ?thesis | 
| 56519 
c1048f5bbb45
more appropriate name (Lifting.invariant -> eq_onp)
 kuncar parents: 
56518diff
changeset | 242 | by (auto intro!: QuotientI simp: eq_onp_def fun_eq_iff) | 
| 47361 
87c0eaf04bad
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
 kuncar parents: 
47354diff
changeset | 243 | qed | 
| 
87c0eaf04bad
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
 kuncar parents: 
47354diff
changeset | 244 | |
| 
87c0eaf04bad
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
 kuncar parents: 
47354diff
changeset | 245 | lemma typedef_to_part_equivp: | 
| 
87c0eaf04bad
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
 kuncar parents: 
47354diff
changeset | 246 | assumes "type_definition Rep Abs S" | 
| 56519 
c1048f5bbb45
more appropriate name (Lifting.invariant -> eq_onp)
 kuncar parents: 
56518diff
changeset | 247 | shows "part_equivp (eq_onp (\<lambda>x. x \<in> S))" | 
| 47361 
87c0eaf04bad
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
 kuncar parents: 
47354diff
changeset | 248 | proof (intro part_equivpI) | 
| 
87c0eaf04bad
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
 kuncar parents: 
47354diff
changeset | 249 | interpret type_definition Rep Abs S by fact | 
| 56519 
c1048f5bbb45
more appropriate name (Lifting.invariant -> eq_onp)
 kuncar parents: 
56518diff
changeset | 250 | show "\<exists>x. eq_onp (\<lambda>x. x \<in> S) x x" using Rep by (auto simp: eq_onp_def) | 
| 47361 
87c0eaf04bad
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
 kuncar parents: 
47354diff
changeset | 251 | next | 
| 56519 
c1048f5bbb45
more appropriate name (Lifting.invariant -> eq_onp)
 kuncar parents: 
56518diff
changeset | 252 | show "symp (eq_onp (\<lambda>x. x \<in> S))" by (auto intro: sympI simp: eq_onp_def) | 
| 47361 
87c0eaf04bad
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
 kuncar parents: 
47354diff
changeset | 253 | next | 
| 56519 
c1048f5bbb45
more appropriate name (Lifting.invariant -> eq_onp)
 kuncar parents: 
56518diff
changeset | 254 | show "transp (eq_onp (\<lambda>x. x \<in> S))" by (auto intro: transpI simp: eq_onp_def) | 
| 47361 
87c0eaf04bad
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
 kuncar parents: 
47354diff
changeset | 255 | qed | 
| 
87c0eaf04bad
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
 kuncar parents: 
47354diff
changeset | 256 | |
| 
87c0eaf04bad
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
 kuncar parents: 
47354diff
changeset | 257 | lemma open_typedef_to_Quotient: | 
| 47308 | 258 |   assumes "type_definition Rep Abs {x. P x}"
 | 
| 47354 | 259 | and T_def: "T \<equiv> (\<lambda>x y. x = Rep y)" | 
| 56519 
c1048f5bbb45
more appropriate name (Lifting.invariant -> eq_onp)
 kuncar parents: 
56518diff
changeset | 260 | shows "Quotient (eq_onp P) Abs Rep T" | 
| 47651 | 261 | using typedef_to_Quotient [OF assms] by simp | 
| 47308 | 262 | |
| 47361 
87c0eaf04bad
support non-open typedefs; define cr_rel in terms of a rep function for typedefs
 kuncar parents: 
47354diff
changeset | 263 | lemma open_typedef_to_part_equivp: | 
| 47308 | 264 |   assumes "type_definition Rep Abs {x. P x}"
 | 
| 56519 
c1048f5bbb45
more appropriate name (Lifting.invariant -> eq_onp)
 kuncar parents: 
56518diff
changeset | 265 | shows "part_equivp (eq_onp P)" | 
| 47651 | 266 | using typedef_to_part_equivp [OF assms] by simp | 
| 47308 | 267 | |
| 47376 | 268 | text {* Generating transfer rules for quotients. *}
 | 
| 269 | ||
| 47537 | 270 | context | 
| 271 | fixes R Abs Rep T | |
| 272 | assumes 1: "Quotient R Abs Rep T" | |
| 273 | begin | |
| 47376 | 274 | |
| 47537 | 275 | lemma Quotient_right_unique: "right_unique T" | 
| 276 | using 1 unfolding Quotient_alt_def right_unique_def by metis | |
| 277 | ||
| 278 | lemma Quotient_right_total: "right_total T" | |
| 279 | using 1 unfolding Quotient_alt_def right_total_def by metis | |
| 280 | ||
| 281 | lemma Quotient_rel_eq_transfer: "(T ===> T ===> op =) R (op =)" | |
| 55945 | 282 | using 1 unfolding Quotient_alt_def rel_fun_def by simp | 
| 47376 | 283 | |
| 47538 | 284 | lemma Quotient_abs_induct: | 
| 285 | assumes "\<And>y. R y y \<Longrightarrow> P (Abs y)" shows "P x" | |
| 286 | using 1 assms unfolding Quotient_def by metis | |
| 287 | ||
| 47537 | 288 | end | 
| 289 | ||
| 290 | text {* Generating transfer rules for total quotients. *}
 | |
| 47376 | 291 | |
| 47537 | 292 | context | 
| 293 | fixes R Abs Rep T | |
| 294 | assumes 1: "Quotient R Abs Rep T" and 2: "reflp R" | |
| 295 | begin | |
| 47376 | 296 | |
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56517diff
changeset | 297 | lemma Quotient_left_total: "left_total T" | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56517diff
changeset | 298 | using 1 2 unfolding Quotient_alt_def left_total_def reflp_def by auto | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56517diff
changeset | 299 | |
| 47537 | 300 | lemma Quotient_bi_total: "bi_total T" | 
| 301 | using 1 2 unfolding Quotient_alt_def bi_total_def reflp_def by auto | |
| 302 | ||
| 303 | lemma Quotient_id_abs_transfer: "(op = ===> T) (\<lambda>x. x) Abs" | |
| 55945 | 304 | using 1 2 unfolding Quotient_alt_def reflp_def rel_fun_def by simp | 
| 47537 | 305 | |
| 47575 | 306 | lemma Quotient_total_abs_induct: "(\<And>y. P (Abs y)) \<Longrightarrow> P x" | 
| 307 | using 1 2 assms unfolding Quotient_alt_def reflp_def by metis | |
| 308 | ||
| 47889 
29212a4bb866
lifting package produces abs_eq_iff rules for total quotients
 huffman parents: 
47777diff
changeset | 309 | lemma Quotient_total_abs_eq_iff: "Abs x = Abs y \<longleftrightarrow> R x y" | 
| 
29212a4bb866
lifting package produces abs_eq_iff rules for total quotients
 huffman parents: 
47777diff
changeset | 310 | using Quotient_rel [OF 1] 2 unfolding reflp_def by simp | 
| 
29212a4bb866
lifting package produces abs_eq_iff rules for total quotients
 huffman parents: 
47777diff
changeset | 311 | |
| 47537 | 312 | end | 
| 47376 | 313 | |
| 47368 
4c522dff1f4d
add lemmas for generating transfer rules for typedefs
 huffman parents: 
47354diff
changeset | 314 | text {* Generating transfer rules for a type defined with @{text "typedef"}. *}
 | 
| 
4c522dff1f4d
add lemmas for generating transfer rules for typedefs
 huffman parents: 
47354diff
changeset | 315 | |
| 47534 
06cc372a80ed
use context block to organize typedef lifting theorems
 huffman parents: 
47521diff
changeset | 316 | context | 
| 
06cc372a80ed
use context block to organize typedef lifting theorems
 huffman parents: 
47521diff
changeset | 317 | fixes Rep Abs A T | 
| 47368 
4c522dff1f4d
add lemmas for generating transfer rules for typedefs
 huffman parents: 
47354diff
changeset | 318 | assumes type: "type_definition Rep Abs A" | 
| 47534 
06cc372a80ed
use context block to organize typedef lifting theorems
 huffman parents: 
47521diff
changeset | 319 | assumes T_def: "T \<equiv> (\<lambda>(x::'a) (y::'b). x = Rep y)" | 
| 
06cc372a80ed
use context block to organize typedef lifting theorems
 huffman parents: 
47521diff
changeset | 320 | begin | 
| 
06cc372a80ed
use context block to organize typedef lifting theorems
 huffman parents: 
47521diff
changeset | 321 | |
| 51994 | 322 | lemma typedef_left_unique: "left_unique T" | 
| 323 | unfolding left_unique_def T_def | |
| 324 | by (simp add: type_definition.Rep_inject [OF type]) | |
| 325 | ||
| 47534 
06cc372a80ed
use context block to organize typedef lifting theorems
 huffman parents: 
47521diff
changeset | 326 | lemma typedef_bi_unique: "bi_unique T" | 
| 47368 
4c522dff1f4d
add lemmas for generating transfer rules for typedefs
 huffman parents: 
47354diff
changeset | 327 | unfolding bi_unique_def T_def | 
| 
4c522dff1f4d
add lemmas for generating transfer rules for typedefs
 huffman parents: 
47354diff
changeset | 328 | by (simp add: type_definition.Rep_inject [OF type]) | 
| 
4c522dff1f4d
add lemmas for generating transfer rules for typedefs
 huffman parents: 
47354diff
changeset | 329 | |
| 51374 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 330 | (* the following two theorems are here only for convinience *) | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 331 | |
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 332 | lemma typedef_right_unique: "right_unique T" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 333 | using T_def type Quotient_right_unique typedef_to_Quotient | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 334 | by blast | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 335 | |
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 336 | lemma typedef_right_total: "right_total T" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 337 | using T_def type Quotient_right_total typedef_to_Quotient | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 338 | by blast | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 339 | |
| 47535 
0f94b02fda1c
lifting_setup generates transfer rule for rep of typedefs
 huffman parents: 
47534diff
changeset | 340 | lemma typedef_rep_transfer: "(T ===> op =) (\<lambda>x. x) Rep" | 
| 55945 | 341 | unfolding rel_fun_def T_def by simp | 
| 47535 
0f94b02fda1c
lifting_setup generates transfer rule for rep of typedefs
 huffman parents: 
47534diff
changeset | 342 | |
| 47534 
06cc372a80ed
use context block to organize typedef lifting theorems
 huffman parents: 
47521diff
changeset | 343 | end | 
| 
06cc372a80ed
use context block to organize typedef lifting theorems
 huffman parents: 
47521diff
changeset | 344 | |
| 47368 
4c522dff1f4d
add lemmas for generating transfer rules for typedefs
 huffman parents: 
47354diff
changeset | 345 | text {* Generating the correspondence rule for a constant defined with
 | 
| 
4c522dff1f4d
add lemmas for generating transfer rules for typedefs
 huffman parents: 
47354diff
changeset | 346 |   @{text "lift_definition"}. *}
 | 
| 
4c522dff1f4d
add lemmas for generating transfer rules for typedefs
 huffman parents: 
47354diff
changeset | 347 | |
| 47351 | 348 | lemma Quotient_to_transfer: | 
| 349 | assumes "Quotient R Abs Rep T" and "R c c" and "c' \<equiv> Abs c" | |
| 350 | shows "T c c'" | |
| 351 | using assms by (auto dest: Quotient_cr_rel) | |
| 352 | ||
| 47982 
7aa35601ff65
prove reflexivity also for the quotient composition relation; reflp_preserve renamed to reflexivity_rule
 kuncar parents: 
47937diff
changeset | 353 | text {* Proving reflexivity *}
 | 
| 
7aa35601ff65
prove reflexivity also for the quotient composition relation; reflp_preserve renamed to reflexivity_rule
 kuncar parents: 
47937diff
changeset | 354 | |
| 
7aa35601ff65
prove reflexivity also for the quotient composition relation; reflp_preserve renamed to reflexivity_rule
 kuncar parents: 
47937diff
changeset | 355 | lemma Quotient_to_left_total: | 
| 
7aa35601ff65
prove reflexivity also for the quotient composition relation; reflp_preserve renamed to reflexivity_rule
 kuncar parents: 
47937diff
changeset | 356 | assumes q: "Quotient R Abs Rep T" | 
| 
7aa35601ff65
prove reflexivity also for the quotient composition relation; reflp_preserve renamed to reflexivity_rule
 kuncar parents: 
47937diff
changeset | 357 | and r_R: "reflp R" | 
| 
7aa35601ff65
prove reflexivity also for the quotient composition relation; reflp_preserve renamed to reflexivity_rule
 kuncar parents: 
47937diff
changeset | 358 | shows "left_total T" | 
| 
7aa35601ff65
prove reflexivity also for the quotient composition relation; reflp_preserve renamed to reflexivity_rule
 kuncar parents: 
47937diff
changeset | 359 | using r_R Quotient_cr_rel[OF q] unfolding left_total_def by (auto elim: reflpE) | 
| 
7aa35601ff65
prove reflexivity also for the quotient composition relation; reflp_preserve renamed to reflexivity_rule
 kuncar parents: 
47937diff
changeset | 360 | |
| 55563 
a64d49f49ca3
implement the reflexivity prover as a monotonicity prover that proves R >= op=; derive "reflexivity" rules for relators from mono rules and eq rules
 kuncar parents: 
55083diff
changeset | 361 | lemma Quotient_composition_ge_eq: | 
| 
a64d49f49ca3
implement the reflexivity prover as a monotonicity prover that proves R >= op=; derive "reflexivity" rules for relators from mono rules and eq rules
 kuncar parents: 
55083diff
changeset | 362 | assumes "left_total T" | 
| 
a64d49f49ca3
implement the reflexivity prover as a monotonicity prover that proves R >= op=; derive "reflexivity" rules for relators from mono rules and eq rules
 kuncar parents: 
55083diff
changeset | 363 | assumes "R \<ge> op=" | 
| 
a64d49f49ca3
implement the reflexivity prover as a monotonicity prover that proves R >= op=; derive "reflexivity" rules for relators from mono rules and eq rules
 kuncar parents: 
55083diff
changeset | 364 | shows "(T OO R OO T\<inverse>\<inverse>) \<ge> op=" | 
| 
a64d49f49ca3
implement the reflexivity prover as a monotonicity prover that proves R >= op=; derive "reflexivity" rules for relators from mono rules and eq rules
 kuncar parents: 
55083diff
changeset | 365 | using assms unfolding left_total_def by fast | 
| 51994 | 366 | |
| 55563 
a64d49f49ca3
implement the reflexivity prover as a monotonicity prover that proves R >= op=; derive "reflexivity" rules for relators from mono rules and eq rules
 kuncar parents: 
55083diff
changeset | 367 | lemma Quotient_composition_le_eq: | 
| 
a64d49f49ca3
implement the reflexivity prover as a monotonicity prover that proves R >= op=; derive "reflexivity" rules for relators from mono rules and eq rules
 kuncar parents: 
55083diff
changeset | 368 | assumes "left_unique T" | 
| 
a64d49f49ca3
implement the reflexivity prover as a monotonicity prover that proves R >= op=; derive "reflexivity" rules for relators from mono rules and eq rules
 kuncar parents: 
55083diff
changeset | 369 | assumes "R \<le> op=" | 
| 
a64d49f49ca3
implement the reflexivity prover as a monotonicity prover that proves R >= op=; derive "reflexivity" rules for relators from mono rules and eq rules
 kuncar parents: 
55083diff
changeset | 370 | shows "(T OO R OO T\<inverse>\<inverse>) \<le> op=" | 
| 55604 | 371 | using assms unfolding left_unique_def by blast | 
| 47982 
7aa35601ff65
prove reflexivity also for the quotient composition relation; reflp_preserve renamed to reflexivity_rule
 kuncar parents: 
47937diff
changeset | 372 | |
| 56519 
c1048f5bbb45
more appropriate name (Lifting.invariant -> eq_onp)
 kuncar parents: 
56518diff
changeset | 373 | lemma eq_onp_le_eq: | 
| 
c1048f5bbb45
more appropriate name (Lifting.invariant -> eq_onp)
 kuncar parents: 
56518diff
changeset | 374 | "eq_onp P \<le> op=" unfolding eq_onp_def by blast | 
| 55563 
a64d49f49ca3
implement the reflexivity prover as a monotonicity prover that proves R >= op=; derive "reflexivity" rules for relators from mono rules and eq rules
 kuncar parents: 
55083diff
changeset | 375 | |
| 
a64d49f49ca3
implement the reflexivity prover as a monotonicity prover that proves R >= op=; derive "reflexivity" rules for relators from mono rules and eq rules
 kuncar parents: 
55083diff
changeset | 376 | lemma reflp_ge_eq: | 
| 
a64d49f49ca3
implement the reflexivity prover as a monotonicity prover that proves R >= op=; derive "reflexivity" rules for relators from mono rules and eq rules
 kuncar parents: 
55083diff
changeset | 377 | "reflp R \<Longrightarrow> R \<ge> op=" unfolding reflp_def by blast | 
| 
a64d49f49ca3
implement the reflexivity prover as a monotonicity prover that proves R >= op=; derive "reflexivity" rules for relators from mono rules and eq rules
 kuncar parents: 
55083diff
changeset | 378 | |
| 
a64d49f49ca3
implement the reflexivity prover as a monotonicity prover that proves R >= op=; derive "reflexivity" rules for relators from mono rules and eq rules
 kuncar parents: 
55083diff
changeset | 379 | lemma ge_eq_refl: | 
| 
a64d49f49ca3
implement the reflexivity prover as a monotonicity prover that proves R >= op=; derive "reflexivity" rules for relators from mono rules and eq rules
 kuncar parents: 
55083diff
changeset | 380 | "R \<ge> op= \<Longrightarrow> R x x" by blast | 
| 47982 
7aa35601ff65
prove reflexivity also for the quotient composition relation; reflp_preserve renamed to reflexivity_rule
 kuncar parents: 
47937diff
changeset | 381 | |
| 51374 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 382 | text {* Proving a parametrized correspondence relation *}
 | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 383 | |
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 384 | definition POS :: "('a \<Rightarrow> 'b \<Rightarrow> bool) \<Rightarrow> ('a \<Rightarrow> 'b \<Rightarrow> bool) \<Rightarrow> bool" where
 | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 385 | "POS A B \<equiv> A \<le> B" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 386 | |
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 387 | definition  NEG :: "('a \<Rightarrow> 'b \<Rightarrow> bool) \<Rightarrow> ('a \<Rightarrow> 'b \<Rightarrow> bool) \<Rightarrow> bool" where
 | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 388 | "NEG A B \<equiv> B \<le> A" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 389 | |
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 390 | lemma pos_OO_eq: | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 391 | shows "POS (A OO op=) A" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 392 | unfolding POS_def OO_def by blast | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 393 | |
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 394 | lemma pos_eq_OO: | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 395 | shows "POS (op= OO A) A" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 396 | unfolding POS_def OO_def by blast | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 397 | |
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 398 | lemma neg_OO_eq: | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 399 | shows "NEG (A OO op=) A" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 400 | unfolding NEG_def OO_def by auto | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 401 | |
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 402 | lemma neg_eq_OO: | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 403 | shows "NEG (op= OO A) A" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 404 | unfolding NEG_def OO_def by blast | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 405 | |
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 406 | lemma POS_trans: | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 407 | assumes "POS A B" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 408 | assumes "POS B C" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 409 | shows "POS A C" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 410 | using assms unfolding POS_def by auto | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 411 | |
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 412 | lemma NEG_trans: | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 413 | assumes "NEG A B" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 414 | assumes "NEG B C" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 415 | shows "NEG A C" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 416 | using assms unfolding NEG_def by auto | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 417 | |
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 418 | lemma POS_NEG: | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 419 | "POS A B \<equiv> NEG B A" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 420 | unfolding POS_def NEG_def by auto | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 421 | |
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 422 | lemma NEG_POS: | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 423 | "NEG A B \<equiv> POS B A" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 424 | unfolding POS_def NEG_def by auto | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 425 | |
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 426 | lemma POS_pcr_rule: | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 427 | assumes "POS (A OO B) C" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 428 | shows "POS (A OO B OO X) (C OO X)" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 429 | using assms unfolding POS_def OO_def by blast | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 430 | |
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 431 | lemma NEG_pcr_rule: | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 432 | assumes "NEG (A OO B) C" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 433 | shows "NEG (A OO B OO X) (C OO X)" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 434 | using assms unfolding NEG_def OO_def by blast | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 435 | |
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 436 | lemma POS_apply: | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 437 | assumes "POS R R'" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 438 | assumes "R f g" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 439 | shows "R' f g" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 440 | using assms unfolding POS_def by auto | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 441 | |
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 442 | text {* Proving a parametrized correspondence relation *}
 | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 443 | |
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 444 | lemma fun_mono: | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 445 | assumes "A \<ge> C" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 446 | assumes "B \<le> D" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 447 | shows "(A ===> B) \<le> (C ===> D)" | 
| 55945 | 448 | using assms unfolding rel_fun_def by blast | 
| 51374 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 449 | |
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 450 | lemma pos_fun_distr: "((R ===> S) OO (R' ===> S')) \<le> ((R OO R') ===> (S OO S'))" | 
| 55945 | 451 | unfolding OO_def rel_fun_def by blast | 
| 51374 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 452 | |
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 453 | lemma functional_relation: "right_unique R \<Longrightarrow> left_total R \<Longrightarrow> \<forall>x. \<exists>!y. R x y" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 454 | unfolding right_unique_def left_total_def by blast | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 455 | |
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 456 | lemma functional_converse_relation: "left_unique R \<Longrightarrow> right_total R \<Longrightarrow> \<forall>y. \<exists>!x. R x y" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 457 | unfolding left_unique_def right_total_def by blast | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 458 | |
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 459 | lemma neg_fun_distr1: | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 460 | assumes 1: "left_unique R" "right_total R" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 461 | assumes 2: "right_unique R'" "left_total R'" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 462 | shows "(R OO R' ===> S OO S') \<le> ((R ===> S) OO (R' ===> S')) " | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 463 | using functional_relation[OF 2] functional_converse_relation[OF 1] | 
| 55945 | 464 | unfolding rel_fun_def OO_def | 
| 51374 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 465 | apply clarify | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 466 | apply (subst all_comm) | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 467 | apply (subst all_conj_distrib[symmetric]) | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 468 | apply (intro choice) | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 469 | by metis | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 470 | |
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 471 | lemma neg_fun_distr2: | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 472 | assumes 1: "right_unique R'" "left_total R'" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 473 | assumes 2: "left_unique S'" "right_total S'" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 474 | shows "(R OO R' ===> S OO S') \<le> ((R ===> S) OO (R' ===> S'))" | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 475 | using functional_converse_relation[OF 2] functional_relation[OF 1] | 
| 55945 | 476 | unfolding rel_fun_def OO_def | 
| 51374 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 477 | apply clarify | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 478 | apply (subst all_comm) | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 479 | apply (subst all_conj_distrib[symmetric]) | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 480 | apply (intro choice) | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 481 | by metis | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 482 | |
| 51956 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 483 | subsection {* Domains *}
 | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 484 | |
| 56519 
c1048f5bbb45
more appropriate name (Lifting.invariant -> eq_onp)
 kuncar parents: 
56518diff
changeset | 485 | lemma composed_equiv_rel_eq_onp: | 
| 55731 
66df76dd2640
rewrite composition of quotients to a more readable form in a respectfulness goal that is presented to a user
 kuncar parents: 
55610diff
changeset | 486 | assumes "left_unique R" | 
| 
66df76dd2640
rewrite composition of quotients to a more readable form in a respectfulness goal that is presented to a user
 kuncar parents: 
55610diff
changeset | 487 | assumes "(R ===> op=) P P'" | 
| 
66df76dd2640
rewrite composition of quotients to a more readable form in a respectfulness goal that is presented to a user
 kuncar parents: 
55610diff
changeset | 488 | assumes "Domainp R = P''" | 
| 56519 
c1048f5bbb45
more appropriate name (Lifting.invariant -> eq_onp)
 kuncar parents: 
56518diff
changeset | 489 | shows "(R OO eq_onp P' OO R\<inverse>\<inverse>) = eq_onp (inf P'' P)" | 
| 
c1048f5bbb45
more appropriate name (Lifting.invariant -> eq_onp)
 kuncar parents: 
56518diff
changeset | 490 | using assms unfolding OO_def conversep_iff Domainp_iff[abs_def] left_unique_def rel_fun_def eq_onp_def | 
| 55731 
66df76dd2640
rewrite composition of quotients to a more readable form in a respectfulness goal that is presented to a user
 kuncar parents: 
55610diff
changeset | 491 | fun_eq_iff by blast | 
| 
66df76dd2640
rewrite composition of quotients to a more readable form in a respectfulness goal that is presented to a user
 kuncar parents: 
55610diff
changeset | 492 | |
| 56519 
c1048f5bbb45
more appropriate name (Lifting.invariant -> eq_onp)
 kuncar parents: 
56518diff
changeset | 493 | lemma composed_equiv_rel_eq_eq_onp: | 
| 55731 
66df76dd2640
rewrite composition of quotients to a more readable form in a respectfulness goal that is presented to a user
 kuncar parents: 
55610diff
changeset | 494 | assumes "left_unique R" | 
| 
66df76dd2640
rewrite composition of quotients to a more readable form in a respectfulness goal that is presented to a user
 kuncar parents: 
55610diff
changeset | 495 | assumes "Domainp R = P" | 
| 56519 
c1048f5bbb45
more appropriate name (Lifting.invariant -> eq_onp)
 kuncar parents: 
56518diff
changeset | 496 | shows "(R OO op= OO R\<inverse>\<inverse>) = eq_onp P" | 
| 
c1048f5bbb45
more appropriate name (Lifting.invariant -> eq_onp)
 kuncar parents: 
56518diff
changeset | 497 | using assms unfolding OO_def conversep_iff Domainp_iff[abs_def] left_unique_def eq_onp_def | 
| 55731 
66df76dd2640
rewrite composition of quotients to a more readable form in a respectfulness goal that is presented to a user
 kuncar parents: 
55610diff
changeset | 498 | fun_eq_iff is_equality_def by metis | 
| 
66df76dd2640
rewrite composition of quotients to a more readable form in a respectfulness goal that is presented to a user
 kuncar parents: 
55610diff
changeset | 499 | |
| 51956 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 500 | lemma pcr_Domainp_par_left_total: | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 501 | assumes "Domainp B = P" | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 502 | assumes "left_total A" | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 503 | assumes "(A ===> op=) P' P" | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 504 | shows "Domainp (A OO B) = P'" | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 505 | using assms | 
| 55945 | 506 | unfolding Domainp_iff[abs_def] OO_def bi_unique_def left_total_def rel_fun_def | 
| 51956 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 507 | by (fast intro: fun_eq_iff) | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 508 | |
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 509 | lemma pcr_Domainp_par: | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 510 | assumes "Domainp B = P2" | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 511 | assumes "Domainp A = P1" | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 512 | assumes "(A ===> op=) P2' P2" | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 513 | shows "Domainp (A OO B) = (inf P1 P2')" | 
| 55945 | 514 | using assms unfolding rel_fun_def Domainp_iff[abs_def] OO_def | 
| 51956 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 515 | by (fast intro: fun_eq_iff) | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 516 | |
| 53151 | 517 | definition rel_pred_comp :: "('a => 'b => bool) => ('b => bool) => 'a => bool"
 | 
| 51956 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 518 | where "rel_pred_comp R P \<equiv> \<lambda>x. \<exists>y. R x y \<and> P y" | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 519 | |
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 520 | lemma pcr_Domainp: | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 521 | assumes "Domainp B = P" | 
| 53151 | 522 | shows "Domainp (A OO B) = (\<lambda>x. \<exists>y. A x y \<and> P y)" | 
| 523 | using assms by blast | |
| 51956 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 524 | |
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 525 | lemma pcr_Domainp_total: | 
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56517diff
changeset | 526 | assumes "left_total B" | 
| 51956 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 527 | assumes "Domainp A = P" | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 528 | shows "Domainp (A OO B) = P" | 
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56517diff
changeset | 529 | using assms unfolding left_total_def | 
| 51956 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 530 | by fast | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 531 | |
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 532 | lemma Quotient_to_Domainp: | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 533 | assumes "Quotient R Abs Rep T" | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 534 | shows "Domainp T = (\<lambda>x. R x x)" | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 535 | by (simp add: Domainp_iff[abs_def] Quotient_cr_rel[OF assms]) | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 536 | |
| 56519 
c1048f5bbb45
more appropriate name (Lifting.invariant -> eq_onp)
 kuncar parents: 
56518diff
changeset | 537 | lemma eq_onp_to_Domainp: | 
| 
c1048f5bbb45
more appropriate name (Lifting.invariant -> eq_onp)
 kuncar parents: 
56518diff
changeset | 538 | assumes "Quotient (eq_onp P) Abs Rep T" | 
| 51956 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 539 | shows "Domainp T = P" | 
| 56519 
c1048f5bbb45
more appropriate name (Lifting.invariant -> eq_onp)
 kuncar parents: 
56518diff
changeset | 540 | by (simp add: eq_onp_def Domainp_iff[abs_def] Quotient_cr_rel[OF assms]) | 
| 51956 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51374diff
changeset | 541 | |
| 53011 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 kuncar parents: 
52307diff
changeset | 542 | end | 
| 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 kuncar parents: 
52307diff
changeset | 543 | |
| 47308 | 544 | subsection {* ML setup *}
 | 
| 545 | ||
| 48891 | 546 | ML_file "Tools/Lifting/lifting_util.ML" | 
| 47308 | 547 | |
| 48891 | 548 | ML_file "Tools/Lifting/lifting_info.ML" | 
| 47308 | 549 | setup Lifting_Info.setup | 
| 550 | ||
| 51374 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 551 | (* setup for the function type *) | 
| 47777 
f29e7dcd7c40
use a quot_map theorem attribute instead of the complicated map attribute
 kuncar parents: 
47698diff
changeset | 552 | declare fun_quotient[quot_map] | 
| 51374 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 553 | declare fun_mono[relator_mono] | 
| 
84d01fd733cf
lift_definition and setup_lifting generate parametric transfer rules if parametricity theorems are provided
 kuncar parents: 
51112diff
changeset | 554 | lemmas [relator_distr] = pos_fun_distr neg_fun_distr1 neg_fun_distr2 | 
| 47308 | 555 | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56519diff
changeset | 556 | ML_file "Tools/Lifting/lifting_bnf.ML" | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56519diff
changeset | 557 | |
| 48891 | 558 | ML_file "Tools/Lifting/lifting_term.ML" | 
| 47308 | 559 | |
| 48891 | 560 | ML_file "Tools/Lifting/lifting_def.ML" | 
| 47308 | 561 | |
| 48891 | 562 | ML_file "Tools/Lifting/lifting_setup.ML" | 
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56517diff
changeset | 563 | |
| 56519 
c1048f5bbb45
more appropriate name (Lifting.invariant -> eq_onp)
 kuncar parents: 
56518diff
changeset | 564 | hide_const (open) POS NEG | 
| 47308 | 565 | |
| 566 | end |