| author | wenzelm | 
| Mon, 24 Jun 2019 16:26:25 +0200 | |
| changeset 70359 | 470d4f145e4c | 
| parent 67399 | eab6ce8368fa | 
| permissions | -rw-r--r-- | 
| 47455 | 1  | 
(* Title: HOL/Library/Quotient_Set.thy  | 
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
2  | 
Author: Cezary Kaliszyk and Christian Urban  | 
| 
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
3  | 
*)  | 
| 
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
4  | 
|
| 60500 | 5  | 
section \<open>Quotient infrastructure for the set type\<close>  | 
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
6  | 
|
| 
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
7  | 
theory Quotient_Set  | 
| 62954 | 8  | 
imports Quotient_Syntax  | 
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
9  | 
begin  | 
| 
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
10  | 
|
| 60500 | 11  | 
subsection \<open>Contravariant set map (vimage) and set relator, rules for the Quotient package\<close>  | 
| 
47626
 
f7b1034cb9ce
move definition of set_rel into Library/Quotient_Set.thy
 
huffman 
parents: 
47455 
diff
changeset
 | 
12  | 
|
| 55940 | 13  | 
definition "rel_vset R xs ys \<equiv> \<forall>x y. R x y \<longrightarrow> x \<in> xs \<longleftrightarrow> y \<in> ys"  | 
| 
47626
 
f7b1034cb9ce
move definition of set_rel into Library/Quotient_Set.thy
 
huffman 
parents: 
47455 
diff
changeset
 | 
14  | 
|
| 55940 | 15  | 
lemma rel_vset_eq [id_simps]:  | 
| 67399 | 16  | 
"rel_vset (=) = (=)"  | 
| 55940 | 17  | 
by (subst fun_eq_iff, subst fun_eq_iff) (simp add: set_eq_iff rel_vset_def)  | 
| 
47626
 
f7b1034cb9ce
move definition of set_rel into Library/Quotient_Set.thy
 
huffman 
parents: 
47455 
diff
changeset
 | 
18  | 
|
| 55940 | 19  | 
lemma rel_vset_equivp:  | 
| 
47626
 
f7b1034cb9ce
move definition of set_rel into Library/Quotient_Set.thy
 
huffman 
parents: 
47455 
diff
changeset
 | 
20  | 
assumes e: "equivp R"  | 
| 55940 | 21  | 
shows "rel_vset R xs ys \<longleftrightarrow> xs = ys \<and> (\<forall>x y. x \<in> xs \<longrightarrow> R x y \<longrightarrow> y \<in> xs)"  | 
22  | 
unfolding rel_vset_def  | 
|
| 
47626
 
f7b1034cb9ce
move definition of set_rel into Library/Quotient_Set.thy
 
huffman 
parents: 
47455 
diff
changeset
 | 
23  | 
using equivp_reflp[OF e]  | 
| 
 
f7b1034cb9ce
move definition of set_rel into Library/Quotient_Set.thy
 
huffman 
parents: 
47455 
diff
changeset
 | 
24  | 
by auto (metis, metis equivp_symp[OF e])  | 
| 
 
f7b1034cb9ce
move definition of set_rel into Library/Quotient_Set.thy
 
huffman 
parents: 
47455 
diff
changeset
 | 
25  | 
|
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
26  | 
lemma set_quotient [quot_thm]:  | 
| 47308 | 27  | 
assumes "Quotient3 R Abs Rep"  | 
| 55940 | 28  | 
shows "Quotient3 (rel_vset R) (vimage Rep) (vimage Abs)"  | 
| 47308 | 29  | 
proof (rule Quotient3I)  | 
30  | 
from assms have "\<And>x. Abs (Rep x) = x" by (rule Quotient3_abs_rep)  | 
|
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
31  | 
then show "\<And>xs. Rep -` (Abs -` xs) = xs"  | 
| 
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
32  | 
unfolding vimage_def by auto  | 
| 
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
33  | 
next  | 
| 55940 | 34  | 
show "\<And>xs. rel_vset R (Abs -` xs) (Abs -` xs)"  | 
35  | 
unfolding rel_vset_def vimage_def  | 
|
| 47308 | 36  | 
by auto (metis Quotient3_rel_abs[OF assms])+  | 
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
37  | 
next  | 
| 
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
38  | 
fix r s  | 
| 55940 | 39  | 
show "rel_vset R r s = (rel_vset R r r \<and> rel_vset R s s \<and> Rep -` r = Rep -` s)"  | 
40  | 
unfolding rel_vset_def vimage_def set_eq_iff  | 
|
| 47308 | 41  | 
by auto (metis rep_abs_rsp[OF assms] assms[simplified Quotient3_def])+  | 
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
42  | 
qed  | 
| 
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
43  | 
|
| 55940 | 44  | 
declare [[mapQ3 set = (rel_vset, set_quotient)]]  | 
| 47094 | 45  | 
|
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
46  | 
lemma empty_set_rsp[quot_respect]:  | 
| 55940 | 47  | 
  "rel_vset R {} {}"
 | 
