| author | wenzelm | 
| Tue, 02 Jul 2024 23:29:46 +0200 | |
| changeset 80482 | 2136ecf06a4c | 
| parent 77270 | d1ca1e587a8e | 
| permissions | -rw-r--r-- | 
| 61224 | 1 | (* Author: Tobias Nipkow *) | 
| 2 | ||
| 3 | section \<open>Red-Black Tree Implementation of Maps\<close> | |
| 4 | ||
| 5 | theory RBT_Map | |
| 6 | imports | |
| 7 | RBT_Set | |
| 61231 | 8 | Lookup2 | 
| 61224 | 9 | begin | 
| 10 | ||
| 63411 
e051eea34990
got rid of class cmp; added height-size proofs by Daniel Stuewe
 nipkow parents: 
61790diff
changeset | 11 | fun upd :: "'a::linorder \<Rightarrow> 'b \<Rightarrow> ('a*'b) rbt \<Rightarrow> ('a*'b) rbt" where
 | 
| 61749 | 12 | "upd x y Leaf = R Leaf (x,y) Leaf" | | 
| 13 | "upd x y (B l (a,b) r) = (case cmp x a of | |
| 64960 | 14 | LT \<Rightarrow> baliL (upd x y l) (a,b) r | | 
| 15 | GT \<Rightarrow> baliR l (a,b) (upd x y r) | | |
| 61581 | 16 | EQ \<Rightarrow> B l (x,y) r)" | | 
| 61749 | 17 | "upd x y (R l (a,b) r) = (case cmp x a of | 
| 18 | LT \<Rightarrow> R (upd x y l) (a,b) r | | |
| 19 | GT \<Rightarrow> R l (a,b) (upd x y r) | | |
| 61581 | 20 | EQ \<Rightarrow> R l (x,y) r)" | 
| 61224 | 21 | |
| 63411 
e051eea34990
got rid of class cmp; added height-size proofs by Daniel Stuewe
 nipkow parents: 
61790diff
changeset | 22 | definition update :: "'a::linorder \<Rightarrow> 'b \<Rightarrow> ('a*'b) rbt \<Rightarrow> ('a*'b) rbt" where
 | 
| 61749 | 23 | "update x y t = paint Black (upd x y t)" | 
| 24 | ||
| 68415 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 25 | fun del :: "'a::linorder \<Rightarrow> ('a*'b)rbt \<Rightarrow> ('a*'b)rbt" where
 | 
| 61749 | 26 | "del x Leaf = Leaf" | | 
| 77270 | 27 | "del x (Node l (ab, _) r) = (case cmp x (fst ab) of | 
| 68415 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 28 | LT \<Rightarrow> if l \<noteq> Leaf \<and> color l = Black | 
| 77270 | 29 | then baldL (del x l) ab r else R (del x l) ab r | | 
| 68415 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 30 | GT \<Rightarrow> if r \<noteq> Leaf\<and> color r = Black | 
| 77270 | 31 | then baldR l ab (del x r) else R l ab (del x r) | | 
| 71830 | 32 | EQ \<Rightarrow> join l r)" | 
| 61749 | 33 | |
| 63411 
e051eea34990
got rid of class cmp; added height-size proofs by Daniel Stuewe
 nipkow parents: 
61790diff
changeset | 34 | definition delete :: "'a::linorder \<Rightarrow> ('a*'b) rbt \<Rightarrow> ('a*'b) rbt" where
 | 
