| author | Cezary Kaliszyk <kaliszyk@in.tum.de> | 
| Tue, 12 Jul 2011 16:00:05 +0900 | |
| changeset 43766 | 9545bb3cefac | 
| child 44263 | 971d1be5d5ce | 
| permissions | -rw-r--r-- | 
| 43766 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 1 | (* Title: HOL/Quotient_Examples/DList.thy | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 2 | Author: Cezary Kaliszyk, University of Tsukuba | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 3 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 4 | Based on typedef version "Library/Dlist" by Florian Haftmann | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 5 | and theory morphism version by Maksym Bortin | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 6 | *) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 7 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 8 | header {* Lists with distinct elements *}
 | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 9 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 10 | theory DList | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 11 | imports "~~/src/HOL/Library/Quotient_List" "~~/src/HOL/Library/More_List" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 12 | begin | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 13 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 14 | text {* Some facts about lists *}
 | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 15 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 16 | lemma remdups_removeAll_commute[simp]: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 17 | "remdups (removeAll x l) = removeAll x (remdups l)" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 18 | by (induct l) auto | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 19 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 20 | lemma removeAll_distinct[simp]: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 21 | assumes "distinct l" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 22 | shows "distinct (removeAll x l)" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 23 | using assms by (induct l) simp_all | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 24 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 25 | lemma removeAll_commute: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 26 | "removeAll x (removeAll y l) = removeAll y (removeAll x l)" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 27 | by (induct l) auto | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 28 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 29 | lemma remdups_hd_notin_tl: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 30 | "remdups dl = h # t \<Longrightarrow> h \<notin> set t" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 31 | by (induct dl arbitrary: h t) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 32 | (case_tac [!] "a \<in> set dl", auto) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 33 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 34 | lemma remdups_repeat: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 35 | "remdups dl = h # t \<Longrightarrow> t = remdups t" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 36 | by (induct dl arbitrary: h t, case_tac [!] "a \<in> set dl") | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 37 | (simp_all, metis remdups_remdups) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 38 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 39 | lemma remdups_nil_noteq_cons: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 40 | "remdups (h # t) \<noteq> remdups []" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 41 | "remdups [] \<noteq> remdups (h # t)" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 42 | by auto | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 43 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 44 | lemma remdups_eq_map_eq: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 45 | assumes "remdups xa = remdups ya" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 46 | shows "remdups (map f xa) = remdups (map f ya)" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 47 | using assms | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 48 | by (induct xa ya arbitrary: fx fy rule: list_induct2') | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 49 | (metis (full_types) remdups_nil_noteq_cons(2) remdups_map_remdups)+ | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 50 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 51 | text {* Setting up the quotient type *}
 | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 52 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 53 | definition | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 54 | dlist_eq :: "'a list \<Rightarrow> 'a list \<Rightarrow> bool" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 55 | where | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 56 | [simp]: "dlist_eq xs ys \<longleftrightarrow> remdups xs = remdups ys" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 57 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 58 | lemma dlist_eq_reflp: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 59 | "reflp dlist_eq" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 60 | by (auto intro: reflpI) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 61 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 62 | lemma dlist_eq_symp: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 63 | "symp dlist_eq" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 64 | by (auto intro: sympI) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 65 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 66 | lemma dlist_eq_transp: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 67 | "transp dlist_eq" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 68 | by (auto intro: transpI) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 69 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 70 | lemma dlist_eq_equivp: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 71 | "equivp dlist_eq" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 72 | by (auto intro: equivpI dlist_eq_reflp dlist_eq_symp dlist_eq_transp) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 73 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 74 | quotient_type | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 75 | 'a dlist = "'a list" / "dlist_eq" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 76 | by (rule dlist_eq_equivp) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 77 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 78 | text {* respectfulness and constant definitions *}
 | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 79 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 80 | definition [simp]: "card_remdups = length \<circ> remdups" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 81 | definition [simp]: "foldr_remdups f xs e = foldr f (remdups xs) e" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 82 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 83 | lemma [quot_respect]: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 84 | "(dlist_eq) Nil Nil" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 85 | "(dlist_eq ===> op =) List.member List.member" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 86 | "(op = ===> dlist_eq ===> dlist_eq) Cons Cons" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 87 | "(op = ===> dlist_eq ===> dlist_eq) removeAll removeAll" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 88 | "(dlist_eq ===> op =) card_remdups card_remdups" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 89 | "(dlist_eq ===> op =) remdups remdups" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 90 | "(op = ===> dlist_eq ===> op =) foldr_remdups foldr_remdups" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 91 | "(op = ===> dlist_eq ===> dlist_eq) map map" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 92 | "(op = ===> dlist_eq ===> dlist_eq) filter filter" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 93 | by (auto intro!: fun_relI simp add: remdups_filter) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 94 | (metis (full_types) member_set set_remdups remdups_eq_map_eq)+ | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 95 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 96 | quotient_definition empty where "empty :: 'a dlist" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 97 | is "Nil" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 98 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 99 | quotient_definition insert where "insert :: 'a \<Rightarrow> 'a dlist \<Rightarrow> 'a dlist" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 100 | is "Cons" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 101 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 102 | quotient_definition "member :: 'a dlist \<Rightarrow> 'a \<Rightarrow> bool" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 103 | is "List.member" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 104 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 105 | quotient_definition foldr where "foldr :: ('a \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> 'a dlist \<Rightarrow> 'b \<Rightarrow> 'b"
 | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 106 | is "foldr_remdups" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 107 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 108 | quotient_definition "remove :: 'a \<Rightarrow> 'a dlist \<Rightarrow> 'a dlist" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 109 | is "removeAll" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 110 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 111 | quotient_definition card where "card :: 'a dlist \<Rightarrow> nat" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 112 | is "card_remdups" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 113 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 114 | quotient_definition map where "map :: ('a \<Rightarrow> 'b) \<Rightarrow> 'a dlist \<Rightarrow> 'b dlist"
 | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 115 |   is "List.map :: ('a \<Rightarrow> 'b) \<Rightarrow> 'a list \<Rightarrow> 'b list"
 | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 116 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 117 | quotient_definition filter where "filter :: ('a \<Rightarrow> bool) \<Rightarrow> 'a dlist \<Rightarrow> 'a dlist"
 | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 118 | is "List.filter" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 119 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 120 | quotient_definition "list_of_dlist :: 'a dlist \<Rightarrow> 'a list" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 121 | is "remdups" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 122 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 123 | text {* lifted theorems *}
 | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 124 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 125 | lemma dlist_member_insert: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 126 | "member dl x \<Longrightarrow> insert x dl = dl" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 127 | by descending (simp add: List.member_def) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 128 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 129 | lemma dlist_member_insert_eq: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 130 | "member (insert y dl) x = (x = y \<or> member dl x)" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 131 | by descending (simp add: List.member_def) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 132 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 133 | lemma dlist_insert_idem: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 134 | "insert x (insert x dl) = insert x dl" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 135 | by descending simp | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 136 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 137 | lemma dlist_insert_not_empty: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 138 | "insert x dl \<noteq> empty" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 139 | by descending auto | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 140 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 141 | lemma not_dlist_member_empty: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 142 | "\<not> member empty x" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 143 | by descending (simp add: List.member_def) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 144 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 145 | lemma not_dlist_member_remove: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 146 | "\<not> member (remove x dl) x" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 147 | by descending (simp add: List.member_def) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 148 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 149 | lemma dlist_in_remove: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 150 | "a \<noteq> b \<Longrightarrow> member (remove b dl) a = member dl a" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 151 | by descending (simp add: List.member_def) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 152 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 153 | lemma dlist_not_memb_remove: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 154 | "\<not> member dl x \<Longrightarrow> remove x dl = dl" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 155 | by descending (simp add: List.member_def) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 156 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 157 | lemma dlist_no_memb_remove_insert: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 158 | "\<not> member dl x \<Longrightarrow> remove x (insert x dl) = dl" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 159 | by descending (simp add: List.member_def) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 160 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 161 | lemma dlist_remove_empty: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 162 | "remove x empty = empty" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 163 | by descending simp | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 164 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 165 | lemma dlist_remove_insert_commute: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 166 | "a \<noteq> b \<Longrightarrow> remove a (insert b dl) = insert b (remove a dl)" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 167 | by descending simp | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 168 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 169 | lemma dlist_remove_commute: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 170 | "remove a (remove b dl) = remove b (remove a dl)" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 171 | by (lifting removeAll_commute) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 172 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 173 | lemma dlist_foldr_empty: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 174 | "foldr f empty e = e" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 175 | by descending simp | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 176 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 177 | lemma dlist_no_memb_foldr: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 178 | assumes "\<not> member dl x" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 179 | shows "foldr f (insert x dl) e = f x (foldr f dl e)" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 180 | using assms by descending (simp add: List.member_def) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 181 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 182 | lemma dlist_foldr_insert_not_memb: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 183 | assumes "\<not>member t h" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 184 | shows "foldr f (insert h t) e = f h (foldr f t e)" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 185 | using assms by descending (simp add: List.member_def) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 186 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 187 | lemma list_of_dlist_empty[simp]: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 188 | "list_of_dlist empty = []" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 189 | by descending simp | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 190 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 191 | lemma list_of_dlist_insert[simp]: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 192 | "list_of_dlist (insert x xs) = | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 193 | (if member xs x then (remdups (list_of_dlist xs)) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 194 | else x # (remdups (list_of_dlist xs)))" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 195 | by descending (simp add: List.member_def remdups_remdups) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 196 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 197 | lemma list_of_dlist_remove[simp]: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 198 | "list_of_dlist (remove x dxs) = remove1 x (list_of_dlist dxs)" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 199 | by descending (simp add: distinct_remove1_removeAll) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 200 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 201 | lemma list_of_dlist_map[simp]: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 202 | "list_of_dlist (map f dxs) = remdups (List.map f (list_of_dlist dxs))" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 203 | by descending (simp add: remdups_map_remdups) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 204 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 205 | lemma list_of_dlist_filter [simp]: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 206 | "list_of_dlist (filter P dxs) = List.filter P (list_of_dlist dxs)" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 207 | by descending (simp add: remdups_filter) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 208 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 209 | lemma dlist_map_empty: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 210 | "map f empty = empty" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 211 | by descending simp | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 212 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 213 | lemma dlist_map_insert: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 214 | "map f (insert x xs) = insert (f x) (map f xs)" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 215 | by descending simp | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 216 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 217 | lemma dlist_eq_iff: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 218 | "dxs = dys \<longleftrightarrow> list_of_dlist dxs = list_of_dlist dys" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 219 | by descending simp | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 220 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 221 | lemma dlist_eqI: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 222 | "list_of_dlist dxs = list_of_dlist dys \<Longrightarrow> dxs = dys" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 223 | by (simp add: dlist_eq_iff) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 224 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 225 | abbreviation | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 226 | "dlist xs \<equiv> abs_dlist xs" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 227 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 228 | lemma distinct_list_of_dlist [simp, intro]: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 229 | "distinct (list_of_dlist dxs)" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 230 | by descending simp | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 231 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 232 | lemma list_of_dlist_dlist [simp]: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 233 | "list_of_dlist (dlist xs) = remdups xs" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 234 | unfolding list_of_dlist_def map_fun_apply id_def | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 235 | by (metis Quotient_rep_abs[OF Quotient_dlist] dlist_eq_def) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 236 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 237 | lemma remdups_list_of_dlist [simp]: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 238 | "remdups (list_of_dlist dxs) = list_of_dlist dxs" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 239 | by simp | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 240 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 241 | lemma dlist_list_of_dlist [simp, code abstype]: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 242 | "dlist (list_of_dlist dxs) = dxs" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 243 | by (simp add: list_of_dlist_def) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 244 | (metis Quotient_def Quotient_dlist dlist_eqI list_of_dlist_dlist remdups_list_of_dlist) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 245 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 246 | lemma dlist_filter_simps: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 247 | "filter P empty = empty" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 248 | "filter P (insert x xs) = (if P x then insert x (filter P xs) else filter P xs)" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 249 | by (lifting filter.simps) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 250 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 251 | lemma dlist_induct: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 252 | assumes "P empty" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 253 | and "\<And>a dl. P dl \<Longrightarrow> P (insert a dl)" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 254 | shows "P dl" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 255 | using assms by descending (drule list.induct, simp) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 256 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 257 | lemma dlist_induct_stronger: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 258 | assumes a1: "P empty" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 259 | and a2: "\<And>x dl. \<lbrakk>\<not>member dl x; P dl\<rbrakk> \<Longrightarrow> P (insert x dl)" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 260 | shows "P dl" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 261 | proof(induct dl rule: dlist_induct) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 262 | show "P empty" using a1 by simp | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 263 | next | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 264 | fix x dl | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 265 | assume "P dl" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 266 | then show "P (insert x dl)" using a2 | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 267 | by (cases "member dl x") (simp_all add: dlist_member_insert) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 268 | qed | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 269 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 270 | lemma dlist_card_induct: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 271 | assumes "\<And>xs. (\<And>ys. card ys < card xs \<Longrightarrow> P ys) \<Longrightarrow> P xs" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 272 | shows "P xs" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 273 | using assms | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 274 | by descending (rule measure_induct [of card_remdups], blast) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 275 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 276 | lemma dlist_cases: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 277 | "dl = empty \<or> (\<exists>h t. dl = insert h t \<and> \<not> member t h)" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 278 | apply (descending, simp add: List.member_def) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 279 | by (metis list.exhaust remdups_eq_nil_iff remdups_hd_notin_tl remdups_repeat) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 280 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 281 | lemma dlist_exhaust: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 282 | assumes "y = empty \<Longrightarrow> P" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 283 | and "\<And>a dl. y = insert a dl \<Longrightarrow> P" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 284 | shows "P" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 285 | using assms by (lifting list.exhaust) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 286 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 287 | lemma dlist_exhaust_stronger: | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 288 | assumes "y = empty \<Longrightarrow> P" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 289 | and "\<And>a dl. y = insert a dl \<Longrightarrow> \<not> member dl a \<Longrightarrow> P" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 290 | shows "P" | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 291 | using assms by (metis dlist_cases) | 
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 292 | |
| 
9545bb3cefac
Quotient example: Lists with distinct elements
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 293 | end |