fun isin :: "'a::linorder tree234 ==> 'a ==> bool"where "isin Leaf x = False" | "isin (Node2 l a r) x = (case cmp x a of LT ==> isin l x | EQ ==> True | GT ==> isin r x)" | "isin (Node3 l a m b r) x = (case cmp x a of LT ==> isin l x | EQ ==> True | GT ==> (case cmp x b of LT ==> isin m x | EQ ==> True | GT ==> isin r x))" | "isin (Node4 t1 a t2 b t3 c t4) x = (case cmp x b of LT ==> (case cmp x a of LT ==> isin t1 x | EQ ==> True | GT ==> isin t2 x) | EQ ==> True | GT ==> (case cmp x c of LT ==> isin t3 x | EQ ==> True | GT ==> isin t4 x))"
datatype 'a up🪙i = T🪙i "'a tree234" | Up🪙i "'a tree234" 'a "'a tree234"
fun tree🪙i :: "'a up🪙i ==> 'a tree234"where "tree🪙i (T🪙i t) = t" | "tree🪙i (Up🪙i l a r) = Node2 l a r"
fun ins :: "'a::linorder ==> 'a tree234 ==> 'a up🪙i"where "ins x Leaf = Up🪙i Leaf x Leaf" | "ins x (Node2 l a r) = (case cmp x a of LT ==> (case ins x l of T🪙i l' => T🪙i (Node2 l' a r) | Up🪙i l1 b l2 => T🪙i (Node3 l1 b l2 a r)) | EQ ==> T🪙i (Node2 l x r) | GT ==> (case ins x r of T🪙i r' => T🪙i (Node2 l a r') | Up🪙i r1 b r2 => T🪙i (Node3 l a r1 b r2)))" | "ins x (Node3 l a m b r) = (case cmp x a of LT ==> (case ins x l of T🪙i l' => T🪙i (Node3 l' a m b r) | Up🪙i l1 c l2 => Up🪙i (Node2 l1 c l2) a (Node2 m b r)) | EQ ==> T🪙i (Node3 l a m b r) | GT ==> (case cmp x b of GT ==> (case ins x r of T🪙i r' => T🪙i (Node3 l a m b r') | Up🪙i r1 c r2 => Up🪙i (Node2 l a m) b (Node2 r1 c r2)) | EQ ==> T🪙i (Node3 l a m b r) | LT ==> (case ins x m of T🪙i m' => T🪙i (Node3 l a m' b r) | Up🪙i m1 c m2 => Up🪙i (Node2 l a m1) c (Node2 m2 b r))))" | "ins x (Node4 t1 a t2 b t3 c t4) = (case cmp x b of LT ==> (case cmp x a of LT ==> (case ins x t1 of T🪙i t => T🪙i (Node4 t a t2 b t3 c t4) | Up🪙i l y r => Up🪙i (Node2 l y r) a (Node3 t2 b t3 c t4)) | EQ ==> T🪙i (Node4 t1 a t2 b t3 c t4) | GT ==> (case ins x t2 of T🪙i t => T🪙i (Node4 t1 a t b t3 c t4) | Up🪙i l y r => Up🪙i (Node2 t1 a l) y (Node3 r b t3 c t4))) | EQ ==> T🪙i (Node4 t1 a t2 b t3 c t4) | GT ==> (case cmp x c of LT ==> (case ins x t3 of T🪙i t => T🪙i (Node4 t1 a t2 b t c t4) | Up🪙i l y r => Up🪙i (Node2 t1 a t2) b (Node3 l y r c t4)) | EQ ==> T🪙i (Node4 t1 a t2 b t3 c t4) | GT ==> (case ins x t4 of T🪙i t => T🪙i (Node4 t1 a t2 b t3 c t) | Up🪙i l y r => Up🪙i (Node2 t1 a t2) b (Node3 t3 c l y r))))"
hide_const insert
definition insert :: "'a::linorder ==> 'a tree234 ==> 'a tree234"where "insert x t = tree🪙i(ins x t)"
fun tree🪙d :: "'a up🪙d ==> 'a tree234"where "tree🪙d (T🪙d t) = t" | "tree🪙d (Up🪙d t) = t"
fun node21 :: "'a up🪙d ==> 'a ==> 'a tree234 ==> 'a up🪙d"where "node21 (T🪙d l) a r = T🪙d(Node2 l a r)" | "node21 (Up🪙d l) a (Node2 lr b rr) = Up🪙d(Node3 l a lr b rr)" | "node21 (Up🪙d l) a (Node3 lr b mr c rr) = T🪙d(Node2 (Node2 l a lr) b (Node2 mr c rr))" | "node21 (Up🪙d t1) a (Node4 t2 b t3 c t4 d t5) = T🪙d(Node2 (Node2 t1 a t2) b (Node3 t3 c t4 d t5))"
fun node22 :: "'a tree234 ==> 'a ==> 'a up🪙d ==> 'a up🪙d"where "node22 l a (T🪙d r) = T🪙d(Node2 l a r)" | "node22 (Node2 ll b rl) a (Up🪙d r) = Up🪙d(Node3 ll b rl a r)" | "node22 (Node3 ll b ml c rl) a (Up🪙d r) = T🪙d(Node2 (Node2 ll b ml) c (Node2 rl a r))" | "node22 (Node4 t1 a t2 b t3 c t4) d (Up🪙d t5) = T🪙d(Node2 (Node2 t1 a t2) b (Node3 t3 c t4 d t5))"
fun node31 :: "'a up🪙d ==> 'a ==> 'a tree234 ==> 'a ==> 'a tree234 ==> 'a up🪙d"where "node31 (T🪙d t1) a t2 b t3 = T🪙d(Node3 t1 a t2 b t3)" | "node31 (Up🪙d t1) a (Node2 t2 b t3) c t4 = T🪙d(Node2 (Node3 t1 a t2 b t3) c t4)" | "node31 (Up🪙d t1) a (Node3 t2 b t3 c t4) d t5 = T🪙d(Node3 (Node2 t1 a t2) b (Node2 t3 c t4) d t5)" | "node31 (Up🪙d t1) a (Node4 t2 b t3 c t4 d t5) e t6 = T🪙d(Node3 (Node2 t1 a t2) b (Node3 t3 c t4 d t5) e t6)"
fun node32 :: "'a tree234 ==> 'a ==> 'a up🪙d ==> 'a ==> 'a tree234 ==> 'a up🪙d"where "node32 t1 a (T🪙d t2) b t3 = T🪙d(Node3 t1 a t2 b t3)" | "node32 t1 a (Up🪙d t2) b (Node2 t3 c t4) = T🪙d(Node2 t1 a (Node3 t2 b t3 c t4))" | "node32 t1 a (Up🪙d t2) b (Node3 t3 c t4 d t5) = T🪙d(Node3 t1 a (Node2 t2 b t3) c (Node2 t4 d t5))" | "node32 t1 a (Up🪙d t2) b (Node4 t3 c t4 d t5 e t6) = T🪙d(Node3 t1 a (Node2 t2 b t3) c (Node3 t4 d t5 e t6))"
fun node33 :: "'a tree234 ==> 'a ==> 'a tree234 ==> 'a ==> 'a up🪙d ==> 'a up🪙d"where "node33 l a m b (T🪙d r) = T🪙d(Node3 l a m b r)" | "node33 t1 a (Node2 t2 b t3) c (Up🪙d t4) = T🪙d(Node2 t1 a (Node3 t2 b t3 c t4))" | "node33 t1 a (Node3 t2 b t3 c t4) d (Up🪙d t5) = T🪙d(Node3 t1 a (Node2 t2 b t3) c (Node2 t4 d t5))" | "node33 t1 a (Node4 t2 b t3 c t4 d t5) e (Up🪙d t6) = T🪙d(Node3 t1 a (Node2 t2 b t3) c (Node3 t4 d t5 e t6))"
fun node41 :: "'a up🪙d ==> 'a ==> 'a tree234 ==> 'a ==> 'a tree234 ==> 'a ==> 'a tree234 ==> 'a up🪙d"where "node41 (T🪙d t1) a t2 b t3 c t4 = T🪙d(Node4 t1 a t2 b t3 c t4)" | "node41 (Up🪙d t1) a (Node2 t2 b t3) c t4 d t5 = T🪙d(Node3 (Node3 t1 a t2 b t3) c t4 d t5)" | "node41 (Up🪙d t1) a (Node3 t2 b t3 c t4) d t5 e t6 = T🪙d(Node4 (Node2 t1 a t2) b (Node2 t3 c t4) d t5 e t6)" | "node41 (Up🪙d t1) a (Node4 t2 b t3 c t4 d t5) e t6 f t7 = T🪙d(Node4 (Node2 t1 a t2) b (Node3 t3 c t4 d t5) e t6 f t7)"
fun node42 :: "'a tree234 ==> 'a ==> 'a up🪙d ==> 'a ==> 'a tree234 ==> 'a ==> 'a tree234 ==> 'a up🪙d"where "node42 t1 a (T🪙d t2) b t3 c t4 = T🪙d(Node4 t1 a t2 b t3 c t4)" | "node42 (Node2 t1 a t2) b (Up🪙d t3) c t4 d t5 = T🪙d(Node3 (Node3 t1 a t2 b t3) c t4 d t5)" | "node42 (Node3 t1 a t2 b t3) c (Up🪙d t4) d t5 e t6 = T🪙d(Node4 (Node2 t1 a t2) b (Node2 t3 c t4) d t5 e t6)" | "node42 (Node4 t1 a t2 b t3 c t4) d (Up🪙d t5) e t6 f t7 = T🪙d(Node4 (Node2 t1 a t2) b (Node3 t3 c t4 d t5) e t6 f t7)"
fun node43 :: "'a tree234 ==> 'a ==> 'a tree234 ==> 'a ==> 'a up🪙d ==> 'a ==> 'a tree234 ==> 'a up🪙d"where "node43 t1 a t2 b (T🪙d t3) c t4 = T🪙d(Node4 t1 a t2 b t3 c t4)" | "node43 t1 a (Node2 t2 b t3) c (Up🪙d t4) d t5 = T🪙d(Node3 t1 a (Node3 t2 b t3 c t4) d t5)" | "node43 t1 a (Node3 t2 b t3 c t4) d (Up🪙d t5) e t6 = T🪙d(Node4 t1 a (Node2 t2 b t3) c (Node2 t4 d t5) e t6)" | "node43 t1 a (Node4 t2 b t3 c t4 d t5) e (Up🪙d t6) f t7 = T🪙d(Node4 t1 a (Node2 t2 b t3) c (Node3 t4 d t5 e t6) f t7)"
fun node44 :: "'a tree234 ==> 'a ==> 'a tree234 ==> 'a ==> 'a tree234 ==> 'a ==> 'a up🪙d ==> 'a up🪙d"where "node44 t1 a t2 b t3 c (T🪙d t4) = T🪙d(Node4 t1 a t2 b t3 c t4)" | "node44 t1 a t2 b (Node2 t3 c t4) d (Up🪙d t5) = T🪙d(Node3 t1 a t2 b (Node3 t3 c t4 d t5))" | "node44 t1 a t2 b (Node3 t3 c t4 d t5) e (Up🪙d t6) = T🪙d(Node4 t1 a t2 b (Node2 t3 c t4) d (Node2 t5 e t6))" | "node44 t1 a t2 b (Node4 t3 c t4 d t5 e t6) f (Up🪙d t7) = T🪙d(Node4 t1 a t2 b (Node2 t3 c t4) d (Node3 t5 e t6 f t7))"
fun split_min :: "'a tree234 ==> 'a * 'a up🪙d"where "split_min (Node2 Leaf a Leaf) = (a, Up🪙d Leaf)" | "split_min (Node3 Leaf a Leaf b Leaf) = (a, T🪙d(Node2 Leaf b Leaf))" | "split_min (Node4 Leaf a Leaf b Leaf c Leaf) = (a, T🪙d(Node3 Leaf b Leaf c Leaf))" | "split_min (Node2 l a r) = (let (x,l') = split_min l in (x, node21 l' a r))" | "split_min (Node3 l a m b r) = (let (x,l') = split_min l in (x, node31 l' a m b r))" | "split_min (Node4 l a m b n c r) = (let (x,l') = split_min l in (x, node41 l' a m b n c r))"
fun del :: "'a::linorder ==> 'a tree234 ==> 'a up🪙d"where "del k Leaf = T🪙d Leaf" | "del k (Node2 Leaf p Leaf) = (if k=p then Up🪙d Leaf else T🪙d(Node2 Leaf p Leaf))" | "del k (Node3 Leaf p Leaf q Leaf) = T🪙d(if k=p then Node2 Leaf q Leaf else if k=q then Node2 Leaf p Leaf else Node3 Leaf p Leaf q Leaf)" | "del k (Node4 Leaf a Leaf b Leaf c Leaf) = T🪙d(if k=a then Node3 Leaf b Leaf c Leaf else if k=b then Node3 Leaf a Leaf c Leaf else if k=c then Node3 Leaf a Leaf b Leaf else Node4 Leaf a Leaf b Leaf c Leaf)" | "del k (Node2 l a r) = (case cmp k a of LT ==> node21 (del k l) a r | GT ==> node22 l a (del k r) | EQ ==> let (a',t) = split_min r in node22 l a' t)" | "del k (Node3 l a m b r) = (case cmp k a of LT ==> node31 (del k l) a m b r | EQ ==> let (a',m') = split_min m in node32 l a' m' b r | GT ==> (case cmp k b of LT ==> node32 l a (del k m) b r | EQ ==> let (b',r') = split_min r in node33 l a m b' r' | GT ==> node33 l a m b (del k r)))" | "del k (Node4 l a m b n c r) = (case cmp k b of LT ==> (case cmp k a of LT ==> node41 (del k l) a m b n c r | EQ ==> let (a',m') = split_min m in node42 l a' m' b n c r | GT ==> node42 l a (del k m) b n c r) | EQ ==> let (b',n') = split_min n in node43 l a m b' n' c r | GT ==> (case cmp k c of LT ==> node43 l a m b (del k n) c r | EQ ==> let (c',r') = split_min r in node44 l a m b n c' r' | GT ==> node44 l a m b n c (del k r)))"
definition delete :: "'a::linorder ==> 'a tree234 ==> 'a tree234"where "delete x t = tree🪙d(del x t)"
subsection"Functional correctness"
subsubsection ‹Functional correctness of isin:›
lemma isin_set: "sorted(inorder t) ==> isin t x = (x ∈ set (inorder t))" by (induction t) (auto simp: isin_simps)
subsubsection ‹Functional correctness of insert:›
lemma inorder_ins: "sorted(inorder t) ==> inorder(tree🪙i(ins x t)) = ins_list x (inorder t)" by(induction t) (auto, auto simp: ins_list_simps split!: if_splits up🪙i.splits)
lemma inorder_insert: "sorted(inorder t) ==> inorder(insert a t) = ins_list a (inorder t)" by(simp add: insert_def inorder_ins)
subsubsection ‹Functional correctness of delete›
lemma inorder_node21: "height r > 0 ==> inorder (tree🪙d (node21 l' a r)) = inorder (tree🪙d l') @ a # inorder r" by(induct l' a r rule: node21.induct) auto
lemma inorder_node22: "height l > 0 ==> inorder (tree🪙d (node22 l a r')) = inorder l @ a # inorder (tree🪙d r')" by(induct l a r' rule: node22.induct) auto
lemma inorder_node31: "height m > 0 ==> inorder (tree🪙d (node31 l' a m b r)) = inorder (tree🪙d l') @ a # inorder m @ b # inorder r" by(induct l' a m b r rule: node31.induct) auto
lemma inorder_node32: "height r > 0 ==> inorder (tree🪙d (node32 l a m' b r)) = inorder l @ a # inorder (tree🪙d m') @ b # inorder r" by(induct l a m' b r rule: node32.induct) auto
lemma inorder_node33: "height m > 0 ==> inorder (tree🪙d (node33 l a m b r')) = inorder l @ a # inorder m @ b # inorder (tree🪙d r')" by(induct l a m b r' rule: node33.induct) auto
lemma inorder_node41: "height m > 0 ==> inorder (tree🪙d (node41 l' a m b n c r)) = inorder (tree🪙d l') @ a # inorder m @ b # inorder n @ c # inorder r" by(induct l' a m b n c r rule: node41.induct) auto
lemma inorder_node42: "height l > 0 ==> inorder (tree🪙d (node42 l a m b n c r)) = inorder l @ a # inorder (tree🪙d m) @ b # inorder n @ c # inorder r" by(induct l a m b n c r rule: node42.induct) auto
lemma inorder_node43: "height m > 0 ==> inorder (tree🪙d (node43 l a m b n c r)) = inorder l @ a # inorder m @ b # inorder(tree🪙d n) @ c # inorder r" by(induct l a m b n c r rule: node43.induct) auto
lemma inorder_node44: "height n > 0 ==> inorder (tree🪙d (node44 l a m b n c r)) = inorder l @ a # inorder m @ b # inorder n @ c # inorder (tree🪙d r)" by(induct l a m b n c r rule: node44.induct) auto
lemma split_minD: "split_min t = (x,t') ==> bal t ==> height t > 0 ==> x # inorder(tree🪙d t') = inorder t" by(induction t arbitrary: t' rule: split_min.induct)
(auto simp: inorder_nodes split: prod.splits)
lemma inorder_del: "[ bal t ; sorted(inorder t) ]==> inorder(tree🪙d (del x t)) = del_list x (inorder t)" by(induction t rule: del.induct)
(auto simp: inorder_nodes del_list_simps split_minD split!: if_split prod.splits) (* 30 secs (2016) *)
lemma inorder_delete: "[ bal t ; sorted(inorder t) ]==> inorder(delete x t) = del_list x (inorder t)" by(simp add: delete_def inorder_del)
subsection‹Balancedness›
subsubsection "Proofs for insert"
text‹First a standard proof that 🍋‹ins› preserves 🍋‹bal›.›
instantiation up🪙i :: (type)height begin
fun height_up🪙i :: "'a up🪙i ==> nat"where "height (T🪙i t) = height t" | "height (Up🪙i l a r) = height l"
instance ..
end
lemma bal_ins: "bal t ==> bal (tree🪙i(ins a t)) ∧ height(ins a t) = height t" by (induct t) (auto split!: if_split up🪙i.split)
text‹Now an alternative proof (by Brian Huffman) that runs faster because two properties (balance and height) are combined in one predicate.›
inductive full :: "nat ==> 'a tree234 ==> bool"where "full 0 Leaf" | "[full n l; full n r]==> full (Suc n) (Node2 l p r)" | "[full n l; full n m; full n r]==> full (Suc n) (Node3 l p m q r)" | "[full n l; full n m; full n m'; full n r]==> full (Suc n) (Node4 l p m q m' q' r)"
inductive_cases full_elims: "full n Leaf" "full n (Node2 l p r)" "full n (Node3 l p m q r)" "full n (Node4 l p m q m' q' r)"
lemma full_0_iff [simp]: "full 0 t ⟷ t = Leaf" by (auto elim: full_0_elim intro: full.intros)
lemma full_Leaf_iff [simp]: "full n Leaf ⟷ n = 0" by (auto elim: full_elims intro: full.intros)
lemma full_Suc_Node2_iff [simp]: "full (Suc n) (Node2 l p r) ⟷ full n l ∧ full n r" by (auto elim: full_elims intro: full.intros)
lemma full_Suc_Node3_iff [simp]: "full (Suc n) (Node3 l p m q r) ⟷ full n l ∧ full n m ∧ full n r" by (auto elim: full_elims intro: full.intros)
lemma full_Suc_Node4_iff [simp]: "full (Suc n) (Node4 l p m q m' q' r) ⟷ full n l ∧ full n m ∧ full n m' ∧ full n r" by (auto elim: full_elims intro: full.intros)
lemma full_imp_height: "full n t ==> height t = n" by (induct set: full, simp_all)
lemma full_imp_bal: "full n t ==> bal t" by (induct set: full, auto dest: full_imp_height)
lemma bal_imp_full: "bal t ==> full (height t) t" by (induct t, simp_all)
lemma bal_iff_full: "bal t ⟷ (∃n. full n t)" by (auto elim!: bal_imp_full full_imp_bal)
text‹The 🍋‹insert› function either preserves the height of the
tree, or increases it by one. The constructor returned by the 🍋‹insert›function determines which: A return value of the form 🍋‹T🪙i t› indicates that the height will be the same. A value of the
form 🍋‹Up🪙i l p r› indicates an increase in height.›
primrec full🪙i :: "nat ==> 'a up🪙i ==> bool"where "full🪙i n (T🪙i t) ⟷ full n t" | "full🪙i n (Up🪙i l p r) ⟷ full n l ∧ full n r"
lemma full🪙i_ins: "full n t ==> full🪙i n (ins a t)" by (induct rule: full.induct) (auto, auto split: up🪙i.split)
text‹The 🍋‹insert› operation preserves balance.›
lemma bal_insert: "bal t ==> bal (insert a t)" unfolding bal_iff_full insert_def apply (erule exE) apply (drule full🪙i_ins [of _ _ a]) apply (cases "ins a t") apply (auto intro: full.intros) done
lemma bal_tree🪙d_node21: "[bal r; bal (tree🪙d l); height r = height l ]==> bal (tree🪙d (node21 l a r))" by(induct l a r rule: node21.induct) auto
lemma bal_tree🪙d_node22: "[bal(tree🪙d r); bal l; height r = height l ]==> bal (tree🪙d (node22 l a r))" by(induct l a r rule: node22.induct) auto
lemma bal_tree🪙d_node31: "[ bal (tree🪙d l); bal m; bal r; height l = height r; height m = height r ] ==> bal (tree🪙d (node31 l a m b r))" by(induct l a m b r rule: node31.induct) auto
lemma bal_tree🪙d_node32: "[ bal l; bal (tree🪙d m); bal r; height l = height r; height m = height r ] ==> bal (tree🪙d (node32 l a m b r))" by(induct l a m b r rule: node32.induct) auto
lemma bal_tree🪙d_node33: "[ bal l; bal m; bal(tree🪙d r); height l = height r; height m = height r ] ==> bal (tree🪙d (node33 l a m b r))" by(induct l a m b r rule: node33.induct) auto
lemma bal_tree🪙d_node41: "[ bal (tree🪙d l); bal m; bal n; bal r; height l = height r; height m = height r; height n = height r ] ==> bal (tree🪙d (node41 l a m b n c r))" by(induct l a m b n c r rule: node41.induct) auto
lemma bal_tree🪙d_node42: "[ bal l; bal (tree🪙d m); bal n; bal r; height l = height r; height m = height r; height n = height r ] ==> bal (tree🪙d (node42 l a m b n c r))" by(induct l a m b n c r rule: node42.induct) auto
lemma bal_tree🪙d_node43: "[ bal l; bal m; bal (tree🪙d n); bal r; height l = height r; height m = height r; height n = height r ] ==> bal (tree🪙d (node43 l a m b n c r))" by(induct l a m b n c r rule: node43.induct) auto
lemma bal_tree🪙d_node44: "[ bal l; bal m; bal n; bal (tree🪙d r); height l = height r; height m = height r; height n = height r ] ==> bal (tree🪙d (node44 l a m b n c r))" by(induct l a m b n c r rule: node44.induct) auto
lemma height_node21: "height r > 0 ==> height(node21 l a r) = max (height l) (height r) + 1" by(induct l a r rule: node21.induct)(simp_all add: max.assoc)
lemma height_node22: "height l > 0 ==> height(node22 l a r) = max (height l) (height r) + 1" by(induct l a r rule: node22.induct)(simp_all add: max.assoc)
lemma height_node31: "height m > 0 ==> height(node31 l a m b r) = max (height l) (max (height m) (height r)) + 1" by(induct l a m b r rule: node31.induct)(simp_all add: max_def)
lemma height_node32: "height r > 0 ==> height(node32 l a m b r) = max (height l) (max (height m) (height r)) + 1" by(induct l a m b r rule: node32.induct)(simp_all add: max_def)
lemma height_node33: "height m > 0 ==> height(node33 l a m b r) = max (height l) (max (height m) (height r)) + 1" by(induct l a m b r rule: node33.induct)(simp_all add: max_def)
lemma height_node41: "height m > 0 ==> height(node41 l a m b n c r) = max (height l) (max (height m) (max (height n) (height r))) + 1" by(induct l a m b n c r rule: node41.induct)(simp_all add: max_def)
lemma height_node42: "height l > 0 ==> height(node42 l a m b n c r) = max (height l) (max (height m) (max (height n) (height r))) + 1" by(induct l a m b n c r rule: node42.induct)(simp_all add: max_def)
lemma height_node43: "height m > 0 ==> height(node43 l a m b n c r) = max (height l) (max (height m) (max (height n) (height r))) + 1" by(induct l a m b n c r rule: node43.induct)(simp_all add: max_def)
lemma height_node44: "height n > 0 ==> height(node44 l a m b n c r) = max (height l) (max (height m) (max (height n) (height r))) + 1" by(induct l a m b n c r rule: node44.induct)(simp_all add: max_def)
lemma height_split_min: "split_min t = (x, t') ==> height t > 0 ==> bal t ==> height t' = height t" by(induct t arbitrary: x t' rule: split_min.induct)
(auto simp: heights split: prod.splits)
lemma height_del: "bal t ==> height(del x t) = height t" by(induction x t rule: del.induct)
(auto simp add: heights height_split_min split!: if_split prod.split)
lemma bal_split_min: "[ split_min t = (x, t'); bal t; height t > 0 ]==> bal (tree🪙d t')" by(induct t arbitrary: x t' rule: split_min.induct)
(auto simp: heights height_split_min bals split: prod.splits)
lemma bal_tree🪙d_del: "bal t ==> bal(tree🪙d(del x t))" by(induction x t rule: del.induct)
(auto simp: bals bal_split_min height_del height_split_min split!: if_split prod.split)
corollary bal_delete: "bal t ==> bal(delete x t)" by(simp add: delete_def bal_tree🪙d_del)
subsection‹Overall Correctness›
interpretation S: Set_by_Ordered where empty = empty and isin = isin and insert = insert and delete = delete and inorder = inorder and inv = bal proof (standard, goal_cases) case 2 thus ?caseby(simp add: isin_set) next case 3 thus ?caseby(simp add: inorder_insert) next case 4 thus ?caseby(simp add: inorder_delete) next case 6 thus ?caseby(simp add: bal_insert) next case 7 thus ?caseby(simp add: bal_delete) qed (simp add: empty_def)+
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.16 Sekunden
(vorverarbeitet am 2026-04-26)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.