| author | wenzelm | 
| Sat, 03 Jan 2015 22:56:46 +0100 | |
| changeset 59257 | a73d2b67897c | 
| parent 59141 | 9a5c2e9b001e | 
| child 59275 | 77cd4992edcd | 
| permissions | -rw-r--r-- | 
| 47325 | 1 | (* Title: HOL/Transfer.thy | 
| 2 | Author: Brian Huffman, TU Muenchen | |
| 51956 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51955diff
changeset | 3 | Author: Ondrej Kuncar, TU Muenchen | 
| 47325 | 4 | *) | 
| 5 | ||
| 58889 | 6 | section {* Generic theorem transfer using relations *}
 | 
| 47325 | 7 | |
| 8 | theory Transfer | |
| 59141 | 9 | imports Hilbert_Choice Metis Basic_BNF_LFPs | 
| 47325 | 10 | begin | 
| 11 | ||
| 12 | subsection {* Relator for function space *}
 | |
| 13 | ||
| 53011 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 kuncar parents: 
52358diff
changeset | 14 | locale lifting_syntax | 
| 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 kuncar parents: 
52358diff
changeset | 15 | begin | 
| 55945 | 16 | notation rel_fun (infixr "===>" 55) | 
| 53011 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 kuncar parents: 
52358diff
changeset | 17 | notation map_fun (infixr "--->" 55) | 
| 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 kuncar parents: 
52358diff
changeset | 18 | end | 
| 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 kuncar parents: 
52358diff
changeset | 19 | |
| 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 kuncar parents: 
52358diff
changeset | 20 | context | 
| 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 kuncar parents: 
52358diff
changeset | 21 | begin | 
| 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 kuncar parents: 
52358diff
changeset | 22 | interpretation lifting_syntax . | 
| 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 kuncar parents: 
52358diff
changeset | 23 | |
| 55945 | 24 | lemma rel_funD2: | 
| 25 | assumes "rel_fun A B f g" and "A x x" | |
| 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: 
47924diff
changeset | 26 | shows "B (f x) (g x)" | 
| 55945 | 27 | using assms by (rule rel_funD) | 
| 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: 
47924diff
changeset | 28 | |
| 55945 | 29 | lemma rel_funE: | 
| 30 | assumes "rel_fun A B f g" and "A x y" | |
| 47325 | 31 | obtains "B (f x) (g y)" | 
| 55945 | 32 | using assms by (simp add: rel_fun_def) | 
| 47325 | 33 | |
| 55945 | 34 | lemmas rel_fun_eq = fun.rel_eq | 
| 47325 | 35 | |
| 55945 | 36 | lemma rel_fun_eq_rel: | 
| 37 | shows "rel_fun (op =) R = (\<lambda>f g. \<forall>x. R (f x) (g x))" | |
| 38 | by (simp add: rel_fun_def) | |
| 47325 | 39 | |
| 40 | ||
| 41 | subsection {* Transfer method *}
 | |
| 42 | ||
| 47789 
71a526ee569a
implement transfer tactic with more scalable forward proof methods
 huffman parents: 
47684diff
changeset | 43 | text {* Explicit tag for relation membership allows for
 | 
| 
71a526ee569a
implement transfer tactic with more scalable forward proof methods
 huffman parents: 
47684diff
changeset | 44 | backward proof methods. *} | 
| 47325 | 45 | |
| 46 | definition Rel :: "('a \<Rightarrow> 'b \<Rightarrow> bool) \<Rightarrow> 'a \<Rightarrow> 'b \<Rightarrow> bool"
 | |
| 47 | where "Rel r \<equiv> r" | |
| 48 | ||
| 49975 
faf4afed009f
transfer package: more flexible handling of equality relations using is_equality predicate
 huffman parents: 
48891diff
changeset | 49 | text {* Handling of equality relations *}
 | 
| 
faf4afed009f
transfer package: more flexible handling of equality relations using is_equality predicate
 huffman parents: 
48891diff
changeset | 50 | |
| 
faf4afed009f
transfer package: more flexible handling of equality relations using is_equality predicate
 huffman parents: 
48891diff
changeset | 51 | definition is_equality :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> bool"
 | 
| 
faf4afed009f
transfer package: more flexible handling of equality relations using is_equality predicate
 huffman parents: 
48891diff
changeset | 52 | where "is_equality R \<longleftrightarrow> R = (op =)" | 
| 
faf4afed009f
transfer package: more flexible handling of equality relations using is_equality predicate
 huffman parents: 
48891diff
changeset | 53 | |
| 51437 
8739f8abbecb
fixing transfer tactic - unfold fully identity relation by using relator_eq
 kuncar parents: 
51112diff
changeset | 54 | lemma is_equality_eq: "is_equality (op =)" | 
| 
8739f8abbecb
fixing transfer tactic - unfold fully identity relation by using relator_eq
 kuncar parents: 
51112diff
changeset | 55 | unfolding is_equality_def by simp | 
| 
8739f8abbecb
fixing transfer tactic - unfold fully identity relation by using relator_eq
 kuncar parents: 
51112diff
changeset | 56 | |
| 52354 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 57 | text {* Reverse implication for monotonicity rules *}
 | 
| 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 58 | |
| 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 59 | definition rev_implies where | 
| 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 60 | "rev_implies x y \<longleftrightarrow> (y \<longrightarrow> x)" | 
| 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 61 | |
| 47325 | 62 | text {* Handling of meta-logic connectives *}
 | 
| 63 | ||
| 64 | definition transfer_forall where | |
| 65 | "transfer_forall \<equiv> All" | |
| 66 | ||
| 67 | definition transfer_implies where | |
| 68 | "transfer_implies \<equiv> op \<longrightarrow>" | |
| 69 | ||
| 47355 
3d9d98e0f1a4
add bounded quantifier constant transfer_bforall, whose definition is unfolded after transfer
 huffman parents: 
47325diff
changeset | 70 | definition transfer_bforall :: "('a \<Rightarrow> bool) \<Rightarrow> ('a \<Rightarrow> bool) \<Rightarrow> bool"
 | 
