Theory Splay_Tree_Analysis_Base
section "Splay Tree"
subsection "Basics"
theory Splay_Tree_Analysis_Base
imports
Lemmas_log
Splay_Tree.Splay_Tree
"HOL-Data_Structures.Define_Time_Function"
begin
declare size1_size[simp]
abbreviation "φ t == log 2 (size1 t)"
fun Φ :: "'a tree ⇒ real" where
"Φ Leaf = 0" |
"Φ (Node l a r) = φ (Node l a r) + Φ l + Φ r"
time_fun cmp
time_fun splay equations splay.simps(1) splay_code
lemma T_splay_simps[simp]:
"T_splay a (Node l a r) = 1"
"x<b ⟹ T_splay x (Node Leaf b CD) = 1"
"a<b ⟹ T_splay a (Node (Node A a B) b CD) = 1"
"x<a ⟹ x<b ⟹ T_splay x (Node (Node A a B) b CD) =
(if A = Leaf then 1 else T_splay x A + 1)"
"x<b ⟹ a<x ⟹ T_splay x (Node (Node A a B) b CD) =
(if B = Leaf then 1 else T_splay x B + 1)"
"b<x ⟹ T_splay x (Node AB b Leaf) = 1"
"b<a ⟹ T_splay a (Node AB b (Node C a D)) = 1"
"b<x ⟹ x<c ⟹ T_splay x (Node AB b (Node C c D)) =
(if C=Leaf then 1 else T_splay x C + 1)"
"b<x ⟹ c<x ⟹ T_splay x (Node AB b (Node C c D)) =
(if D=Leaf then 1 else T_splay x D + 1)"
by (auto simp add: tree.case_eq_if)
declare T_splay.simps(2)[simp del]
time_fun insert
lemma T_insert_simp: "T_insert x t = (if t = Leaf then 0 else T_splay x t)"
by(auto split: tree.split)
time_fun splay_max
time_fun delete
lemma ex_in_set_tree: "t ≠ Leaf ⟹ bst t ⟹
∃x' ∈ set_tree t. splay x' t = splay x t ∧ T_splay x' t = T_splay x t"
proof(induction x t rule: splay.induct)
case (6 x b c A)
hence "splay x A ≠ Leaf" by simp
then obtain A1 u A2 where [simp]: "splay x A = Node A1 u A2"
by (metis tree.exhaust)
have "b < c" "bst A" using "6.prems" by auto
from "6.IH"[OF ‹A ≠ Leaf› ‹bst A›]
obtain x' where "x' ∈ set_tree A" "splay x' A = splay x A" "T_splay x' A = T_splay x A"
by blast
moreover hence "x'<b" using "6.prems"(2) by auto
ultimately show ?case using ‹x<c› ‹x<b› ‹b<c› ‹bst A› by force
next
case (8 a x c B)
hence "splay x B ≠ Leaf" by simp
then obtain B1 u B2 where [simp]: "splay x B = Node B1 u B2"
by (metis tree.exhaust)
have "a < c" "bst B" using "8.prems" by auto
from "8.IH"[OF ‹B ≠ Leaf› ‹bst B›]
obtain x' where "x' ∈ set_tree B" "splay x' B = splay x B" "T_splay x' B = T_splay x B"
by blast
moreover hence "a<x' & x'<c" using "8.prems"(2) by simp
ultimately show ?case using ‹x<c› ‹a<x› ‹a<c› ‹bst B› by force
next
case (11 b x c C)
hence "splay x C ≠ Leaf" by simp
then obtain C1 u C2 where [simp]: "splay x C = Node C1 u C2"
by (metis tree.exhaust)
have "b < c" "bst C" using "11.prems" by auto
from "11.IH"[OF ‹C ≠ Leaf› ‹bst C›]
obtain x' where "x' ∈ set_tree C" "splay x' C = splay x C" "T_splay x' C = T_splay x C"
by blast
moreover hence "b<x' & x'<c" using "11.prems" by simp
ultimately show ?case using ‹b<x› ‹x<c› ‹b<c› ‹bst C› by force
next
case (14 a x c D)
hence "splay x D ≠ Leaf" by simp
then obtain D1 u D2 where [simp]: "splay x D = Node D1 u D2"
by (metis tree.exhaust)
have "a < c" "bst D" using "14.prems" by auto
from "14.IH"[OF ‹D ≠ Leaf› ‹bst D›]
obtain x' where "x' ∈ set_tree D" "splay x' D = splay x D" "T_splay x' D = T_splay x D"
by blast
moreover hence "c<x'" using "14.prems"(2) by simp
ultimately show ?case using ‹a<x› ‹c<x› ‹a<c› ‹bst D› by force
qed (auto simp: le_less)