# HG changeset patch # User nipkow # Date 1504182743 -7200 # Node ID dd47c984359865a868a6bbbc4e3a7cb3f77da7bd # Parent a14bbbaa628d40fc0be0c1caa72b31d1e1432a6b Moved material into AFP/Splay_Tree diff -r a14bbbaa628d -r dd47c9843598 src/HOL/Data_Structures/Splay_Map.thy --- a/src/HOL/Data_Structures/Splay_Map.thy Thu Aug 31 09:50:11 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,156 +0,0 @@ -(* Author: Tobias Nipkow *) - -section "Splay Tree Implementation of Maps" - -theory Splay_Map -imports - Splay_Set - Map_by_Ordered -begin - -function splay :: "'a::linorder \ ('a*'b) tree \ ('a*'b) tree" where -"splay x Leaf = Leaf" | -"x = fst a \ splay x (Node t1 a t2) = Node t1 a t2" | -"x = fst a \ x < fst b \ splay x (Node (Node t1 a t2) b t3) = Node t1 a (Node t2 b t3)" | -"x < fst a \ splay x (Node Leaf a t) = Node Leaf a t" | -"x < fst a \ x < fst b \ splay x (Node (Node Leaf a t1) b t2) = Node Leaf a (Node t1 b t2)" | -"x < fst a \ x < fst b \ t1 \ Leaf \ - splay x (Node (Node t1 a t2) b t3) = - (case splay x t1 of Node t11 y t12 \ Node t11 y (Node t12 a (Node t2 b t3)))" | -"fst a < x \ x < fst b \ splay x (Node (Node t1 a Leaf) b t2) = Node t1 a (Node Leaf b t2)" | -"fst a < x \ x < fst b \ t2 \ Leaf \ - splay x (Node (Node t1 a t2) b t3) = - (case splay x t2 of Node t21 y t22 \ Node (Node t1 a t21) y (Node t22 b t3))" | -"fst a < x \ x = fst b \ splay x (Node t1 a (Node t2 b t3)) = Node (Node t1 a t2) b t3" | -"fst a < x \ splay x (Node t a Leaf) = Node t a Leaf" | -"fst a < x \ x < fst b \ t2 \ Leaf \ - splay x (Node t1 a (Node t2 b t3)) = - (case splay x t2 of Node t21 y t22 \ Node (Node t1 a t21) y (Node t22 b t3))" | -"fst a < x \ x < fst b \ splay x (Node t1 a (Node Leaf b t2)) = Node (Node t1 a Leaf) b t2" | -"fst a < x \ fst b < x \ splay x (Node t1 a (Node t2 b Leaf)) = Node (Node t1 a t2) b Leaf" | -"fst a < x \ fst b < x \ t3 \ Leaf \ - splay x (Node t1 a (Node t2 b t3)) = - (case splay x t3 of Node t31 y t32 \ Node (Node (Node t1 a t2) b t31) y t32)" -apply(atomize_elim) -apply(auto) -(* 1 subgoal *) -apply (subst (asm) neq_Leaf_iff) -apply(auto) -apply (metis tree.exhaust surj_pair less_linear)+ -done - -termination splay -by lexicographic_order - -lemma splay_code: "splay (x::_::linorder) t = (case t of Leaf \ Leaf | - Node al a ar \ (case cmp x (fst a) of - EQ \ t | - LT \ (case al of - Leaf \ t | - Node bl b br \ (case cmp x (fst b) of - EQ \ Node bl b (Node br a ar) | - LT \ if bl = Leaf then Node bl b (Node br a ar) - else case splay x bl of - Node bll y blr \ Node bll y (Node blr b (Node br a ar)) | - GT \ if br = Leaf then Node bl b (Node br a ar) - else case splay x br of - Node brl y brr \ Node (Node bl b brl) y (Node brr a ar))) | - GT \ (case ar of - Leaf \ t | - Node bl b br \ (case cmp x (fst b) of - EQ \ Node (Node al a bl) b br | - LT \ if bl = Leaf then Node (Node al a bl) b br - else case splay x bl of - Node bll y blr \ Node (Node al a bll) y (Node blr b br) | - GT \ if br=Leaf then Node (Node al a bl) b br - else case splay x br of - Node bll y blr \ Node (Node (Node al a bl) b bll) y blr))))" -by(auto cong: case_tree_cong split: tree.split) - -definition lookup :: "('a*'b)tree \ 'a::linorder \ 'b option" where "lookup t x = - (case splay x t of Leaf \ None | Node _ (a,b) _ \ if x=a then Some b else None)" - -hide_const (open) insert - -fun update :: "'a::linorder \ 'b \ ('a*'b) tree \ ('a*'b) tree" where -"update x y t = (if t = Leaf then Node Leaf (x,y) Leaf - else case splay x t of - Node l a r \ if x = fst a then Node l (x,y) r - else if x < fst a then Node l (x,y) (Node Leaf a r) else Node (Node l a Leaf) (x,y) r)" - -definition delete :: "'a::linorder \ ('a*'b) tree \ ('a*'b) tree" where -"delete x t = (if t = Leaf then Leaf - else case splay x t of Node l a r \ - if x = fst a - then if l = Leaf then r else case splay_max l of Node l' m r' \ Node l' m r - else Node l a r)" - - -subsection "Functional Correctness Proofs" - -lemma splay_Leaf_iff: "(splay x t = Leaf) = (t = Leaf)" -by(induction x t rule: splay.induct) (auto split: tree.splits) - - -subsubsection "Proofs for lookup" - -lemma splay_map_of_inorder: - "splay x t = Node l a r \ sorted1(inorder t) \ - map_of (inorder t) x = (if x = fst a then Some(snd a) else None)" -by(induction x t arbitrary: l a r rule: splay.induct) - (auto simp: map_of_simps splay_Leaf_iff split: tree.splits) - -lemma lookup_eq: - "sorted1(inorder t) \ lookup t x = map_of (inorder t) x" -by(auto simp: lookup_def splay_Leaf_iff splay_map_of_inorder split: tree.split) - - -subsubsection "Proofs for update" - -lemma inorder_splay: "inorder(splay x t) = inorder t" -by(induction x t rule: splay.induct) - (auto simp: neq_Leaf_iff split: tree.split) - -lemma sorted_splay: - "sorted1(inorder t) \ splay x t = Node l a r \ - sorted(map fst (inorder l) @ x # map fst (inorder r))" -unfolding inorder_splay[of x t, symmetric] -by(induction x t arbitrary: l a r rule: splay.induct) - (auto simp: sorted_lems sorted_Cons_le sorted_snoc_le splay_Leaf_iff split: tree.splits) - -lemma inorder_update: - "sorted1(inorder t) \ inorder(update x y t) = upd_list x y (inorder t)" -using inorder_splay[of x t, symmetric] sorted_splay[of t x] -by(auto simp: upd_list_simps upd_list_Cons upd_list_snoc neq_Leaf_iff split: tree.split) - - -subsubsection "Proofs for delete" - -lemma inorder_splay_maxD: - "splay_max t = Node l a r \ sorted1(inorder t) \ - inorder l @ [a] = inorder t \ r = Leaf" -by(induction t arbitrary: l a r rule: splay_max.induct) - (auto simp: sorted_lems splay_max_Leaf_iff split: tree.splits if_splits) - -lemma inorder_delete: - "sorted1(inorder t) \ inorder(delete x t) = del_list x (inorder t)" -using inorder_splay[of x t, symmetric] sorted_splay[of t x] -by (auto simp: del_list_simps del_list_sorted_app delete_def - del_list_notin_Cons inorder_splay_maxD splay_Leaf_iff splay_max_Leaf_iff - split: tree.splits) - - -subsubsection "Overall Correctness" - -interpretation Map_by_Ordered -where empty = Leaf and lookup = lookup and update = update -and delete = delete and inorder = inorder and inv = "\_. True" -proof (standard, goal_cases) - case 2 thus ?case by(simp add: lookup_eq) -next - case 3 thus ?case by(simp add: inorder_update del: update.simps) -next - case 4 thus ?case by(simp add: inorder_delete) -qed auto - -end diff -r a14bbbaa628d -r dd47c9843598 src/HOL/Data_Structures/Splay_Set.thy --- a/src/HOL/Data_Structures/Splay_Set.thy Thu Aug 31 09:50:11 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,190 +0,0 @@ -(* -Author: Tobias Nipkow -Function follow AFP entry Splay_Tree, proofs are new. -*) - -section "Splay Tree Implementation of Sets" - -theory Splay_Set -imports - "HOL-Library.Tree" - Set_by_Ordered - Cmp -begin - -function splay :: "'a::linorder \ 'a tree \ 'a tree" where -"splay a Leaf = Leaf" | -"splay a (Node t1 a t2) = Node t1 a t2" | -"a splay a (Node (Node t1 a t2) b t3) = Node t1 a (Node t2 b t3)" | -"x splay x (Node Leaf a t) = Node Leaf a t" | -"x x splay x (Node (Node Leaf a t1) b t2) = Node Leaf a (Node t1 b t2)" | -"x x t1 \ Leaf \ - splay x (Node (Node t1 a t2) b t3) = - (case splay x t1 of Node t11 y t12 \ Node t11 y (Node t12 a (Node t2 b t3)))" | -"a x splay x (Node (Node t1 a Leaf) b t2) = Node t1 a (Node Leaf b t2)" | -"a x t2 \ Leaf \ - splay x (Node (Node t1 a t2) b t3) = - (case splay x t2 of Node t21 y t22 \ Node (Node t1 a t21) y (Node t22 b t3))" | -"a splay b (Node t1 a (Node t2 b t3)) = Node (Node t1 a t2) b t3" | -"a splay x (Node t a Leaf) = Node t a Leaf" | -"a x t2 \ Leaf \ - splay x (Node t1 a (Node t2 b t3)) = - (case splay x t2 of Node t21 y t22 \ Node (Node t1 a t21) y (Node t22 b t3))" | -"a x splay x (Node t1 a (Node Leaf b t2)) = Node (Node t1 a Leaf) b t2" | -"a b splay x (Node t1 a (Node t2 b Leaf)) = Node (Node t1 a t2) b Leaf" | -"a b t3 \ Leaf \ - splay x (Node t1 a (Node t2 b t3)) = - (case splay x t3 of Node t31 y t32 \ Node (Node (Node t1 a t2) b t31) y t32)" -apply(atomize_elim) -apply(auto) -(* 1 subgoal *) -apply (subst (asm) neq_Leaf_iff) -apply(auto) -apply (metis tree.exhaust less_linear)+ -done - -termination splay -by lexicographic_order - -(* no idea why this speeds things up below *) -lemma case_tree_cong: - "\ x = x'; y = y'; z = z' \ \ case_tree x y z = case_tree x' y' z'" -by auto - -lemma splay_code: "splay (x::_::linorder) t = (case t of Leaf \ Leaf | - Node al a ar \ (case cmp x a of - EQ \ t | - LT \ (case al of - Leaf \ t | - Node bl b br \ (case cmp x b of - EQ \ Node bl b (Node br a ar) | - LT \ if bl = Leaf then Node bl b (Node br a ar) - else case splay x bl of - Node bll y blr \ Node bll y (Node blr b (Node br a ar)) | - GT \ if br = Leaf then Node bl b (Node br a ar) - else case splay x br of - Node brl y brr \ Node (Node bl b brl) y (Node brr a ar))) | - GT \ (case ar of - Leaf \ t | - Node bl b br \ (case cmp x b of - EQ \ Node (Node al a bl) b br | - LT \ if bl = Leaf then Node (Node al a bl) b br - else case splay x bl of - Node bll y blr \ Node (Node al a bll) y (Node blr b br) | - GT \ if br=Leaf then Node (Node al a bl) b br - else case splay x br of - Node bll y blr \ Node (Node (Node al a bl) b bll) y blr))))" -by(auto cong: case_tree_cong split: tree.split) - -definition is_root :: "'a \ 'a tree \ bool" where -"is_root x t = (case t of Leaf \ False | Node l a r \ x = a)" - -definition "isin t x = is_root x (splay x t)" - -hide_const (open) insert - -fun insert :: "'a::linorder \ 'a tree \ 'a tree" where -"insert x t = - (if t = Leaf then Node Leaf x Leaf - else case splay x t of - Node l a r \ - case cmp x a of - EQ \ Node l a r | - LT \ Node l x (Node Leaf a r) | - GT \ Node (Node l a Leaf) x r)" - - -fun splay_max :: "'a tree \ 'a tree" where -"splay_max Leaf = Leaf" | -"splay_max (Node l b Leaf) = Node l b Leaf" | -"splay_max (Node l b (Node rl c rr)) = - (if rr = Leaf then Node (Node l b rl) c Leaf - else case splay_max rr of - Node rrl m rrr \ Node (Node (Node l b rl) c rrl) m rrr)" - - -definition delete :: "'a::linorder \ 'a tree \ 'a tree" where -"delete x t = - (if t = Leaf then Leaf - else case splay x t of Node l a r \ - if x = a - then if l = Leaf then r else case splay_max l of Node l' m r' \ Node l' m r - else Node l a r)" - - -subsection "Functional Correctness Proofs" - -lemma splay_Leaf_iff: "(splay a t = Leaf) = (t = Leaf)" -by(induction a t rule: splay.induct) (auto split: tree.splits) - -lemma splay_max_Leaf_iff: "(splay_max t = Leaf) = (t = Leaf)" -by(induction t rule: splay_max.induct)(auto split: tree.splits) - - -subsubsection "Proofs for isin" - -lemma - "splay x t = Node l a r \ sorted(inorder t) \ - x \ elems (inorder t) \ x=a" -by(induction x t arbitrary: l a r rule: splay.induct) - (auto simp: elems_simps1 splay_Leaf_iff ball_Un split: tree.splits) - -lemma splay_elemsD: - "splay x t = Node l a r \ sorted(inorder t) \ - x \ elems (inorder t) \ x=a" -by(induction x t arbitrary: l a r rule: splay.induct) - (auto simp: elems_simps2 splay_Leaf_iff split: tree.splits) - -lemma isin_set: "sorted(inorder t) \ isin t x = (x \ elems (inorder t))" -by (auto simp: isin_def is_root_def splay_elemsD splay_Leaf_iff split: tree.splits) - - -subsubsection "Proofs for insert" - -lemma inorder_splay: "inorder(splay x t) = inorder t" -by(induction x t rule: splay.induct) - (auto simp: neq_Leaf_iff split: tree.split) - -lemma sorted_splay: - "sorted(inorder t) \ splay x t = Node l a r \ - sorted(inorder l @ x # inorder r)" -unfolding inorder_splay[of x t, symmetric] -by(induction x t arbitrary: l a r rule: splay.induct) - (auto simp: sorted_lems sorted_Cons_le sorted_snoc_le splay_Leaf_iff split: tree.splits) - -lemma inorder_insert: - "sorted(inorder t) \ inorder(insert x t) = ins_list x (inorder t)" -using inorder_splay[of x t, symmetric] sorted_splay[of t x] -by(auto simp: ins_list_simps ins_list_Cons ins_list_snoc neq_Leaf_iff split: tree.split) - - -subsubsection "Proofs for delete" - -lemma inorder_splay_maxD: - "splay_max t = Node l a r \ sorted(inorder t) \ - inorder l @ [a] = inorder t \ r = Leaf" -by(induction t arbitrary: l a r rule: splay_max.induct) - (auto simp: sorted_lems splay_max_Leaf_iff split: tree.splits if_splits) - -lemma inorder_delete: - "sorted(inorder t) \ inorder(delete x t) = del_list x (inorder t)" -using inorder_splay[of x t, symmetric] sorted_splay[of t x] -by (auto simp: del_list_simps del_list_sorted_app delete_def - del_list_notin_Cons inorder_splay_maxD splay_Leaf_iff splay_max_Leaf_iff - split: tree.splits) - - -subsubsection "Overall Correctness" - -interpretation Set_by_Ordered -where empty = Leaf and isin = isin and insert = insert -and delete = delete and inorder = inorder and inv = "\_. True" -proof (standard, goal_cases) - case 2 thus ?case by(simp add: isin_set) -next - case 3 thus ?case by(simp add: inorder_insert del: insert.simps) -next - case 4 thus ?case by(simp add: inorder_delete) -qed auto - -end diff -r a14bbbaa628d -r dd47c9843598 src/HOL/ROOT --- a/src/HOL/ROOT Thu Aug 31 09:50:11 2017 +0200 +++ b/src/HOL/ROOT Thu Aug 31 14:32:23 2017 +0200 @@ -212,7 +212,6 @@ Tree234_Map Brother12_Map AA_Map - Splay_Map Leftist_Heap Binomial_Heap document_files "root.tex" "root.bib"