12 "lookup Leaf x = None" | |
12 "lookup Leaf x = None" | |
13 "lookup (Node l (a,b) r) x = (if x < a then lookup l x else |
13 "lookup (Node l (a,b) r) x = (if x < a then lookup l x else |
14 if x > a then lookup r x else Some b)" |
14 if x > a then lookup r x else Some b)" |
15 |
15 |
16 fun update :: "'a::linorder \<Rightarrow> 'b \<Rightarrow> ('a*'b) tree \<Rightarrow> ('a*'b) tree" where |
16 fun update :: "'a::linorder \<Rightarrow> 'b \<Rightarrow> ('a*'b) tree \<Rightarrow> ('a*'b) tree" where |
17 "update a b Leaf = Node Leaf (a,b) Leaf" | |
17 "update x y Leaf = Node Leaf (x,y) Leaf" | |
18 "update a b (Node l (x,y) r) = |
18 "update x y (Node l (a,b) r) = |
19 (if a < x then Node (update a b l) (x,y) r |
19 (if x < a then Node (update x y l) (a,b) r |
20 else if a=x then Node l (a,b) r |
20 else if x = a then Node l (x,y) r |
21 else Node l (x,y) (update a b r))" |
21 else Node l (a,b) (update x y r))" |
22 |
22 |
23 fun delete :: "'a::linorder \<Rightarrow> ('a*'b) tree \<Rightarrow> ('a*'b) tree" where |
23 fun delete :: "'a::linorder \<Rightarrow> ('a*'b) tree \<Rightarrow> ('a*'b) tree" where |
24 "delete k Leaf = Leaf" | |
24 "delete x Leaf = Leaf" | |
25 "delete k (Node l (a,b) r) = (if k<a then Node (delete k l) (a,b) r else |
25 "delete x (Node l (a,b) r) = (if x < a then Node (delete x l) (a,b) r else |
26 if k > a then Node l (a,b) (delete k r) else |
26 if x > a then Node l (a,b) (delete x r) else |
27 if r = Leaf then l else let (ab',r') = del_min r in Node l ab' r')" |
27 if r = Leaf then l else let (ab',r') = del_min r in Node l ab' r')" |
28 |
28 |
29 |
29 |
30 subsection "Functional Correctness Proofs" |
30 subsection "Functional Correctness Proofs" |
31 |
31 |