| 
3d9d98e0f1a4
add bounded quantifier constant transfer_bforall, whose definition is unfolded after transfer
 huffman parents: 
47325diff
changeset | 71 | where "transfer_bforall \<equiv> (\<lambda>P Q. \<forall>x. P x \<longrightarrow> Q x)" | 
| 
3d9d98e0f1a4
add bounded quantifier constant transfer_bforall, whose definition is unfolded after transfer
 huffman parents: 
47325diff
changeset | 72 | |
| 47325 | 73 | lemma transfer_forall_eq: "(\<And>x. P x) \<equiv> Trueprop (transfer_forall (\<lambda>x. P x))" | 
| 74 | unfolding atomize_all transfer_forall_def .. | |
| 75 | ||
| 76 | lemma transfer_implies_eq: "(A \<Longrightarrow> B) \<equiv> Trueprop (transfer_implies A B)" | |
| 77 | unfolding atomize_imp transfer_implies_def .. | |
| 78 | ||
| 47355 
3d9d98e0f1a4
add bounded quantifier constant transfer_bforall, whose definition is unfolded after transfer
 huffman parents: 
47325diff
changeset | 79 | lemma transfer_bforall_unfold: | 
| 
3d9d98e0f1a4
add bounded quantifier constant transfer_bforall, whose definition is unfolded after transfer
 huffman parents: 
47325diff
changeset | 80 | "Trueprop (transfer_bforall P (\<lambda>x. Q x)) \<equiv> (\<And>x. P x \<Longrightarrow> Q x)" | 
| 
3d9d98e0f1a4
add bounded quantifier constant transfer_bforall, whose definition is unfolded after transfer
 huffman parents: 
47325diff
changeset | 81 | unfolding transfer_bforall_def atomize_imp atomize_all .. | 
| 
3d9d98e0f1a4
add bounded quantifier constant transfer_bforall, whose definition is unfolded after transfer
 huffman parents: 
47325diff
changeset | 82 | |
| 47658 
7631f6f7873d
enable variant of transfer method that proves an implication instead of an equivalence
 huffman parents: 
47637diff
changeset | 83 | lemma transfer_start: "\<lbrakk>P; Rel (op =) P Q\<rbrakk> \<Longrightarrow> Q" | 
| 47325 | 84 | unfolding Rel_def by simp | 
| 85 | ||
| 47658 
7631f6f7873d
enable variant of transfer method that proves an implication instead of an equivalence
 huffman parents: 
47637diff
changeset | 86 | lemma transfer_start': "\<lbrakk>P; Rel (op \<longrightarrow>) P Q\<rbrakk> \<Longrightarrow> Q" | 
| 47325 | 87 | unfolding Rel_def by simp | 
| 88 | ||
| 47635 
ebb79474262c
rename 'correspondence' method to 'transfer_prover'
 huffman parents: 
47627diff
changeset | 89 | lemma transfer_prover_start: "\<lbrakk>x = x'; Rel R x' y\<rbrakk> \<Longrightarrow> Rel R x y" | 
| 47618 
1568dadd598a
make correspondence tactic more robust by replacing lhs with schematic variable before applying intro rules
 huffman parents: 
47612diff
changeset | 90 | by simp | 
| 
1568dadd598a
make correspondence tactic more robust by replacing lhs with schematic variable before applying intro rules
 huffman parents: 
47612diff
changeset | 91 | |
| 52358 
f4c4bcb0d564
implement 'untransferred' attribute, which is like 'transferred' but works in the opposite direction
 huffman parents: 
52354diff
changeset | 92 | lemma untransfer_start: "\<lbrakk>Q; Rel (op =) P Q\<rbrakk> \<Longrightarrow> P" | 
| 
f4c4bcb0d564
implement 'untransferred' attribute, which is like 'transferred' but works in the opposite direction
 huffman parents: 
52354diff
changeset | 93 | unfolding Rel_def by simp | 
| 
f4c4bcb0d564
implement 'untransferred' attribute, which is like 'transferred' but works in the opposite direction
 huffman parents: 
52354diff
changeset | 94 | |
| 47325 | 95 | lemma Rel_eq_refl: "Rel (op =) x x" | 
| 96 | unfolding Rel_def .. | |
| 97 | ||
| 47789 
71a526ee569a
implement transfer tactic with more scalable forward proof methods
 huffman parents: 
47684diff
changeset | 98 | lemma Rel_app: | 
| 47523 
1bf0e92c1ca0
make transfer method more deterministic by using SOLVED' on some subgoals
 huffman parents: 
47503diff
changeset | 99 | assumes "Rel (A ===> B) f g" and "Rel A x y" | 
| 47789 
71a526ee569a
implement transfer tactic with more scalable forward proof methods
 huffman parents: 
47684diff
changeset | 100 | shows "Rel B (f x) (g y)" | 
| 55945 | 101 | using assms unfolding Rel_def rel_fun_def by fast | 
| 47523 
1bf0e92c1ca0
make transfer method more deterministic by using SOLVED' on some subgoals
 huffman parents: 
47503diff
changeset | 102 | |
| 47789 
71a526ee569a
implement transfer tactic with more scalable forward proof methods
 huffman parents: 
47684diff
changeset | 103 | lemma Rel_abs: | 
| 47523 
1bf0e92c1ca0
make transfer method more deterministic by using SOLVED' on some subgoals
 huffman parents: 
47503diff
changeset | 104 | assumes "\<And>x y. Rel A x y \<Longrightarrow> Rel B (f x) (g y)" | 
| 47789 
71a526ee569a
implement transfer tactic with more scalable forward proof methods
 huffman parents: 
47684diff
changeset | 105 | shows "Rel (A ===> B) (\<lambda>x. f x) (\<lambda>y. g y)" | 
| 55945 | 106 | using assms unfolding Rel_def rel_fun_def by fast | 
| 47523 
1bf0e92c1ca0
make transfer method more deterministic by using SOLVED' on some subgoals
 huffman parents: 
