| author | wenzelm | 
| Fri, 07 May 2010 20:57:37 +0200 | |
| changeset 36734 | d9b10c173330 | 
| parent 36276 | 92011cc923f5 | 
| child 36812 | e090bdb4e1c5 | 
| permissions | -rw-r--r-- | 
| 35788 | 1 | (* Title: HOL/Library/Quotient_List.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 | *) | 
| 35788 | 4 | |
| 5 | header {* Quotient infrastructure for the list type *}
 | |
| 6 | ||
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 7 | theory Quotient_List | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 8 | imports Main Quotient_Syntax | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 9 | begin | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 10 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 11 | fun | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 12 | list_rel | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 13 | where | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 14 | "list_rel R [] [] = True" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 15 | | "list_rel R (x#xs) [] = False" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 16 | | "list_rel R [] (x#xs) = False" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 17 | | "list_rel R (x#xs) (y#ys) = (R x y \<and> list_rel R xs ys)" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 18 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 19 | declare [[map list = (map, list_rel)]] | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 20 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 21 | lemma split_list_all: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 22 | shows "(\<forall>x. P x) \<longleftrightarrow> P [] \<and> (\<forall>x xs. P (x#xs))" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 23 | apply(auto) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 24 | apply(case_tac x) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 25 | apply(simp_all) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 26 | done | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 27 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 28 | lemma map_id[id_simps]: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 29 | shows "map id = id" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 30 | apply(simp add: expand_fun_eq) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 31 | apply(rule allI) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 32 | apply(induct_tac x) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 33 | apply(simp_all) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 34 | done | 
| 
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 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 37 | lemma list_rel_reflp: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 38 | shows "equivp R \<Longrightarrow> list_rel R xs xs" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 39 | apply(induct xs) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 40 | apply(simp_all add: equivp_reflp) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 41 | done | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 42 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 43 | lemma list_rel_symp: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 44 | assumes a: "equivp R" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 45 | shows "list_rel R xs ys \<Longrightarrow> list_rel R ys xs" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 46 | apply(induct xs ys rule: list_induct2') | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 47 | apply(simp_all) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 48 | apply(rule equivp_symp[OF a]) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 49 | apply(simp) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 50 | done | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 51 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 52 | lemma list_rel_transp: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 53 | assumes a: "equivp R" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 54 | shows "list_rel R xs1 xs2 \<Longrightarrow> list_rel R xs2 xs3 \<Longrightarrow> list_rel R xs1 xs3" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 55 | apply(induct xs1 xs2 arbitrary: xs3 rule: list_induct2') | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 56 | apply(simp_all) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 57 | apply(case_tac xs3) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 58 | apply(simp_all) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 59 | apply(rule equivp_transp[OF a]) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 60 | apply(auto) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 61 | done | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 62 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 63 | lemma list_equivp[quot_equiv]: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 64 | assumes a: "equivp R" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 65 | shows "equivp (list_rel R)" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 66 | apply(rule equivpI) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 67 | unfolding reflp_def symp_def transp_def | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 68 | apply(subst split_list_all) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 69 | apply(simp add: equivp_reflp[OF a] list_rel_reflp[OF a]) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 70 | apply(blast intro: list_rel_symp[OF a]) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 71 | apply(blast intro: list_rel_transp[OF a]) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 72 | done | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 73 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 74 | lemma list_rel_rel: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 75 | assumes q: "Quotient R Abs Rep" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 76 | shows "list_rel R r s = (list_rel R r r \<and> list_rel R s s \<and> (map Abs r = map Abs s))" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 77 | apply(induct r s rule: list_induct2') | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 78 | apply(simp_all) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 79 | using Quotient_rel[OF q] | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 80 | apply(metis) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 81 | done | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 82 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 83 | lemma list_quotient[quot_thm]: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 84 | assumes q: "Quotient R Abs Rep" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 85 | shows "Quotient (list_rel R) (map Abs) (map Rep)" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 86 | unfolding Quotient_def | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 87 | apply(subst split_list_all) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 88 | apply(simp add: Quotient_abs_rep[OF q] abs_o_rep[OF q] map_id) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 89 | apply(rule conjI) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 90 | apply(rule allI) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 91 | apply(induct_tac a) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 92 | apply(simp) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 93 | apply(simp) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 94 | apply(simp add: Quotient_rep_reflp[OF q]) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 95 | apply(rule allI)+ | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 96 | apply(rule list_rel_rel[OF q]) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 97 | done | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 98 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 99 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 100 | lemma cons_prs_aux: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 101 | assumes q: "Quotient R Abs Rep" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 102 | shows "(map Abs) ((Rep h) # (map Rep t)) = h # t" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 103 | by (induct t) (simp_all add: Quotient_abs_rep[OF q]) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 104 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 105 | lemma cons_prs[quot_preserve]: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 106 | assumes q: "Quotient R Abs Rep" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 107 | shows "(Rep ---> (map Rep) ---> (map Abs)) (op #) = (op #)" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 108 | by (simp only: expand_fun_eq fun_map_def cons_prs_aux[OF q]) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 109 | (simp) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 110 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 111 | lemma cons_rsp[quot_respect]: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 112 | assumes q: "Quotient R Abs Rep" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 113 | shows "(R ===> list_rel R ===> list_rel R) (op #) (op #)" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 114 | by (auto) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 115 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 116 | lemma nil_prs[quot_preserve]: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 117 | assumes q: "Quotient R Abs Rep" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 118 | shows "map Abs [] = []" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 119 | by simp | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 120 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 121 | lemma nil_rsp[quot_respect]: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 122 | assumes q: "Quotient R Abs Rep" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 123 | shows "list_rel R [] []" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 124 | by simp | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 125 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 126 | lemma map_prs_aux: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 127 | assumes a: "Quotient R1 abs1 rep1" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 128 | and b: "Quotient R2 abs2 rep2" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 129 | shows "(map abs2) (map ((abs1 ---> rep2) f) (map rep1 l)) = map f l" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 130 | by (induct l) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 131 | (simp_all add: Quotient_abs_rep[OF a] Quotient_abs_rep[OF b]) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 132 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 133 | lemma map_prs[quot_preserve]: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 134 | assumes a: "Quotient R1 abs1 rep1" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 135 | and b: "Quotient R2 abs2 rep2" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 136 | shows "((abs1 ---> rep2) ---> (map rep1) ---> (map abs2)) map = map" | 
| 36216 
8fb6cc6f3b94
respectfullness and preservation of map for identity quotients
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36154diff
changeset | 137 | and "((abs1 ---> id) ---> map rep1 ---> id) map = map" | 
| 
8fb6cc6f3b94
respectfullness and preservation of map for identity quotients
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36154diff
changeset | 138 | by (simp_all only: expand_fun_eq fun_map_def map_prs_aux[OF a b]) | 
| 
8fb6cc6f3b94
respectfullness and preservation of map for identity quotients
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36154diff
changeset | 139 | (simp_all add: Quotient_abs_rep[OF a]) | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 140 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 141 | lemma map_rsp[quot_respect]: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 142 | assumes q1: "Quotient R1 Abs1 Rep1" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 143 | and q2: "Quotient R2 Abs2 Rep2" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 144 | shows "((R1 ===> R2) ===> (list_rel R1) ===> list_rel R2) map map" | 
| 36216 
8fb6cc6f3b94
respectfullness and preservation of map for identity quotients
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36154diff
changeset | 145 | and "((R1 ===> op =) ===> (list_rel R1) ===> op =) map map" | 
| 
8fb6cc6f3b94
respectfullness and preservation of map for identity quotients
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36154diff
changeset | 146 | apply simp_all | 
| 
8fb6cc6f3b94
respectfullness and preservation of map for identity quotients
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36154diff
changeset | 147 | apply(rule_tac [!] allI)+ | 
| 
8fb6cc6f3b94
respectfullness and preservation of map for identity quotients
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36154diff
changeset | 148 | apply(rule_tac [!] impI) | 
| 
8fb6cc6f3b94
respectfullness and preservation of map for identity quotients
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36154diff
changeset | 149 | apply(rule_tac [!] allI)+ | 
| 
8fb6cc6f3b94
respectfullness and preservation of map for identity quotients
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36154diff
changeset | 150 | apply (induct_tac [!] xa ya rule: list_induct2') | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 151 | apply simp_all | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 152 | done | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 153 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 154 | lemma foldr_prs_aux: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 155 | assumes a: "Quotient R1 abs1 rep1" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 156 | and b: "Quotient R2 abs2 rep2" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 157 | shows "abs2 (foldr ((abs1 ---> abs2 ---> rep2) f) (map rep1 l) (rep2 e)) = foldr f l e" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 158 | by (induct l) (simp_all add: Quotient_abs_rep[OF a] Quotient_abs_rep[OF b]) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 159 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 160 | lemma foldr_prs[quot_preserve]: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 161 | assumes a: "Quotient R1 abs1 rep1" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 162 | and b: "Quotient R2 abs2 rep2" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 163 | shows "((abs1 ---> abs2 ---> rep2) ---> (map rep1) ---> rep2 ---> abs2) foldr = foldr" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 164 | by (simp only: expand_fun_eq fun_map_def foldr_prs_aux[OF a b]) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 165 | (simp) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 166 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 167 | lemma foldl_prs_aux: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 168 | assumes a: "Quotient R1 abs1 rep1" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 169 | and b: "Quotient R2 abs2 rep2" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 170 | shows "abs1 (foldl ((abs1 ---> abs2 ---> rep1) f) (rep1 e) (map rep2 l)) = foldl f e l" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 171 | by (induct l arbitrary:e) (simp_all add: Quotient_abs_rep[OF a] Quotient_abs_rep[OF b]) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 172 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 173 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 174 | lemma foldl_prs[quot_preserve]: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 175 | assumes a: "Quotient R1 abs1 rep1" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 176 | and b: "Quotient R2 abs2 rep2" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 177 | shows "((abs1 ---> abs2 ---> rep1) ---> rep1 ---> (map rep2) ---> abs1) foldl = foldl" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 178 | by (simp only: expand_fun_eq fun_map_def foldl_prs_aux[OF a b]) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 179 | (simp) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 180 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 181 | lemma list_rel_empty: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 182 | shows "list_rel R [] b \<Longrightarrow> length b = 0" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 183 | by (induct b) (simp_all) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 184 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 185 | lemma list_rel_len: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 186 | shows "list_rel R a b \<Longrightarrow> length a = length b" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 187 | apply (induct a arbitrary: b) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 188 | apply (simp add: list_rel_empty) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 189 | apply (case_tac b) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 190 | apply simp_all | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 191 | done | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 192 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 193 | (* induct_tac doesn't accept 'arbitrary', so we manually 'spec' *) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 194 | lemma foldl_rsp[quot_respect]: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 195 | assumes q1: "Quotient R1 Abs1 Rep1" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 196 | and q2: "Quotient R2 Abs2 Rep2" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 197 | shows "((R1 ===> R2 ===> R1) ===> R1 ===> list_rel R2 ===> R1) foldl foldl" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 198 | apply(auto) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 199 | apply (subgoal_tac "R1 xa ya \<longrightarrow> list_rel R2 xb yb \<longrightarrow> R1 (foldl x xa xb) (foldl y ya yb)") | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 200 | apply simp | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 201 | apply (rule_tac x="xa" in spec) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 202 | apply (rule_tac x="ya" in spec) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 203 | apply (rule_tac xs="xb" and ys="yb" in list_induct2) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 204 | apply (rule list_rel_len) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 205 | apply (simp_all) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 206 | done | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 207 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 208 | lemma foldr_rsp[quot_respect]: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 209 | assumes q1: "Quotient R1 Abs1 Rep1" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 210 | and q2: "Quotient R2 Abs2 Rep2" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 211 | shows "((R1 ===> R2 ===> R2) ===> list_rel R1 ===> R2 ===> R2) foldr foldr" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 212 | apply auto | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 213 | apply(subgoal_tac "R2 xb yb \<longrightarrow> list_rel R1 xa ya \<longrightarrow> R2 (foldr x xa xb) (foldr y ya yb)") | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 214 | apply simp | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 215 | apply (rule_tac xs="xa" and ys="ya" in list_induct2) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 216 | apply (rule list_rel_len) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 217 | apply (simp_all) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 218 | done | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 219 | |
| 36154 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 220 | lemma list_rel_rsp: | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 221 | assumes r: "\<forall>x y. R x y \<longrightarrow> (\<forall>a b. R a b \<longrightarrow> S x a = T y b)" | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 222 | and l1: "list_rel R x y" | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 223 | and l2: "list_rel R a b" | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 224 | shows "list_rel S x a = list_rel T y b" | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 225 | proof - | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 226 | have a: "length y = length x" by (rule list_rel_len[OF l1, symmetric]) | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 227 | have c: "length a = length b" by (rule list_rel_len[OF l2]) | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 228 | show ?thesis proof (cases "length x = length a") | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 229 | case True | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 230 | have b: "length x = length a" by fact | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 231 | show ?thesis using a b c r l1 l2 proof (induct rule: list_induct4) | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 232 | case Nil | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 233 | show ?case using assms by simp | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 234 | next | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 235 | case (Cons h t) | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 236 | then show ?case by auto | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 237 | qed | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 238 | next | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 239 | case False | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 240 | have d: "length x \<noteq> length a" by fact | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 241 | then have e: "\<not>list_rel S x a" using list_rel_len by auto | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 242 | have "length y \<noteq> length b" using d a c by simp | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 243 | then have "\<not>list_rel T y b" using list_rel_len by auto | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 244 | then show ?thesis using e by simp | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 245 | qed | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 246 | qed | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 247 | |
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 248 | lemma[quot_respect]: | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 249 | "((R ===> R ===> op =) ===> list_rel R ===> list_rel R ===> op =) list_rel list_rel" | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 250 | by (simp add: list_rel_rsp) | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 251 | |
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 252 | lemma[quot_preserve]: | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 253 | assumes a: "Quotient R abs1 rep1" | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 254 | shows "((abs1 ---> abs1 ---> id) ---> map rep1 ---> map rep1 ---> id) list_rel = list_rel" | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 255 | apply (simp add: expand_fun_eq) | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 256 | apply clarify | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 257 | apply (induct_tac xa xb rule: list_induct2') | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 258 | apply (simp_all add: Quotient_abs_rep[OF a]) | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 259 | done | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 260 | |
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 261 | lemma[quot_preserve]: | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 262 | assumes a: "Quotient R abs1 rep1" | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 263 | shows "(list_rel ((rep1 ---> rep1 ---> id) R) l m) = (l = m)" | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 264 | by (induct l m rule: list_induct2') (simp_all add: Quotient_rel_rep[OF a]) | 
| 
11c6106d7787
Respectfullness and preservation of list_rel
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35788diff
changeset | 265 | |
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 266 | lemma list_rel_eq[id_simps]: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 267 | shows "(list_rel (op =)) = (op =)" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 268 | unfolding expand_fun_eq | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 269 | apply(rule allI)+ | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 270 | apply(induct_tac x xa rule: list_induct2') | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 271 | apply(simp_all) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 272 | done | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 273 | |
| 36276 
92011cc923f5
fun_rel introduction and list_rel elimination for quotient package
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36216diff
changeset | 274 | lemma list_rel_find_element: | 
| 
92011cc923f5
fun_rel introduction and list_rel elimination for quotient package
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36216diff
changeset | 275 | assumes a: "x \<in> set a" | 
| 
92011cc923f5
fun_rel introduction and list_rel elimination for quotient package
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36216diff
changeset | 276 | and b: "list_rel R a b" | 
| 
92011cc923f5
fun_rel introduction and list_rel elimination for quotient package
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36216diff
changeset | 277 | shows "\<exists>y. (y \<in> set b \<and> R x y)" | 
| 
92011cc923f5
fun_rel introduction and list_rel elimination for quotient package
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36216diff
changeset | 278 | proof - | 
| 
92011cc923f5
fun_rel introduction and list_rel elimination for quotient package
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36216diff
changeset | 279 | have "length a = length b" using b by (rule list_rel_len) | 
| 
92011cc923f5
fun_rel introduction and list_rel elimination for quotient package
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36216diff
changeset | 280 | then show ?thesis using a b by (induct a b rule: list_induct2) auto | 
| 
92011cc923f5
fun_rel introduction and list_rel elimination for quotient package
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36216diff
changeset | 281 | qed | 
| 
92011cc923f5
fun_rel introduction and list_rel elimination for quotient package
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36216diff
changeset | 282 | |
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 283 | lemma list_rel_refl: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 284 | assumes a: "\<And>x y. R x y = (R x = R y)" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 285 | shows "list_rel R x x" | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 286 | by (induct x) (auto simp add: a) | 
| 
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 | end |