src/HOL/Data_Structures/Splay_Set.thy
author nipkow
Wed, 11 Nov 2015 15:41:01 +0100
changeset 61627 6059ce322766
parent 61588 1d2907d0ed73
child 61696 ce6320b9ef9b
permissions -rw-r--r--
tuned
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
61525
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
     1
(*
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
     2
Author: Tobias Nipkow
61581
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
     3
Function defs follow AFP entry Splay_Tree, proofs are new.
61525
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
     4
*)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
     5
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
     6
section "Splay Tree Implementation of Sets"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
     7
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
     8
theory Splay_Set
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
     9
imports
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    10
  "~~/src/HOL/Library/Tree"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    11
  Set_by_Ordered
61581
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    12
  Cmp
61525
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    13
begin
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    14
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    15
function splay :: "'a::linorder \<Rightarrow> 'a tree \<Rightarrow> 'a tree" where
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    16
"splay a Leaf = Leaf" |
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    17
"splay a (Node t1 a t2) = Node t1 a t2" |
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    18
"a<b \<Longrightarrow> splay a (Node (Node t1 a t2) b t3) = Node t1 a (Node t2 b t3)" |
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    19
"x<a \<Longrightarrow> splay x (Node Leaf a t) = Node Leaf a t" |
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    20
"x<a \<Longrightarrow> x<b \<Longrightarrow> splay x (Node (Node Leaf a t1) b t2) = Node Leaf a (Node t1 b t2)" |
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    21
"x<a \<Longrightarrow> x<b \<Longrightarrow> t1 \<noteq> Leaf \<Longrightarrow>
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    22
 splay x (Node (Node t1 a t2) b t3) =
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    23
 (case splay x t1 of Node t11 y t12 \<Rightarrow> Node t11 y (Node t12 a (Node t2 b t3)))" |
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    24
"a<x \<Longrightarrow> x<b \<Longrightarrow> splay x (Node (Node t1 a Leaf) b t2) = Node t1 a (Node Leaf b t2)" |
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    25
"a<x \<Longrightarrow> x<b \<Longrightarrow> t2 \<noteq> Leaf \<Longrightarrow>
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    26
 splay x (Node (Node t1 a t2) b t3) =
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    27
 (case splay x t2 of Node t21 y t22 \<Rightarrow> Node (Node t1 a t21) y (Node t22 b t3))" |
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    28
"a<b \<Longrightarrow> splay b (Node t1 a (Node t2 b t3)) = Node (Node t1 a t2) b t3" |
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    29
"a<x \<Longrightarrow> splay x (Node t a Leaf) = Node t a Leaf" |
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    30
"a<x \<Longrightarrow> x<b \<Longrightarrow>  t2 \<noteq> Leaf \<Longrightarrow>
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    31
 splay x (Node t1 a (Node t2 b t3)) =
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    32
 (case splay x t2 of Node t21 y t22 \<Rightarrow> Node (Node t1 a t21) y (Node t22 b t3))" |
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    33
"a<x \<Longrightarrow> x<b \<Longrightarrow> splay x (Node t1 a (Node Leaf b t2)) = Node (Node t1 a Leaf) b t2" |
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    34
"a<x \<Longrightarrow> b<x \<Longrightarrow> splay x (Node t1 a (Node t2 b Leaf)) = Node (Node t1 a t2) b Leaf" |
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    35
"a<x \<Longrightarrow> b<x \<Longrightarrow>  t3 \<noteq> Leaf \<Longrightarrow>
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    36
 splay x (Node t1 a (Node t2 b t3)) =
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    37
 (case splay x t3 of Node t31 y t32 \<Rightarrow> Node (Node (Node t1 a t2) b t31) y t32)"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    38