47503diff
changeset | 107 | |
| 47325 | 108 | subsection {* Predicates on relations, i.e. ``class constraints'' *}
 | 
| 109 | ||
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 110 | definition left_total :: "('a \<Rightarrow> 'b \<Rightarrow> bool) \<Rightarrow> bool"
 | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 111 | where "left_total R \<longleftrightarrow> (\<forall>x. \<exists>y. R x y)" | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 112 | |
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 113 | definition left_unique :: "('a \<Rightarrow> 'b \<Rightarrow> bool) \<Rightarrow> bool"
 | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 114 | where "left_unique R \<longleftrightarrow> (\<forall>x y z. R x z \<longrightarrow> R y z \<longrightarrow> x = y)" | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 115 | |
| 47325 | 116 | definition right_total :: "('a \<Rightarrow> 'b \<Rightarrow> bool) \<Rightarrow> bool"
 | 
| 117 | where "right_total R \<longleftrightarrow> (\<forall>y. \<exists>x. R x y)" | |
| 118 | ||
| 119 | definition right_unique :: "('a \<Rightarrow> 'b \<Rightarrow> bool) \<Rightarrow> bool"
 | |
| 120 | where "right_unique R \<longleftrightarrow> (\<forall>x y z. R x y \<longrightarrow> R x z \<longrightarrow> y = z)" | |
| 121 | ||
| 122 | definition bi_total :: "('a \<Rightarrow> 'b \<Rightarrow> bool) \<Rightarrow> bool"
 | |
| 123 | where "bi_total R \<longleftrightarrow> (\<forall>x. \<exists>y. R x y) \<and> (\<forall>y. \<exists>x. R x y)" | |
| 124 | ||
| 125 | definition bi_unique :: "('a \<Rightarrow> 'b \<Rightarrow> bool) \<Rightarrow> bool"
 | |
| 126 | where "bi_unique R \<longleftrightarrow> | |
| 127 | (\<forall>x y z. R x y \<longrightarrow> R x z \<longrightarrow> y = z) \<and> | |
| 128 | (\<forall>x y z. R x z \<longrightarrow> R y z \<longrightarrow> x = y)" | |
| 129 | ||
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 130 | lemma left_uniqueI: "(\<And>x y z. \<lbrakk> A x z; A y z \<rbrakk> \<Longrightarrow> x = y) \<Longrightarrow> left_unique A" | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 131 | unfolding left_unique_def by blast | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 132 | |
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 133 | lemma left_uniqueD: "\<lbrakk> left_unique A; A x z; A y z \<rbrakk> \<Longrightarrow> x = y" | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 134 | unfolding left_unique_def by blast | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 135 | |
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 136 | lemma left_totalI: | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 137 | "(\<And>x. \<exists>y. R x y) \<Longrightarrow> left_total R" | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 138 | unfolding left_total_def by blast | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 139 | |
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 140 | lemma left_totalE: | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 141 | assumes "left_total R" | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 142 | obtains "(\<And>x. \<exists>y. R x y)" | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 143 | using assms unfolding left_total_def by blast | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 144 | |
| 53927 | 145 | lemma bi_uniqueDr: "\<lbrakk> bi_unique A; A x y; A x z \<rbrakk> \<Longrightarrow> y = z" | 
| 146 | by(simp add: bi_unique_def) | |
| 147 | ||
| 148 | lemma bi_uniqueDl: "\<lbrakk> bi_unique A; A x y; A z y \<rbrakk> \<Longrightarrow> x = z" | |
| 149 | by(simp add: bi_unique_def) | |
| 150 | ||
| 151 | lemma right_uniqueI: "(\<And>x y z. \<lbrakk> A x y; A x z \<rbrakk> \<Longrightarrow> y = z) \<Longrightarrow> right_unique A" | |
| 56085 | 152 | unfolding right_unique_def by fast | 
| 53927 | 153 | |
| 154 | lemma right_uniqueD: "\<lbrakk> right_unique A; A x y; A x z \<rbrakk> \<Longrightarrow> y = z" | |
| 56085 | 155 | unfolding right_unique_def by fast | 
| 53927 | 156 | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 157 | lemma right_total_alt_def2: | 
| 47325 | 158 | "right_total R \<longleftrightarrow> ((R ===> op \<longrightarrow>) ===> op \<longrightarrow>) All All" | 
| 55945 | 159 | unfolding right_total_def rel_fun_def | 
| 47325 | 160 | apply (rule iffI, fast) | 
| 161 | apply (rule allI) | |
| 162 | apply (drule_tac x="\<lambda>x. True" in spec) | |
| 163 | apply (drule_tac x="\<lambda>y. \<exists>x. R x y" in spec) | |
| 164 | apply fast | |
| 165 | done | |
| 166 | ||
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 167 | lemma right_unique_alt_def2: | 
| 47325 | 168 | "right_unique R \<longleftrightarrow> (R ===> R ===> op \<longrightarrow>) (op =) (op =)" | 
| 55945 | 169 | unfolding right_unique_def rel_fun_def by auto | 
| 47325 | 170 | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 171 | lemma bi_total_alt_def2: | 
| 47325 | 172 | "bi_total R \<longleftrightarrow> ((R ===> op =) ===> op =) All All" | 
| 55945 | 173 | unfolding bi_total_def rel_fun_def | 
| 47325 | 174 | apply (rule iffI, fast) | 
| 175 | apply safe | |
| 176 | apply (drule_tac x="\<lambda>x. \<exists>y. R x y" in spec) | |
| 177 | apply (drule_tac x="\<lambda>y. True" in spec) | |
| 178 | apply fast | |
| 179 | apply (drule_tac x="\<lambda>x. True" in spec) | |
| 180 | apply (drule_tac x="\<lambda>y. \<exists>x. R x y" in spec) | |
| 181 | apply fast | |
| 182 | done | |
| 183 | ||
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 184 | lemma bi_unique_alt_def2: | 
| 47325 | 185 | "bi_unique R \<longleftrightarrow> (R ===> R ===> op =) (op =) (op =)" | 
| 55945 | 186 | unfolding bi_unique_def rel_fun_def by auto | 
| 47325 | 187 | |
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 188 | lemma [simp]: | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 189 | shows left_unique_conversep: "left_unique A\<inverse>\<inverse> \<longleftrightarrow> right_unique A" | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 190 | and right_unique_conversep: "right_unique A\<inverse>\<inverse> \<longleftrightarrow> left_unique A" | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 191 | by(auto simp add: left_unique_def right_unique_def) | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 192 | |
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 193 | lemma [simp]: | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 194 | shows left_total_conversep: "left_total A\<inverse>\<inverse> \<longleftrightarrow> right_total A" | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 195 | and right_total_conversep: "right_total A\<inverse>\<inverse> \<longleftrightarrow> left_total A" | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 196 | by(simp_all add: left_total_def right_total_def) | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 197 | |
| 53944 | 198 | lemma bi_unique_conversep [simp]: "bi_unique R\<inverse>\<inverse> = bi_unique R" | 
| 199 | by(auto simp add: bi_unique_def) | |
| 200 | ||
| 201 | lemma bi_total_conversep [simp]: "bi_total R\<inverse>\<inverse> = bi_total R" | |
| 202 | by(auto simp add: bi_total_def) | |
| 203 | ||
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 204 | lemma right_unique_alt_def: "right_unique R = (conversep R OO R \<le> op=)" unfolding right_unique_def by blast | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 205 | lemma left_unique_alt_def: "left_unique R = (R OO (conversep R) \<le> op=)" unfolding left_unique_def by blast | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 206 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 207 | lemma right_total_alt_def: "right_total R = (conversep R OO R \<ge> op=)" unfolding right_total_def by blast | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 208 | lemma left_total_alt_def: "left_total R = (R OO conversep R \<ge> op=)" unfolding left_total_def by blast | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 209 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 210 | lemma bi_total_alt_def: "bi_total A = (left_total A \<and> right_total A)" | 
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 211 | unfolding left_total_def right_total_def bi_total_def by blast | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 212 | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 213 | lemma bi_unique_alt_def: "bi_unique A = (left_unique A \<and> right_unique A)" | 
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 214 | unfolding left_unique_def right_unique_def bi_unique_def by blast | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 215 | |
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 216 | lemma bi_totalI: "left_total R \<Longrightarrow> right_total R \<Longrightarrow> bi_total R" | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 217 | unfolding bi_total_alt_def .. | 
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 218 | |
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 219 | lemma bi_uniqueI: "left_unique R \<Longrightarrow> right_unique R \<Longrightarrow> bi_unique R" | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 220 | unfolding bi_unique_alt_def .. | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 221 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 222 | end | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 223 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 224 | subsection {* Equality restricted by a predicate *}
 | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 225 | |