| 61749 | 35 | "delete x t = paint Black (del x t)" | 
| 61224 | 36 | |
| 37 | ||
| 38 | subsection "Functional Correctness Proofs" | |
| 39 | ||
| 61749 | 40 | lemma inorder_upd: | 
| 41 | "sorted1(inorder t) \<Longrightarrow> inorder(upd x y t) = upd_list x y (inorder t)" | |
| 42 | by(induction x y t rule: upd.induct) | |
| 64960 | 43 | (auto simp: upd_list_simps inorder_baliL inorder_baliR) | 
| 61749 | 44 | |
| 68440 | 45 | lemma inorder_update: | 
| 61224 | 46 | "sorted1(inorder t) \<Longrightarrow> inorder(update x y t) = upd_list x y (inorder t)" | 
| 61749 | 47 | by(simp add: update_def inorder_upd inorder_paint) | 
| 61224 | 48 | |
| 77270 | 49 | (* This lemma became necessary below when \<open>del\<close> was converted from pattern-matching to \<open>fst\<close> *) | 
| 50 | lemma del_list_id: "\<forall>ab\<in>set ps. y < fst ab \<Longrightarrow> x \<le> y \<Longrightarrow> del_list x ps = ps" | |
| 51 | by(rule del_list_idem) auto | |
| 52 | ||
| 61749 | 53 | lemma inorder_del: | 
| 68415 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 54 | "sorted1(inorder t) \<Longrightarrow> inorder(del x t) = del_list x (inorder t)" | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 55 | by(induction x t rule: del.induct) | 
| 77270 | 56 | (auto simp: del_list_simps del_list_id inorder_join inorder_baldL inorder_baldR) | 
| 61224 | 57 | |
| 68440 | 58 | lemma inorder_delete: | 
| 61749 | 59 | "sorted1(inorder t) \<Longrightarrow> inorder(delete x t) = del_list x (inorder t)" | 
| 60 | by(simp add: delete_def inorder_del inorder_paint) | |
| 61224 | 61 | |
| 68415 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 62 | |
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 63 | subsection \<open>Structural invariants\<close> | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 64 | |
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 65 | subsubsection \<open>Update\<close> | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 66 | |
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 67 | lemma invc_upd: assumes "invc t" | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 68 | shows "color t = Black \<Longrightarrow> invc (upd x y t)" "invc2 (upd x y t)" | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 69 | using assms | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 70 | by (induct x y t rule: upd.induct) (auto simp: invc_baliL invc_baliR invc2I) | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 71 | |
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 72 | lemma invh_upd: assumes "invh t" | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 73 | shows "invh (upd x y t)" "bheight (upd x y t) = bheight t" | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 74 | using assms | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 75 | by(induct x y t rule: upd.induct) | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 76 | (auto simp: invh_baliL invh_baliR bheight_baliL bheight_baliR) | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 77 | |
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 78 | theorem rbt_update: "rbt t \<Longrightarrow> rbt (update x y t)" | 
| 70708 | 79 | by (simp add: invc_upd(2) invh_upd(1) color_paint_Black invh_paint rbt_def update_def) | 
| 68415 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 80 | |
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 81 | |
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 82 | subsubsection \<open>Deletion\<close> | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 83 | |
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 84 | lemma del_invc_invh: "invh t \<Longrightarrow> invc t \<Longrightarrow> invh (del x t) \<and> | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 85 | (color t = Red \<and> bheight (del x t) = bheight t \<and> invc (del x t) \<or> | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 86 | color t = Black \<and> bheight (del x t) = bheight t - 1 \<and> invc2 (del x t))" | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 87 | proof (induct x t rule: del.induct) | 
| 77270 | 88 | case (2 x _ ab c) | 
| 89 | have "x = fst ab \<or> x < fst ab \<or> x > fst ab" by auto | |
| 68415 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 90 | thus ?case proof (elim disjE) | 
| 77270 | 91 | assume "x = fst ab" | 
| 68415 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 92 | with 2 show ?thesis | 
| 71830 | 93 | by (cases c) (simp_all add: invh_join invc_join) | 
| 68415 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 94 | next | 
| 77270 | 95 | assume "x < fst ab" | 
| 68415 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 96 | with 2 show ?thesis | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 97 | by(cases c) | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 98 | (auto simp: invh_baldL_invc invc_baldL invc2_baldL dest: neq_LeafD) | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 99 | next | 
| 77270 | 100 | assume "fst ab < x" | 
| 68415 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 101 | with 2 show ?thesis | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 102 | by(cases c) | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 103 | (auto simp: invh_baldR_invc invc_baldR invc2_baldR dest: neq_LeafD) | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 104 | qed | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 105 | qed auto | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 106 | |
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 107 | theorem rbt_delete: "rbt t \<Longrightarrow> rbt (delete k t)" | 
| 70708 | 108 | by (metis delete_def rbt_def color_paint_Black del_invc_invh invc2I invh_paint) | 
| 68415 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 109 | |
| 68440 | 110 | interpretation M: Map_by_Ordered | 
| 68431 | 111 | where empty = empty and lookup = lookup and update = update and delete = delete | 
| 68415 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 112 | and inorder = inorder and inv = rbt | 
| 61224 | 113 | proof (standard, goal_cases) | 
| 68431 | 114 | case 1 show ?case by (simp add: empty_def) | 
| 61224 | 115 | next | 
| 61790 | 116 | case 2 thus ?case by(simp add: lookup_map_of) | 
| 61224 | 117 | next | 
| 68440 | 118 | case 3 thus ?case by(simp add: inorder_update) | 
| 61224 | 119 | next | 
| 68440 | 120 | case 4 thus ?case by(simp add: inorder_delete) | 
| 68415 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 121 | next | 
| 68431 | 122 | case 5 thus ?case by (simp add: rbt_def empty_def) | 
| 68415 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 123 | next | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 124 | case 6 thus ?case by (simp add: rbt_update) | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 125 | next | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 126 | case 7 thus ?case by (simp add: rbt_delete) | 
| 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 nipkow parents: 
68413diff
changeset | 127 | qed | 
| 61224 | 128 | |
| 129 | end |