apply(atomize_elim)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    39
apply(auto)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    40
(* 1 subgoal *)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    41
apply (subst (asm) neq_Leaf_iff)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    42
apply(auto)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    43
apply (metis tree.exhaust less_linear)+
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    44
done
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    45
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    46
termination splay
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    47
by lexicographic_order
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    48
61581
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    49
(* no idea why this speeds things up below *)
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    50
lemma case_tree_cong:
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    51
  "\<lbrakk> x = x'; y = y'; z = z' \<rbrakk> \<Longrightarrow> case_tree x y z = case_tree x' y' z'"
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    52
by auto
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    53
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    54
lemma splay_code: "splay (x::_::cmp) t = (case t of Leaf \<Rightarrow> Leaf |
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    55
  Node al a ar \<Rightarrow> (case cmp x a of
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    56
    EQ \<Rightarrow> t |
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    57
    LT \<Rightarrow> (case al of
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    58
      Leaf \<Rightarrow> t |
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    59
      Node bl b br \<Rightarrow> (case cmp x b of
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    60
        EQ \<Rightarrow> Node bl b (Node br a ar) |
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    61
        LT \<Rightarrow> if bl = Leaf then Node bl b (Node br a ar)
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    62
              else case splay x bl of
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    63
                Node bll y blr \<Rightarrow> Node bll y (Node blr b (Node br a ar)) |
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    64
        GT \<Rightarrow> if br = Leaf then Node bl b (Node br a ar)
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    65
              else case splay x br of
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    66
                Node brl y brr \<Rightarrow> Node (Node bl b brl) y (Node brr a ar))) |
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    67
    GT \<Rightarrow> (case ar of
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    68
      Leaf \<Rightarrow> t |
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    69
      Node bl b br \<Rightarrow> (case cmp x b of
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    70
        EQ \<Rightarrow> Node (Node al a bl) b br |
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    71
        LT \<Rightarrow> if bl = Leaf then Node (Node al a bl) b br
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    72
              else case splay x bl of
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    73
                Node bll y blr \<Rightarrow> Node (Node al a bll) y (Node blr b br) |
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    74
        GT \<Rightarrow> if br=Leaf then Node (Node al a bl) b br
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    75
              else case splay x br of
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    76
                Node bll y blr \<Rightarrow> Node (Node (Node al a bl) b bll) y blr))))"
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61525
diff changeset
    77
by(auto cong: case_tree_cong split: tree.split)
61525
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    78
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    79
definition is_root :: "'a \<Rightarrow> 'a tree \<Rightarrow> bool" where
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    80
"is_root a t = (case t of Leaf \<Rightarrow> False | Node _ x _ \<Rightarrow> x = a)"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    81
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    82
definition "isin t x = is_root x (splay x t)"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    83
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    84
hide_const (open) insert
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    85
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    86
fun insert :: "'a::linorder \<Rightarrow> 'a tree \<Rightarrow> 'a tree" where
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    87
"insert x t =  (if t = Leaf then Node Leaf x Leaf
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    88
  else case splay x t of
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    89
    Node l a r \<Rightarrow> if x = a then Node l a r
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    90
      else if x < a then Node l x (Node Leaf a r) else Node (Node l a Leaf) x r)"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    91
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    92
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    93
fun splay_max :: "'a tree \<Rightarrow> 'a tree" where
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    94
"splay_max Leaf = Leaf" |
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    95
"splay_max (Node l b Leaf) = Node l b Leaf" |
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    96
"splay_max (Node l b (Node rl c rr)) =
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    97
  (if rr = Leaf then Node (Node l b rl) c Leaf
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    98
   else case splay_max rr of
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
    99
     Node rrl m rrr \<Rightarrow> Node (Node (Node l b rl) c rrl) m rrr)"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   100
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   101
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   102
definition delete :: "'a::linorder \<Rightarrow> 'a tree \<Rightarrow> 'a tree" where
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   103
"delete x t = (if t = Leaf then Leaf
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   104
  else case splay x t of Node l a r \<Rightarrow>
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   105
    if x = a
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   106
    then if l = Leaf then r else case splay_max l of Node l' m r' \<Rightarrow> Node l' m r
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   107
    else Node l a r)"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   108
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   109
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   110
subsection "Functional Correctness Proofs"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   111
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   112
lemma splay_Leaf_iff: "(splay a t = Leaf) = (t = Leaf)"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   113
by(induction a t rule: splay.induct) (auto split: tree.splits)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   114
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   115
lemma splay_max_Leaf_iff: "(splay_max t = Leaf) = (t = Leaf)"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   116
by(induction t rule: splay_max.induct)(auto split: tree.splits)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   117
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   118
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   119
subsubsection "Proofs for isin"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   120
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   121
lemma
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   122
  "splay x t = Node l a r \<Longrightarrow> sorted(inorder t) \<Longrightarrow>
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   123
  x \<in> elems (inorder t) \<longleftrightarrow> x=a"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   124
by(induction x t arbitrary: l a r rule: splay.induct)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   125
  (auto simp: elems_simps1 splay_Leaf_iff ball_Un split: tree.splits)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   126
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   127
lemma splay_elemsD:
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   128
  "splay x t = Node l a r \<Longrightarrow> sorted(inorder t) \<Longrightarrow>
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   129
  x \<in> elems (inorder t) \<longleftrightarrow> x=a"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   130
by(induction x t arbitrary: l a r rule: splay.induct)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   131
  (auto simp: elems_simps2 splay_Leaf_iff split: tree.splits)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   132
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   133
lemma isin_set: "sorted(inorder t) \<Longrightarrow> isin t x = (x \<in> elems (inorder t))"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   134
by (auto simp: isin_def is_root_def splay_elemsD splay_Leaf_iff split: tree.splits)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   135
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   136
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   137
subsubsection "Proofs for insert"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   138
61627
nipkow
parents: 61588
diff changeset
   139
