| author | wenzelm | 
| Thu, 15 Mar 2018 22:28:20 +0100 | |
| changeset 67872 | 39b27d38a54c | 
| parent 67399 | eab6ce8368fa | 
| child 68615 | 3ed4ff0b7ac4 | 
| permissions | -rw-r--r-- | 
| 41959 | 1  | 
(* Title: HOL/Quotient.thy  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
2  | 
Author: Cezary Kaliszyk and Christian Urban  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
3  | 
*)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
4  | 
|
| 60758 | 5  | 
section \<open>Definition of Quotient Types\<close>  | 
| 35294 | 6  | 
|
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
7  | 
theory Quotient  | 
| 54555 | 8  | 
imports Lifting  | 
| 
46950
 
d0181abdbdac
declare command keywords via theory header, including strict checking outside Pure;
 
wenzelm 
parents: 
46947 
diff
changeset
 | 
9  | 
keywords  | 
| 47308 | 10  | 
"print_quotmapsQ3" "print_quotientsQ3" "print_quotconsts" :: diag and  | 
| 
46950
 
d0181abdbdac
declare command keywords via theory header, including strict checking outside Pure;
 
wenzelm 
parents: 
46947 
diff
changeset
 | 
11  | 
"quotient_type" :: thy_goal and "/" and  | 
| 
47091
 
d5cd13aca90b
respectfulness theorem has to be proved if a new constant is lifted by quotient_definition
 
kuncar 
parents: 
46950 
diff
changeset
 | 
12  | 
"quotient_definition" :: thy_goal  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
13  | 
begin  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
14  | 
|
| 60758 | 15  | 
text \<open>  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
16  | 
Basic definition for equivalence relations  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
17  | 
that are represented by predicates.  | 
| 60758 | 18  | 
\<close>  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
19  | 
|
| 60758 | 20  | 
text \<open>Composition of Relations\<close>  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
21  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
22  | 
abbreviation  | 
| 
40818
 
b117df72e56b
reorienting iff in Quotient_rel prevents simplifier looping;
 
haftmann 
parents: 
40814 
diff
changeset
 | 
23  | 
  rel_conj :: "('a \<Rightarrow> 'b \<Rightarrow> bool) \<Rightarrow> ('b \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> 'a \<Rightarrow> 'b \<Rightarrow> bool" (infixr "OOO" 75)
 | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
24  | 
where  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
25  | 
"r1 OOO r2 \<equiv> r1 OO r2 OO r1"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
26  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
27  | 
lemma eq_comp_r:  | 
| 67399 | 28  | 
shows "((=) OOO R) = R"  | 
| 
39302
 
d7728f65b353
renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
 
nipkow 
parents: 
39198 
diff
changeset
 | 
29  | 
by (auto simp add: fun_eq_iff)  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
30  | 
|
| 63343 | 31  | 
context includes lifting_syntax  | 
| 
53011
 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 
kuncar 
parents: 
51112 
diff
changeset
 | 
32  | 
begin  | 
| 
 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 
kuncar 
parents: 
51112 
diff
changeset
 | 
33  | 
|
| 60758 | 34  | 
subsection \<open>Quotient Predicate\<close>  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
35  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
36  | 
definition  | 
| 47308 | 37  | 
"Quotient3 R Abs Rep \<longleftrightarrow>  | 
| 
40814
 
fa64f6278568
moved generic definitions about (partial) equivalence relations from Quotient to Equiv_Relations;
 
haftmann 
parents: 
40615 
diff
changeset
 | 
38  | 
(\<forall>a. Abs (Rep a) = a) \<and> (\<forall>a. R (Rep a) (Rep a)) \<and>  | 
| 
40818
 
b117df72e56b
reorienting iff in Quotient_rel prevents simplifier looping;
 
haftmann 
parents: 
40814 
diff
changeset
 | 
39  | 
(\<forall>r s. R r s \<longleftrightarrow> R r r \<and> R s s \<and> Abs r = Abs s)"  | 
| 
 
b117df72e56b
reorienting iff in Quotient_rel prevents simplifier looping;
 
haftmann 
parents: 
40814 
diff
changeset
 | 
40  | 
|
| 47308 | 41  | 
lemma Quotient3I:  | 
| 
40818
 
b117df72e56b
reorienting iff in Quotient_rel prevents simplifier looping;
 
haftmann 
parents: 
40814 
diff
changeset
 | 
42  | 
assumes "\<And>a. Abs (Rep a) = a"  | 
| 
 
b117df72e56b
reorienting iff in Quotient_rel prevents simplifier looping;
 
haftmann 
parents: 
40814 
diff
changeset
 | 
43  | 
and "\<And>a. R (Rep a) (Rep a)"  | 
| 
 
b117df72e56b
reorienting iff in Quotient_rel prevents simplifier looping;
 
haftmann 
parents: 
40814 
diff
changeset
 | 
44  | 
and "\<And>r s. R r s \<longleftrightarrow> R r r \<and> R s s \<and> Abs r = Abs s"  | 
| 47308 | 45  | 
shows "Quotient3 R Abs Rep"  | 
46  | 
using assms unfolding Quotient3_def by blast  | 
|
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
47  | 
|
| 
54867
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
48  | 
context  | 
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
49  | 
fixes R Abs Rep  | 
| 47308 | 50  | 
assumes a: "Quotient3 R Abs Rep"  | 
| 
54867
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
51  | 
begin  | 
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
52  | 
|
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
53  | 
lemma Quotient3_abs_rep:  | 
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
54  | 
"Abs (Rep a) = a"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
55  | 
using a  | 
| 47308 | 56  | 
unfolding Quotient3_def  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
57  | 
by simp  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
58  | 
|
| 47308 | 59  | 
lemma Quotient3_rep_reflp:  | 
| 
54867
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
60  | 
"R (Rep a) (Rep a)"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
61  | 
using a  | 
| 47308 | 62  | 
unfolding Quotient3_def  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
63  | 
by blast  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
64  | 
|
| 47308 | 65  | 
lemma Quotient3_rel:  | 
| 61799 | 66  | 
"R r r \<and> R s s \<and> Abs r = Abs s \<longleftrightarrow> R r s" \<comment> \<open>orientation does not loop on rewriting\<close>  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
67  | 
using a  | 
| 47308 | 68  | 
unfolding Quotient3_def  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
69  | 
by blast  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
70  | 
|
| 47308 | 71  | 
lemma Quotient3_refl1:  | 
| 
54867
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
72  | 
"R r s \<Longrightarrow> R r r"  | 
| 47308 | 73  | 
using a unfolding Quotient3_def  | 
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
74  | 
by fast  | 
| 
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
75  | 
|
| 47308 | 76  | 
lemma Quotient3_refl2:  | 
| 
54867
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
77  | 
"R r s \<Longrightarrow> R s s"  | 
| 47308 | 78  | 
using a unfolding Quotient3_def  | 
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
79  | 
by fast  | 
| 
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
80  | 
|
| 47308 | 81  | 
lemma Quotient3_rel_rep:  | 
| 
54867
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
82  | 
"R (Rep a) (Rep b) \<longleftrightarrow> a = b"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
83  | 
using a  | 
| 47308 | 84  | 
unfolding Quotient3_def  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
85  | 
by metis  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
86  | 
|
| 47308 | 87  | 
lemma Quotient3_rep_abs:  | 
| 
54867
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
88  | 
"R r r \<Longrightarrow> R (Rep (Abs r)) r"  | 
| 47308 | 89  | 
using a unfolding Quotient3_def  | 
90  | 
by blast  | 
|
91  | 
||
92  | 
lemma Quotient3_rel_abs:  | 
|
| 
54867
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
93  | 
"R r s \<Longrightarrow> Abs r = Abs s"  | 
| 47308 | 94  | 
using a unfolding Quotient3_def  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
95  | 
by blast  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
96  | 
|
| 47308 | 97  | 
lemma Quotient3_symp:  | 
| 
54867
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
98  | 
"symp R"  | 
| 47308 | 99  | 
using a unfolding Quotient3_def using sympI by metis  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
100  | 
|
| 47308 | 101  | 
lemma Quotient3_transp:  | 
| 
54867
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
102  | 
"transp R"  | 
| 47308 | 103  | 
using a unfolding Quotient3_def using transpI by (metis (full_types))  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
104  | 
|
| 47308 | 105  | 
lemma Quotient3_part_equivp:  | 
| 
54867
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
106  | 
"part_equivp R"  | 
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
107  | 
by (metis Quotient3_rep_reflp Quotient3_symp Quotient3_transp part_equivpI)  | 
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
108  | 
|
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
109  | 
lemma abs_o_rep:  | 
| 67091 | 110  | 
"Abs \<circ> Rep = id"  | 
| 
54867
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
111  | 
unfolding fun_eq_iff  | 
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
112  | 
by (simp add: Quotient3_abs_rep)  | 
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
113  | 
|
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
114  | 
lemma equals_rsp:  | 
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
115  | 
assumes b: "R xa xb" "R ya yb"  | 
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
116  | 
shows "R xa ya = R xb yb"  | 
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
117  | 
using b Quotient3_symp Quotient3_transp  | 
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
118  | 
by (blast elim: sympE transpE)  | 
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
119  | 
|
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
120  | 
lemma rep_abs_rsp:  | 
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
121  | 
assumes b: "R x1 x2"  | 
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
122  | 
shows "R x1 (Rep (Abs x2))"  | 
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
123  | 
using b Quotient3_rel Quotient3_abs_rep Quotient3_rep_reflp  | 
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
124  | 
by metis  | 
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
125  | 
|
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
126  | 
lemma rep_abs_rsp_left:  | 
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
127  | 
assumes b: "R x1 x2"  | 
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
128  | 
shows "R (Rep (Abs x1)) x2"  | 
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
129  | 
using b Quotient3_rel Quotient3_abs_rep Quotient3_rep_reflp  | 
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
130  | 
by metis  | 
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
131  | 
|
| 
 