| 58182 | 226 | definition eq_onp :: "('a \<Rightarrow> bool) \<Rightarrow> 'a \<Rightarrow> 'a \<Rightarrow> bool"
 | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 227 | where "eq_onp R = (\<lambda>x y. R x \<and> x = y)" | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 228 | |
| 58182 | 229 | lemma eq_onp_Grp: "eq_onp P = BNF_Def.Grp (Collect P) id" | 
| 230 | unfolding eq_onp_def Grp_def by auto | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 231 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 232 | lemma eq_onp_to_eq: | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 233 | assumes "eq_onp P x y" | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 234 | shows "x = y" | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 235 | using assms by (simp add: eq_onp_def) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 236 | |
| 58182 | 237 | lemma eq_onp_top_eq_eq: "eq_onp top = op=" | 
| 56677 
660ffb526069
predicator simplification rules: support also partially specialized types e.g. 'a * nat
 kuncar parents: 
56654diff
changeset | 238 | by (simp add: eq_onp_def) | 
| 
660ffb526069
predicator simplification rules: support also partially specialized types e.g. 'a * nat
 kuncar parents: 
56654diff
changeset | 239 | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 240 | lemma eq_onp_same_args: | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 241 | shows "eq_onp P x x = P x" | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 242 | using assms by (auto simp add: eq_onp_def) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 243 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 244 | lemma Ball_Collect: "Ball A P = (A \<subseteq> (Collect P))" | 
| 57260 
8747af0d1012
fixed postprocessing of 'coinduct' formula to obtain right property format (without needless hypotheses)
 blanchet parents: 
56677diff
changeset | 245 | by auto | 
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 246 | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 247 | ML_file "Tools/Transfer/transfer.ML" | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 248 | declare refl [transfer_rule] | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 249 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 250 | hide_const (open) Rel | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 251 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 252 | context | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 253 | begin | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 254 | interpretation lifting_syntax . | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 255 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 256 | text {* Handling of domains *}
 | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 257 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 258 | lemma Domainp_iff: "Domainp T x \<longleftrightarrow> (\<exists>y. T x y)" | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 259 | by auto | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 260 | |
| 58386 | 261 | lemma Domainp_refl[transfer_domain_rule]: | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 262 | "Domainp T = Domainp T" .. | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 263 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 264 | lemma Domainp_prod_fun_eq[relator_domain]: | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 265 | "Domainp (op= ===> T) = (\<lambda>f. \<forall>x. (Domainp T) (f x))" | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 266 | by (auto intro: choice simp: Domainp_iff rel_fun_def fun_eq_iff) | 
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 267 | |
| 47660 | 268 | text {* Properties are preserved by relation composition. *}
 | 