text\<open>Splay trees need two addition @{const sorted} lemmas:\<close>
61525
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   140
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   141
lemma sorted_snoc_le:
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   142
  "ASSUMPTION(sorted(xs @ [x])) \<Longrightarrow> x \<le> y \<Longrightarrow> sorted (xs @ [y])"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   143
by (auto simp add: Sorted_Less.sorted_snoc_iff ASSUMPTION_def)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   144
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   145
lemma sorted_Cons_le:
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   146
  "ASSUMPTION(sorted(x # xs)) \<Longrightarrow> y \<le> x \<Longrightarrow> sorted (y # xs)"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   147
by (auto simp add: Sorted_Less.sorted_Cons_iff ASSUMPTION_def)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   148
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   149
lemma inorder_splay: "inorder(splay x t) = inorder t"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   150
by(induction x t rule: splay.induct)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   151
  (auto simp: neq_Leaf_iff split: tree.split)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   152
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   153
lemma sorted_splay:
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   154
  "sorted(inorder t) \<Longrightarrow> splay x t = Node l a r \<Longrightarrow>
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   155
  sorted(inorder l @ x # inorder r)"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   156
unfolding inorder_splay[of x t, symmetric]
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   157
by(induction x t arbitrary: l a r rule: splay.induct)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   158
  (auto simp: sorted_lems sorted_Cons_le sorted_snoc_le splay_Leaf_iff split: tree.splits)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   159
61627
nipkow
parents: 61588
diff changeset
   160
text\<open>Splay trees need two addition @{const ins_list} lemmas:\<close>
nipkow
parents: 61588
diff changeset
   161
61525
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   162
lemma ins_list_Cons: "sorted (x # xs) \<Longrightarrow> ins_list x xs = x # xs"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   163
by (induction xs) auto
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   164
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   165
lemma ins_list_snoc: "sorted (xs @ [x]) \<Longrightarrow> ins_list x xs = xs @ [x]"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   166
by(induction xs) (auto simp add: sorted_mid_iff2)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   167
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   168
lemma inorder_insert:
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   169
  "sorted(inorder t) \<Longrightarrow> inorder(insert x t) = ins_list x (inorder t)"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   170
using inorder_splay[of x t, symmetric] sorted_splay[of t x]
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   171
by(auto simp: ins_list_simps ins_list_Cons ins_list_snoc neq_Leaf_iff split: tree.split)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   172
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   173
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   174
subsubsection "Proofs for delete"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   175
61627
nipkow
parents: 61588
diff changeset
   176
text\<open>Splay trees need two addition @{const del_list} lemmas:\<close>
61525
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   177
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   178
lemma del_list_notin_Cons: "sorted (x # xs) \<Longrightarrow> del_list x xs = xs"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   179
by(induction xs)(auto simp: sorted_Cons_iff)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   180
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   181
lemma del_list_sorted_app:
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   182
  "sorted(xs @ [x]) \<Longrightarrow> del_list x (xs @ ys) = xs @ del_list x ys"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   183
by (induction xs) (auto simp: sorted_mid_iff2)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   184
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   185
lemma inorder_splay_maxD:
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   186
  "splay_max t = Node l a r \<Longrightarrow> sorted(inorder t) \<Longrightarrow>
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   187
  inorder l @ [a] = inorder t \<and> r = Leaf"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   188
by(induction t arbitrary: l a r rule: splay_max.induct)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   189
  (auto simp: sorted_lems splay_max_Leaf_iff split: tree.splits if_splits)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   190
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   191
lemma inorder_delete:
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   192
  "sorted(inorder t) \<Longrightarrow> inorder(delete x t) = del_list x (inorder t)"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   193
using inorder_splay[of x t, symmetric] sorted_splay[of t x]
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   194
by (auto simp: del_list_simps del_list_sorted_app delete_def
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   195
  del_list_notin_Cons inorder_splay_maxD splay_Leaf_iff splay_max_Leaf_iff
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   196
  split: tree.splits)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   197
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   198
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   199
subsubsection "Overall Correctness"
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   200
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   201
interpretation Set_by_Ordered
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   202
where empty = Leaf and isin = isin and insert = insert
61588
nipkow
parents: 61581
diff changeset
   203
and delete = delete and inorder = inorder and inv = "\<lambda>_. True"
61525
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   204
proof (standard, goal_cases)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   205
  case 2 thus ?case by(simp add: isin_set)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   206
next
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   207
  case 3 thus ?case by(simp add: inorder_insert del: insert.simps)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   208
next
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   209
  case 4 thus ?case by(simp add: inorder_delete)
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   210
qed auto
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   211
87244a9cfe40 added splay trees
nipkow
parents:
diff changeset
   212
end