c21a2465cac1
prefer ephemeral interpretation over interpretation in proof contexts;
 
haftmann 
parents: 
54555 
diff
changeset
 | 
132  | 
end  | 
| 47308 | 133  | 
|
134  | 
lemma identity_quotient3:  | 
|
| 67399 | 135  | 
"Quotient3 (=) id id"  | 
| 47308 | 136  | 
unfolding Quotient3_def id_def  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
137  | 
by blast  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
138  | 
|
| 47308 | 139  | 
lemma fun_quotient3:  | 
140  | 
assumes q1: "Quotient3 R1 abs1 rep1"  | 
|
141  | 
and q2: "Quotient3 R2 abs2 rep2"  | 
|
142  | 
shows "Quotient3 (R1 ===> R2) (rep1 ---> abs2) (abs1 ---> rep2)"  | 
|
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
143  | 
proof -  | 
| 47308 | 144  | 
have "\<And>a.(rep1 ---> abs2) ((abs1 ---> rep2) a) = a"  | 
145  | 
using q1 q2 by (simp add: Quotient3_def fun_eq_iff)  | 
|
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
146  | 
moreover  | 
| 47308 | 147  | 
have "\<And>a.(R1 ===> R2) ((abs1 ---> rep2) a) ((abs1 ---> rep2) a)"  | 
| 55945 | 148  | 
by (rule rel_funI)  | 
| 47308 | 149  | 
(insert q1 q2 Quotient3_rel_abs [of R1 abs1 rep1] Quotient3_rel_rep [of R2 abs2 rep2],  | 
150  | 
simp (no_asm) add: Quotient3_def, simp)  | 
|
151  | 
||
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
152  | 
moreover  | 
| 47308 | 153  | 
  {
 | 
154  | 
fix r s  | 
|
155  | 
have "(R1 ===> R2) r s = ((R1 ===> R2) r r \<and> (R1 ===> R2) s s \<and>  | 
|
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
156  | 
(rep1 ---> abs2) r = (rep1 ---> abs2) s)"  | 
| 47308 | 157  | 
proof -  | 
158  | 
||
| 55945 | 159  | 
have "(R1 ===> R2) r s \<Longrightarrow> (R1 ===> R2) r r" unfolding rel_fun_def  | 
| 47308 | 160  | 
using Quotient3_part_equivp[OF q1] Quotient3_part_equivp[OF q2]  | 
161  | 
by (metis (full_types) part_equivp_def)  | 
|
| 55945 | 162  | 
moreover have "(R1 ===> R2) r s \<Longrightarrow> (R1 ===> R2) s s" unfolding rel_fun_def  | 
| 47308 | 163  | 
using Quotient3_part_equivp[OF q1] Quotient3_part_equivp[OF q2]  | 
164  | 
by (metis (full_types) part_equivp_def)  | 
|
165  | 
moreover have "(R1 ===> R2) r s \<Longrightarrow> (rep1 ---> abs2) r = (rep1 ---> abs2) s"  | 
|
| 55945 | 166  | 
apply(auto simp add: rel_fun_def fun_eq_iff) using q1 q2 unfolding Quotient3_def by metis  | 
| 47308 | 167  | 
moreover have "((R1 ===> R2) r r \<and> (R1 ===> R2) s s \<and>  | 
168  | 
(rep1 ---> abs2) r = (rep1 ---> abs2) s) \<Longrightarrow> (R1 ===> R2) r s"  | 
|
| 55945 | 169  | 
apply(auto simp add: rel_fun_def fun_eq_iff) using q1 q2 unfolding Quotient3_def  | 
| 47308 | 170  | 
by (metis map_fun_apply)  | 
171  | 
||
172  | 
ultimately show ?thesis by blast  | 
|
173  | 
qed  | 
|
174  | 
}  | 
|
175  | 
ultimately show ?thesis by (intro Quotient3I) (assumption+)  | 
|
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
176  | 
qed  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
177  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
178  | 
lemma lambda_prs:  | 
| 47308 | 179  | 
assumes q1: "Quotient3 R1 Abs1 Rep1"  | 
180  | 
and q2: "Quotient3 R2 Abs2 Rep2"  | 
|
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
181  | 
shows "(Rep1 ---> Abs2) (\<lambda>x. Rep2 (f (Abs1 x))) = (\<lambda>x. f x)"  | 
| 
39302
 
d7728f65b353
renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
 
nipkow 
parents: 
39198 
diff
changeset
 | 
182  | 
unfolding fun_eq_iff  | 
| 47308 | 183  | 
using Quotient3_abs_rep[OF q1] Quotient3_abs_rep[OF q2]  | 
| 
40814
 
fa64f6278568
moved generic definitions about (partial) equivalence relations from Quotient to Equiv_Relations;
 
haftmann 
parents: 
40615 
diff
changeset
 | 
184  | 
by simp  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
185  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
186  | 
lemma lambda_prs1:  | 
| 47308 | 187  | 
assumes q1: "Quotient3 R1 Abs1 Rep1"  | 
188  | 
and q2: "Quotient3 R2 Abs2 Rep2"  | 
|
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
189  | 
shows "(Rep1 ---> Abs2) (\<lambda>x. (Abs1 ---> Rep2) f x) = (\<lambda>x. f x)"  | 
| 
39302
 
d7728f65b353
renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
 
nipkow 
parents: 
39198 
diff
changeset
 | 
190  | 
unfolding fun_eq_iff  | 
| 47308 | 191  | 
using Quotient3_abs_rep[OF q1] Quotient3_abs_rep[OF q2]  | 
| 
40814
 
fa64f6278568
moved generic definitions about (partial) equivalence relations from Quotient to Equiv_Relations;
 
haftmann 
parents: 
40615 
diff
changeset
 | 
