| author | nipkow | 
| Mon, 11 Jul 2022 08:21:54 +0200 | |
| changeset 75663 | f2e402a19530 | 
| parent 71830 | 7a997ead54b0 | 
| child 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: 
61790 
diff
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: 
61790 
diff
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: 
68413 
diff
changeset
 | 
25  | 
fun del :: "'a::linorder \<Rightarrow> ('a*'b)rbt \<Rightarrow> ('a*'b)rbt" where
 | 
| 61749 | 26  | 
"del x Leaf = Leaf" |  | 
| 
70755
 
3fb16bed5d6c
replaced new type ('a,'b) tree by old type ('a*'b) tree.
 
nipkow 
parents: 
70708 
diff
changeset
 | 
27  | 
"del x (Node l ((a,b), c) r) = (case cmp x a of  | 
| 
68415
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
28  | 
LT \<Rightarrow> if l \<noteq> Leaf \<and> color l = Black  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
29  | 
then baldL (del x l) (a,b) r else R (del x l) (a,b) r |  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
30  | 
GT \<Rightarrow> if r \<noteq> Leaf\<and> color r = Black  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
31  | 
then baldR l (a,b) (del x r) else R l (a,b) (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: 
61790 
diff
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  | 
|
| 61749 | 49  | 
lemma inorder_del:  | 
| 
68415
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
50  | 
"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: 
68413 
diff
changeset
 | 
51  | 
by(induction x t rule: del.induct)  | 
| 71830 | 52  | 
(auto simp: del_list_simps inorder_join inorder_baldL inorder_baldR)  | 
| 61224 | 53  | 
|
| 68440 | 54  | 
lemma inorder_delete:  | 
| 61749 | 55  | 
"sorted1(inorder t) \<Longrightarrow> inorder(delete x t) = del_list x (inorder t)"  | 
56  | 
by(simp add: delete_def inorder_del inorder_paint)  | 
|
| 61224 | 57  | 
|
| 
68415
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
58  | 
|
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
59  | 
subsection \<open>Structural invariants\<close>  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
60  | 
|
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
61  | 
subsubsection \<open>Update\<close>  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
62  | 
|
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
63  | 
lemma invc_upd: assumes "invc t"  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
64  | 
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: 
68413 
diff
changeset
 | 
65  | 
using assms  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
66  | 
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: 
68413 
diff
changeset
 | 
67  | 
|
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
68  | 
lemma invh_upd: assumes "invh t"  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
69  | 
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: 
68413 
diff
changeset
 | 
70  | 
using assms  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
71  | 
by(induct x y t rule: upd.induct)  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
72  | 
(auto simp: invh_baliL invh_baliR bheight_baliL bheight_baliR)  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
73  | 
|
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
74  | 
theorem rbt_update: "rbt t \<Longrightarrow> rbt (update x y t)"  | 
| 70708 | 75  | 
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: 
68413 
diff
changeset
 | 
76  | 
|
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
77  | 
|
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
78  | 
subsubsection \<open>Deletion\<close>  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
79  | 
|
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
80  | 
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: 
68413 
diff
changeset
 | 
81  | 
(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: 
68413 
diff
changeset
 | 
82  | 
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: 
68413 
diff
changeset
 | 
83  | 
proof (induct x t rule: del.induct)  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
84  | 
case (2 x _ y _ c)  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
85  | 
have "x = y \<or> x < y \<or> x > y" by auto  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
86  | 
thus ?case proof (elim disjE)  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
87  | 
assume "x = y"  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
88  | 
with 2 show ?thesis  | 
| 71830 | 89  | 
by (cases c) (simp_all add: invh_join invc_join)  | 
| 
68415
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
90  | 
next  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
91  | 
assume "x < y"  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
92  | 
with 2 show ?thesis  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
93  | 
by(cases c)  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
94  | 
(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: 
68413 
diff
changeset
 | 
95  | 
next  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
96  | 
assume "y < x"  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
97  | 
with 2 show ?thesis  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
98  | 
by(cases c)  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
99  | 
(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: 
68413 
diff
changeset
 | 
100  | 
qed  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
101  | 
qed auto  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
102  | 
|
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
103  | 
theorem rbt_delete: "rbt t \<Longrightarrow> rbt (delete k t)"  | 
| 70708 | 104  | 
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: 
68413 
diff
changeset
 | 
105  | 
|
| 68440 | 106  | 
interpretation M: Map_by_Ordered  | 
| 68431 | 107  | 
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: 
68413 
diff
changeset
 | 
108  | 
and inorder = inorder and inv = rbt  | 
| 61224 | 109  | 
proof (standard, goal_cases)  | 
| 68431 | 110  | 
case 1 show ?case by (simp add: empty_def)  | 
| 61224 | 111  | 
next  | 
| 61790 | 112  | 
case 2 thus ?case by(simp add: lookup_map_of)  | 
| 61224 | 113  | 
next  | 
| 68440 | 114  | 
case 3 thus ?case by(simp add: inorder_update)  | 
| 61224 | 115  | 
next  | 
| 68440 | 116  | 
case 4 thus ?case by(simp add: inorder_delete)  | 
| 
68415
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
117  | 
next  | 
| 68431 | 118  | 
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: 
68413 
diff
changeset
 | 
119  | 
next  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
120  | 
case 6 thus ?case by (simp add: rbt_update)  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
121  | 
next  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
122  | 
case 7 thus ?case by (simp add: rbt_delete)  | 
| 
 
d74ba11680d4
tuned def. of del and proved preservation of rbt (finally)
 
nipkow 
parents: 
68413 
diff
changeset
 | 
123  | 
qed  | 
| 61224 | 124  | 
|
125  | 
end  |