| 269 | ||
| 270 | lemma OO_def: "R OO S = (\<lambda>x z. \<exists>y. R x y \<and> S y z)" | |
| 271 | by auto | |
| 272 | ||
| 273 | lemma bi_total_OO: "\<lbrakk>bi_total A; bi_total B\<rbrakk> \<Longrightarrow> bi_total (A OO B)" | |
| 56085 | 274 | unfolding bi_total_def OO_def by fast | 
| 47660 | 275 | |
| 276 | lemma bi_unique_OO: "\<lbrakk>bi_unique A; bi_unique B\<rbrakk> \<Longrightarrow> bi_unique (A OO B)" | |
| 56085 | 277 | unfolding bi_unique_def OO_def by blast | 
| 47660 | 278 | |
| 279 | lemma right_total_OO: | |
| 280 | "\<lbrakk>right_total A; right_total B\<rbrakk> \<Longrightarrow> right_total (A OO B)" | |
| 56085 | 281 | unfolding right_total_def OO_def by fast | 
| 47660 | 282 | |
| 283 | lemma right_unique_OO: | |
| 284 | "\<lbrakk>right_unique A; right_unique B\<rbrakk> \<Longrightarrow> right_unique (A OO B)" | |
| 56085 | 285 | unfolding right_unique_def OO_def by fast | 
| 47660 | 286 | |
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 287 | lemma left_total_OO: "left_total R \<Longrightarrow> left_total S \<Longrightarrow> left_total (R OO S)" | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 288 | unfolding left_total_def OO_def by fast | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 289 | |
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 290 | lemma left_unique_OO: "left_unique R \<Longrightarrow> left_unique S \<Longrightarrow> left_unique (R OO S)" | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 291 | unfolding left_unique_def OO_def by blast | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 292 | |
| 47325 | 293 | |
| 294 | subsection {* Properties of relators *}
 | |
| 295 | ||
| 58182 | 296 | lemma left_total_eq[transfer_rule]: "left_total op=" | 
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 297 | unfolding left_total_def by blast | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 298 | |
| 58182 | 299 | lemma left_unique_eq[transfer_rule]: "left_unique op=" | 
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 300 | unfolding left_unique_def by blast | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 301 | |
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 302 | lemma right_total_eq [transfer_rule]: "right_total op=" | 
| 47325 | 303 | unfolding right_total_def by simp | 
| 304 | ||
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 305 | lemma right_unique_eq [transfer_rule]: "right_unique op=" | 
| 47325 | 306 | unfolding right_unique_def by simp | 
| 307 | ||
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 308 | lemma bi_total_eq[transfer_rule]: "bi_total (op =)" | 
| 47325 | 309 | unfolding bi_total_def by simp | 
| 310 | ||
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 311 | lemma bi_unique_eq[transfer_rule]: "bi_unique (op =)" | 
| 47325 | 312 | unfolding bi_unique_def by simp | 
| 313 | ||
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 314 | lemma left_total_fun[transfer_rule]: | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 315 | "\<lbrakk>left_unique A; left_total B\<rbrakk> \<Longrightarrow> left_total (A ===> B)" | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 316 | unfolding left_total_def rel_fun_def | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 317 | apply (rule allI, rename_tac f) | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 318 | apply (rule_tac x="\<lambda>y. SOME z. B (f (THE x. A x y)) z" in exI) | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 319 | apply clarify | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 320 | apply (subgoal_tac "(THE x. A x y) = x", simp) | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 321 | apply (rule someI_ex) | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 322 | apply (simp) | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 323 | apply (rule the_equality) | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 324 | apply assumption | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 325 | apply (simp add: left_unique_def) | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 326 | done | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 327 | |
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 328 | lemma left_unique_fun[transfer_rule]: | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 329 | "\<lbrakk>left_total A; left_unique B\<rbrakk> \<Longrightarrow> left_unique (A ===> B)" | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 330 | unfolding left_total_def left_unique_def rel_fun_def | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 331 | by (clarify, rule ext, fast) | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 332 | |
| 47325 | 333 | lemma right_total_fun [transfer_rule]: | 
| 334 | "\<lbrakk>right_unique A; right_total B\<rbrakk> \<Longrightarrow> right_total (A ===> B)" | |
| 55945 | 335 | unfolding right_total_def rel_fun_def | 
| 47325 | 336 | apply (rule allI, rename_tac g) | 
| 337 | apply (rule_tac x="\<lambda>x. SOME z. B z (g (THE y. A x y))" in exI) | |
| 338 | apply clarify | |
| 339 | apply (subgoal_tac "(THE y. A x y) = y", simp) | |
| 340 | apply (rule someI_ex) | |
| 341 | apply (simp) | |
| 342 | apply (rule the_equality) | |
| 343 | apply assumption | |
| 344 | apply (simp add: right_unique_def) | |
| 345 | done | |
| 346 | ||
| 347 | lemma right_unique_fun [transfer_rule]: | |
| 348 | "\<lbrakk>right_total A; right_unique B\<rbrakk> \<Longrightarrow> right_unique (A ===> B)" | |
| 55945 | 349 | unfolding right_total_def right_unique_def rel_fun_def | 
| 47325 | 350 | by (clarify, rule ext, fast) | 
| 351 | ||
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 352 | lemma bi_total_fun[transfer_rule]: | 
| 47325 | 353 | "\<lbrakk>bi_unique A; bi_total B\<rbrakk> \<Longrightarrow> bi_total (A ===> B)" | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 354 | unfolding bi_unique_alt_def bi_total_alt_def | 
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 355 | by (blast intro: right_total_fun left_total_fun) | 
| 47325 | 356 | |
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 357 | lemma bi_unique_fun[transfer_rule]: | 
| 47325 | 358 | "\<lbrakk>bi_total A; bi_unique B\<rbrakk> \<Longrightarrow> bi_unique (A ===> B)" | 
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 359 | unfolding bi_unique_alt_def bi_total_alt_def | 
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 360 | by (blast intro: right_unique_fun left_unique_fun) | 
| 47325 | 361 | |
| 56543 
9bd56f2e4c10
bi_unique and co. rules from the BNF hook must be introduced after bi_unique op= and co. rules are introduced
 kuncar parents: 
56524diff
changeset | 362 | end | 
| 
9bd56f2e4c10
bi_unique and co. rules from the BNF hook must be introduced after bi_unique op= and co. rules are introduced
 kuncar parents: 