48  | 
unfolding rel_vset_def by simp  | 
|
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
49  | 
|
| 
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
50  | 
lemma collect_rsp[quot_respect]:  | 
| 47308 | 51  | 
assumes "Quotient3 R Abs Rep"  | 
| 67399 | 52  | 
shows "((R ===> (=)) ===> rel_vset R) Collect Collect"  | 
| 55945 | 53  | 
by (intro rel_funI) (simp add: rel_fun_def rel_vset_def)  | 
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
54  | 
|
| 
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
55  | 
lemma collect_prs[quot_preserve]:  | 
| 47308 | 56  | 
assumes "Quotient3 R Abs Rep"  | 
| 67399 | 57  | 
shows "((Abs ---> id) ---> (-`) Rep) Collect = Collect"  | 
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
58  | 
unfolding fun_eq_iff  | 
| 47308 | 59  | 
by (simp add: Quotient3_abs_rep[OF assms])  | 
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
60  | 
|
| 
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
61  | 
lemma union_rsp[quot_respect]:  | 
| 47308 | 62  | 
assumes "Quotient3 R Abs Rep"  | 
| 67399 | 63  | 
shows "(rel_vset R ===> rel_vset R ===> rel_vset R) (\<union>) (\<union>)"  | 
| 55945 | 64  | 
by (intro rel_funI) (simp add: rel_vset_def)  | 
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
65  | 
|
| 
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
66  | 
lemma union_prs[quot_preserve]:  | 
| 47308 | 67  | 
assumes "Quotient3 R Abs Rep"  | 
| 67399 | 68  | 
shows "((-`) Abs ---> (-`) Abs ---> (-`) Rep) (\<union>) = (\<union>)"  | 
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
69  | 
unfolding fun_eq_iff  | 
| 47308 | 70  | 
by (simp add: Quotient3_abs_rep[OF set_quotient[OF assms]])  | 
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
71  | 
|
| 
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
72  | 
lemma diff_rsp[quot_respect]:  | 
| 47308 | 73  | 
assumes "Quotient3 R Abs Rep"  | 
| 67399 | 74  | 
shows "(rel_vset R ===> rel_vset R ===> rel_vset R) (-) (-)"  | 
| 55945 | 75  | 
by (intro rel_funI) (simp add: rel_vset_def)  | 
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
76  | 
|
| 
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
77  | 
lemma diff_prs[quot_preserve]:  | 
| 47308 | 78  | 
assumes "Quotient3 R Abs Rep"  | 
| 67399 | 79  | 
shows "((-`) Abs ---> (-`) Abs ---> (-`) Rep) (-) = (-)"  | 
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
80  | 
unfolding fun_eq_iff  | 
| 47308 | 81  | 
by (simp add: Quotient3_abs_rep[OF set_quotient[OF assms]] vimage_Diff)  | 
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
82  | 
|
| 
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
83  | 
lemma inter_rsp[quot_respect]:  | 
| 47308 | 84  | 
assumes "Quotient3 R Abs Rep"  | 
| 67399 | 85  | 
shows "(rel_vset R ===> rel_vset R ===> rel_vset R) (\<inter>) (\<inter>)"  | 
| 55945 | 86  | 
by (intro rel_funI) (auto simp add: rel_vset_def)  | 
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
87  | 
|
| 
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
88  | 
lemma inter_prs[quot_preserve]:  | 
| 47308 | 89  | 
assumes "Quotient3 R Abs Rep"  | 
| 67399 | 90  | 
shows "((-`) Abs ---> (-`) Abs ---> (-`) Rep) (\<inter>) = (\<inter>)"  | 
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
91  | 
unfolding fun_eq_iff  | 
| 47308 | 92  | 
by (simp add: Quotient3_abs_rep[OF set_quotient[OF assms]])  | 
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
93  | 
|
| 
44459
 
079ccfb074d9
Quotient Package: add mem_rsp, mem_prs, tune proofs.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
44413 
diff
changeset
 | 
94  | 
lemma mem_prs[quot_preserve]:  | 
| 47308 | 95  | 
assumes "Quotient3 R Abs Rep"  | 
| 67399 | 96  | 
shows "(Rep ---> (-`) Abs ---> id) (\<in>) = (\<in>)"  | 
| 47308 | 97  | 
by (simp add: fun_eq_iff Quotient3_abs_rep[OF assms])  | 
| 
44459
 
079ccfb074d9
Quotient Package: add mem_rsp, mem_prs, tune proofs.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
44413 
diff
changeset
 | 
98  | 
|
| 
45970
 
b6d0cff57d96
adjusted to set/pred distinction by means of type constructor `set`
 
haftmann 
parents: 
44873 
diff
changeset
 | 
99  | 
lemma mem_rsp[quot_respect]:  | 
| 67399 | 100  | 
shows "(R ===> rel_vset R ===> (=)) (\<in>) (\<in>)"  | 
| 55945 | 101  | 
by (intro rel_funI) (simp add: rel_vset_def)  | 
| 
44459
 
079ccfb074d9
Quotient Package: add mem_rsp, mem_prs, tune proofs.
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents: 
44413 
diff
changeset
 | 
102  | 
|
| 
44413
 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 
Cezary Kaliszyk <kaliszyk@in.tum.de> 
parents:  
diff
changeset
 | 
103  | 
end  |