192  | 
by simp  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
193  | 
|
| 60758 | 194  | 
text\<open>  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
195  | 
In the following theorem R1 can be instantiated with anything,  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
196  | 
but we know some of the types of the Rep and Abs functions;  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
197  | 
so by solving Quotient assumptions we can get a unique R1 that  | 
| 61799 | 198  | 
will be provable; which is why we need to use \<open>apply_rsp\<close> and  | 
| 60758 | 199  | 
not the primed version\<close>  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
200  | 
|
| 47308 | 201  | 
lemma apply_rspQ3:  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
202  | 
fixes f g::"'a \<Rightarrow> 'c"  | 
| 47308 | 203  | 
assumes q: "Quotient3 R1 Abs1 Rep1"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
204  | 
and a: "(R1 ===> R2) f g" "R1 x y"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
205  | 
shows "R2 (f x) (g y)"  | 
| 55945 | 206  | 
using a by (auto elim: rel_funE)  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
207  | 
|
| 47308 | 208  | 
lemma apply_rspQ3'':  | 
209  | 
assumes "Quotient3 R Abs Rep"  | 
|
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
210  | 
and "(R ===> S) f f"  | 
| 
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
211  | 
shows "S (f (Rep x)) (f (Rep x))"  | 
| 
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
212  | 
proof -  | 
| 47308 | 213  | 
from assms(1) have "R (Rep x) (Rep x)" by (rule Quotient3_rep_reflp)  | 
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
214  | 
then show ?thesis using assms(2) by (auto intro: apply_rsp')  | 
| 
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
215  | 
qed  | 
| 
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
216  | 
|
| 60758 | 217  | 
subsection \<open>lemmas for regularisation of ball and bex\<close>  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
218  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
219  | 
lemma ball_reg_eqv:  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
220  | 
fixes P :: "'a \<Rightarrow> bool"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
221  | 
assumes a: "equivp R"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
222  | 
shows "Ball (Respects R) P = (All P)"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
223  | 
using a  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
224  | 
unfolding equivp_def  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
225  | 
by (auto simp add: in_respects)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
226  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
227  | 
lemma bex_reg_eqv:  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
228  | 
fixes P :: "'a \<Rightarrow> bool"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
229  | 
assumes a: "equivp R"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
230  | 
shows "Bex (Respects R) P = (Ex P)"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
231  | 
using a  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
232  | 
unfolding equivp_def  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
233  | 
by (auto simp add: in_respects)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
234  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
235  | 
lemma ball_reg_right:  | 
| 
44553
 
4d39b032a021
avoid intermixing set and predicates; dropped lemmas mem_rsp and mem_prs (now in Quotient_Set.thy)
 
haftmann 
parents: 
44413 
diff
changeset
 | 
236  | 
assumes a: "\<And>x. x \<in> R \<Longrightarrow> P x \<longrightarrow> Q x"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
237  | 
shows "All P \<longrightarrow> Ball R Q"  | 
| 44921 | 238  | 
using a by fast  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
239  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
240  | 
lemma bex_reg_left:  | 
| 
44553
 
4d39b032a021
avoid intermixing set and predicates; dropped lemmas mem_rsp and mem_prs (now in Quotient_Set.thy)
 
haftmann 
parents: 
44413 
diff
changeset
 | 
241  | 
assumes a: "\<And>x. x \<in> R \<Longrightarrow> Q x \<longrightarrow> P x"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
242  | 
shows "Bex R Q \<longrightarrow> Ex P"  | 
| 44921 | 243  | 
using a by fast  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
244  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
245  | 
lemma ball_reg_left:  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
246  | 
assumes a: "equivp R"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
247  | 
shows "(\<And>x. (Q x \<longrightarrow> P x)) \<Longrightarrow> Ball (Respects R) Q \<longrightarrow> All P"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
248  | 
using a by (metis equivp_reflp in_respects)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
249  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
250  | 
lemma bex_reg_right:  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
251  | 
assumes a: "equivp R"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
252  | 
shows "(\<And>x. (Q x \<longrightarrow> P x)) \<Longrightarrow> Ex Q \<longrightarrow> Bex (Respects R) P"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
253  | 
using a by (metis equivp_reflp in_respects)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
254  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
255  | 
lemma ball_reg_eqv_range:  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
256  | 
fixes P::"'a \<Rightarrow> bool"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
257  | 
and x::"'a"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
258  | 
assumes a: "equivp R2"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
259  | 
shows "(Ball (Respects (R1 ===> R2)) (\<lambda>f. P (f x)) = All (\<lambda>f. P (f x)))"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
260  | 
apply(rule iffI)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
261  | 
apply(rule allI)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
262  | 
apply(drule_tac x="\<lambda>y. f x" in bspec)  | 
| 55945 | 263  | 
apply(simp add: in_respects rel_fun_def)  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
264  | 
apply(rule impI)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
265  | 
using a equivp_reflp_symp_transp[of "R2"]  | 
| 
40814
 
fa64f6278568
moved generic definitions about (partial) equivalence relations from Quotient to Equiv_Relations;
 
haftmann 
parents: 
40615 
diff
changeset
 | 
266  | 
apply (auto elim: equivpE reflpE)  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
267  | 
done  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
268  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
269  | 
lemma bex_reg_eqv_range:  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
270  | 
assumes a: "equivp R2"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
271  | 
shows "(Bex (Respects (R1 ===> R2)) (\<lambda>f. P (f x)) = Ex (\<lambda>f. P (f x)))"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
272  | 
apply(auto)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
273  | 
apply(rule_tac x="\<lambda>y. f x" in bexI)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
274  | 
apply(simp)  | 
| 55945 | 275  | 
apply(simp add: Respects_def in_respects rel_fun_def)  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
276  | 
apply(rule impI)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
277  | 
using a equivp_reflp_symp_transp[of "R2"]  | 
| 
40814
 
fa64f6278568
moved generic definitions about (partial) equivalence relations from Quotient to Equiv_Relations;
 
haftmann 
parents: 
40615 
diff
changeset
 | 
278  | 
apply (auto elim: equivpE reflpE)  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
279  | 
done  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
280  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
281  | 
(* Next four lemmas are unused *)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
282  | 
lemma all_reg:  | 
| 67091 | 283  | 
assumes a: "\<forall>x :: 'a. (P x \<longrightarrow> Q x)"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
284  | 
and b: "All P"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
285  | 
shows "All Q"  | 
| 44921 | 286  | 
using a b by fast  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
287  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
288  | 
lemma ex_reg:  | 
| 67091 | 289  | 
assumes a: "\<forall>x :: 'a. (P x \<longrightarrow> Q x)"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
290  | 
and b: "Ex P"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
291  | 
shows "Ex Q"  | 
| 44921 | 292  | 
using a b by fast  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
293  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
294  | 
lemma ball_reg:  | 
| 67091 | 295  | 
assumes a: "\<forall>x :: 'a. (x \<in> R \<longrightarrow> P x \<longrightarrow> Q x)"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
296  | 
and b: "Ball R P"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
297  | 
shows "Ball R Q"  | 
| 44921 | 298  | 
using a b by fast  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
299  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
300  | 
lemma bex_reg:  | 
| 67091 | 301  | 
assumes a: "\<forall>x :: 'a. (x \<in> R \<longrightarrow> P x \<longrightarrow> Q x)"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
302  | 
and b: "Bex R P"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
303  | 
shows "Bex R Q"  | 
| 44921 | 304  | 
using a b by fast  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
305  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
306  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
307  | 
lemma ball_all_comm:  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
308  | 
assumes "\<And>y. (\<forall>x\<in>P. A x y) \<longrightarrow> (\<forall>x. B x y)"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
309  | 
shows "(\<forall>x\<in>P. \<forall>y. A x y) \<longrightarrow> (\<forall>x. \<forall>y. B x y)"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
310  | 
using assms by auto  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
311  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
312  | 
lemma bex_ex_comm:  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
313  | 
assumes "(\<exists>y. \<exists>x. A x y) \<longrightarrow> (\<exists>y. \<exists>x\<in>P. B x y)"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
314  | 
shows "(\<exists>x. \<exists>y. A x y) \<longrightarrow> (\<exists>x\<in>P. \<exists>y. B x y)"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
315  | 
using assms by auto  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
316  | 
|
| 60758 | 317  | 
subsection \<open>Bounded abstraction\<close>  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
318  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
319  | 
definition  | 
| 
40466
 
c6587375088e
type annotations in specifications; fun_rel_def is no simp rule by default; slightly changed fun_map_def; more on predicates on relation functions; proper HOL equations in definitions
 
haftmann 
parents: 
40031 
diff
changeset
 | 
320  | 
  Babs :: "'a set \<Rightarrow> ('a \<Rightarrow> 'b) \<Rightarrow> 'a \<Rightarrow> 'b"
 | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
321  | 
where  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
322  | 
"x \<in> p \<Longrightarrow> Babs p m x = m x"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
323  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
324  | 
lemma babs_rsp:  | 
| 47308 | 325  | 
assumes q: "Quotient3 R1 Abs1 Rep1"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
326  | 
and a: "(R1 ===> R2) f g"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
327  | 
shows "(R1 ===> R2) (Babs (Respects R1) f) (Babs (Respects R1) g)"  | 
| 55945 | 328  | 
apply (auto simp add: Babs_def in_respects rel_fun_def)  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
329  | 
apply (subgoal_tac "x \<in> Respects R1 \<and> y \<in> Respects R1")  | 
| 55945 | 330  | 
using a apply (simp add: Babs_def rel_fun_def)  | 
331  | 
apply (simp add: in_respects rel_fun_def)  | 
|
| 47308 | 332  | 
using Quotient3_rel[OF q]  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
333  | 
by metis  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
334  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
335  | 
lemma babs_prs:  | 
| 47308 | 336  | 
assumes q1: "Quotient3 R1 Abs1 Rep1"  | 
337  | 
and q2: "Quotient3 R2 Abs2 Rep2"  | 
|
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
338  | 
shows "((Rep1 ---> Abs2) (Babs (Respects R1) ((Abs1 ---> Rep2) f))) = f"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
339  | 
apply (rule ext)  | 
| 
40466
 
c6587375088e
type annotations in specifications; fun_rel_def is no simp rule by default; slightly changed fun_map_def; more on predicates on relation functions; proper HOL equations in definitions
 
haftmann 
parents: 
40031 
diff
changeset
 | 
340  | 
apply (simp add:)  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
341  | 
apply (subgoal_tac "Rep1 x \<in> Respects R1")  | 
| 47308 | 342  | 
apply (simp add: Babs_def Quotient3_abs_rep[OF q1] Quotient3_abs_rep[OF q2])  | 
343  | 
apply (simp add: in_respects Quotient3_rel_rep[OF q1])  | 
|
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
344  | 
done  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
345  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
346  | 
lemma babs_simp:  | 
| 47308 | 347  | 
assumes q: "Quotient3 R1 Abs Rep"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
348  | 
shows "((R1 ===> R2) (Babs (Respects R1) f) (Babs (Respects R1) g)) = ((R1 ===> R2) f g)"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
349  | 
apply(rule iffI)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
350  | 
apply(simp_all only: babs_rsp[OF q])  | 
| 55945 | 351  | 
apply(auto simp add: Babs_def rel_fun_def)  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
352  | 
apply (subgoal_tac "x \<in> Respects R1 \<and> y \<in> Respects R1")  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
353  | 
apply(metis Babs_def)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
354  | 
apply (simp add: in_respects)  | 
| 47308 | 355  | 
using Quotient3_rel[OF q]  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
356  | 
by metis  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
357  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
358  | 
(* If a user proves that a particular functional relation  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
359  | 
is an equivalence this may be useful in regularising *)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
360  | 
lemma babs_reg_eqv:  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
361  | 
shows "equivp R \<Longrightarrow> Babs (Respects R) P = P"  | 
| 
39302
 
d7728f65b353
renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
 
nipkow 
parents: 
39198 
diff
changeset
 | 
362  | 
by (simp add: fun_eq_iff Babs_def in_respects equivp_reflp)  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
363  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
364  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
365  | 
(* 3 lemmas needed for proving repabs_inj *)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
366  | 
lemma ball_rsp:  | 
| 67399 | 367  | 
assumes a: "(R ===> (=)) f g"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
368  | 
shows "Ball (Respects R) f = Ball (Respects R) g"  | 
| 55945 | 369  | 
using a by (auto simp add: Ball_def in_respects elim: rel_funE)  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
370  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
371  | 
lemma bex_rsp:  | 
| 67399 | 372  | 
assumes a: "(R ===> (=)) f g"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
373  | 
shows "(Bex (Respects R) f = Bex (Respects R) g)"  | 
| 55945 | 374  | 
using a by (auto simp add: Bex_def in_respects elim: rel_funE)  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
375  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
376  | 
lemma bex1_rsp:  | 
| 67399 | 377  | 
assumes a: "(R ===> (=)) f g"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
378  | 
shows "Ex1 (\<lambda>x. x \<in> Respects R \<and> f x) = Ex1 (\<lambda>x. x \<in> Respects R \<and> g x)"  | 
| 55945 | 379  | 
using a by (auto elim: rel_funE simp add: Ex1_def in_respects)  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
380  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
381  | 
(* 2 lemmas needed for cleaning of quantifiers *)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
382  | 
lemma all_prs:  | 
| 47308 | 383  | 
assumes a: "Quotient3 R absf repf"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
384  | 
shows "Ball (Respects R) ((absf ---> id) f) = All f"  | 
| 47308 | 385  | 
using a unfolding Quotient3_def Ball_def in_respects id_apply comp_def map_fun_def  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
386  | 
by metis  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
387  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
388  | 
lemma ex_prs:  | 
| 47308 | 389  | 
assumes a: "Quotient3 R absf repf"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
390  | 
shows "Bex (Respects R) ((absf ---> id) f) = Ex f"  | 
| 47308 | 391  | 
using a unfolding Quotient3_def Bex_def in_respects id_apply comp_def map_fun_def  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
392  | 
by metis  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
393  | 
|
| 61799 | 394  | 
subsection \<open>\<open>Bex1_rel\<close> quantifier\<close>  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
395  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
396  | 
definition  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
397  | 
  Bex1_rel :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> ('a \<Rightarrow> bool) \<Rightarrow> bool"
 | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
398  | 
where  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
399  | 
"Bex1_rel R P \<longleftrightarrow> (\<exists>x \<in> Respects R. P x) \<and> (\<forall>x \<in> Respects R. \<forall>y \<in> Respects R. ((P x \<and> P y) \<longrightarrow> (R x y)))"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
400  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
401  | 
lemma bex1_rel_aux:  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
402  | 
"\<lbrakk>\<forall>xa ya. R xa ya \<longrightarrow> x xa = y ya; Bex1_rel R x\<rbrakk> \<Longrightarrow> Bex1_rel R y"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
403  | 
unfolding Bex1_rel_def  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
404  | 
apply (erule conjE)+  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
405  | 
apply (erule bexE)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
406  | 
apply rule  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
407  | 
apply (rule_tac x="xa" in bexI)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
408  | 
apply metis  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
409  | 
apply metis  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
410  | 
apply rule+  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
411  | 
apply (erule_tac x="xaa" in ballE)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
412  | 
prefer 2  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
413  | 
apply (metis)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
414  | 
apply (erule_tac x="ya" in ballE)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
415  | 
prefer 2  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
416  | 
apply (metis)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
417  | 
apply (metis in_respects)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
418  | 
done  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
419  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
420  | 
lemma bex1_rel_aux2:  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
421  | 
"\<lbrakk>\<forall>xa ya. R xa ya \<longrightarrow> x xa = y ya; Bex1_rel R y\<rbrakk> \<Longrightarrow> Bex1_rel R x"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
422  | 
unfolding Bex1_rel_def  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
423  | 
apply (erule conjE)+  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
424  | 
apply (erule bexE)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
425  | 
apply rule  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
426  | 
apply (rule_tac x="xa" in bexI)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
427  | 
apply metis  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
428  | 
apply metis  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
429  | 
apply rule+  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
430  | 
apply (erule_tac x="xaa" in ballE)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
431  | 
prefer 2  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
432  | 
apply (metis)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
433  | 
apply (erule_tac x="ya" in ballE)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
434  | 
prefer 2  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
435  | 
apply (metis)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
436  | 
apply (metis in_respects)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
437  | 
done  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
438  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
439  | 
lemma bex1_rel_rsp:  | 
| 47308 | 440  | 
assumes a: "Quotient3 R absf repf"  | 
| 67399 | 441  | 
shows "((R ===> (=)) ===> (=)) (Bex1_rel R) (Bex1_rel R)"  | 
| 55945 | 442  | 
apply (simp add: rel_fun_def)  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
443  | 
apply clarify  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
444  | 
apply rule  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
445  | 
apply (simp_all add: bex1_rel_aux bex1_rel_aux2)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
446  | 
apply (erule bex1_rel_aux2)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
447  | 
apply assumption  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
448  | 
done  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
449  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
450  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
451  | 
lemma ex1_prs:  | 
| 47308 | 452  | 
assumes a: "Quotient3 R absf repf"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
453  | 
shows "((absf ---> id) ---> id) (Bex1_rel R) f = Ex1 f"  | 
| 
40466
 
c6587375088e
type annotations in specifications; fun_rel_def is no simp rule by default; slightly changed fun_map_def; more on predicates on relation functions; proper HOL equations in definitions
 
haftmann 
parents: 
40031 
diff
changeset
 | 
454  | 
apply (simp add:)  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
455  | 
apply (subst Bex1_rel_def)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
456  | 
apply (subst Bex_def)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
457  | 
apply (subst Ex1_def)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
458  | 
apply simp  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
459  | 
apply rule  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
460  | 
apply (erule conjE)+  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
461  | 
apply (erule_tac exE)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
462  | 
apply (erule conjE)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
463  | 
apply (subgoal_tac "\<forall>y. R y y \<longrightarrow> f (absf y) \<longrightarrow> R x y")  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
464  | 
apply (rule_tac x="absf x" in exI)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
465  | 
apply (simp)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
466  | 
apply rule+  | 
| 47308 | 467  | 
using a unfolding Quotient3_def  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
468  | 
apply metis  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
469  | 
apply rule+  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
470  | 
apply (erule_tac x="x" in ballE)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
471  | 
apply (erule_tac x="y" in ballE)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
472  | 
apply simp  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
473  | 
apply (simp add: in_respects)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
474  | 
apply (simp add: in_respects)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
475  | 
apply (erule_tac exE)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
476  | 
apply rule  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
477  | 
apply (rule_tac x="repf x" in exI)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
478  | 
apply (simp only: in_respects)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
479  | 
apply rule  | 
| 47308 | 480  | 
apply (metis Quotient3_rel_rep[OF a])  | 
481  | 
using a unfolding Quotient3_def apply (simp)  | 
|
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
482  | 
apply rule+  | 
| 47308 | 483  | 
using a unfolding Quotient3_def in_respects  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
484  | 
apply metis  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
485  | 
done  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
486  | 
|
| 
38702
 
72fd257f4343
Quotient Package / lemma for regularization of bex1_rel for equivalence relations
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
38317 
diff
changeset
 | 
487  | 
lemma bex1_bexeq_reg:  | 
| 
 
72fd257f4343
Quotient Package / lemma for regularization of bex1_rel for equivalence relations
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
38317 
diff
changeset
 | 
488  | 
shows "(\<exists>!x\<in>Respects R. P x) \<longrightarrow> (Bex1_rel R (\<lambda>x. P x))"  | 
| 
56073
 
29e308b56d23
enhanced simplifier solver for preconditions of rewrite rule, can now deal with conjunctions
 
nipkow 
parents: 
55945 
diff
changeset
 | 
489  | 
by (auto simp add: Ex1_def Bex1_rel_def Bex_def Ball_def in_respects)  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
490  | 
|
| 
38702
 
72fd257f4343
Quotient Package / lemma for regularization of bex1_rel for equivalence relations
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
38317 
diff
changeset
 | 
491  | 
lemma bex1_bexeq_reg_eqv:  | 
| 
 
72fd257f4343
Quotient Package / lemma for regularization of bex1_rel for equivalence relations
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
38317 
diff
changeset
 | 
492  | 
assumes a: "equivp R"  | 
| 
 
72fd257f4343
Quotient Package / lemma for regularization of bex1_rel for equivalence relations
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
38317 
diff
changeset
 | 
493  | 
shows "(\<exists>!x. P x) \<longrightarrow> Bex1_rel R P"  | 
| 
 
72fd257f4343
Quotient Package / lemma for regularization of bex1_rel for equivalence relations
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
38317 
diff
changeset
 | 
494  | 
using equivp_reflp[OF a]  | 
| 
 
72fd257f4343
Quotient Package / lemma for regularization of bex1_rel for equivalence relations
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
38317 
diff
changeset
 | 
495  | 
apply (intro impI)  | 
| 
 
72fd257f4343
Quotient Package / lemma for regularization of bex1_rel for equivalence relations
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
38317 
diff
changeset
 | 
496  | 
apply (elim ex1E)  | 
| 
 
72fd257f4343
Quotient Package / lemma for regularization of bex1_rel for equivalence relations
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
38317 
diff
changeset
 | 
497  | 
apply (rule mp[OF bex1_bexeq_reg])  | 
| 
 
72fd257f4343
Quotient Package / lemma for regularization of bex1_rel for equivalence relations
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
38317 
diff
changeset
 | 
498  | 
apply (rule_tac a="x" in ex1I)  | 
| 
 
72fd257f4343
Quotient Package / lemma for regularization of bex1_rel for equivalence relations
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
38317 
diff
changeset
 | 
499  | 
apply (subst in_respects)  | 
| 
 
72fd257f4343
Quotient Package / lemma for regularization of bex1_rel for equivalence relations
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
38317 
diff
changeset
 | 
500  | 
apply (rule conjI)  | 
| 
 
72fd257f4343
Quotient Package / lemma for regularization of bex1_rel for equivalence relations
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
38317 
diff
changeset
 | 
501  | 
apply assumption  | 
| 
 
72fd257f4343
Quotient Package / lemma for regularization of bex1_rel for equivalence relations
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
38317 
diff
changeset
 | 
502  | 
apply assumption  | 
| 
 
72fd257f4343
Quotient Package / lemma for regularization of bex1_rel for equivalence relations
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
38317 
diff
changeset
 | 
503  | 
apply clarify  | 
| 
 
72fd257f4343
Quotient Package / lemma for regularization of bex1_rel for equivalence relations
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
38317 
diff
changeset
 | 
504  | 
apply (erule_tac x="xa" in allE)  | 
| 
 
72fd257f4343
Quotient Package / lemma for regularization of bex1_rel for equivalence relations
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
38317 
diff
changeset
 | 
505  | 
apply simp  | 
| 
 
72fd257f4343
Quotient Package / lemma for regularization of bex1_rel for equivalence relations
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
38317 
diff
changeset
 | 
506  | 
done  | 
| 
 
72fd257f4343
Quotient Package / lemma for regularization of bex1_rel for equivalence relations
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
38317 
diff
changeset
 | 
507  | 
|
| 60758 | 508  | 
subsection \<open>Various respects and preserve lemmas\<close>  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
509  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
510  | 
lemma quot_rel_rsp:  | 
| 47308 | 511  | 
assumes a: "Quotient3 R Abs Rep"  | 
| 67399 | 512  | 
shows "(R ===> R ===> (=)) R R"  | 
| 55945 | 513  | 
apply(rule rel_funI)+  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
514  | 
apply(rule equals_rsp[OF a])  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
515  | 
apply(assumption)+  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
516  | 
done  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
517  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
518  | 
lemma o_prs:  | 
| 47308 | 519  | 
assumes q1: "Quotient3 R1 Abs1 Rep1"  | 
520  | 
and q2: "Quotient3 R2 Abs2 Rep2"  | 
|
521  | 
and q3: "Quotient3 R3 Abs3 Rep3"  | 
|
| 67399 | 522  | 
shows "((Abs2 ---> Rep3) ---> (Abs1 ---> Rep2) ---> (Rep1 ---> Abs3)) (\<circ>) = (\<circ>)"  | 
523  | 
and "(id ---> (Abs1 ---> id) ---> Rep1 ---> id) (\<circ>) = (\<circ>)"  | 
|
| 47308 | 524  | 
using Quotient3_abs_rep[OF q1] Quotient3_abs_rep[OF q2] Quotient3_abs_rep[OF q3]  | 
| 
40466
 
c6587375088e
type annotations in specifications; fun_rel_def is no simp rule by default; slightly changed fun_map_def; more on predicates on relation functions; proper HOL equations in definitions
 
haftmann 
parents: 
40031 
diff
changeset
 | 
525  | 
by (simp_all add: fun_eq_iff)  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
526  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
527  | 
lemma o_rsp:  | 
| 67399 | 528  | 
"((R2 ===> R3) ===> (R1 ===> R2) ===> (R1 ===> R3)) (\<circ>) (\<circ>)"  | 
529  | 
"((=) ===> (R1 ===> (=)) ===> R1 ===> (=)) (\<circ>) (\<circ>)"  | 
|
| 55945 | 530  | 
by (force elim: rel_funE)+  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
531  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
532  | 
lemma cond_prs:  | 
| 47308 | 533  | 
assumes a: "Quotient3 R absf repf"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
534  | 
shows "absf (if a then repf b else repf c) = (if a then b else c)"  | 
| 47308 | 535  | 
using a unfolding Quotient3_def by auto  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
536  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
537  | 
lemma if_prs:  | 
| 47308 | 538  | 
assumes q: "Quotient3 R Abs Rep"  | 
| 
36123
 
7f877bbad5b2
add If respectfullness and preservation to Quotient package database
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
36116 
diff
changeset
 | 
539  | 
shows "(id ---> Rep ---> Rep ---> Abs) If = If"  | 
| 47308 | 540  | 
using Quotient3_abs_rep[OF q]  | 
| 
39302
 
d7728f65b353
renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
 
nipkow 
parents: 
39198 
diff
changeset
 | 
541  | 
by (auto simp add: fun_eq_iff)  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
542  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
543  | 
lemma if_rsp:  | 
| 47308 | 544  | 
assumes q: "Quotient3 R Abs Rep"  | 
| 67399 | 545  | 
shows "((=) ===> R ===> R ===> R) If If"  | 
| 44921 | 546  | 
by force  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
547  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
548  | 
lemma let_prs:  | 
| 47308 | 549  | 
assumes q1: "Quotient3 R1 Abs1 Rep1"  | 
550  | 
and q2: "Quotient3 R2 Abs2 Rep2"  | 
|
| 
37049
 
ca1c293e521e
Let rsp and prs in fun_rel/fun_map format
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
36276 
diff
changeset
 | 
551  | 
shows "(Rep2 ---> (Abs2 ---> Rep1) ---> Abs1) Let = Let"  | 
| 47308 | 552  | 
using Quotient3_abs_rep[OF q1] Quotient3_abs_rep[OF q2]  | 
| 
39302
 
d7728f65b353
renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
 
nipkow 
parents: 
39198 
diff
changeset
 | 
553  | 
by (auto simp add: fun_eq_iff)  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
554  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
555  | 
lemma let_rsp:  | 
| 
37049
 
ca1c293e521e
Let rsp and prs in fun_rel/fun_map format
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
36276 
diff
changeset
 | 
556  | 
shows "(R1 ===> (R1 ===> R2) ===> R2) Let Let"  | 
| 55945 | 557  | 
by (force elim: rel_funE)  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
558  | 
|
| 
39669
 
9e3b035841e4
quotient package: respectfulness and preservation of identity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
39302 
diff
changeset
 | 
559  | 
lemma id_rsp:  | 
| 
 
9e3b035841e4
quotient package: respectfulness and preservation of identity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
39302 
diff
changeset
 | 
560  | 
shows "(R ===> R) id id"  | 
| 44921 | 561  | 
by auto  | 
| 
39669
 
9e3b035841e4
quotient package: respectfulness and preservation of identity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
39302 
diff
changeset
 | 
562  | 
|
| 
 
9e3b035841e4
quotient package: respectfulness and preservation of identity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
39302 
diff
changeset
 | 
563  | 
lemma id_prs:  | 
| 47308 | 564  | 
assumes a: "Quotient3 R Abs Rep"  | 
| 
39669
 
9e3b035841e4
quotient package: respectfulness and preservation of identity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
39302 
diff
changeset
 | 
565  | 
shows "(Rep ---> Abs) id = id"  | 
| 47308 | 566  | 
by (simp add: fun_eq_iff Quotient3_abs_rep [OF a])  | 
| 
39669
 
9e3b035841e4
quotient package: respectfulness and preservation of identity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
39302 
diff
changeset
 | 
567  | 
|
| 
53011
 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 
kuncar 
parents: 
51112 
diff
changeset
 | 
568  | 
end  | 
| 
39669
 
9e3b035841e4
quotient package: respectfulness and preservation of identity.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
39302 
diff
changeset
 | 
569  | 
|
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
570  | 
locale quot_type =  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
571  | 
fixes R :: "'a \<Rightarrow> 'a \<Rightarrow> bool"  | 
| 
44204
 
3cdc4176638c
Quotient Package: make quotient_type work with separate set type
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
42814 
diff
changeset
 | 
572  | 
and Abs :: "'a set \<Rightarrow> 'b"  | 
| 
 
3cdc4176638c
Quotient Package: make quotient_type work with separate set type
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
42814 
diff
changeset
 | 
573  | 
and Rep :: "'b \<Rightarrow> 'a set"  | 
| 
37493
 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
37049 
diff
changeset
 | 
574  | 
assumes equivp: "part_equivp R"  | 
| 
44204
 
3cdc4176638c
Quotient Package: make quotient_type work with separate set type
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
42814 
diff
changeset
 | 
575  | 
and rep_prop: "\<And>y. \<exists>x. R x x \<and> Rep y = Collect (R x)"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
576  | 
and rep_inverse: "\<And>x. Abs (Rep x) = x"  | 
| 
44204
 
3cdc4176638c
Quotient Package: make quotient_type work with separate set type
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
42814 
diff
changeset
 | 
577  | 
and abs_inverse: "\<And>c. (\<exists>x. ((R x x) \<and> (c = Collect (R x)))) \<Longrightarrow> (Rep (Abs c)) = c"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
578  | 
and rep_inject: "\<And>x y. (Rep x = Rep y) = (x = y)"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
579  | 
begin  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
580  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
581  | 
definition  | 
| 
40466
 
c6587375088e
type annotations in specifications; fun_rel_def is no simp rule by default; slightly changed fun_map_def; more on predicates on relation functions; proper HOL equations in definitions
 
haftmann 
parents: 
40031 
diff
changeset
 | 
582  | 
abs :: "'a \<Rightarrow> 'b"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
583  | 
where  | 
| 
44204
 
3cdc4176638c
Quotient Package: make quotient_type work with separate set type
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
42814 
diff
changeset
 | 
584  | 
"abs x = Abs (Collect (R x))"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
585  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
586  | 
definition  | 
| 
40466
 
c6587375088e
type annotations in specifications; fun_rel_def is no simp rule by default; slightly changed fun_map_def; more on predicates on relation functions; proper HOL equations in definitions
 
haftmann 
parents: 
40031 
diff
changeset
 | 
587  | 
rep :: "'b \<Rightarrow> 'a"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
588  | 
where  | 
| 
44204
 
3cdc4176638c
Quotient Package: make quotient_type work with separate set type
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
42814 
diff
changeset
 | 
589  | 
"rep a = (SOME x. x \<in> Rep a)"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
590  | 
|
| 
44204
 
3cdc4176638c
Quotient Package: make quotient_type work with separate set type
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
42814 
diff
changeset
 | 
591  | 
lemma some_collect:  | 
| 
37493
 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
37049 
diff
changeset
 | 
592  | 
assumes "R r r"  | 
| 
44204
 
3cdc4176638c
Quotient Package: make quotient_type work with separate set type
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
42814 
diff
changeset
 | 
593  | 
shows "R (SOME x. x \<in> Collect (R r)) = R r"  | 
| 
 
3cdc4176638c
Quotient Package: make quotient_type work with separate set type
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
42814 
diff
changeset
 | 
594  | 
apply simp  | 
| 
 
3cdc4176638c
Quotient Package: make quotient_type work with separate set type
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
42814 
diff
changeset
 | 
595  | 
by (metis assms exE_some equivp[simplified part_equivp_def])  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
596  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
597  | 
lemma Quotient:  | 
| 47308 | 598  | 
shows "Quotient3 R abs rep"  | 
599  | 
unfolding Quotient3_def abs_def rep_def  | 
|
| 
37493
 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
37049 
diff
changeset
 | 
600  | 
proof (intro conjI allI)  | 
| 
 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
37049 
diff
changeset
 | 
601  | 
fix a r s  | 
| 
44204
 
3cdc4176638c
Quotient Package: make quotient_type work with separate set type
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
42814 
diff
changeset
 | 
602  | 
show x: "R (SOME x. x \<in> Rep a) (SOME x. x \<in> Rep a)" proof -  | 
| 
 
3cdc4176638c
Quotient Package: make quotient_type work with separate set type
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
42814 
diff
changeset
 | 
603  | 
obtain x where r: "R x x" and rep: "Rep a = Collect (R x)" using rep_prop[of a] by auto  | 
| 
 
3cdc4176638c
Quotient Package: make quotient_type work with separate set type
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
42814 
diff
changeset
 | 
604  | 
have "R (SOME x. x \<in> Rep a) x" using r rep some_collect by metis  | 
| 
 
3cdc4176638c
Quotient Package: make quotient_type work with separate set type
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
42814 
diff
changeset
 | 
605  | 
then have "R x (SOME x. x \<in> Rep a)" using part_equivp_symp[OF equivp] by fast  | 
| 
 
3cdc4176638c
Quotient Package: make quotient_type work with separate set type
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
42814 
diff
changeset
 | 
606  | 
then show "R (SOME x. x \<in> Rep a) (SOME x. x \<in> Rep a)"  | 
| 60758 | 607  | 
using part_equivp_transp[OF equivp] by (metis \<open>R (SOME x. x \<in> Rep a) x\<close>)  | 
| 
37493
 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
37049 
diff
changeset
 | 
608  | 
qed  | 
| 
44204
 
3cdc4176638c
Quotient Package: make quotient_type work with separate set type
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
42814 
diff
changeset
 | 
609  | 
have "Collect (R (SOME x. x \<in> Rep a)) = (Rep a)" by (metis some_collect rep_prop)  | 
| 
 
3cdc4176638c
Quotient Package: make quotient_type work with separate set type
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
42814 
diff
changeset
 | 
610  | 
then show "Abs (Collect (R (SOME x. x \<in> Rep a))) = a" using rep_inverse by auto  | 
| 
 
3cdc4176638c
Quotient Package: make quotient_type work with separate set type
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
42814 
diff
changeset
 | 
611  | 
have "R r r \<Longrightarrow> R s s \<Longrightarrow> Abs (Collect (R r)) = Abs (Collect (R s)) \<longleftrightarrow> R r = R s"  | 
| 44242 | 612  | 
proof -  | 
613  | 
assume "R r r" and "R s s"  | 
|
614  | 
then have "Abs (Collect (R r)) = Abs (Collect (R s)) \<longleftrightarrow> Collect (R r) = Collect (R s)"  | 
|
615  | 
by (metis abs_inverse)  | 
|
616  | 
also have "Collect (R r) = Collect (R s) \<longleftrightarrow> (\<lambda>A x. x \<in> A) (Collect (R r)) = (\<lambda>A x. x \<in> A) (Collect (R s))"  | 
|
617  | 
by rule simp_all  | 
|
618  | 
finally show "Abs (Collect (R r)) = Abs (Collect (R s)) \<longleftrightarrow> R r = R s" by simp  | 
|
619  | 
qed  | 
|
| 
44204
 
3cdc4176638c
Quotient Package: make quotient_type work with separate set type
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
42814 
diff
changeset
 | 
620  | 
then show "R r s \<longleftrightarrow> R r r \<and> R s s \<and> (Abs (Collect (R r)) = Abs (Collect (R s)))"  | 
| 
 
3cdc4176638c
Quotient Package: make quotient_type work with separate set type
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
42814 
diff
changeset
 | 
621  | 
using equivp[simplified part_equivp_def] by metis  | 
| 
 
3cdc4176638c
Quotient Package: make quotient_type work with separate set type
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
42814 
diff
changeset
 | 
622  | 
qed  | 
| 44242 | 623  | 
|
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
624  | 
end  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
625  | 
|
| 60758 | 626  | 
subsection \<open>Quotient composition\<close>  | 
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
627  | 
|
| 47308 | 628  | 
lemma OOO_quotient3:  | 
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
629  | 
fixes R1 :: "'a \<Rightarrow> 'a \<Rightarrow> bool"  | 
| 
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
630  | 
fixes Abs1 :: "'a \<Rightarrow> 'b" and Rep1 :: "'b \<Rightarrow> 'a"  | 
| 
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
631  | 
fixes Abs2 :: "'b \<Rightarrow> 'c" and Rep2 :: "'c \<Rightarrow> 'b"  | 
| 
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
632  | 
fixes R2' :: "'a \<Rightarrow> 'a \<Rightarrow> bool"  | 
| 
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
633  | 
fixes R2 :: "'b \<Rightarrow> 'b \<Rightarrow> bool"  | 
| 47308 | 634  | 
assumes R1: "Quotient3 R1 Abs1 Rep1"  | 
635  | 
assumes R2: "Quotient3 R2 Abs2 Rep2"  | 
|
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
636  | 
assumes Abs1: "\<And>x y. R2' x y \<Longrightarrow> R1 x x \<Longrightarrow> R1 y y \<Longrightarrow> R2 (Abs1 x) (Abs1 y)"  | 
| 
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
637  | 
assumes Rep1: "\<And>x y. R2 x y \<Longrightarrow> R2' (Rep1 x) (Rep1 y)"  | 
| 47308 | 638  | 
shows "Quotient3 (R1 OO R2' OO R1) (Abs2 \<circ> Abs1) (Rep1 \<circ> Rep2)"  | 
639  | 
apply (rule Quotient3I)  | 
|
640  | 
apply (simp add: o_def Quotient3_abs_rep [OF R2] Quotient3_abs_rep [OF R1])  | 
|
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
641  | 
apply simp  | 
| 
47434
 
b75ce48a93ee
dropped abbreviation "pred_comp"; introduced infix notation "P OO Q" for "relcompp P Q"
 
griff 
parents: 
47105 
diff
changeset
 | 
642  | 
apply (rule_tac b="Rep1 (Rep2 a)" in relcomppI)  | 
| 47308 | 643  | 
apply (rule Quotient3_rep_reflp [OF R1])  | 
| 
47434
 
b75ce48a93ee
dropped abbreviation "pred_comp"; introduced infix notation "P OO Q" for "relcompp P Q"
 
griff 
parents: 
47105 
diff
changeset
 | 
644  | 
apply (rule_tac b="Rep1 (Rep2 a)" in relcomppI [rotated])  | 
| 47308 | 645  | 
apply (rule Quotient3_rep_reflp [OF R1])  | 
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
646  | 
apply (rule Rep1)  | 
| 47308 | 647  | 
apply (rule Quotient3_rep_reflp [OF R2])  | 
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
648  | 
apply safe  | 
| 
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
649  | 
apply (rename_tac x y)  | 
| 
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
650  | 
apply (drule Abs1)  | 
| 47308 | 651  | 
apply (erule Quotient3_refl2 [OF R1])  | 
652  | 
apply (erule Quotient3_refl1 [OF R1])  | 
|
653  | 
apply (drule Quotient3_refl1 [OF R2], drule Rep1)  | 
|
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
654  | 
apply (subgoal_tac "R1 r (Rep1 (Abs1 x))")  | 
| 
47434
 
b75ce48a93ee
dropped abbreviation "pred_comp"; introduced infix notation "P OO Q" for "relcompp P Q"
 
griff 
parents: 
47105 
diff
changeset
 | 
655  | 
apply (rule_tac b="Rep1 (Abs1 x)" in relcomppI, assumption)  | 
| 
 
b75ce48a93ee
dropped abbreviation "pred_comp"; introduced infix notation "P OO Q" for "relcompp P Q"
 
griff 
parents: 
47105 
diff
changeset
 | 
656  | 
apply (erule relcomppI)  | 
| 47308 | 657  | 
apply (erule Quotient3_symp [OF R1, THEN sympD])  | 
658  | 
apply (rule Quotient3_rel[symmetric, OF R1, THEN iffD2])  | 
|
659  | 
apply (rule conjI, erule Quotient3_refl1 [OF R1])  | 
|
660  | 
apply (rule conjI, rule Quotient3_rep_reflp [OF R1])  | 
|
661  | 
apply (subst Quotient3_abs_rep [OF R1])  | 
|
662  | 
apply (erule Quotient3_rel_abs [OF R1])  | 
|
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
663  | 
apply (rename_tac x y)  | 
| 
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
664  | 
apply (drule Abs1)  | 
| 47308 | 665  | 
apply (erule Quotient3_refl2 [OF R1])  | 
666  | 
apply (erule Quotient3_refl1 [OF R1])  | 
|
667  | 
apply (drule Quotient3_refl2 [OF R2], drule Rep1)  | 
|
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
668  | 
apply (subgoal_tac "R1 s (Rep1 (Abs1 y))")  | 
| 
47434
 
b75ce48a93ee
dropped abbreviation "pred_comp"; introduced infix notation "P OO Q" for "relcompp P Q"
 
griff 
parents: 
47105 
diff
changeset
 | 
669  | 
apply (rule_tac b="Rep1 (Abs1 y)" in relcomppI, assumption)  | 
| 
 
b75ce48a93ee
dropped abbreviation "pred_comp"; introduced infix notation "P OO Q" for "relcompp P Q"
 
griff 
parents: 
47105 
diff
changeset
 | 
670  | 
apply (erule relcomppI)  | 
| 47308 | 671  | 
apply (erule Quotient3_symp [OF R1, THEN sympD])  | 
672  | 
apply (rule Quotient3_rel[symmetric, OF R1, THEN iffD2])  | 
|
673  | 
apply (rule conjI, erule Quotient3_refl2 [OF R1])  | 
|
674  | 
apply (rule conjI, rule Quotient3_rep_reflp [OF R1])  | 
|
675  | 
apply (subst Quotient3_abs_rep [OF R1])  | 
|
676  | 
apply (erule Quotient3_rel_abs [OF R1, THEN sym])  | 
|
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
677  | 
apply simp  | 
| 47308 | 678  | 
apply (rule Quotient3_rel_abs [OF R2])  | 
679  | 
apply (rule Quotient3_rel_abs [OF R1, THEN ssubst], assumption)  | 
|
680  | 
apply (rule Quotient3_rel_abs [OF R1, THEN subst], assumption)  | 
|
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
681  | 
apply (erule Abs1)  | 
| 47308 | 682  | 
apply (erule Quotient3_refl2 [OF R1])  | 
683  | 
apply (erule Quotient3_refl1 [OF R1])  | 
|
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
684  | 
apply (rename_tac a b c d)  | 
| 
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
685  | 
apply simp  | 
| 
47434
 
b75ce48a93ee
dropped abbreviation "pred_comp"; introduced infix notation "P OO Q" for "relcompp P Q"
 
griff 
parents: 
47105 
diff
changeset
 | 
686  | 
apply (rule_tac b="Rep1 (Abs1 r)" in relcomppI)  | 
| 47308 | 687  | 
apply (rule Quotient3_rel[symmetric, OF R1, THEN iffD2])  | 
688  | 
apply (rule conjI, erule Quotient3_refl1 [OF R1])  | 
|
689  | 
apply (simp add: Quotient3_abs_rep [OF R1] Quotient3_rep_reflp [OF R1])  | 
|
| 
47434
 
b75ce48a93ee
dropped abbreviation "pred_comp"; introduced infix notation "P OO Q" for "relcompp P Q"
 
griff 
parents: 
47105 
diff
changeset
 | 
690  | 
apply (rule_tac b="Rep1 (Abs1 s)" in relcomppI [rotated])  | 
| 47308 | 691  | 
apply (rule Quotient3_rel[symmetric, OF R1, THEN iffD2])  | 
692  | 
apply (simp add: Quotient3_abs_rep [OF R1] Quotient3_rep_reflp [OF R1])  | 
|
693  | 
apply (erule Quotient3_refl2 [OF R1])  | 
|
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
694  | 
apply (rule Rep1)  | 
| 
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
695  | 
apply (drule Abs1)  | 
| 47308 | 696  | 
apply (erule Quotient3_refl2 [OF R1])  | 
697  | 
apply (erule Quotient3_refl1 [OF R1])  | 
|
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
698  | 
apply (drule Abs1)  | 
| 47308 | 699  | 
apply (erule Quotient3_refl2 [OF R1])  | 
700  | 
apply (erule Quotient3_refl1 [OF R1])  | 
|
701  | 
apply (drule Quotient3_rel_abs [OF R1])  | 
|
702  | 
apply (drule Quotient3_rel_abs [OF R1])  | 
|
703  | 
apply (drule Quotient3_rel_abs [OF R1])  | 
|
704  | 
apply (drule Quotient3_rel_abs [OF R1])  | 
|
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
705  | 
apply simp  | 
| 47308 | 706  | 
apply (rule Quotient3_rel[symmetric, OF R2, THEN iffD2])  | 
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
707  | 
apply simp  | 
| 
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
708  | 
done  | 
| 
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
709  | 
|
| 47308 | 710  | 
lemma OOO_eq_quotient3:  | 
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
711  | 
fixes R1 :: "'a \<Rightarrow> 'a \<Rightarrow> bool"  | 
| 
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
712  | 
fixes Abs1 :: "'a \<Rightarrow> 'b" and Rep1 :: "'b \<Rightarrow> 'a"  | 
| 
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
713  | 
fixes Abs2 :: "'b \<Rightarrow> 'c" and Rep2 :: "'c \<Rightarrow> 'b"  | 
| 47308 | 714  | 
assumes R1: "Quotient3 R1 Abs1 Rep1"  | 
| 67399 | 715  | 
assumes R2: "Quotient3 (=) Abs2 Rep2"  | 
716  | 
shows "Quotient3 (R1 OOO (=)) (Abs2 \<circ> Abs1) (Rep1 \<circ> Rep2)"  | 
|
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
717  | 
using assms  | 
| 47308 | 718  | 
by (rule OOO_quotient3) auto  | 
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
719  | 
|
| 60758 | 720  | 
subsection \<open>Quotient3 to Quotient\<close>  | 
| 
47362
 
b1f099bdfbba
connect the Quotient package to the Lifting package
 
kuncar 
parents: 
47361 
diff
changeset
 | 
721  | 
|
| 
 
b1f099bdfbba
connect the Quotient package to the Lifting package
 
kuncar 
parents: 
47361 
diff
changeset
 | 
722  | 
lemma Quotient3_to_Quotient:  | 
| 
 
b1f099bdfbba
connect the Quotient package to the Lifting package
 
kuncar 
parents: 
47361 
diff
changeset
 | 
723  | 
assumes "Quotient3 R Abs Rep"  | 
| 
 
b1f099bdfbba
connect the Quotient package to the Lifting package
 
kuncar 
parents: 
47361 
diff
changeset
 | 
724  | 
and "T \<equiv> \<lambda>x y. R x x \<and> Abs x = y"  | 
| 
 
b1f099bdfbba
connect the Quotient package to the Lifting package
 
kuncar 
parents: 
47361 
diff
changeset
 | 
725  | 
shows "Quotient R Abs Rep T"  | 
| 
 
b1f099bdfbba
connect the Quotient package to the Lifting package
 
kuncar 
parents: 
47361 
diff
changeset
 | 
726  | 
using assms unfolding Quotient3_def by (intro QuotientI) blast+  | 
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
727  | 
|
| 
47362
 
b1f099bdfbba
connect the Quotient package to the Lifting package
 
kuncar 
parents: 
47361 
diff
changeset
 | 
728  | 
lemma Quotient3_to_Quotient_equivp:  | 
| 
 
b1f099bdfbba
connect the Quotient package to the Lifting package
 
kuncar 
parents: 
47361 
diff
changeset
 | 
729  | 
assumes q: "Quotient3 R Abs Rep"  | 
| 
 
b1f099bdfbba
connect the Quotient package to the Lifting package
 
kuncar 
parents: 
47361 
diff
changeset
 | 
730  | 
and T_def: "T \<equiv> \<lambda>x y. Abs x = y"  | 
| 
 
b1f099bdfbba
connect the Quotient package to the Lifting package
 
kuncar 
parents: 
47361 
diff
changeset
 | 
731  | 
and eR: "equivp R"  | 
| 
 
b1f099bdfbba
connect the Quotient package to the Lifting package
 
kuncar 
parents: 
47361 
diff
changeset
 | 
732  | 
shows "Quotient R Abs Rep T"  | 
| 
 
b1f099bdfbba
connect the Quotient package to the Lifting package
 
kuncar 
parents: 
47361 
diff
changeset
 | 
733  | 
proof (intro QuotientI)  | 
| 
 
b1f099bdfbba
connect the Quotient package to the Lifting package
 
kuncar 
parents: 
47361 
diff
changeset
 | 
734  | 
fix a  | 
| 
 
b1f099bdfbba
connect the Quotient package to the Lifting package
 
kuncar 
parents: 
47361 
diff
changeset
 | 
735  | 
show "Abs (Rep a) = a" using q by(rule Quotient3_abs_rep)  | 
| 
 
b1f099bdfbba
connect the Quotient package to the Lifting package
 
kuncar 
parents: 
47361 
diff
changeset
 | 
736  | 
next  | 
| 
 
b1f099bdfbba
connect the Quotient package to the Lifting package
 
kuncar 
parents: 
47361 
diff
changeset
 | 
737  | 
fix a  | 
| 
 
b1f099bdfbba
connect the Quotient package to the Lifting package
 
kuncar 
parents: 
47361 
diff
changeset
 | 
738  | 
show "R (Rep a) (Rep a)" using q by(rule Quotient3_rep_reflp)  | 
| 
 
b1f099bdfbba
connect the Quotient package to the Lifting package
 
kuncar 
parents: 
47361 
diff
changeset
 | 
739  | 
next  | 
| 
 
b1f099bdfbba
connect the Quotient package to the Lifting package
 
kuncar 
parents: 
47361 
diff
changeset
 | 
740  | 
fix r s  | 
| 
 
b1f099bdfbba
connect the Quotient package to the Lifting package
 
kuncar 
parents: 
47361 
diff
changeset
 | 
741  | 
show "R r s = (R r r \<and> R s s \<and> Abs r = Abs s)" using q by(rule Quotient3_rel[symmetric])  | 
| 
 
b1f099bdfbba
connect the Quotient package to the Lifting package
 
kuncar 
parents: 
47361 
diff
changeset
 | 
742  | 
next  | 
| 
 
b1f099bdfbba
connect the Quotient package to the Lifting package
 
kuncar 
parents: 
47361 
diff
changeset
 | 
743  | 
show "T = (\<lambda>x y. R x x \<and> Abs x = y)" using T_def equivp_reflp[OF eR] by simp  | 
| 
47096
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
744  | 
qed  | 
| 
 
3ea48c19673e
generation of a code certificate from a respectfulness theorem for constants lifted by the quotient_definition command & setup_lifting command: setups Quotient infrastructure from a typedef theorem
 
kuncar 
parents: 
47094 
diff
changeset
 | 
745  | 
|
| 60758 | 746  | 
subsection \<open>ML setup\<close>  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
747  | 
|
| 60758 | 748  | 
text \<open>Auxiliary data for the quotient package\<close>  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
749  | 
|
| 57960 | 750  | 
named_theorems quot_equiv "equivalence relation theorems"  | 
| 59028 | 751  | 
and quot_respect "respectfulness theorems"  | 
752  | 
and quot_preserve "preservation theorems"  | 
|
753  | 
and id_simps "identity simp rules for maps"  | 
|
754  | 
and quot_thm "quotient theorems"  | 
|
| 48891 | 755  | 
ML_file "Tools/Quotient/quotient_info.ML"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
756  | 
|
| 55945 | 757  | 
declare [[mapQ3 "fun" = (rel_fun, fun_quotient3)]]  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
758  | 
|
| 47308 | 759  | 
lemmas [quot_thm] = fun_quotient3  | 
| 
44553
 
4d39b032a021
avoid intermixing set and predicates; dropped lemmas mem_rsp and mem_prs (now in Quotient_Set.thy)
 
haftmann 
parents: 
44413 
diff
changeset
 | 
760  | 
lemmas [quot_respect] = quot_rel_rsp if_rsp o_rsp let_rsp id_rsp  | 
| 
 
4d39b032a021
avoid intermixing set and predicates; dropped lemmas mem_rsp and mem_prs (now in Quotient_Set.thy)
 
haftmann 
parents: 
44413 
diff
changeset
 | 
761  | 
lemmas [quot_preserve] = if_prs o_prs let_prs id_prs  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
762  | 
lemmas [quot_equiv] = identity_equivp  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
763  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
764  | 
|
| 60758 | 765  | 
text \<open>Lemmas about simplifying id's.\<close>  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
766  | 
lemmas [id_simps] =  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
767  | 
id_def[symmetric]  | 
| 40602 | 768  | 
map_fun_id  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
769  | 
id_apply  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
770  | 
id_o  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
771  | 
o_id  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
772  | 
eq_comp_r  | 
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
44242 
diff
changeset
 | 
773  | 
vimage_id  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
774  | 
|
| 60758 | 775  | 
text \<open>Translation functions for the lifting process.\<close>  | 
| 48891 | 776  | 
ML_file "Tools/Quotient/quotient_term.ML"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
777  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
778  | 
|
| 60758 | 779  | 
text \<open>Definitions of the quotient types.\<close>  | 
| 48891 | 780  | 
ML_file "Tools/Quotient/quotient_type.ML"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
781  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
782  | 
|
| 60758 | 783  | 
text \<open>Definitions for quotient constants.\<close>  | 
| 48891 | 784  | 
ML_file "Tools/Quotient/quotient_def.ML"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
785  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
786  | 
|
| 60758 | 787  | 
text \<open>  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
788  | 
An auxiliary constant for recording some information  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
789  | 
about the lifted theorem in a tactic.  | 
| 60758 | 790  | 
\<close>  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
791  | 
definition  | 
| 
40466
 
c6587375088e
type annotations in specifications; fun_rel_def is no simp rule by default; slightly changed fun_map_def; more on predicates on relation functions; proper HOL equations in definitions
 
haftmann 
parents: 
40031 
diff
changeset
 | 
792  | 
Quot_True :: "'a \<Rightarrow> bool"  | 
| 
 
c6587375088e
type annotations in specifications; fun_rel_def is no simp rule by default; slightly changed fun_map_def; more on predicates on relation functions; proper HOL equations in definitions
 
haftmann 
parents: 
40031 
diff
changeset
 | 
793  | 
where  | 
| 
 
c6587375088e
type annotations in specifications; fun_rel_def is no simp rule by default; slightly changed fun_map_def; more on predicates on relation functions; proper HOL equations in definitions
 
haftmann 
parents: 
40031 
diff
changeset
 | 
794  | 
"Quot_True x \<longleftrightarrow> True"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
795  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
796  | 
lemma  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
797  | 
shows QT_all: "Quot_True (All P) \<Longrightarrow> Quot_True P"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
798  | 
and QT_ex: "Quot_True (Ex P) \<Longrightarrow> Quot_True P"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
799  | 
and QT_ex1: "Quot_True (Ex1 P) \<Longrightarrow> Quot_True P"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
800  | 
and QT_lam: "Quot_True (\<lambda>x. P x) \<Longrightarrow> (\<And>x. Quot_True (P x))"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
801  | 
and QT_ext: "(\<And>x. Quot_True (a x) \<Longrightarrow> f x = g x) \<Longrightarrow> (Quot_True a \<Longrightarrow> f = g)"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
802  | 
by (simp_all add: Quot_True_def ext)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
803  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
804  | 
lemma QT_imp: "Quot_True a \<equiv> Quot_True b"  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
805  | 
by (simp add: Quot_True_def)  | 
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
806  | 
|
| 63343 | 807  | 
context includes lifting_syntax  | 
| 
53011
 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 
kuncar 
parents: 
51112 
diff
changeset
 | 
808  | 
begin  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
809  | 
|
| 60758 | 810  | 
text \<open>Tactics for proving the lifted theorems\<close>  | 
| 48891 | 811  | 
ML_file "Tools/Quotient/quotient_tacs.ML"  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
812  | 
|
| 
53011
 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 
kuncar 
parents: 
51112 
diff
changeset
 | 
813  | 
end  | 
| 
 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 
kuncar 
parents: 
51112 
diff
changeset
 | 
814  | 
|
| 60758 | 815  | 
subsection \<open>Methods / Interface\<close>  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
816  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
817  | 
method_setup lifting =  | 
| 60758 | 818  | 
\<open>Attrib.thms >> (fn thms => fn ctxt =>  | 
819  | 
SIMPLE_METHOD' (Quotient_Tacs.lift_tac ctxt [] thms))\<close>  | 
|
820  | 
\<open>lift theorems to quotient types\<close>  | 
|
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
821  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
822  | 
method_setup lifting_setup =  | 
| 60758 | 823  | 
\<open>Attrib.thm >> (fn thm => fn ctxt =>  | 
824  | 
SIMPLE_METHOD' (Quotient_Tacs.lift_procedure_tac ctxt [] thm))\<close>  | 
|
825  | 
\<open>set up the three goals for the quotient lifting procedure\<close>  | 
|
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
826  | 
|
| 
37593
 
2505feaf2d70
separated the lifting and descending procedures in the quotient package
 
Christian Urban <urbanc@in.tum.de> 
parents: 
37564 
diff
changeset
 | 
827  | 
method_setup descending =  | 
| 60758 | 828  | 
\<open>Scan.succeed (fn ctxt => SIMPLE_METHOD' (Quotient_Tacs.descend_tac ctxt []))\<close>  | 
829  | 
\<open>decend theorems to the raw level\<close>  | 
|
| 
37593
 
2505feaf2d70
separated the lifting and descending procedures in the quotient package
 
Christian Urban <urbanc@in.tum.de> 
parents: 
37564 
diff
changeset
 | 
830  | 
|
| 
 
2505feaf2d70
separated the lifting and descending procedures in the quotient package
 
Christian Urban <urbanc@in.tum.de> 
parents: 
37564 
diff
changeset
 | 
831  | 
method_setup descending_setup =  | 
| 60758 | 832  | 
\<open>Scan.succeed (fn ctxt => SIMPLE_METHOD' (Quotient_Tacs.descend_procedure_tac ctxt []))\<close>  | 
833  | 
\<open>set up the three goals for the decending theorems\<close>  | 
|
| 
37593
 
2505feaf2d70
separated the lifting and descending procedures in the quotient package
 
Christian Urban <urbanc@in.tum.de> 
parents: 
37564 
diff
changeset
 | 
834  | 
|
| 
45782
 
f82020ca3248
added a specific tactic and method that deal with partial equivalence relations
 
Christian Urban <urbanc@in.tum.de> 
parents: 
45680 
diff
changeset
 | 
835  | 
method_setup partiality_descending =  | 
| 60758 | 836  | 
\<open>Scan.succeed (fn ctxt => SIMPLE_METHOD' (Quotient_Tacs.partiality_descend_tac ctxt []))\<close>  | 
837  | 
\<open>decend theorems to the raw level\<close>  | 
|
| 
45782
 
f82020ca3248
added a specific tactic and method that deal with partial equivalence relations
 
Christian Urban <urbanc@in.tum.de> 
parents: 
45680 
diff
changeset
 | 
838  | 
|
| 
 
f82020ca3248
added a specific tactic and method that deal with partial equivalence relations
 
Christian Urban <urbanc@in.tum.de> 
parents: 
45680 
diff
changeset
 | 
839  | 
method_setup partiality_descending_setup =  | 
| 60758 | 840  | 
\<open>Scan.succeed (fn ctxt =>  | 
841  | 
SIMPLE_METHOD' (Quotient_Tacs.partiality_descend_procedure_tac ctxt []))\<close>  | 
|
842  | 
\<open>set up the three goals for the decending theorems\<close>  | 
|
| 
45782
 
f82020ca3248
added a specific tactic and method that deal with partial equivalence relations
 
Christian Urban <urbanc@in.tum.de> 
parents: 
45680 
diff
changeset
 | 
843  | 
|
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
844  | 
method_setup regularize =  | 
| 60758 | 845  | 
\<open>Scan.succeed (fn ctxt => SIMPLE_METHOD' (Quotient_Tacs.regularize_tac ctxt))\<close>  | 
846  | 
\<open>prove the regularization goals from the quotient lifting procedure\<close>  | 
|
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
847  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
848  | 
method_setup injection =  | 
| 60758 | 849  | 
\<open>Scan.succeed (fn ctxt => SIMPLE_METHOD' (Quotient_Tacs.all_injection_tac ctxt))\<close>  | 
850  | 
\<open>prove the rep/abs injection goals from the quotient lifting procedure\<close>  | 
|
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
851  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
852  | 
method_setup cleaning =  | 
| 60758 | 853  | 
\<open>Scan.succeed (fn ctxt => SIMPLE_METHOD' (Quotient_Tacs.clean_tac ctxt))\<close>  | 
854  | 
\<open>prove the cleaning goals from the quotient lifting procedure\<close>  | 
|
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
855  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
856  | 
attribute_setup quot_lifted =  | 
| 60758 | 857  | 
\<open>Scan.succeed Quotient_Tacs.lifted_attrib\<close>  | 
858  | 
\<open>lift theorems to quotient types\<close>  | 
|
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
859  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
860  | 
no_notation  | 
| 
53011
 
aeee0a4be6cf
introduce locale with syntax for fun_rel and map_fun and make thus ===> and ---> local
 
kuncar 
parents: 
51112 
diff
changeset
 | 
861  | 
rel_conj (infixr "OOO" 75)  | 
| 
35222
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
862  | 
|
| 
 
4f1fba00f66d
Initial version of HOL quotient package.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
863  | 
end  | 
| 
47488
 
be6dd389639d
centralized enriched_type declaration, thanks to in-situ available Isar commands
 
haftmann 
parents: 
47436 
diff
changeset
 | 
864  |