56524diff
changeset | 363 | |
| 58182 | 364 | ML_file "Tools/Transfer/transfer_bnf.ML" | 
| 56543 
9bd56f2e4c10
bi_unique and co. rules from the BNF hook must be introduced after bi_unique op= and co. rules are introduced
 kuncar parents: 
56524diff
changeset | 365 | |
| 
9bd56f2e4c10
bi_unique and co. rules from the BNF hook must be introduced after bi_unique op= and co. rules are introduced
 kuncar parents: 
56524diff
changeset | 366 | declare pred_fun_def [simp] | 
| 
9bd56f2e4c10
bi_unique and co. rules from the BNF hook must be introduced after bi_unique op= and co. rules are introduced
 kuncar parents: 
56524diff
changeset | 367 | declare rel_fun_eq [relator_eq] | 
| 
9bd56f2e4c10
bi_unique and co. rules from the BNF hook must be introduced after bi_unique op= and co. rules are introduced
 kuncar parents: 
56524diff
changeset | 368 | |
| 47635 
ebb79474262c
rename 'correspondence' method to 'transfer_prover'
 huffman parents: 
47627diff
changeset | 369 | subsection {* Transfer rules *}
 | 
| 47325 | 370 | |
| 56543 
9bd56f2e4c10
bi_unique and co. rules from the BNF hook must be introduced after bi_unique op= and co. rules are introduced
 kuncar parents: 
56524diff
changeset | 371 | context | 
| 
9bd56f2e4c10
bi_unique and co. rules from the BNF hook must be introduced after bi_unique op= and co. rules are introduced
 kuncar parents: 
56524diff
changeset | 372 | begin | 
| 
9bd56f2e4c10
bi_unique and co. rules from the BNF hook must be introduced after bi_unique op= and co. rules are introduced
 kuncar parents: 
56524diff
changeset | 373 | interpretation lifting_syntax . | 
| 
9bd56f2e4c10
bi_unique and co. rules from the BNF hook must be introduced after bi_unique op= and co. rules are introduced
 kuncar parents: 
56524diff
changeset | 374 | |
| 53952 | 375 | lemma Domainp_forall_transfer [transfer_rule]: | 
| 376 | assumes "right_total A" | |
| 377 | shows "((A ===> op =) ===> op =) | |
| 378 | (transfer_bforall (Domainp A)) transfer_forall" | |
| 379 | using assms unfolding right_total_def | |
| 55945 | 380 | unfolding transfer_forall_def transfer_bforall_def rel_fun_def Domainp_iff | 
| 56085 | 381 | by fast | 
| 53952 | 382 | |
| 47684 | 383 | text {* Transfer rules using implication instead of equality on booleans. *}
 | 
| 384 | ||
| 52354 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 385 | lemma transfer_forall_transfer [transfer_rule]: | 
| 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 386 | "bi_total A \<Longrightarrow> ((A ===> op =) ===> op =) transfer_forall transfer_forall" | 
| 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 387 | "right_total A \<Longrightarrow> ((A ===> op =) ===> implies) transfer_forall transfer_forall" | 
| 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 388 | "right_total A \<Longrightarrow> ((A ===> implies) ===> implies) transfer_forall transfer_forall" | 
| 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 389 | "bi_total A \<Longrightarrow> ((A ===> op =) ===> rev_implies) transfer_forall transfer_forall" | 
| 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 390 | "bi_total A \<Longrightarrow> ((A ===> rev_implies) ===> rev_implies) transfer_forall transfer_forall" | 
| 55945 | 391 | unfolding transfer_forall_def rev_implies_def rel_fun_def right_total_def bi_total_def | 
| 56085 | 392 | by fast+ | 
| 52354 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 393 | |
| 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 394 | lemma transfer_implies_transfer [transfer_rule]: | 
| 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 395 | "(op = ===> op = ===> op = ) transfer_implies transfer_implies" | 
| 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 396 | "(rev_implies ===> implies ===> implies ) transfer_implies transfer_implies" | 
| 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 397 | "(rev_implies ===> op = ===> implies ) transfer_implies transfer_implies" | 
| 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 398 | "(op = ===> implies ===> implies ) transfer_implies transfer_implies" | 
| 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 399 | "(op = ===> op = ===> implies ) transfer_implies transfer_implies" | 
| 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 400 | "(implies ===> rev_implies ===> rev_implies) transfer_implies transfer_implies" | 
| 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 401 | "(implies ===> op = ===> rev_implies) transfer_implies transfer_implies" | 
| 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 402 | "(op = ===> rev_implies ===> rev_implies) transfer_implies transfer_implies" | 
| 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 403 | "(op = ===> op = ===> rev_implies) transfer_implies transfer_implies" | 
| 55945 | 404 | unfolding transfer_implies_def rev_implies_def rel_fun_def by auto | 
| 52354 
acb4f932dd24
implement 'transferred' attribute for transfer package, with support for monotonicity of !!/==>
 huffman parents: 
51956diff
changeset | 405 | |
| 47684 | 406 | lemma eq_imp_transfer [transfer_rule]: | 
| 407 | "right_unique A \<Longrightarrow> (A ===> A ===> op \<longrightarrow>) (op =) (op =)" | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 408 | unfolding right_unique_alt_def2 . | 
| 47684 | 409 | |
| 56518 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 410 | text {* Transfer rules using equality. *}
 | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 411 | |
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 412 | lemma left_unique_transfer [transfer_rule]: | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 413 | assumes "right_total A" | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 414 | assumes "right_total B" | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 415 | assumes "bi_unique A" | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 416 | shows "((A ===> B ===> op=) ===> implies) left_unique left_unique" | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 417 | using assms unfolding left_unique_def[abs_def] right_total_def bi_unique_def rel_fun_def | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 418 | by metis | 
| 
beb3b6851665
left_total and left_unique rules are now transfer rules (cleaner solution, reflexvity_rule attribute not needed anymore)
 kuncar parents: 
