| author | blanchet | 
| Wed, 28 May 2014 17:42:36 +0200 | |
| changeset 57108 | dc0b4f50e288 | 
| parent 55945 | e96383acecf9 | 
| child 58881 | b9556a055632 | 
| 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 | |
| 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 5 | header {* Quotient infrastructure for the set type *}
 | 
| 
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 | 
| 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 8 | imports Main Quotient_Syntax | 
| 
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 | |
| 53012 
cb82606b8215
move Lifting/Transfer relevant parts of Library/Quotient_* to Main
 kuncar parents: 
52359diff
changeset | 11 | subsection {* Contravariant set map (vimage) and set relator, rules for the Quotient package *}
 | 
| 47626 
f7b1034cb9ce
move definition of set_rel into Library/Quotient_Set.thy
 huffman parents: 
47455diff
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: 
47455diff
changeset | 14 | |
| 55940 | 15 | lemma rel_vset_eq [id_simps]: | 
| 16 | "rel_vset op = = op =" | |
| 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: 
47455diff
changeset | 18 | |
| 55940 | 19 | lemma rel_vset_equivp: | 
| 47626 
f7b1034cb9ce
move definition of set_rel into Library/Quotient_Set.thy
 huffman parents: 
47455diff
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: 
47455diff
changeset | 23 | using equivp_reflp[OF e] | 
| 
f7b1034cb9ce
move definition of set_rel into Library/Quotient_Set.thy
 huffman parents: 
47455diff
changeset | 24 | by auto (metis, metis equivp_symp[OF e]) | 
| 
f7b1034cb9ce
move definition of set_rel into Library/Quotient_Set.thy
 huffman parents: 
47455diff
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" | 
| 55940 | 52 | shows "((R ===> op =) ===> 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" | 
| 44413 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 57 | shows "((Abs ---> id) ---> op -` Rep) Collect = Collect" | 
| 
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" | 
| 55940 | 63 | shows "(rel_vset R ===> rel_vset R ===> rel_vset R) op \<union> op \<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" | 
| 44413 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 68 | shows "(op -` Abs ---> op -` Abs ---> op -` Rep) op \<union> = op \<union>" | 
| 
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" | 
| 55940 | 74 | shows "(rel_vset R ===> rel_vset R ===> rel_vset R) op - op -" | 
| 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" | 
| 44413 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 79 | shows "(op -` Abs ---> op -` Abs ---> op -` Rep) op - = op -" | 
| 
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" | 
| 55940 | 85 | shows "(rel_vset R ===> rel_vset R ===> rel_vset R) op \<inter> op \<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" | 
| 44413 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 90 | shows "(op -` Abs ---> op -` Abs ---> op -` Rep) op \<inter> = op \<inter>" | 
| 
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: 
44413diff
changeset | 94 | lemma mem_prs[quot_preserve]: | 
| 47308 | 95 | assumes "Quotient3 R Abs Rep" | 
| 44459 
079ccfb074d9
Quotient Package: add mem_rsp, mem_prs, tune proofs.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
44413diff
changeset | 96 | shows "(Rep ---> op -` Abs ---> id) op \<in> = op \<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: 
44413diff
changeset | 98 | |
| 45970 
b6d0cff57d96
adjusted to set/pred distinction by means of type constructor `set`
 haftmann parents: 
44873diff
changeset | 99 | lemma mem_rsp[quot_respect]: | 
| 55940 | 100 | shows "(R ===> rel_vset R ===> op =) op \<in> op \<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: 
44413diff
changeset | 102 | |
| 44413 
80d460bc6fa8
Quotient Package: some infrastructure for lifting inside sets
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 103 | end |