56085diff
changeset | 419 | |
| 47636 | 420 | lemma eq_transfer [transfer_rule]: | 
| 47325 | 421 | assumes "bi_unique A" | 
| 422 | shows "(A ===> A ===> op =) (op =) (op =)" | |
| 55945 | 423 | using assms unfolding bi_unique_def rel_fun_def by auto | 
| 47325 | 424 | |
| 51956 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51955diff
changeset | 425 | lemma right_total_Ex_transfer[transfer_rule]: | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51955diff
changeset | 426 | assumes "right_total A" | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51955diff
changeset | 427 | shows "((A ===> op=) ===> op=) (Bex (Collect (Domainp A))) Ex" | 
| 55945 | 428 | using assms unfolding right_total_def Bex_def rel_fun_def Domainp_iff[abs_def] | 
| 56085 | 429 | by fast | 
| 51956 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51955diff
changeset | 430 | |
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51955diff
changeset | 431 | lemma right_total_All_transfer[transfer_rule]: | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51955diff
changeset | 432 | assumes "right_total A" | 
| 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51955diff
changeset | 433 | shows "((A ===> op =) ===> op =) (Ball (Collect (Domainp A))) All" | 
| 55945 | 434 | using assms unfolding right_total_def Ball_def rel_fun_def Domainp_iff[abs_def] | 
| 56085 | 435 | by fast | 
| 51956 
a4d81cdebf8b
better support for domains in Lifting/Transfer = replace Domainp T by the actual invariant in a transferred goal
 kuncar parents: 
51955diff
changeset | 436 | |
| 47636 | 437 | lemma All_transfer [transfer_rule]: | 
| 47325 | 438 | assumes "bi_total A" | 
| 439 | shows "((A ===> op =) ===> op =) All All" | |
| 55945 | 440 | using assms unfolding bi_total_def rel_fun_def by fast | 
| 47325 | 441 | |
| 47636 | 442 | lemma Ex_transfer [transfer_rule]: | 
| 47325 | 443 | assumes "bi_total A" | 
| 444 | shows "((A ===> op =) ===> op =) Ex Ex" | |
| 55945 | 445 | using assms unfolding bi_total_def rel_fun_def by fast | 
| 47325 | 446 | |
| 58448 | 447 | declare If_transfer [transfer_rule] | 
| 47325 | 448 | |
| 47636 | 449 | lemma Let_transfer [transfer_rule]: "(A ===> (A ===> B) ===> B) Let Let" | 
| 55945 | 450 | unfolding rel_fun_def by simp | 
| 47612 | 451 | |
| 58916 | 452 | declare id_transfer [transfer_rule] | 
| 47625 | 453 | |
| 58444 | 454 | declare comp_transfer [transfer_rule] | 
| 47325 | 455 | |
| 58916 | 456 | lemma curry_transfer [transfer_rule]: | 
| 457 | "((rel_prod A B ===> C) ===> A ===> B ===> C) curry curry" | |
| 458 | unfolding curry_def by transfer_prover | |
| 459 | ||
| 47636 | 460 | lemma fun_upd_transfer [transfer_rule]: | 
| 47325 | 461 | assumes [transfer_rule]: "bi_unique A" | 
| 462 | shows "((A ===> B) ===> A ===> B ===> A ===> B) fun_upd fun_upd" | |
| 47635 
ebb79474262c
rename 'correspondence' method to 'transfer_prover'
 huffman parents: 
47627diff
changeset | 463 | unfolding fun_upd_def [abs_def] by transfer_prover | 
| 47325 | 464 | |
| 55415 | 465 | lemma case_nat_transfer [transfer_rule]: | 
| 466 | "(A ===> (op = ===> A) ===> op = ===> A) case_nat case_nat" | |
| 55945 | 467 | unfolding rel_fun_def by (simp split: nat.split) | 
| 47627 
2b1d3eda59eb
add secondary transfer rule for universal quantifiers on non-bi-total relations
 huffman parents: 
47625diff
changeset | 468 | |
| 55415 | 469 | lemma rec_nat_transfer [transfer_rule]: | 
| 470 | "(A ===> (op = ===> A ===> A) ===> op = ===> A) rec_nat rec_nat" | |
| 55945 | 471 | unfolding rel_fun_def by (clarsimp, rename_tac n, induct_tac n, simp_all) | 
| 47924 | 472 | |
| 473 | lemma funpow_transfer [transfer_rule]: | |
| 474 | "(op = ===> (A ===> A) ===> (A ===> A)) compow compow" | |
| 475 | unfolding funpow_def by transfer_prover | |
| 476 | ||
| 53952 | 477 | lemma mono_transfer[transfer_rule]: | 
| 478 | assumes [transfer_rule]: "bi_total A" | |
| 479 | assumes [transfer_rule]: "(A ===> A ===> op=) op\<le> op\<le>" | |
| 480 | assumes [transfer_rule]: "(B ===> B ===> op=) op\<le> op\<le>" | |
| 481 | shows "((A ===> B) ===> op=) mono mono" | |
| 482 | unfolding mono_def[abs_def] by transfer_prover | |
| 483 | ||
| 58182 | 484 | lemma right_total_relcompp_transfer[transfer_rule]: | 
| 53952 | 485 | assumes [transfer_rule]: "right_total B" | 
| 58182 | 486 | shows "((A ===> B ===> op=) ===> (B ===> C ===> op=) ===> A ===> C ===> op=) | 
| 53952 | 487 | (\<lambda>R S x z. \<exists>y\<in>Collect (Domainp B). R x y \<and> S y z) op OO" | 
| 488 | unfolding OO_def[abs_def] by transfer_prover | |
| 489 | ||
| 58182 | 490 | lemma relcompp_transfer[transfer_rule]: | 
| 53952 | 491 | assumes [transfer_rule]: "bi_total B" | 
| 492 | shows "((A ===> B ===> op=) ===> (B ===> C ===> op=) ===> A ===> C ===> op=) op OO op OO" | |
| 493 | unfolding OO_def[abs_def] by transfer_prover | |
| 47627 
2b1d3eda59eb
add secondary transfer rule for universal quantifiers on non-bi-total relations
 huffman parents: 
47625diff
changeset | 494 | |
| 53952 | 495 | lemma right_total_Domainp_transfer[transfer_rule]: | 
| 496 | assumes [transfer_rule]: "right_total B" | |
| 497 | shows "((A ===> B ===> op=) ===> A ===> op=) (\<lambda>T x. \<exists>y\<in>Collect(Domainp B). T x y) Domainp" | |
| 498 | apply(subst(2) Domainp_iff[abs_def]) by transfer_prover | |
| 499 | ||
| 500 | lemma Domainp_transfer[transfer_rule]: | |
| 501 | assumes [transfer_rule]: "bi_total B" | |
| 502 | shows "((A ===> B ===> op=) ===> A ===> op=) Domainp Domainp" | |
| 503 | unfolding Domainp_iff[abs_def] by transfer_prover | |
| 504 | ||
| 58182 | 505 | lemma reflp_transfer[transfer_rule]: | 
| 53952 | 506 | "bi_total A \<Longrightarrow> ((A ===> A ===> op=) ===> op=) reflp reflp" | 
| 507 | "right_total A \<Longrightarrow> ((A ===> A ===> implies) ===> implies) reflp reflp" | |
| 508 | "right_total A \<Longrightarrow> ((A ===> A ===> op=) ===> implies) reflp reflp" | |
| 509 | "bi_total A \<Longrightarrow> ((A ===> A ===> rev_implies) ===> rev_implies) reflp reflp" | |
| 510 | "bi_total A \<Longrightarrow> ((A ===> A ===> op=) ===> rev_implies) reflp reflp" | |
| 58182 | 511 | using assms unfolding reflp_def[abs_def] rev_implies_def bi_total_def right_total_def rel_fun_def | 
| 53952 | 512 | by fast+ | 
| 513 | ||
| 514 | lemma right_unique_transfer [transfer_rule]: | |
| 515 | assumes [transfer_rule]: "right_total A" | |
| 516 | assumes [transfer_rule]: "right_total B" | |
| 517 | assumes [transfer_rule]: "bi_unique B" | |
| 518 | shows "((A ===> B ===> op=) ===> implies) right_unique right_unique" | |
| 55945 | 519 | using assms unfolding right_unique_def[abs_def] right_total_def bi_unique_def rel_fun_def | 
| 53952 | 520 | by metis | 
| 47325 | 521 | |
| 56524 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 522 | lemma rel_fun_eq_eq_onp: "(op= ===> eq_onp P) = eq_onp (\<lambda>f. \<forall>x. P(f x))" | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 523 | unfolding eq_onp_def rel_fun_def by auto | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 524 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 525 | lemma rel_fun_eq_onp_rel: | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 526 | shows "((eq_onp R) ===> S) = (\<lambda>f g. \<forall>x. R x \<longrightarrow> S (f x) (g x))" | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 527 | by (auto simp add: eq_onp_def rel_fun_def) | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 528 | |
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 529 | lemma eq_onp_transfer [transfer_rule]: | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 530 | assumes [transfer_rule]: "bi_unique A" | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 531 | shows "((A ===> op=) ===> A ===> A ===> op=) eq_onp eq_onp" | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 532 | unfolding eq_onp_def[abs_def] by transfer_prover | 
| 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 kuncar parents: 
56520diff
changeset | 533 | |
| 57599 | 534 | lemma rtranclp_parametric [transfer_rule]: | 
| 535 | assumes "bi_unique A" "bi_total A" | |
| 536 | shows "((A ===> A ===> op =) ===> A ===> A ===> op =) rtranclp rtranclp" | |
| 537 | proof(rule rel_funI iffI)+ | |
| 538 | fix R :: "'a \<Rightarrow> 'a \<Rightarrow> bool" and R' x y x' y' | |
| 539 | assume R: "(A ===> A ===> op =) R R'" and "A x x'" | |
| 540 |   {
 | |
| 541 | assume "R\<^sup>*\<^sup>* x y" "A y y'" | |
| 542 | thus "R'\<^sup>*\<^sup>* x' y'" | |
| 543 | proof(induction arbitrary: y') | |
| 544 | case base | |
| 545 | with `bi_unique A` `A x x'` have "x' = y'" by(rule bi_uniqueDr) | |
| 546 | thus ?case by simp | |
| 547 | next | |
| 548 | case (step y z z') | |
| 549 | from `bi_total A` obtain y' where "A y y'" unfolding bi_total_def by blast | |
| 550 | hence "R'\<^sup>*\<^sup>* x' y'" by(rule step.IH) | |
| 551 | moreover from R `A y y'` `A z z'` `R y z` | |
| 552 | have "R' y' z'" by(auto dest: rel_funD) | |
| 553 | ultimately show ?case .. | |
| 554 | qed | |
| 555 | next | |
| 556 | assume "R'\<^sup>*\<^sup>* x' y'" "A y y'" | |
| 557 | thus "R\<^sup>*\<^sup>* x y" | |
| 558 | proof(induction arbitrary: y) | |
| 559 | case base | |
| 560 | with `bi_unique A` `A x x'` have "x = y" by(rule bi_uniqueDl) | |
| 561 | thus ?case by simp | |
| 562 | next | |
| 563 | case (step y' z' z) | |
| 564 | from `bi_total A` obtain y where "A y y'" unfolding bi_total_def by blast | |
| 565 | hence "R\<^sup>*\<^sup>* x y" by(rule step.IH) | |
| 566 | moreover from R `A y y'` `A z z'` `R' y' z'` | |
| 567 | have "R y z" by(auto dest: rel_funD) | |
| 568 | ultimately show ?case .. | |
| 569 | qed | |
| 570 | } | |
| 571 | qed | |
| 572 | ||
| 47325 | 573 | end | 
| 53011 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 kuncar parents: 
52358diff
changeset | 574 | |
| 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 kuncar parents: 
52358diff
changeset | 575 | end |