src/HOL/Library/RBT_Impl.thy
author nipkow
Wed, 13 Feb 2019 07:48:42 +0100
changeset 69801 a99a0f5474c5
parent 69593 3dda49e08b9d
child 73211 bfa9f646f5ae
permissions -rw-r--r--
too agressive
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
47455
26315a545e26 updated headers;
wenzelm
parents: 47450
diff changeset
     1
(*  Title:      HOL/Library/RBT_Impl.thy
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
     2
    Author:     Markus Reiter, TU Muenchen
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
     3
    Author:     Alexander Krauss, TU Muenchen
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
     4
*)
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
     5
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
     6
section \<open>Implementation of Red-Black Trees\<close>
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
     7
36147
b43b22f63665 theory RBT with abstract type of red-black trees backed by implementation RBT_Impl
haftmann
parents: 35618
diff changeset
     8
theory RBT_Impl
45990
b7b905b23b2a incorporated More_Set and More_List into the Main body -- to be consolidated later
haftmann
parents: 41959
diff changeset
     9
imports Main
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
    10
begin
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
    11
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
    12
text \<open>
61585
a9599d3d7610 isabelle update_cartouches -c -t;
wenzelm
parents: 61433
diff changeset
    13
  For applications, you should use theory \<open>RBT\<close> which defines
36147
b43b22f63665 theory RBT with abstract type of red-black trees backed by implementation RBT_Impl
haftmann
parents: 35618
diff changeset
    14
  an abstract type of red-black tree obeying the invariant.
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
    15
\<close>
36147
b43b22f63665 theory RBT with abstract type of red-black trees backed by implementation RBT_Impl
haftmann
parents: 35618
diff changeset
    16
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
    17
subsection \<open>Datatype of RB trees\<close>
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
    18
58310
91ea607a34d8 updated news
blanchet
parents: 58257
diff changeset
    19
datatype color = R | B
91ea607a34d8 updated news
blanchet
parents: 58257
diff changeset
    20
datatype ('a, 'b) rbt = Empty | Branch color "('a, 'b) rbt" 'a 'b "('a, 'b) rbt"
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
    21
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
    22
lemma rbt_cases:
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
    23
  obtains (Empty) "t = Empty" 
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
    24
  | (Red) l k v r where "t = Branch R l k v r" 
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
    25
  | (Black) l k v r where "t = Branch B l k v r"
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
    26
proof (cases t)
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
    27
  case Empty with that show thesis by blast
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
    28
next
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
    29
  case (Branch c) with that show thesis by (cases c) blast+
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
    30
qed
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
    31
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
    32
subsection \<open>Tree properties\<close>
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
    33
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
    34
subsubsection \<open>Content of a tree\<close>
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
    35
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
    36
primrec entries :: "('a, 'b) rbt \<Rightarrow> ('a \<times> 'b) list"
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
    37
where 
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
    38
  "entries Empty = []"
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
    39
| "entries (Branch _ l k v r) = entries l @ (k,v) # entries r"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
    40
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
    41
abbreviation (input) entry_in_tree :: "'a \<Rightarrow> 'b \<Rightarrow> ('a, 'b) rbt \<Rightarrow> bool"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
    42
where
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
    43
  "entry_in_tree k v t \<equiv> (k, v) \<in> set (entries t)"
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
    44
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
    45
definition keys :: "('a, 'b) rbt \<Rightarrow> 'a list" where
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
    46
  "keys t = map fst (entries t)"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
    47
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
    48
lemma keys_simps [simp, code]:
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
    49
  "keys Empty = []"
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
    50
  "keys (Branch c l k v r) = keys l @ k # keys r"
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
    51
  by (simp_all add: keys_def)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
    52
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
    53
lemma entry_in_tree_keys:
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
    54
  assumes "(k, v) \<in> set (entries t)"
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
    55
  shows "k \<in> set (keys t)"
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
    56
proof -
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
    57
  from assms have "fst (k, v) \<in> fst ` set (entries t)" by (rule imageI)
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
    58
  then show ?thesis by (simp add: keys_def)
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
    59
qed
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
    60
35602
e814157560e8 various refinements
haftmann
parents: 35550
diff changeset
    61
lemma keys_entries:
e814157560e8 various refinements
haftmann
parents: 35550
diff changeset
    62
  "k \<in> set (keys t) \<longleftrightarrow> (\<exists>v. (k, v) \<in> set (entries t))"
e814157560e8 various refinements
haftmann
parents: 35550
diff changeset
    63
  by (auto intro: entry_in_tree_keys) (auto simp add: keys_def)
e814157560e8 various refinements
haftmann
parents: 35550
diff changeset
    64
48621
877df57629e3 a couple of additions to RBT formalization to allow us to implement RBT_Set
kuncar
parents: 47455
diff changeset
    65
lemma non_empty_rbt_keys: 
877df57629e3 a couple of additions to RBT formalization to allow us to implement RBT_Set
kuncar
parents: 47455
diff changeset
    66
  "t \<noteq> rbt.Empty \<Longrightarrow> keys t \<noteq> []"
877df57629e3 a couple of additions to RBT formalization to allow us to implement RBT_Set
kuncar
parents: 47455
diff changeset
    67
  by (cases t) simp_all
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
    68
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
    69
subsubsection \<open>Search tree properties\<close>
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
    70
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
    71
context ord begin
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
    72
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
    73
definition rbt_less :: "'a \<Rightarrow> ('a, 'b) rbt \<Rightarrow> bool"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
    74
where
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
    75
  rbt_less_prop: "rbt_less k t \<longleftrightarrow> (\<forall>x\<in>set (keys t). x < k)"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
    76
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
    77
abbreviation rbt_less_symbol (infix "|\<guillemotleft>" 50)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
    78
where "t |\<guillemotleft> x \<equiv> rbt_less x t"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
    79
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
    80
definition rbt_greater :: "'a \<Rightarrow> ('a, 'b) rbt \<Rightarrow> bool" (infix "\<guillemotleft>|" 50) 
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
    81
where
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
    82
  rbt_greater_prop: "rbt_greater k t = (\<forall>x\<in>set (keys t). k < x)"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
    83
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
    84
lemma rbt_less_simps [simp]:
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
    85
  "Empty |\<guillemotleft> k = True"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
    86
  "Branch c lt kt v rt |\<guillemotleft> k \<longleftrightarrow> kt < k \<and> lt |\<guillemotleft> k \<and> rt |\<guillemotleft> k"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
    87
  by (auto simp add: rbt_less_prop)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
    88
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
    89
lemma rbt_greater_simps [simp]:
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
    90
  "k \<guillemotleft>| Empty = True"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
    91
  "k \<guillemotleft>| (Branch c lt kt v rt) \<longleftrightarrow> k < kt \<and> k \<guillemotleft>| lt \<and> k \<guillemotleft>| rt"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
    92
  by (auto simp add: rbt_greater_prop)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
    93
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
    94
lemmas rbt_ord_props = rbt_less_prop rbt_greater_prop
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
    95
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
    96
lemmas rbt_greater_nit = rbt_greater_prop entry_in_tree_keys
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
    97
lemmas rbt_less_nit = rbt_less_prop entry_in_tree_keys
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
    98
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
    99
lemma (in order)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   100
  shows rbt_less_eq_trans: "l |\<guillemotleft> u \<Longrightarrow> u \<le> v \<Longrightarrow> l |\<guillemotleft> v"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   101
  and rbt_less_trans: "t |\<guillemotleft> x \<Longrightarrow> x < y \<Longrightarrow> t |\<guillemotleft> y"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   102
  and rbt_greater_eq_trans: "u \<le> v \<Longrightarrow> v \<guillemotleft>| r \<Longrightarrow> u \<guillemotleft>| r"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   103
  and rbt_greater_trans: "x < y \<Longrightarrow> y \<guillemotleft>| t \<Longrightarrow> x \<guillemotleft>| t"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   104
  by (auto simp: rbt_ord_props)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   105
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   106
primrec rbt_sorted :: "('a, 'b) rbt \<Rightarrow> bool"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   107
where
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   108
  "rbt_sorted Empty = True"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   109
| "rbt_sorted (Branch c l k v r) = (l |\<guillemotleft> k \<and> k \<guillemotleft>| r \<and> rbt_sorted l \<and> rbt_sorted r)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   110
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   111
end
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   112
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   113
context linorder begin
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   114
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   115
lemma rbt_sorted_entries:
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
   116
  "rbt_sorted t \<Longrightarrow> List.sorted (map fst (entries t))"
68109
cebf36c14226 new def of sorted and sorted_wrt
nipkow
parents: 67408
diff changeset
   117
by (induct t)  (force simp: sorted_append rbt_ord_props dest!: entry_in_tree_keys)+
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   118
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   119
lemma distinct_entries:
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
   120
  "rbt_sorted t \<Longrightarrow> distinct (map fst (entries t))"
68109
cebf36c14226 new def of sorted and sorted_wrt
nipkow
parents: 67408
diff changeset
   121
by (induct t) (force simp: sorted_append rbt_ord_props dest!: entry_in_tree_keys)+
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   122
48621
877df57629e3 a couple of additions to RBT formalization to allow us to implement RBT_Set
kuncar
parents: 47455
diff changeset
   123
lemma distinct_keys:
877df57629e3 a couple of additions to RBT formalization to allow us to implement RBT_Set
kuncar
parents: 47455
diff changeset
   124
  "rbt_sorted t \<Longrightarrow> distinct (keys t)"
877df57629e3 a couple of additions to RBT formalization to allow us to implement RBT_Set
kuncar
parents: 47455
diff changeset
   125
  by (simp add: distinct_entries keys_def)
877df57629e3 a couple of additions to RBT formalization to allow us to implement RBT_Set
kuncar
parents: 47455
diff changeset
   126
877df57629e3 a couple of additions to RBT formalization to allow us to implement RBT_Set
kuncar
parents: 47455
diff changeset
   127
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
   128
subsubsection \<open>Tree lookup\<close>
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   129
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   130
primrec (in ord) rbt_lookup :: "('a, 'b) rbt \<Rightarrow> 'a \<rightharpoonup> 'b"
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   131
where
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   132
  "rbt_lookup Empty k = None"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   133
| "rbt_lookup (Branch _ l x y r) k = 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   134
   (if k < x then rbt_lookup l k else if x < k then rbt_lookup r k else Some y)"
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   135
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   136
lemma rbt_lookup_keys: "rbt_sorted t \<Longrightarrow> dom (rbt_lookup t) = set (keys t)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   137
  by (induct t) (auto simp: dom_def rbt_greater_prop rbt_less_prop)
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   138
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   139
lemma dom_rbt_lookup_Branch: 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   140
  "rbt_sorted (Branch c t1 k v t2) \<Longrightarrow> 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   141
    dom (rbt_lookup (Branch c t1 k v t2)) 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   142
    = Set.insert k (dom (rbt_lookup t1) \<union> dom (rbt_lookup t2))"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   143
proof -
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   144
  assume "rbt_sorted (Branch c t1 k v t2)"
53374
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 49810
diff changeset
   145
  then show ?thesis by (simp add: rbt_lookup_keys)
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   146
qed
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   147
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   148
lemma finite_dom_rbt_lookup [simp, intro!]: "finite (dom (rbt_lookup t))"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   149
proof (induct t)
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   150
  case Empty then show ?case by simp
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   151
next
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   152
  case (Branch color t1 a b t2)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   153
  let ?A = "Set.insert a (dom (rbt_lookup t1) \<union> dom (rbt_lookup t2))"
62390
842917225d56 more canonical names
nipkow
parents: 62093
diff changeset
   154
  have "dom (rbt_lookup (Branch color t1 a b t2)) \<subseteq> ?A" by (auto split: if_split_asm)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   155
  moreover from Branch have "finite (insert a (dom (rbt_lookup t1) \<union> dom (rbt_lookup t2)))" by simp
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   156
  ultimately show ?case by (rule finite_subset)
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   157
qed 
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   158
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   159
end
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   160
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   161
context ord begin
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   162
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   163
lemma rbt_lookup_rbt_less[simp]: "t |\<guillemotleft> k \<Longrightarrow> rbt_lookup t k = None" 
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   164
by (induct t) auto
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   165
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   166
lemma rbt_lookup_rbt_greater[simp]: "k \<guillemotleft>| t \<Longrightarrow> rbt_lookup t k = None"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   167
by (induct t) auto
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   168
68450
41de07c7a0f3 Map.empty now qualified to avoid name clashes
nipkow
parents: 68109
diff changeset
   169
lemma rbt_lookup_Empty: "rbt_lookup Empty = Map.empty"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   170
by (rule ext) simp
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   171
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   172
end
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   173
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   174
context linorder begin
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   175
35618
b7bfd4cbcfc0 some lemma refinements
haftmann
parents: 35606
diff changeset
   176
lemma map_of_entries:
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   177
  "rbt_sorted t \<Longrightarrow> map_of (entries t) = rbt_lookup t"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   178
proof (induct t)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   179
  case Empty thus ?case by (simp add: rbt_lookup_Empty)
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   180
next
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   181
  case (Branch c t1 k v t2)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   182
  have "rbt_lookup (Branch c t1 k v t2) = rbt_lookup t2 ++ [k\<mapsto>v] ++ rbt_lookup t1"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   183
  proof (rule ext)
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   184
    fix x
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   185
    from Branch have RBT_SORTED: "rbt_sorted (Branch c t1 k v t2)" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   186
    let ?thesis = "rbt_lookup (Branch c t1 k v t2) x = (rbt_lookup t2 ++ [k \<mapsto> v] ++ rbt_lookup t1) x"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   187
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   188
    have DOM_T1: "!!k'. k'\<in>dom (rbt_lookup t1) \<Longrightarrow> k>k'"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   189
    proof -
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   190
      fix k'
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   191
      from RBT_SORTED have "t1 |\<guillemotleft> k" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   192
      with rbt_less_prop have "\<forall>k'\<in>set (keys t1). k>k'" by auto
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   193
      moreover assume "k'\<in>dom (rbt_lookup t1)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   194
      ultimately show "k>k'" using rbt_lookup_keys RBT_SORTED by auto
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   195
    qed
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   196
    
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   197
    have DOM_T2: "!!k'. k'\<in>dom (rbt_lookup t2) \<Longrightarrow> k<k'"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   198
    proof -
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   199
      fix k'
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   200
      from RBT_SORTED have "k \<guillemotleft>| t2" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   201
      with rbt_greater_prop have "\<forall>k'\<in>set (keys t2). k<k'" by auto
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   202
      moreover assume "k'\<in>dom (rbt_lookup t2)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   203
      ultimately show "k<k'" using rbt_lookup_keys RBT_SORTED by auto
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   204
    qed
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   205
    
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   206
    {
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   207
      assume C: "x<k"
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   208
      hence "rbt_lookup (Branch c t1 k v t2) x = rbt_lookup t1 x" by simp
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   209
      moreover from C have "x\<notin>dom [k\<mapsto>v]" by simp
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   210
      moreover have "x \<notin> dom (rbt_lookup t2)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   211
      proof
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   212
        assume "x \<in> dom (rbt_lookup t2)"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   213
        with DOM_T2 have "k<x" by blast
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   214
        with C show False by simp
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   215
      qed
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   216
      ultimately have ?thesis by (simp add: map_add_upd_left map_add_dom_app_simps)
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   217
    } moreover {
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   218
      assume [simp]: "x=k"
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   219
      hence "rbt_lookup (Branch c t1 k v t2) x = [k \<mapsto> v] x" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   220
      moreover have "x \<notin> dom (rbt_lookup t1)" 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   221
      proof
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   222
        assume "x \<in> dom (rbt_lookup t1)"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   223
        with DOM_T1 have "k>x" by blast
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   224
        thus False by simp
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   225
      qed
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   226
      ultimately have ?thesis by (simp add: map_add_upd_left map_add_dom_app_simps)
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   227
    } moreover {
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   228
      assume C: "x>k"
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   229
      hence "rbt_lookup (Branch c t1 k v t2) x = rbt_lookup t2 x" by (simp add: less_not_sym[of k x])
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   230
      moreover from C have "x\<notin>dom [k\<mapsto>v]" by simp
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   231
      moreover have "x\<notin>dom (rbt_lookup t1)" proof
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   232
        assume "x\<in>dom (rbt_lookup t1)"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   233
        with DOM_T1 have "k>x" by simp
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   234
        with C show False by simp
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   235
      qed
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   236
      ultimately have ?thesis by (simp add: map_add_upd_left map_add_dom_app_simps)
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   237
    } ultimately show ?thesis using less_linear by blast
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   238
  qed
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   239
  also from Branch 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   240
  have "rbt_lookup t2 ++ [k \<mapsto> v] ++ rbt_lookup t1 = map_of (entries (Branch c t1 k v t2))" by simp
35618
b7bfd4cbcfc0 some lemma refinements
haftmann
parents: 35606
diff changeset
   241
  finally show ?case by simp
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   242
qed
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   243
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   244
lemma rbt_lookup_in_tree: "rbt_sorted t \<Longrightarrow> rbt_lookup t k = Some v \<longleftrightarrow> (k, v) \<in> set (entries t)"
35618
b7bfd4cbcfc0 some lemma refinements
haftmann
parents: 35606
diff changeset
   245
  by (simp add: map_of_entries [symmetric] distinct_entries)
35602
e814157560e8 various refinements
haftmann
parents: 35550
diff changeset
   246
e814157560e8 various refinements
haftmann
parents: 35550
diff changeset
   247
lemma set_entries_inject:
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   248
  assumes rbt_sorted: "rbt_sorted t1" "rbt_sorted t2" 
35602
e814157560e8 various refinements
haftmann
parents: 35550
diff changeset
   249
  shows "set (entries t1) = set (entries t2) \<longleftrightarrow> entries t1 = entries t2"
e814157560e8 various refinements
haftmann
parents: 35550
diff changeset
   250
proof -
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   251
  from rbt_sorted have "distinct (map fst (entries t1))"
35602
e814157560e8 various refinements
haftmann
parents: 35550
diff changeset
   252
    "distinct (map fst (entries t2))"
e814157560e8 various refinements
haftmann
parents: 35550
diff changeset
   253
    by (auto intro: distinct_entries)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   254
  with rbt_sorted show ?thesis
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   255
    by (auto intro: map_sorted_distinct_set_unique rbt_sorted_entries simp add: distinct_map)
35602
e814157560e8 various refinements
haftmann
parents: 35550
diff changeset
   256
qed
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   257
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   258
lemma entries_eqI:
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   259
  assumes rbt_sorted: "rbt_sorted t1" "rbt_sorted t2" 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   260
  assumes rbt_lookup: "rbt_lookup t1 = rbt_lookup t2"
35602
e814157560e8 various refinements
haftmann
parents: 35550
diff changeset
   261
  shows "entries t1 = entries t2"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   262
proof -
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   263
  from rbt_sorted rbt_lookup have "map_of (entries t1) = map_of (entries t2)"
35618
b7bfd4cbcfc0 some lemma refinements
haftmann
parents: 35606
diff changeset
   264
    by (simp add: map_of_entries)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   265
  with rbt_sorted have "set (entries t1) = set (entries t2)"
35602
e814157560e8 various refinements
haftmann
parents: 35550
diff changeset
   266
    by (simp add: map_of_inject_set distinct_entries)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   267
  with rbt_sorted show ?thesis by (simp add: set_entries_inject)
35602
e814157560e8 various refinements
haftmann
parents: 35550
diff changeset
   268
qed
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   269
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   270
lemma entries_rbt_lookup:
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   271
  assumes "rbt_sorted t1" "rbt_sorted t2" 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   272
  shows "entries t1 = entries t2 \<longleftrightarrow> rbt_lookup t1 = rbt_lookup t2"
35618
b7bfd4cbcfc0 some lemma refinements
haftmann
parents: 35606
diff changeset
   273
  using assms by (auto intro: entries_eqI simp add: map_of_entries [symmetric])
35602
e814157560e8 various refinements
haftmann
parents: 35550
diff changeset
   274
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   275
lemma rbt_lookup_from_in_tree: 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   276
  assumes "rbt_sorted t1" "rbt_sorted t2" 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   277
  and "\<And>v. (k, v) \<in> set (entries t1) \<longleftrightarrow> (k, v) \<in> set (entries t2)" 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   278
  shows "rbt_lookup t1 k = rbt_lookup t2 k"
35602
e814157560e8 various refinements
haftmann
parents: 35550
diff changeset
   279
proof -
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   280
  from assms have "k \<in> dom (rbt_lookup t1) \<longleftrightarrow> k \<in> dom (rbt_lookup t2)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   281
    by (simp add: keys_entries rbt_lookup_keys)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   282
  with assms show ?thesis by (auto simp add: rbt_lookup_in_tree [symmetric])
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   283
qed
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   284
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   285
end
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   286
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
   287
subsubsection \<open>Red-black properties\<close>
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   288
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   289
primrec color_of :: "('a, 'b) rbt \<Rightarrow> color"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   290
where
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   291
  "color_of Empty = B"
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   292
| "color_of (Branch c _ _ _ _) = c"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   293
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   294
primrec bheight :: "('a,'b) rbt \<Rightarrow> nat"
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   295
where
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   296
  "bheight Empty = 0"
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   297
| "bheight (Branch c lt k v rt) = (if c = B then Suc (bheight lt) else bheight lt)"
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   298
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   299
primrec inv1 :: "('a, 'b) rbt \<Rightarrow> bool"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   300
where
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   301
  "inv1 Empty = True"
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   302
| "inv1 (Branch c lt k v rt) \<longleftrightarrow> inv1 lt \<and> inv1 rt \<and> (c = B \<or> color_of lt = B \<and> color_of rt = B)"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   303
61585
a9599d3d7610 isabelle update_cartouches -c -t;
wenzelm
parents: 61433
diff changeset
   304
primrec inv1l :: "('a, 'b) rbt \<Rightarrow> bool" \<comment> \<open>Weaker version\<close>
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   305
where
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   306
  "inv1l Empty = True"
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   307
| "inv1l (Branch c l k v r) = (inv1 l \<and> inv1 r)"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   308
lemma [simp]: "inv1 t \<Longrightarrow> inv1l t" by (cases t) simp+
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   309
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   310
primrec inv2 :: "('a, 'b) rbt \<Rightarrow> bool"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   311
where
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   312
  "inv2 Empty = True"
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   313
| "inv2 (Branch c lt k v rt) = (inv2 lt \<and> inv2 rt \<and> bheight lt = bheight rt)"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   314
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   315
context ord begin
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   316
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   317
definition is_rbt :: "('a, 'b) rbt \<Rightarrow> bool" where
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   318
  "is_rbt t \<longleftrightarrow> inv1 t \<and> inv2 t \<and> color_of t = B \<and> rbt_sorted t"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   319
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   320
lemma is_rbt_rbt_sorted [simp]:
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   321
  "is_rbt t \<Longrightarrow> rbt_sorted t" by (simp add: is_rbt_def)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   322
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   323
theorem Empty_is_rbt [simp]:
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   324
  "is_rbt Empty" by (simp add: is_rbt_def)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   325
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   326
end
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   327
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
   328
subsection \<open>Insertion\<close>
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   329
61225
1a690dce8cfc tuned references
nipkow
parents: 61121
diff changeset
   330
text \<open>The function definitions are based on the book by Okasaki.\<close>
1a690dce8cfc tuned references
nipkow
parents: 61121
diff changeset
   331
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   332
fun (* slow, due to massive case splitting *)
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   333
  balance :: "('a,'b) rbt \<Rightarrow> 'a \<Rightarrow> 'b \<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt"
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   334
where
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   335
  "balance (Branch R a w x b) s t (Branch R c y z d) = Branch R (Branch B a w x b) s t (Branch B c y z d)" |
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   336
  "balance (Branch R (Branch R a w x b) s t c) y z d = Branch R (Branch B a w x b) s t (Branch B c y z d)" |
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   337
  "balance (Branch R a w x (Branch R b s t c)) y z d = Branch R (Branch B a w x b) s t (Branch B c y z d)" |
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   338
  "balance a w x (Branch R b s t (Branch R c y z d)) = Branch R (Branch B a w x b) s t (Branch B c y z d)" |
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   339
  "balance a w x (Branch R (Branch R b s t c) y z d) = Branch R (Branch B a w x b) s t (Branch B c y z d)" |
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   340
  "balance a s t b = Branch B a s t b"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   341
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   342
lemma balance_inv1: "\<lbrakk>inv1l l; inv1l r\<rbrakk> \<Longrightarrow> inv1 (balance l k v r)" 
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   343
  by (induct l k v r rule: balance.induct) auto
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   344
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   345
lemma balance_bheight: "bheight l = bheight r \<Longrightarrow> bheight (balance l k v r) = Suc (bheight l)"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   346
  by (induct l k v r rule: balance.induct) auto
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   347
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   348
lemma balance_inv2: 
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   349
  assumes "inv2 l" "inv2 r" "bheight l = bheight r"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   350
  shows "inv2 (balance l k v r)"
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   351
  using assms
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   352
  by (induct l k v r rule: balance.induct) auto
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   353
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   354
context ord begin
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   355
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   356
lemma balance_rbt_greater[simp]: "(v \<guillemotleft>| balance a k x b) = (v \<guillemotleft>| a \<and> v \<guillemotleft>| b \<and> v < k)" 
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   357
  by (induct a k x b rule: balance.induct) auto
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   358
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   359
lemma balance_rbt_less[simp]: "(balance a k x b |\<guillemotleft> v) = (a |\<guillemotleft> v \<and> b |\<guillemotleft> v \<and> k < v)"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   360
  by (induct a k x b rule: balance.induct) auto
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   361
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   362
end
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   363
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   364
lemma (in linorder) balance_rbt_sorted: 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   365
  fixes k :: "'a"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   366
  assumes "rbt_sorted l" "rbt_sorted r" "l |\<guillemotleft> k" "k \<guillemotleft>| r"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   367
  shows "rbt_sorted (balance l k v r)"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   368
using assms proof (induct l k v r rule: balance.induct)
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   369
  case ("2_2" a x w b y t c z s va vb vd vc)
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   370
  hence "y < z \<and> z \<guillemotleft>| Branch B va vb vd vc" 
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   371
    by (auto simp add: rbt_ord_props)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   372
  hence "y \<guillemotleft>| (Branch B va vb vd vc)" by (blast dest: rbt_greater_trans)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   373
  with "2_2" show ?case by simp
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   374
next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   375
  case ("3_2" va vb vd vc x w b y s c z)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   376
  from "3_2" have "x < y \<and> Branch B va vb vd vc |\<guillemotleft> x" 
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   377
    by simp
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   378
  hence "Branch B va vb vd vc |\<guillemotleft> y" by (blast dest: rbt_less_trans)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   379
  with "3_2" show ?case by simp
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   380
next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   381
  case ("3_3" x w b y s c z t va vb vd vc)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   382
  from "3_3" have "y < z \<and> z \<guillemotleft>| Branch B va vb vd vc" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   383
  hence "y \<guillemotleft>| Branch B va vb vd vc" by (blast dest: rbt_greater_trans)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   384
  with "3_3" show ?case by simp
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   385
next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   386
  case ("3_4" vd ve vg vf x w b y s c z t va vb vii vc)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   387
  hence "x < y \<and> Branch B vd ve vg vf |\<guillemotleft> x" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   388
  hence 1: "Branch B vd ve vg vf |\<guillemotleft> y" by (blast dest: rbt_less_trans)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   389
  from "3_4" have "y < z \<and> z \<guillemotleft>| Branch B va vb vii vc" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   390
  hence "y \<guillemotleft>| Branch B va vb vii vc" by (blast dest: rbt_greater_trans)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   391
  with 1 "3_4" show ?case by simp
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   392
next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   393
  case ("4_2" va vb vd vc x w b y s c z t dd)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   394
  hence "x < y \<and> Branch B va vb vd vc |\<guillemotleft> x" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   395
  hence "Branch B va vb vd vc |\<guillemotleft> y" by (blast dest: rbt_less_trans)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   396
  with "4_2" show ?case by simp
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   397
next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   398
  case ("5_2" x w b y s c z t va vb vd vc)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   399
  hence "y < z \<and> z \<guillemotleft>| Branch B va vb vd vc" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   400
  hence "y \<guillemotleft>| Branch B va vb vd vc" by (blast dest: rbt_greater_trans)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   401
  with "5_2" show ?case by simp
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   402
next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   403
  case ("5_3" va vb vd vc x w b y s c z t)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   404
  hence "x < y \<and> Branch B va vb vd vc |\<guillemotleft> x" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   405
  hence "Branch B va vb vd vc |\<guillemotleft> y" by (blast dest: rbt_less_trans)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   406
  with "5_3" show ?case by simp
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   407
next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   408
  case ("5_4" va vb vg vc x w b y s c z t vd ve vii vf)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   409
  hence "x < y \<and> Branch B va vb vg vc |\<guillemotleft> x" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   410
  hence 1: "Branch B va vb vg vc |\<guillemotleft> y" by (blast dest: rbt_less_trans)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   411
  from "5_4" have "y < z \<and> z \<guillemotleft>| Branch B vd ve vii vf" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   412
  hence "y \<guillemotleft>| Branch B vd ve vii vf" by (blast dest: rbt_greater_trans)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   413
  with 1 "5_4" show ?case by simp
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   414
qed simp+
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   415
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   416
lemma entries_balance [simp]:
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   417
  "entries (balance l k v r) = entries l @ (k, v) # entries r"
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   418
  by (induct l k v r rule: balance.induct) auto
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   419
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   420
lemma keys_balance [simp]: 
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   421
  "keys (balance l k v r) = keys l @ k # keys r"
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   422
  by (simp add: keys_def)
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   423
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   424
lemma balance_in_tree:  
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   425
  "entry_in_tree k x (balance l v y r) \<longleftrightarrow> entry_in_tree k x l \<or> k = v \<and> x = y \<or> entry_in_tree k x r"
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   426
  by (auto simp add: keys_def)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   427
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   428
lemma (in linorder) rbt_lookup_balance[simp]: 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   429
fixes k :: "'a"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   430
assumes "rbt_sorted l" "rbt_sorted r" "l |\<guillemotleft> k" "k \<guillemotleft>| r"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   431
shows "rbt_lookup (balance l k v r) x = rbt_lookup (Branch B l k v r) x"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   432
by (rule rbt_lookup_from_in_tree) (auto simp:assms balance_in_tree balance_rbt_sorted)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   433
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   434
primrec paint :: "color \<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt"
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   435
where
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   436
  "paint c Empty = Empty"
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   437
| "paint c (Branch _ l k v r) = Branch c l k v r"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   438
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   439
lemma paint_inv1l[simp]: "inv1l t \<Longrightarrow> inv1l (paint c t)" by (cases t) auto
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   440
lemma paint_inv1[simp]: "inv1l t \<Longrightarrow> inv1 (paint B t)" by (cases t) auto
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   441
lemma paint_inv2[simp]: "inv2 t \<Longrightarrow> inv2 (paint c t)" by (cases t) auto
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   442
lemma paint_color_of[simp]: "color_of (paint B t) = B" by (cases t) auto
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   443
lemma paint_in_tree[simp]: "entry_in_tree k x (paint c t) = entry_in_tree k x t" by (cases t) auto
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   444
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   445
context ord begin
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   446
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   447
lemma paint_rbt_sorted[simp]: "rbt_sorted t \<Longrightarrow> rbt_sorted (paint c t)" by (cases t) auto
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   448
lemma paint_rbt_lookup[simp]: "rbt_lookup (paint c t) = rbt_lookup t" by (rule ext) (cases t, auto)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   449
lemma paint_rbt_greater[simp]: "(v \<guillemotleft>| paint c t) = (v \<guillemotleft>| t)" by (cases t) auto
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   450
lemma paint_rbt_less[simp]: "(paint c t |\<guillemotleft> v) = (t |\<guillemotleft> v)" by (cases t) auto
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   451
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   452
fun
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   453
  rbt_ins :: "('a \<Rightarrow> 'b \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> 'a \<Rightarrow> 'b \<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   454
where
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   455
  "rbt_ins f k v Empty = Branch R Empty k v Empty" |
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   456
  "rbt_ins f k v (Branch B l x y r) = (if k < x then balance (rbt_ins f k v l) x y r
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   457
                                       else if k > x then balance l x y (rbt_ins f k v r)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   458
                                       else Branch B l x (f k y v) r)" |
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   459
  "rbt_ins f k v (Branch R l x y r) = (if k < x then Branch R (rbt_ins f k v l) x y r
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   460
                                       else if k > x then Branch R l x y (rbt_ins f k v r)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   461
                                       else Branch R l x (f k y v) r)"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   462
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   463
lemma ins_inv1_inv2: 
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   464
  assumes "inv1 t" "inv2 t"
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   465
  shows "inv2 (rbt_ins f k x t)" "bheight (rbt_ins f k x t) = bheight t" 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   466
  "color_of t = B \<Longrightarrow> inv1 (rbt_ins f k x t)" "inv1l (rbt_ins f k x t)"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   467
  using assms
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   468
  by (induct f k x t rule: rbt_ins.induct) (auto simp: balance_inv1 balance_inv2 balance_bheight)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   469
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   470
end
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   471
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   472
context linorder begin
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   473
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   474
lemma ins_rbt_greater[simp]: "(v \<guillemotleft>| rbt_ins f (k :: 'a) x t) = (v \<guillemotleft>| t \<and> k > v)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   475
  by (induct f k x t rule: rbt_ins.induct) auto
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   476
lemma ins_rbt_less[simp]: "(rbt_ins f k x t |\<guillemotleft> v) = (t |\<guillemotleft> v \<and> k < v)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   477
  by (induct f k x t rule: rbt_ins.induct) auto
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   478
lemma ins_rbt_sorted[simp]: "rbt_sorted t \<Longrightarrow> rbt_sorted (rbt_ins f k x t)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   479
  by (induct f k x t rule: rbt_ins.induct) (auto simp: balance_rbt_sorted)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   480
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   481
lemma keys_ins: "set (keys (rbt_ins f k v t)) = { k } \<union> set (keys t)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   482
  by (induct f k v t rule: rbt_ins.induct) auto
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   483
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   484
lemma rbt_lookup_ins: 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   485
  fixes k :: "'a"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   486
  assumes "rbt_sorted t"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   487
  shows "rbt_lookup (rbt_ins f k v t) x = ((rbt_lookup t)(k |-> case rbt_lookup t k of None \<Rightarrow> v 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   488
                                                                | Some w \<Rightarrow> f k w v)) x"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   489
using assms by (induct f k v t rule: rbt_ins.induct) auto
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   490
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   491
end
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   492
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   493
context ord begin
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   494
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   495
definition rbt_insert_with_key :: "('a \<Rightarrow> 'b \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> 'a \<Rightarrow> 'b \<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   496
where "rbt_insert_with_key f k v t = paint B (rbt_ins f k v t)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   497
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   498
definition rbt_insertw_def: "rbt_insert_with f = rbt_insert_with_key (\<lambda>_. f)"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   499
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   500
definition rbt_insert :: "'a \<Rightarrow> 'b \<Rightarrow> ('a, 'b) rbt \<Rightarrow> ('a, 'b) rbt" where
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   501
  "rbt_insert = rbt_insert_with_key (\<lambda>_ _ nv. nv)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   502
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   503
end
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   504
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   505
context linorder begin
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   506
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   507
lemma rbt_insertwk_rbt_sorted: "rbt_sorted t \<Longrightarrow> rbt_sorted (rbt_insert_with_key f (k :: 'a) x t)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   508
  by (auto simp: rbt_insert_with_key_def)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   509
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   510
theorem rbt_insertwk_is_rbt: 
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   511
  assumes inv: "is_rbt t" 
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   512
  shows "is_rbt (rbt_insert_with_key f k x t)"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   513
using assms
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   514
unfolding rbt_insert_with_key_def is_rbt_def
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   515
by (auto simp: ins_inv1_inv2)
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   516
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   517
lemma rbt_lookup_rbt_insertwk: 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   518
  assumes "rbt_sorted t"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   519
  shows "rbt_lookup (rbt_insert_with_key f k v t) x = ((rbt_lookup t)(k |-> case rbt_lookup t k of None \<Rightarrow> v 
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   520
                                                       | Some w \<Rightarrow> f k w v)) x"
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   521
unfolding rbt_insert_with_key_def using assms
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   522
by (simp add:rbt_lookup_ins)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   523
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   524
lemma rbt_insertw_rbt_sorted: "rbt_sorted t \<Longrightarrow> rbt_sorted (rbt_insert_with f k v t)" 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   525
  by (simp add: rbt_insertwk_rbt_sorted rbt_insertw_def)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   526
theorem rbt_insertw_is_rbt: "is_rbt t \<Longrightarrow> is_rbt (rbt_insert_with f k v t)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   527
  by (simp add: rbt_insertwk_is_rbt rbt_insertw_def)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   528
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   529
lemma rbt_lookup_rbt_insertw:
63649
e690d6f2185b tuned proofs;
wenzelm
parents: 63040
diff changeset
   530
  "is_rbt t \<Longrightarrow>
e690d6f2185b tuned proofs;
wenzelm
parents: 63040
diff changeset
   531
    rbt_lookup (rbt_insert_with f k v t) =
e690d6f2185b tuned proofs;
wenzelm
parents: 63040
diff changeset
   532
      (rbt_lookup t)(k \<mapsto> (if k \<in> dom (rbt_lookup t) then f (the (rbt_lookup t k)) v else v))"
e690d6f2185b tuned proofs;
wenzelm
parents: 63040
diff changeset
   533
  by (rule ext, cases "rbt_lookup t k") (auto simp: rbt_lookup_rbt_insertwk dom_def rbt_insertw_def)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   534
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   535
lemma rbt_insert_rbt_sorted: "rbt_sorted t \<Longrightarrow> rbt_sorted (rbt_insert k v t)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   536
  by (simp add: rbt_insertwk_rbt_sorted rbt_insert_def)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   537
theorem rbt_insert_is_rbt [simp]: "is_rbt t \<Longrightarrow> is_rbt (rbt_insert k v t)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   538
  by (simp add: rbt_insertwk_is_rbt rbt_insert_def)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   539
63649
e690d6f2185b tuned proofs;
wenzelm
parents: 63040
diff changeset
   540
lemma rbt_lookup_rbt_insert: "is_rbt t \<Longrightarrow> rbt_lookup (rbt_insert k v t) = (rbt_lookup t)(k\<mapsto>v)"
e690d6f2185b tuned proofs;
wenzelm
parents: 63040
diff changeset
   541
  by (rule ext) (simp add: rbt_insert_def rbt_lookup_rbt_insertwk split: option.split)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   542
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   543
end
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   544
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
   545
subsection \<open>Deletion\<close>
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   546
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   547
lemma bheight_paintR'[simp]: "color_of t = B \<Longrightarrow> bheight (paint R t) = bheight t - 1"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   548
by (cases t rule: rbt_cases) auto
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   549
63680
6e1e8b5abbfa more symbols;
wenzelm
parents: 63649
diff changeset
   550
text \<open>
6e1e8b5abbfa more symbols;
wenzelm
parents: 63649
diff changeset
   551
  The function definitions are based on the Haskell code by Stefan Kahrs
6e1e8b5abbfa more symbols;
wenzelm
parents: 63649
diff changeset
   552
  at \<^url>\<open>http://www.cs.ukc.ac.uk/people/staff/smk/redblack/rb.html\<close>.
6e1e8b5abbfa more symbols;
wenzelm
parents: 63649
diff changeset
   553
\<close>
61225
1a690dce8cfc tuned references
nipkow
parents: 61121
diff changeset
   554
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   555
fun
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   556
  balance_left :: "('a,'b) rbt \<Rightarrow> 'a \<Rightarrow> 'b \<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   557
where
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   558
  "balance_left (Branch R a k x b) s y c = Branch R (Branch B a k x b) s y c" |
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   559
  "balance_left bl k x (Branch B a s y b) = balance bl k x (Branch R a s y b)" |
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   560
  "balance_left bl k x (Branch R (Branch B a s y b) t z c) = Branch R (Branch B bl k x a) s y (balance b t z (paint R c))" |
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   561
  "balance_left t k x s = Empty"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   562
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   563
lemma balance_left_inv2_with_inv1:
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   564
  assumes "inv2 lt" "inv2 rt" "bheight lt + 1 = bheight rt" "inv1 rt"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   565
  shows "bheight (balance_left lt k v rt) = bheight lt + 1"
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   566
  and   "inv2 (balance_left lt k v rt)"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   567
using assms 
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   568
by (induct lt k v rt rule: balance_left.induct) (auto simp: balance_inv2 balance_bheight)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   569
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   570
lemma balance_left_inv2_app: 
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   571
  assumes "inv2 lt" "inv2 rt" "bheight lt + 1 = bheight rt" "color_of rt = B"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   572
  shows "inv2 (balance_left lt k v rt)" 
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   573
        "bheight (balance_left lt k v rt) = bheight rt"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   574
using assms 
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   575
by (induct lt k v rt rule: balance_left.induct) (auto simp add: balance_inv2 balance_bheight)+ 
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   576
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   577
lemma balance_left_inv1: "\<lbrakk>inv1l a; inv1 b; color_of b = B\<rbrakk> \<Longrightarrow> inv1 (balance_left a k x b)"
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   578
  by (induct a k x b rule: balance_left.induct) (simp add: balance_inv1)+
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   579
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   580
lemma balance_left_inv1l: "\<lbrakk> inv1l lt; inv1 rt \<rbrakk> \<Longrightarrow> inv1l (balance_left lt k x rt)"
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   581
by (induct lt k x rt rule: balance_left.induct) (auto simp: balance_inv1)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   582
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   583
lemma (in linorder) balance_left_rbt_sorted: 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   584
  "\<lbrakk> rbt_sorted l; rbt_sorted r; rbt_less k l; k \<guillemotleft>| r \<rbrakk> \<Longrightarrow> rbt_sorted (balance_left l k v r)"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   585
apply (induct l k v r rule: balance_left.induct)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   586
apply (auto simp: balance_rbt_sorted)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   587
apply (unfold rbt_greater_prop rbt_less_prop)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   588
by force+
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   589
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   590
context order begin
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   591
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   592
lemma balance_left_rbt_greater: 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   593
  fixes k :: "'a"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   594
  assumes "k \<guillemotleft>| a" "k \<guillemotleft>| b" "k < x" 
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   595
  shows "k \<guillemotleft>| balance_left a x t b"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   596
using assms 
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   597
by (induct a x t b rule: balance_left.induct) auto
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   598
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   599
lemma balance_left_rbt_less: 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   600
  fixes k :: "'a"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   601
  assumes "a |\<guillemotleft> k" "b |\<guillemotleft> k" "x < k" 
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   602
  shows "balance_left a x t b |\<guillemotleft> k"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   603
using assms
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   604
by (induct a x t b rule: balance_left.induct) auto
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   605
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   606
end
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   607
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   608
lemma balance_left_in_tree: 
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   609
  assumes "inv1l l" "inv1 r" "bheight l + 1 = bheight r"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   610
  shows "entry_in_tree k v (balance_left l a b r) = (entry_in_tree k v l \<or> k = a \<and> v = b \<or> entry_in_tree k v r)"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   611
using assms 
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   612
by (induct l k v r rule: balance_left.induct) (auto simp: balance_in_tree)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   613
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   614
fun
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   615
  balance_right :: "('a,'b) rbt \<Rightarrow> 'a \<Rightarrow> 'b \<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   616
where
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   617
  "balance_right a k x (Branch R b s y c) = Branch R a k x (Branch B b s y c)" |
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   618
  "balance_right (Branch B a k x b) s y bl = balance (Branch R a k x b) s y bl" |
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   619
  "balance_right (Branch R a k x (Branch B b s y c)) t z bl = Branch R (balance (paint R a) k x b) s y (Branch B c t z bl)" |
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   620
  "balance_right t k x s = Empty"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   621
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   622
lemma balance_right_inv2_with_inv1:
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   623
  assumes "inv2 lt" "inv2 rt" "bheight lt = bheight rt + 1" "inv1 lt"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   624
  shows "inv2 (balance_right lt k v rt) \<and> bheight (balance_right lt k v rt) = bheight lt"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   625
using assms
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   626
by (induct lt k v rt rule: balance_right.induct) (auto simp: balance_inv2 balance_bheight)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   627
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   628
lemma balance_right_inv1: "\<lbrakk>inv1 a; inv1l b; color_of a = B\<rbrakk> \<Longrightarrow> inv1 (balance_right a k x b)"
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   629
by (induct a k x b rule: balance_right.induct) (simp add: balance_inv1)+
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   630
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   631
lemma balance_right_inv1l: "\<lbrakk> inv1 lt; inv1l rt \<rbrakk> \<Longrightarrow>inv1l (balance_right lt k x rt)"
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   632
by (induct lt k x rt rule: balance_right.induct) (auto simp: balance_inv1)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   633
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   634
lemma (in linorder) balance_right_rbt_sorted:
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   635
  "\<lbrakk> rbt_sorted l; rbt_sorted r; rbt_less k l; k \<guillemotleft>| r \<rbrakk> \<Longrightarrow> rbt_sorted (balance_right l k v r)"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   636
apply (induct l k v r rule: balance_right.induct)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   637
apply (auto simp:balance_rbt_sorted)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   638
apply (unfold rbt_less_prop rbt_greater_prop)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   639
by force+
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   640
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   641
context order begin
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   642
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   643
lemma balance_right_rbt_greater: 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   644
  fixes k :: "'a"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   645
  assumes "k \<guillemotleft>| a" "k \<guillemotleft>| b" "k < x" 
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   646
  shows "k \<guillemotleft>| balance_right a x t b"
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   647
using assms by (induct a x t b rule: balance_right.induct) auto
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   648
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   649
lemma balance_right_rbt_less: 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   650
  fixes k :: "'a"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   651
  assumes "a |\<guillemotleft> k" "b |\<guillemotleft> k" "x < k" 
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   652
  shows "balance_right a x t b |\<guillemotleft> k"
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   653
using assms by (induct a x t b rule: balance_right.induct) auto
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   654
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   655
end
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   656
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   657
lemma balance_right_in_tree:
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   658
  assumes "inv1 l" "inv1l r" "bheight l = bheight r + 1" "inv2 l" "inv2 r"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   659
  shows "entry_in_tree x y (balance_right l k v r) = (entry_in_tree x y l \<or> x = k \<and> y = v \<or> entry_in_tree x y r)"
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   660
using assms by (induct l k v r rule: balance_right.induct) (auto simp: balance_in_tree)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   661
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   662
fun
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   663
  combine :: "('a,'b) rbt \<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   664
where
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   665
  "combine Empty x = x" 
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   666
| "combine x Empty = x" 
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   667
| "combine (Branch R a k x b) (Branch R c s y d) = (case (combine b c) of
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   668
                                    Branch R b2 t z c2 \<Rightarrow> (Branch R (Branch R a k x b2) t z (Branch R c2 s y d)) |
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   669
                                    bc \<Rightarrow> Branch R a k x (Branch R bc s y d))" 
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   670
| "combine (Branch B a k x b) (Branch B c s y d) = (case (combine b c) of
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   671
                                    Branch R b2 t z c2 \<Rightarrow> Branch R (Branch B a k x b2) t z (Branch B c2 s y d) |
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   672
                                    bc \<Rightarrow> balance_left a k x (Branch B bc s y d))" 
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   673
| "combine a (Branch R b k x c) = Branch R (combine a b) k x c" 
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   674
| "combine (Branch R a k x b) c = Branch R a k x (combine b c)" 
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   675
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   676
lemma combine_inv2:
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   677
  assumes "inv2 lt" "inv2 rt" "bheight lt = bheight rt"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   678
  shows "bheight (combine lt rt) = bheight lt" "inv2 (combine lt rt)"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   679
using assms 
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   680
by (induct lt rt rule: combine.induct) 
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   681
   (auto simp: balance_left_inv2_app split: rbt.splits color.splits)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   682
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   683
lemma combine_inv1: 
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   684
  assumes "inv1 lt" "inv1 rt"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   685
  shows "color_of lt = B \<Longrightarrow> color_of rt = B \<Longrightarrow> inv1 (combine lt rt)"
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   686
         "inv1l (combine lt rt)"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   687
using assms 
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   688
by (induct lt rt rule: combine.induct)
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   689
   (auto simp: balance_left_inv1 split: rbt.splits color.splits)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   690
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   691
context linorder begin
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   692
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   693
lemma combine_rbt_greater[simp]: 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   694
  fixes k :: "'a"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   695
  assumes "k \<guillemotleft>| l" "k \<guillemotleft>| r" 
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   696
  shows "k \<guillemotleft>| combine l r"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   697
using assms 
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   698
by (induct l r rule: combine.induct)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   699
   (auto simp: balance_left_rbt_greater split:rbt.splits color.splits)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   700
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   701
lemma combine_rbt_less[simp]: 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   702
  fixes k :: "'a"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   703
  assumes "l |\<guillemotleft> k" "r |\<guillemotleft> k" 
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   704
  shows "combine l r |\<guillemotleft> k"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   705
using assms 
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   706
by (induct l r rule: combine.induct)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   707
   (auto simp: balance_left_rbt_less split:rbt.splits color.splits)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   708
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   709
lemma combine_rbt_sorted: 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   710
  fixes k :: "'a"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   711
  assumes "rbt_sorted l" "rbt_sorted r" "l |\<guillemotleft> k" "k \<guillemotleft>| r"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   712
  shows "rbt_sorted (combine l r)"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   713
using assms proof (induct l r rule: combine.induct)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   714
  case (3 a x v b c y w d)
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   715
  hence ineqs: "a |\<guillemotleft> x" "x \<guillemotleft>| b" "b |\<guillemotleft> k" "k \<guillemotleft>| c" "c |\<guillemotleft> y" "y \<guillemotleft>| d"
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   716
    by auto
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   717
  with 3
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   718
  show ?case
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   719
    by (cases "combine b c" rule: rbt_cases)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   720
      (auto, (metis combine_rbt_greater combine_rbt_less ineqs ineqs rbt_less_simps(2) rbt_greater_simps(2) rbt_greater_trans rbt_less_trans)+)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   721
next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   722
  case (4 a x v b c y w d)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   723
  hence "x < k \<and> rbt_greater k c" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   724
  hence "rbt_greater x c" by (blast dest: rbt_greater_trans)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   725
  with 4 have 2: "rbt_greater x (combine b c)" by (simp add: combine_rbt_greater)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   726
  from 4 have "k < y \<and> rbt_less k b" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   727
  hence "rbt_less y b" by (blast dest: rbt_less_trans)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   728
  with 4 have 3: "rbt_less y (combine b c)" by (simp add: combine_rbt_less)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   729
  show ?case
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   730
  proof (cases "combine b c" rule: rbt_cases)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   731
    case Empty
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   732
    from 4 have "x < y \<and> rbt_greater y d" by auto
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   733
    hence "rbt_greater x d" by (blast dest: rbt_greater_trans)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   734
    with 4 Empty have "rbt_sorted a" and "rbt_sorted (Branch B Empty y w d)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   735
      and "rbt_less x a" and "rbt_greater x (Branch B Empty y w d)" by auto
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   736
    with Empty show ?thesis by (simp add: balance_left_rbt_sorted)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   737
  next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   738
    case (Red lta va ka rta)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   739
    with 2 4 have "x < va \<and> rbt_less x a" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   740
    hence 5: "rbt_less va a" by (blast dest: rbt_less_trans)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   741
    from Red 3 4 have "va < y \<and> rbt_greater y d" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   742
    hence "rbt_greater va d" by (blast dest: rbt_greater_trans)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   743
    with Red 2 3 4 5 show ?thesis by simp
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   744
  next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   745
    case (Black lta va ka rta)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   746
    from 4 have "x < y \<and> rbt_greater y d" by auto
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   747
    hence "rbt_greater x d" by (blast dest: rbt_greater_trans)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   748
    with Black 2 3 4 have "rbt_sorted a" and "rbt_sorted (Branch B (combine b c) y w d)" 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   749
      and "rbt_less x a" and "rbt_greater x (Branch B (combine b c) y w d)" by auto
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   750
    with Black show ?thesis by (simp add: balance_left_rbt_sorted)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   751
  qed
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   752
next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   753
  case (5 va vb vd vc b x w c)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   754
  hence "k < x \<and> rbt_less k (Branch B va vb vd vc)" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   755
  hence "rbt_less x (Branch B va vb vd vc)" by (blast dest: rbt_less_trans)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   756
  with 5 show ?case by (simp add: combine_rbt_less)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   757
next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   758
  case (6 a x v b va vb vd vc)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   759
  hence "x < k \<and> rbt_greater k (Branch B va vb vd vc)" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   760
  hence "rbt_greater x (Branch B va vb vd vc)" by (blast dest: rbt_greater_trans)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   761
  with 6 show ?case by (simp add: combine_rbt_greater)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   762
qed simp+
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   763
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   764
end
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   765
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   766
lemma combine_in_tree: 
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   767
  assumes "inv2 l" "inv2 r" "bheight l = bheight r" "inv1 l" "inv1 r"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   768
  shows "entry_in_tree k v (combine l r) = (entry_in_tree k v l \<or> entry_in_tree k v r)"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   769
using assms 
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   770
proof (induct l r rule: combine.induct)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   771
  case (4 _ _ _ b c)
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   772
  hence a: "bheight (combine b c) = bheight b" by (simp add: combine_inv2)
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   773
  from 4 have b: "inv1l (combine b c)" by (simp add: combine_inv1)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   774
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   775
  show ?case
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   776
  proof (cases "combine b c" rule: rbt_cases)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   777
    case Empty
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   778
    with 4 a show ?thesis by (auto simp: balance_left_in_tree)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   779
  next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   780
    case (Red lta ka va rta)
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   781
    with 4 show ?thesis by auto
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   782
  next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   783
    case (Black lta ka va rta)
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   784
    with a b 4  show ?thesis by (auto simp: balance_left_in_tree)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   785
  qed 
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   786
qed (auto split: rbt.splits color.splits)
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   787
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   788
context ord begin
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   789
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   790
fun
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   791
  rbt_del_from_left :: "'a \<Rightarrow> ('a,'b) rbt \<Rightarrow> 'a \<Rightarrow> 'b \<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt" and
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   792
  rbt_del_from_right :: "'a \<Rightarrow> ('a,'b) rbt \<Rightarrow> 'a \<Rightarrow> 'b \<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt" and
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   793
  rbt_del :: "'a\<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   794
where
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   795
  "rbt_del x Empty = Empty" |
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   796
  "rbt_del x (Branch c a y s b) = 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   797
   (if x < y then rbt_del_from_left x a y s b 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   798
    else (if x > y then rbt_del_from_right x a y s b else combine a b))" |
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   799
  "rbt_del_from_left x (Branch B lt z v rt) y s b = balance_left (rbt_del x (Branch B lt z v rt)) y s b" |
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   800
  "rbt_del_from_left x a y s b = Branch R (rbt_del x a) y s b" |
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   801
  "rbt_del_from_right x a y s (Branch B lt z v rt) = balance_right a y s (rbt_del x (Branch B lt z v rt))" | 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   802
  "rbt_del_from_right x a y s b = Branch R a y s (rbt_del x b)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   803
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   804
end
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   805
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   806
context linorder begin
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   807
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   808
lemma 
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   809
  assumes "inv2 lt" "inv1 lt"
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   810
  shows
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   811
  "\<lbrakk>inv2 rt; bheight lt = bheight rt; inv1 rt\<rbrakk> \<Longrightarrow>
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   812
   inv2 (rbt_del_from_left x lt k v rt) \<and> 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   813
   bheight (rbt_del_from_left x lt k v rt) = bheight lt \<and> 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   814
   (color_of lt = B \<and> color_of rt = B \<and> inv1 (rbt_del_from_left x lt k v rt) \<or> 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   815
    (color_of lt \<noteq> B \<or> color_of rt \<noteq> B) \<and> inv1l (rbt_del_from_left x lt k v rt))"
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   816
  and "\<lbrakk>inv2 rt; bheight lt = bheight rt; inv1 rt\<rbrakk> \<Longrightarrow>
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   817
  inv2 (rbt_del_from_right x lt k v rt) \<and> 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   818
  bheight (rbt_del_from_right x lt k v rt) = bheight lt \<and> 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   819
  (color_of lt = B \<and> color_of rt = B \<and> inv1 (rbt_del_from_right x lt k v rt) \<or> 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   820
   (color_of lt \<noteq> B \<or> color_of rt \<noteq> B) \<and> inv1l (rbt_del_from_right x lt k v rt))"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   821
  and rbt_del_inv1_inv2: "inv2 (rbt_del x lt) \<and> (color_of lt = R \<and> bheight (rbt_del x lt) = bheight lt \<and> inv1 (rbt_del x lt) 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   822
  \<or> color_of lt = B \<and> bheight (rbt_del x lt) = bheight lt - 1 \<and> inv1l (rbt_del x lt))"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   823
using assms
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   824
proof (induct x lt k v rt and x lt k v rt and x lt rule: rbt_del_from_left_rbt_del_from_right_rbt_del.induct)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   825
case (2 y c _ y')
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   826
  have "y = y' \<or> y < y' \<or> y > y'" by auto
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   827
  thus ?case proof (elim disjE)
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   828
    assume "y = y'"
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   829
    with 2 show ?thesis by (cases c) (simp add: combine_inv2 combine_inv1)+
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   830
  next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   831
    assume "y < y'"
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   832
    with 2 show ?thesis by (cases c) auto
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   833
  next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   834
    assume "y' < y"
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   835
    with 2 show ?thesis by (cases c) auto
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   836
  qed
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   837
next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   838
  case (3 y lt z v rta y' ss bb) 
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   839
  thus ?case by (cases "color_of (Branch B lt z v rta) = B \<and> color_of bb = B") (simp add: balance_left_inv2_with_inv1 balance_left_inv1 balance_left_inv1l)+
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   840
next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   841
  case (5 y a y' ss lt z v rta)
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   842
  thus ?case by (cases "color_of a = B \<and> color_of (Branch B lt z v rta) = B") (simp add: balance_right_inv2_with_inv1 balance_right_inv1 balance_right_inv1l)+
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   843
next
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   844
  case ("6_1" y a y' ss) thus ?case by (cases "color_of a = B \<and> color_of Empty = B") simp+
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   845
qed auto
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   846
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   847
lemma 
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   848
  rbt_del_from_left_rbt_less: "\<lbrakk> lt |\<guillemotleft> v; rt |\<guillemotleft> v; k < v\<rbrakk> \<Longrightarrow> rbt_del_from_left x lt k y rt |\<guillemotleft> v"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   849
  and rbt_del_from_right_rbt_less: "\<lbrakk>lt |\<guillemotleft> v; rt |\<guillemotleft> v; k < v\<rbrakk> \<Longrightarrow> rbt_del_from_right x lt k y rt |\<guillemotleft> v"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   850
  and rbt_del_rbt_less: "lt |\<guillemotleft> v \<Longrightarrow> rbt_del x lt |\<guillemotleft> v"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   851
by (induct x lt k y rt and x lt k y rt and x lt rule: rbt_del_from_left_rbt_del_from_right_rbt_del.induct) 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   852
   (auto simp: balance_left_rbt_less balance_right_rbt_less)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   853
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   854
lemma rbt_del_from_left_rbt_greater: "\<lbrakk>v \<guillemotleft>| lt; v \<guillemotleft>| rt; k > v\<rbrakk> \<Longrightarrow> v \<guillemotleft>| rbt_del_from_left x lt k y rt"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   855
  and rbt_del_from_right_rbt_greater: "\<lbrakk>v \<guillemotleft>| lt; v \<guillemotleft>| rt; k > v\<rbrakk> \<Longrightarrow> v \<guillemotleft>| rbt_del_from_right x lt k y rt"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   856
  and rbt_del_rbt_greater: "v \<guillemotleft>| lt \<Longrightarrow> v \<guillemotleft>| rbt_del x lt"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   857
by (induct x lt k y rt and x lt k y rt and x lt rule: rbt_del_from_left_rbt_del_from_right_rbt_del.induct)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   858
   (auto simp: balance_left_rbt_greater balance_right_rbt_greater)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   859
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   860
lemma "\<lbrakk>rbt_sorted lt; rbt_sorted rt; lt |\<guillemotleft> k; k \<guillemotleft>| rt\<rbrakk> \<Longrightarrow> rbt_sorted (rbt_del_from_left x lt k y rt)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   861
  and "\<lbrakk>rbt_sorted lt; rbt_sorted rt; lt |\<guillemotleft> k; k \<guillemotleft>| rt\<rbrakk> \<Longrightarrow> rbt_sorted (rbt_del_from_right x lt k y rt)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   862
  and rbt_del_rbt_sorted: "rbt_sorted lt \<Longrightarrow> rbt_sorted (rbt_del x lt)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   863
proof (induct x lt k y rt and x lt k y rt and x lt rule: rbt_del_from_left_rbt_del_from_right_rbt_del.induct)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   864
  case (3 x lta zz v rta yy ss bb)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   865
  from 3 have "Branch B lta zz v rta |\<guillemotleft> yy" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   866
  hence "rbt_del x (Branch B lta zz v rta) |\<guillemotleft> yy" by (rule rbt_del_rbt_less)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   867
  with 3 show ?case by (simp add: balance_left_rbt_sorted)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   868
next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   869
  case ("4_2" x vaa vbb vdd vc yy ss bb)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   870
  hence "Branch R vaa vbb vdd vc |\<guillemotleft> yy" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   871
  hence "rbt_del x (Branch R vaa vbb vdd vc) |\<guillemotleft> yy" by (rule rbt_del_rbt_less)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   872
  with "4_2" show ?case by simp
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   873
next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   874
  case (5 x aa yy ss lta zz v rta) 
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   875
  hence "yy \<guillemotleft>| Branch B lta zz v rta" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   876
  hence "yy \<guillemotleft>| rbt_del x (Branch B lta zz v rta)" by (rule rbt_del_rbt_greater)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   877
  with 5 show ?case by (simp add: balance_right_rbt_sorted)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   878
next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   879
  case ("6_2" x aa yy ss vaa vbb vdd vc)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   880
  hence "yy \<guillemotleft>| Branch R vaa vbb vdd vc" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   881
  hence "yy \<guillemotleft>| rbt_del x (Branch R vaa vbb vdd vc)" by (rule rbt_del_rbt_greater)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   882
  with "6_2" show ?case by simp
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   883
qed (auto simp: combine_rbt_sorted)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   884
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   885
lemma "\<lbrakk>rbt_sorted lt; rbt_sorted rt; lt |\<guillemotleft> kt; kt \<guillemotleft>| rt; inv1 lt; inv1 rt; inv2 lt; inv2 rt; bheight lt = bheight rt; x < kt\<rbrakk> \<Longrightarrow> entry_in_tree k v (rbt_del_from_left x lt kt y rt) = (False \<or> (x \<noteq> k \<and> entry_in_tree k v (Branch c lt kt y rt)))"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   886
  and "\<lbrakk>rbt_sorted lt; rbt_sorted rt; lt |\<guillemotleft> kt; kt \<guillemotleft>| rt; inv1 lt; inv1 rt; inv2 lt; inv2 rt; bheight lt = bheight rt; x > kt\<rbrakk> \<Longrightarrow> entry_in_tree k v (rbt_del_from_right x lt kt y rt) = (False \<or> (x \<noteq> k \<and> entry_in_tree k v (Branch c lt kt y rt)))"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   887
  and rbt_del_in_tree: "\<lbrakk>rbt_sorted t; inv1 t; inv2 t\<rbrakk> \<Longrightarrow> entry_in_tree k v (rbt_del x t) = (False \<or> (x \<noteq> k \<and> entry_in_tree k v t))"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   888
proof (induct x lt kt y rt and x lt kt y rt and x t rule: rbt_del_from_left_rbt_del_from_right_rbt_del.induct)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   889
  case (2 xx c aa yy ss bb)
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   890
  have "xx = yy \<or> xx < yy \<or> xx > yy" by auto
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   891
  from this 2 show ?case proof (elim disjE)
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   892
    assume "xx = yy"
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   893
    with 2 show ?thesis proof (cases "xx = k")
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   894
      case True
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
   895
      from 2 \<open>xx = yy\<close> \<open>xx = k\<close> have "rbt_sorted (Branch c aa yy ss bb) \<and> k = yy" by simp
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   896
      hence "\<not> entry_in_tree k v aa" "\<not> entry_in_tree k v bb" by (auto simp: rbt_less_nit rbt_greater_prop)
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
   897
      with \<open>xx = yy\<close> 2 \<open>xx = k\<close> show ?thesis by (simp add: combine_in_tree)
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   898
    qed (simp add: combine_in_tree)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   899
  qed simp+
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   900
next    
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   901
  case (3 xx lta zz vv rta yy ss bb)
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
   902
  define mt where [simp]: "mt = Branch B lta zz vv rta"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   903
  from 3 have "inv2 mt \<and> inv1 mt" by simp
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   904
  hence "inv2 (rbt_del xx mt) \<and> (color_of mt = R \<and> bheight (rbt_del xx mt) = bheight mt \<and> inv1 (rbt_del xx mt) \<or> color_of mt = B \<and> bheight (rbt_del xx mt) = bheight mt - 1 \<and> inv1l (rbt_del xx mt))" by (blast dest: rbt_del_inv1_inv2)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   905
  with 3 have 4: "entry_in_tree k v (rbt_del_from_left xx mt yy ss bb) = (False \<or> xx \<noteq> k \<and> entry_in_tree k v mt \<or> (k = yy \<and> v = ss) \<or> entry_in_tree k v bb)" by (simp add: balance_left_in_tree)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   906
  thus ?case proof (cases "xx = k")
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   907
    case True
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   908
    from 3 True have "yy \<guillemotleft>| bb \<and> yy > k" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   909
    hence "k \<guillemotleft>| bb" by (blast dest: rbt_greater_trans)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   910
    with 3 4 True show ?thesis by (auto simp: rbt_greater_nit)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   911
  qed auto
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   912
next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   913
  case ("4_1" xx yy ss bb)
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   914
  show ?case proof (cases "xx = k")
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   915
    case True
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   916
    with "4_1" have "yy \<guillemotleft>| bb \<and> k < yy" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   917
    hence "k \<guillemotleft>| bb" by (blast dest: rbt_greater_trans)
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
   918
    with "4_1" \<open>xx = k\<close> 
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   919
   have "entry_in_tree k v (Branch R Empty yy ss bb) = entry_in_tree k v Empty" by (auto simp: rbt_greater_nit)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   920
    thus ?thesis by auto
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   921
  qed simp+
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   922
next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   923
  case ("4_2" xx vaa vbb vdd vc yy ss bb)
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   924
  thus ?case proof (cases "xx = k")
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   925
    case True
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   926
    with "4_2" have "k < yy \<and> yy \<guillemotleft>| bb" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   927
    hence "k \<guillemotleft>| bb" by (blast dest: rbt_greater_trans)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   928
    with True "4_2" show ?thesis by (auto simp: rbt_greater_nit)
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   929
  qed auto
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   930
next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   931
  case (5 xx aa yy ss lta zz vv rta)
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
   932
  define mt where [simp]: "mt = Branch B lta zz vv rta"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   933
  from 5 have "inv2 mt \<and> inv1 mt" by simp
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   934
  hence "inv2 (rbt_del xx mt) \<and> (color_of mt = R \<and> bheight (rbt_del xx mt) = bheight mt \<and> inv1 (rbt_del xx mt) \<or> color_of mt = B \<and> bheight (rbt_del xx mt) = bheight mt - 1 \<and> inv1l (rbt_del xx mt))" by (blast dest: rbt_del_inv1_inv2)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   935
  with 5 have 3: "entry_in_tree k v (rbt_del_from_right xx aa yy ss mt) = (entry_in_tree k v aa \<or> (k = yy \<and> v = ss) \<or> False \<or> xx \<noteq> k \<and> entry_in_tree k v mt)" by (simp add: balance_right_in_tree)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   936
  thus ?case proof (cases "xx = k")
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   937
    case True
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   938
    from 5 True have "aa |\<guillemotleft> yy \<and> yy < k" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   939
    hence "aa |\<guillemotleft> k" by (blast dest: rbt_less_trans)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   940
    with 3 5 True show ?thesis by (auto simp: rbt_less_nit)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   941
  qed auto
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   942
next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   943
  case ("6_1" xx aa yy ss)
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   944
  show ?case proof (cases "xx = k")
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   945
    case True
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   946
    with "6_1" have "aa |\<guillemotleft> yy \<and> k > yy" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   947
    hence "aa |\<guillemotleft> k" by (blast dest: rbt_less_trans)
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
   948
    with "6_1" \<open>xx = k\<close> show ?thesis by (auto simp: rbt_less_nit)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   949
  qed simp
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   950
next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   951
  case ("6_2" xx aa yy ss vaa vbb vdd vc)
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   952
  thus ?case proof (cases "xx = k")
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   953
    case True
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   954
    with "6_2" have "k > yy \<and> aa |\<guillemotleft> yy" by simp
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   955
    hence "aa |\<guillemotleft> k" by (blast dest: rbt_less_trans)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   956
    with True "6_2" show ?thesis by (auto simp: rbt_less_nit)
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   957
  qed auto
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   958
qed simp
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   959
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   960
definition (in ord) rbt_delete where
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   961
  "rbt_delete k t = paint B (rbt_del k t)"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   962
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   963
theorem rbt_delete_is_rbt [simp]: assumes "is_rbt t" shows "is_rbt (rbt_delete k t)"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   964
proof -
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   965
  from assms have "inv2 t" and "inv1 t" unfolding is_rbt_def by auto 
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   966
  hence "inv2 (rbt_del k t) \<and> (color_of t = R \<and> bheight (rbt_del k t) = bheight t \<and> inv1 (rbt_del k t) \<or> color_of t = B \<and> bheight (rbt_del k t) = bheight t - 1 \<and> inv1l (rbt_del k t))" by (rule rbt_del_inv1_inv2)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   967
  hence "inv2 (rbt_del k t) \<and> inv1l (rbt_del k t)" by (cases "color_of t") auto
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   968
  with assms show ?thesis
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   969
    unfolding is_rbt_def rbt_delete_def
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   970
    by (auto intro: paint_rbt_sorted rbt_del_rbt_sorted)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   971
qed
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   972
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   973
lemma rbt_delete_in_tree: 
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   974
  assumes "is_rbt t" 
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   975
  shows "entry_in_tree k v (rbt_delete x t) = (x \<noteq> k \<and> entry_in_tree k v t)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   976
  using assms unfolding is_rbt_def rbt_delete_def
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   977
  by (auto simp: rbt_del_in_tree)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   978
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   979
lemma rbt_lookup_rbt_delete:
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   980
  assumes is_rbt: "is_rbt t"
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   981
  shows "rbt_lookup (rbt_delete k t) = (rbt_lookup t)|`(-{k})"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   982
proof
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   983
  fix x
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   984
  show "rbt_lookup (rbt_delete k t) x = (rbt_lookup t |` (-{k})) x" 
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   985
  proof (cases "x = k")
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   986
    assume "x = k" 
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
   987
    with is_rbt show ?thesis
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   988
      by (cases "rbt_lookup (rbt_delete k t) k") (auto simp: rbt_lookup_in_tree rbt_delete_in_tree)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   989
  next
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   990
    assume "x \<noteq> k"
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   991
    thus ?thesis
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   992
      by auto (metis is_rbt rbt_delete_is_rbt rbt_delete_in_tree is_rbt_rbt_sorted rbt_lookup_from_in_tree)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   993
  qed
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   994
qed
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   995
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
   996
end
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
   997
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
   998
subsection \<open>Modifying existing entries\<close>
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
   999
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1000
context ord begin
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1001
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
  1002
primrec
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1003
  rbt_map_entry :: "'a \<Rightarrow> ('b \<Rightarrow> 'b) \<Rightarrow> ('a, 'b) rbt \<Rightarrow> ('a, 'b) rbt"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
  1004
where
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1005
  "rbt_map_entry k f Empty = Empty"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1006
| "rbt_map_entry k f (Branch c lt x v rt) =
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1007
    (if k < x then Branch c (rbt_map_entry k f lt) x v rt
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1008
    else if k > x then (Branch c lt x v (rbt_map_entry k f rt))
35602
e814157560e8 various refinements
haftmann
parents: 35550
diff changeset
  1009
    else Branch c lt x (f v) rt)"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
  1010
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1011
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1012
lemma rbt_map_entry_color_of: "color_of (rbt_map_entry k f t) = color_of t" by (induct t) simp+
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1013
lemma rbt_map_entry_inv1: "inv1 (rbt_map_entry k f t) = inv1 t" by (induct t) (simp add: rbt_map_entry_color_of)+
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1014
lemma rbt_map_entry_inv2: "inv2 (rbt_map_entry k f t) = inv2 t" "bheight (rbt_map_entry k f t) = bheight t" by (induct t) simp+
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1015
lemma rbt_map_entry_rbt_greater: "rbt_greater a (rbt_map_entry k f t) = rbt_greater a t" by (induct t) simp+
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1016
lemma rbt_map_entry_rbt_less: "rbt_less a (rbt_map_entry k f t) = rbt_less a t" by (induct t) simp+
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1017
lemma rbt_map_entry_rbt_sorted: "rbt_sorted (rbt_map_entry k f t) = rbt_sorted t"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1018
  by (induct t) (simp_all add: rbt_map_entry_rbt_less rbt_map_entry_rbt_greater)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
  1019
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1020
theorem rbt_map_entry_is_rbt [simp]: "is_rbt (rbt_map_entry k f t) = is_rbt t" 
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1021
unfolding is_rbt_def by (simp add: rbt_map_entry_inv2 rbt_map_entry_color_of rbt_map_entry_rbt_sorted rbt_map_entry_inv1 )
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
  1022
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1023
end
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1024
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1025
theorem (in linorder) rbt_lookup_rbt_map_entry:
55466
786edc984c98 merged 'Option.map' and 'Option.map_option'
blanchet
parents: 55417
diff changeset
  1026
  "rbt_lookup (rbt_map_entry k f t) = (rbt_lookup t)(k := map_option f (rbt_lookup t k))"
39302
d7728f65b353 renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
nipkow
parents: 39198
diff changeset
  1027
  by (induct t) (auto split: option.splits simp add: fun_eq_iff)
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
  1028
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1029
subsection \<open>Mapping all entries\<close>
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
  1030
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
  1031
primrec
35602
e814157560e8 various refinements
haftmann
parents: 35550
diff changeset
  1032
  map :: "('a \<Rightarrow> 'b \<Rightarrow> 'c) \<Rightarrow> ('a, 'b) rbt \<Rightarrow> ('a, 'c) rbt"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
  1033
where
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
  1034
  "map f Empty = Empty"
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
  1035
| "map f (Branch c lt k v rt) = Branch c (map f lt) k (f k v) (map f rt)"
32237
cdc76a42fed4 added missing proof of RBT.map_of_alist_of (contributed by Peter Lammich)
krauss
parents: 30738
diff changeset
  1036
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
  1037
lemma map_entries [simp]: "entries (map f t) = List.map (\<lambda>(k, v). (k, f k v)) (entries t)"
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
  1038
  by (induct t) auto
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
  1039
lemma map_keys [simp]: "keys (map f t) = keys t" by (simp add: keys_def split_def)
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
  1040
lemma map_color_of: "color_of (map f t) = color_of t" by (induct t) simp+
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
  1041
lemma map_inv1: "inv1 (map f t) = inv1 t" by (induct t) (simp add: map_color_of)+
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
  1042
lemma map_inv2: "inv2 (map f t) = inv2 t" "bheight (map f t) = bheight t" by (induct t) simp+
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1043
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1044
context ord begin
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1045
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1046
lemma map_rbt_greater: "rbt_greater k (map f t) = rbt_greater k t" by (induct t) simp+
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1047
lemma map_rbt_less: "rbt_less k (map f t) = rbt_less k t" by (induct t) simp+
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1048
lemma map_rbt_sorted: "rbt_sorted (map f t) = rbt_sorted t"  by (induct t) (simp add: map_rbt_less map_rbt_greater)+
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
  1049
theorem map_is_rbt [simp]: "is_rbt (map f t) = is_rbt t" 
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1050
unfolding is_rbt_def by (simp add: map_inv1 map_inv2 map_rbt_sorted map_color_of)
32237
cdc76a42fed4 added missing proof of RBT.map_of_alist_of (contributed by Peter Lammich)
krauss
parents: 30738
diff changeset
  1051
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1052
end
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
  1053
55466
786edc984c98 merged 'Option.map' and 'Option.map_option'
blanchet
parents: 55417
diff changeset
  1054
theorem (in linorder) rbt_lookup_map: "rbt_lookup (map f t) x = map_option (f x) (rbt_lookup t x)"
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1055
  apply(induct t)
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1056
  apply auto
58257
0662f35534fe half-ported Imperative HOL to new datatypes
blanchet
parents: 58249
diff changeset
  1057
  apply(rename_tac a b c, subgoal_tac "x = a")
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1058
  apply auto
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1059
  done
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1060
 (* FIXME: simproc "antisym less" does not work for linorder context, only for linorder type class
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1061
    by (induct t) auto *)
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
  1062
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1063
hide_const (open) map
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1064
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1065
subsection \<open>Folding over entries\<close>
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
  1066
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
  1067
definition fold :: "('a \<Rightarrow> 'b \<Rightarrow> 'c \<Rightarrow> 'c) \<Rightarrow> ('a, 'b) rbt \<Rightarrow> 'c \<Rightarrow> 'c" where
55414
eab03e9cee8a renamed '{prod,sum,bool,unit}_case' to 'case_...'
blanchet
parents: 55412
diff changeset
  1068
  "fold f t = List.fold (case_prod f) (entries t)"
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
  1069
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1070
lemma fold_simps [simp]:
35550
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
  1071
  "fold f Empty = id"
e2bc7f8d8d51 restructured RBT theory
haftmann
parents: 35534
diff changeset
  1072
  "fold f (Branch c lt k v rt) = fold f rt \<circ> f k v \<circ> fold f lt"
39302
d7728f65b353 renamed lemmas: ext_iff -> fun_eq_iff, set_ext_iff -> set_eq_iff, set_ext -> set_eqI
nipkow
parents: 39198
diff changeset
  1073
  by (simp_all add: fold_def fun_eq_iff)
35534
14d8d72f8b1f more explicit naming scheme
haftmann
parents: 32245
diff changeset
  1074
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1075
lemma fold_code [code]:
49810
53f14f62cca2 fix code equation for RBT_Impl.fold
Andreas Lochbihler
parents: 49807
diff changeset
  1076
  "fold f Empty x = x"
53f14f62cca2 fix code equation for RBT_Impl.fold
Andreas Lochbihler
parents: 49807
diff changeset
  1077
  "fold f (Branch c lt k v rt) x = fold f rt (f k v (fold f lt x))"
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1078
by(simp_all)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1079
67408
4a4c14b24800 prefer formal comments;
wenzelm
parents: 66808
diff changeset
  1080
\<comment> \<open>fold with continuation predicate\<close>
48621
877df57629e3 a couple of additions to RBT formalization to allow us to implement RBT_Set
kuncar
parents: 47455
diff changeset
  1081
fun foldi :: "('c \<Rightarrow> bool) \<Rightarrow> ('a \<Rightarrow> 'b \<Rightarrow> 'c \<Rightarrow> 'c) \<Rightarrow> ('a :: linorder, 'b) rbt \<Rightarrow> 'c \<Rightarrow> 'c" 
877df57629e3 a couple of additions to RBT formalization to allow us to implement RBT_Set
kuncar
parents: 47455
diff changeset
  1082
  where
877df57629e3 a couple of additions to RBT formalization to allow us to implement RBT_Set
kuncar
parents: 47455
diff changeset
  1083
  "foldi c f Empty s = s" |
877df57629e3 a couple of additions to RBT formalization to allow us to implement RBT_Set
kuncar
parents: 47455
diff changeset
  1084
  "foldi c f (Branch col l k v r) s = (
877df57629e3 a couple of additions to RBT formalization to allow us to implement RBT_Set
kuncar
parents: 47455
diff changeset
  1085
    if (c s) then
877df57629e3 a couple of additions to RBT formalization to allow us to implement RBT_Set
kuncar
parents: 47455
diff changeset
  1086
      let s' = foldi c f l s in
877df57629e3 a couple of additions to RBT formalization to allow us to implement RBT_Set
kuncar
parents: 47455
diff changeset
  1087
        if (c s') then
877df57629e3 a couple of additions to RBT formalization to allow us to implement RBT_Set
kuncar
parents: 47455
diff changeset
  1088
          foldi c f r (f k v s')
877df57629e3 a couple of additions to RBT formalization to allow us to implement RBT_Set
kuncar
parents: 47455
diff changeset
  1089
        else s'
877df57629e3 a couple of additions to RBT formalization to allow us to implement RBT_Set
kuncar
parents: 47455
diff changeset
  1090
    else 
877df57629e3 a couple of additions to RBT formalization to allow us to implement RBT_Set
kuncar
parents: 47455
diff changeset
  1091
      s
877df57629e3 a couple of additions to RBT formalization to allow us to implement RBT_Set
kuncar
parents: 47455
diff changeset
  1092
  )"
35606
7c5b40c7e8c4 added bulkload; tuned document
haftmann
parents: 35603
diff changeset
  1093
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1094
subsection \<open>Bulkloading a tree\<close>
35606
7c5b40c7e8c4 added bulkload; tuned document
haftmann
parents: 35603
diff changeset
  1095
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1096
definition (in ord) rbt_bulkload :: "('a \<times> 'b) list \<Rightarrow> ('a, 'b) rbt" where
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1097
  "rbt_bulkload xs = foldr (\<lambda>(k, v). rbt_insert k v) xs Empty"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1098
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1099
context linorder begin
35606
7c5b40c7e8c4 added bulkload; tuned document
haftmann
parents: 35603
diff changeset
  1100
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1101
lemma rbt_bulkload_is_rbt [simp, intro]:
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1102
  "is_rbt (rbt_bulkload xs)"
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1103
  unfolding rbt_bulkload_def by (induct xs) auto
35606
7c5b40c7e8c4 added bulkload; tuned document
haftmann
parents: 35603
diff changeset
  1104
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1105
lemma rbt_lookup_rbt_bulkload:
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1106
  "rbt_lookup (rbt_bulkload xs) = map_of xs"
35606
7c5b40c7e8c4 added bulkload; tuned document
haftmann
parents: 35603
diff changeset
  1107
proof -
7c5b40c7e8c4 added bulkload; tuned document
haftmann
parents: 35603
diff changeset
  1108
  obtain ys where "ys = rev xs" by simp
7c5b40c7e8c4 added bulkload; tuned document
haftmann
parents: 35603
diff changeset
  1109
  have "\<And>t. is_rbt t \<Longrightarrow>
55414
eab03e9cee8a renamed '{prod,sum,bool,unit}_case' to 'case_...'
blanchet
parents: 55412
diff changeset
  1110
    rbt_lookup (List.fold (case_prod rbt_insert) ys t) = rbt_lookup t ++ map_of (rev ys)"
eab03e9cee8a renamed '{prod,sum,bool,unit}_case' to 'case_...'
blanchet
parents: 55412
diff changeset
  1111
      by (induct ys) (simp_all add: rbt_bulkload_def rbt_lookup_rbt_insert case_prod_beta)
35606
7c5b40c7e8c4 added bulkload; tuned document
haftmann
parents: 35603
diff changeset
  1112
  from this Empty_is_rbt have
55414
eab03e9cee8a renamed '{prod,sum,bool,unit}_case' to 'case_...'
blanchet
parents: 55412
diff changeset
  1113
    "rbt_lookup (List.fold (case_prod rbt_insert) (rev xs) Empty) = rbt_lookup Empty ++ map_of xs"
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1114
     by (simp add: \<open>ys = rev xs\<close>)
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1115
  then show ?thesis by (simp add: rbt_bulkload_def rbt_lookup_Empty foldr_conv_fold)
35606
7c5b40c7e8c4 added bulkload; tuned document
haftmann
parents: 35603
diff changeset
  1116
qed
7c5b40c7e8c4 added bulkload; tuned document
haftmann
parents: 35603
diff changeset
  1117
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1118
end
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1119
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1120
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1121
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1122
subsection \<open>Building a RBT from a sorted list\<close>
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1123
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1124
text \<open>
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1125
  These functions have been adapted from 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1126
  Andrew W. Appel, Efficient Verified Red-Black Trees (September 2011) 
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1127
\<close>
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1128
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1129
fun rbtreeify_f :: "nat \<Rightarrow> ('a \<times> 'b) list \<Rightarrow> ('a, 'b) rbt \<times> ('a \<times> 'b) list"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1130
  and rbtreeify_g :: "nat \<Rightarrow> ('a \<times> 'b) list \<Rightarrow> ('a, 'b) rbt \<times> ('a \<times> 'b) list"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1131
where
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1132
  "rbtreeify_f n kvs =
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1133
   (if n = 0 then (Empty, kvs)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1134
    else if n = 1 then
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1135
      case kvs of (k, v) # kvs' \<Rightarrow> (Branch R Empty k v Empty, kvs')
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1136
    else if (n mod 2 = 0) then
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1137
      case rbtreeify_f (n div 2) kvs of (t1, (k, v) # kvs') \<Rightarrow>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1138
        apfst (Branch B t1 k v) (rbtreeify_g (n div 2) kvs')
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1139
    else case rbtreeify_f (n div 2) kvs of (t1, (k, v) # kvs') \<Rightarrow>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1140
        apfst (Branch B t1 k v) (rbtreeify_f (n div 2) kvs'))"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1141
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1142
| "rbtreeify_g n kvs =
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1143
   (if n = 0 \<or> n = 1 then (Empty, kvs)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1144
    else if n mod 2 = 0 then
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1145
      case rbtreeify_g (n div 2) kvs of (t1, (k, v) # kvs') \<Rightarrow>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1146
        apfst (Branch B t1 k v) (rbtreeify_g (n div 2) kvs')
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1147
    else case rbtreeify_f (n div 2) kvs of (t1, (k, v) # kvs') \<Rightarrow>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1148
        apfst (Branch B t1 k v) (rbtreeify_g (n div 2) kvs'))"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1149
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1150
definition rbtreeify :: "('a \<times> 'b) list \<Rightarrow> ('a, 'b) rbt"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1151
where "rbtreeify kvs = fst (rbtreeify_g (Suc (length kvs)) kvs)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1152
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1153
declare rbtreeify_f.simps [simp del] rbtreeify_g.simps [simp del]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1154
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1155
lemma rbtreeify_f_code [code]:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1156
  "rbtreeify_f n kvs =
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1157
   (if n = 0 then (Empty, kvs)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1158
    else if n = 1 then
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1159
      case kvs of (k, v) # kvs' \<Rightarrow> 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1160
        (Branch R Empty k v Empty, kvs')
61433
a4c0de1df3d8 qualify some names stemming from internal bootstrap constructions
haftmann
parents: 61225
diff changeset
  1161
    else let (n', r) = Divides.divmod_nat n 2 in
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1162
      if r = 0 then
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1163
        case rbtreeify_f n' kvs of (t1, (k, v) # kvs') \<Rightarrow>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1164
          apfst (Branch B t1 k v) (rbtreeify_g n' kvs')
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1165
      else case rbtreeify_f n' kvs of (t1, (k, v) # kvs') \<Rightarrow>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1166
          apfst (Branch B t1 k v) (rbtreeify_f n' kvs'))"
66808
1907167b6038 elementary definition of division on natural numbers
haftmann
parents: 64246
diff changeset
  1167
by (subst rbtreeify_f.simps) (simp only: Let_def divmod_nat_def prod.case)
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1168
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1169
lemma rbtreeify_g_code [code]:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1170
  "rbtreeify_g n kvs =
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1171
   (if n = 0 \<or> n = 1 then (Empty, kvs)
61433
a4c0de1df3d8 qualify some names stemming from internal bootstrap constructions
haftmann
parents: 61225
diff changeset
  1172
    else let (n', r) = Divides.divmod_nat n 2 in
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1173
      if r = 0 then
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1174
        case rbtreeify_g n' kvs of (t1, (k, v) # kvs') \<Rightarrow>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1175
          apfst (Branch B t1 k v) (rbtreeify_g n' kvs')
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1176
      else case rbtreeify_f n' kvs of (t1, (k, v) # kvs') \<Rightarrow>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1177
          apfst (Branch B t1 k v) (rbtreeify_g n' kvs'))"
66808
1907167b6038 elementary definition of division on natural numbers
haftmann
parents: 64246
diff changeset
  1178
by(subst rbtreeify_g.simps)(simp only: Let_def divmod_nat_def prod.case)
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1179
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1180
lemma Suc_double_half: "Suc (2 * n) div 2 = n"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1181
by simp
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1182
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1183
lemma div2_plus_div2: "n div 2 + n div 2 = (n :: nat) - n mod 2"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1184
by arith
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1185
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1186
lemma rbtreeify_f_rec_aux_lemma:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1187
  "\<lbrakk>k - n div 2 = Suc k'; n \<le> k; n mod 2 = Suc 0\<rbrakk>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1188
  \<Longrightarrow> k' - n div 2 = k - n"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1189
apply(rule add_right_imp_eq[where a = "n - n div 2"])
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1190
apply(subst add_diff_assoc2, arith)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1191
apply(simp add: div2_plus_div2)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1192
done
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1193
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1194
lemma rbtreeify_f_simps:
59575
55f5e1cbf2a7 removed needless (and inconsistent) qualifier that messes up with Mirabelle
blanchet
parents: 59554
diff changeset
  1195
  "rbtreeify_f 0 kvs = (Empty, kvs)"
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1196
  "rbtreeify_f (Suc 0) ((k, v) # kvs) = 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1197
  (Branch R Empty k v Empty, kvs)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1198
  "0 < n \<Longrightarrow> rbtreeify_f (2 * n) kvs =
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1199
   (case rbtreeify_f n kvs of (t1, (k, v) # kvs') \<Rightarrow>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1200
     apfst (Branch B t1 k v) (rbtreeify_g n kvs'))"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1201
  "0 < n \<Longrightarrow> rbtreeify_f (Suc (2 * n)) kvs =
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1202
   (case rbtreeify_f n kvs of (t1, (k, v) # kvs') \<Rightarrow> 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1203
     apfst (Branch B t1 k v) (rbtreeify_f n kvs'))"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1204
by(subst (1) rbtreeify_f.simps, simp add: Suc_double_half)+
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1205
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1206
lemma rbtreeify_g_simps:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1207
  "rbtreeify_g 0 kvs = (Empty, kvs)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1208
  "rbtreeify_g (Suc 0) kvs = (Empty, kvs)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1209
  "0 < n \<Longrightarrow> rbtreeify_g (2 * n) kvs =
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1210
   (case rbtreeify_g n kvs of (t1, (k, v) # kvs') \<Rightarrow> 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1211
     apfst (Branch B t1 k v) (rbtreeify_g n kvs'))"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1212
  "0 < n \<Longrightarrow> rbtreeify_g (Suc (2 * n)) kvs =
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1213
   (case rbtreeify_f n kvs of (t1, (k, v) # kvs') \<Rightarrow> 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1214
     apfst (Branch B t1 k v) (rbtreeify_g n kvs'))"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1215
by(subst (1) rbtreeify_g.simps, simp add: Suc_double_half)+
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1216
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1217
declare rbtreeify_f_simps[simp] rbtreeify_g_simps[simp]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1218
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1219
lemma length_rbtreeify_f: "n \<le> length kvs
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1220
  \<Longrightarrow> length (snd (rbtreeify_f n kvs)) = length kvs - n"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1221
  and length_rbtreeify_g:"\<lbrakk> 0 < n; n \<le> Suc (length kvs) \<rbrakk>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1222
  \<Longrightarrow> length (snd (rbtreeify_g n kvs)) = Suc (length kvs) - n"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1223
proof(induction n kvs and n kvs rule: rbtreeify_f_rbtreeify_g.induct)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1224
  case (1 n kvs)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1225
  show ?case
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1226
  proof(cases "n \<le> 1")
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1227
    case True thus ?thesis using "1.prems"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1228
      by(cases n kvs rule: nat.exhaust[case_product list.exhaust]) auto
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1229
  next
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1230
    case False
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1231
    hence "n \<noteq> 0" "n \<noteq> 1" by simp_all
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1232
    note IH = "1.IH"[OF this]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1233
    show ?thesis
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1234
    proof(cases "n mod 2 = 0")
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1235
      case True
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1236
      hence "length (snd (rbtreeify_f n kvs)) = 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1237
        length (snd (rbtreeify_f (2 * (n div 2)) kvs))"
64246
15d1ee6e847b eliminated irregular aliasses
haftmann
parents: 64243
diff changeset
  1238
        by(metis minus_nat.diff_0 minus_mod_eq_mult_div [symmetric])
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1239
      also from "1.prems" False obtain k v kvs' 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1240
        where kvs: "kvs = (k, v) # kvs'" by(cases kvs) auto
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1241
      also have "0 < n div 2" using False by(simp) 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1242
      note rbtreeify_f_simps(3)[OF this]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1243
      also note kvs[symmetric] 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1244
      also let ?rest1 = "snd (rbtreeify_f (n div 2) kvs)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1245
      from "1.prems" have "n div 2 \<le> length kvs" by simp
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1246
      with True have len: "length ?rest1 = length kvs - n div 2" by(rule IH)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1247
      with "1.prems" False obtain t1 k' v' kvs''
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1248
        where kvs'': "rbtreeify_f (n div 2) kvs = (t1, (k', v') # kvs'')"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1249
         by(cases ?rest1)(auto simp add: snd_def split: prod.split_asm)
55412
eb2caacf3ba4 avoid old 'prod.simps' -- better be more specific
blanchet
parents: 53374
diff changeset
  1250
      note this also note prod.case also note list.simps(5) 
eb2caacf3ba4 avoid old 'prod.simps' -- better be more specific
blanchet
parents: 53374
diff changeset
  1251
      also note prod.case also note snd_apfst
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1252
      also have "0 < n div 2" "n div 2 \<le> Suc (length kvs'')" 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1253
        using len "1.prems" False unfolding kvs'' by simp_all
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1254
      with True kvs''[symmetric] refl refl
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1255
      have "length (snd (rbtreeify_g (n div 2) kvs'')) = 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1256
        Suc (length kvs'') - n div 2" by(rule IH)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1257
      finally show ?thesis using len[unfolded kvs''] "1.prems" True
64246
15d1ee6e847b eliminated irregular aliasses
haftmann
parents: 64243
diff changeset
  1258
        by(simp add: Suc_diff_le[symmetric] mult_2[symmetric] minus_mod_eq_mult_div [symmetric])
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1259
    next
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1260
      case False
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1261
      hence "length (snd (rbtreeify_f n kvs)) = 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1262
        length (snd (rbtreeify_f (Suc (2 * (n div 2))) kvs))"
59554
4044f53326c9 inlined rules to free user-space from technical names
haftmann
parents: 58881
diff changeset
  1263
        by (simp add: mod_eq_0_iff_dvd)
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1264
      also from "1.prems" \<open>\<not> n \<le> 1\<close> obtain k v kvs' 
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1265
        where kvs: "kvs = (k, v) # kvs'" by(cases kvs) auto
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1266
      also have "0 < n div 2" using \<open>\<not> n \<le> 1\<close> by(simp) 
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1267
      note rbtreeify_f_simps(4)[OF this]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1268
      also note kvs[symmetric] 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1269
      also let ?rest1 = "snd (rbtreeify_f (n div 2) kvs)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1270
      from "1.prems" have "n div 2 \<le> length kvs" by simp
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1271
      with False have len: "length ?rest1 = length kvs - n div 2" by(rule IH)
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1272
      with "1.prems" \<open>\<not> n \<le> 1\<close> obtain t1 k' v' kvs''
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1273
        where kvs'': "rbtreeify_f (n div 2) kvs = (t1, (k', v') # kvs'')"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1274
        by(cases ?rest1)(auto simp add: snd_def split: prod.split_asm)
55412
eb2caacf3ba4 avoid old 'prod.simps' -- better be more specific
blanchet
parents: 53374
diff changeset
  1275
      note this also note prod.case also note list.simps(5)
eb2caacf3ba4 avoid old 'prod.simps' -- better be more specific
blanchet
parents: 53374
diff changeset
  1276
      also note prod.case also note snd_apfst
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1277
      also have "n div 2 \<le> length kvs''" 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1278
        using len "1.prems" False unfolding kvs'' by simp arith
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1279
      with False kvs''[symmetric] refl refl
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1280
      have "length (snd (rbtreeify_f (n div 2) kvs'')) = length kvs'' - n div 2"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1281
        by(rule IH)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1282
      finally show ?thesis using len[unfolded kvs''] "1.prems" False
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1283
        by simp(rule rbtreeify_f_rec_aux_lemma[OF sym])
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1284
    qed
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1285
  qed
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1286
next
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1287
  case (2 n kvs)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1288
  show ?case
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1289
  proof(cases "n > 1")
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1290
    case False with \<open>0 < n\<close> show ?thesis
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1291
      by(cases n kvs rule: nat.exhaust[case_product list.exhaust]) simp_all
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1292
  next
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1293
    case True
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1294
    hence "\<not> (n = 0 \<or> n = 1)" by simp
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1295
    note IH = "2.IH"[OF this]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1296
    show ?thesis
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1297
    proof(cases "n mod 2 = 0")
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1298
      case True
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1299
      hence "length (snd (rbtreeify_g n kvs)) =
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1300
        length (snd (rbtreeify_g (2 * (n div 2)) kvs))"
64246
15d1ee6e847b eliminated irregular aliasses
haftmann
parents: 64243
diff changeset
  1301
        by(metis minus_nat.diff_0 minus_mod_eq_mult_div [symmetric])
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1302
      also from "2.prems" True obtain k v kvs' 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1303
        where kvs: "kvs = (k, v) # kvs'" by(cases kvs) auto
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1304
      also have "0 < n div 2" using \<open>1 < n\<close> by(simp) 
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1305
      note rbtreeify_g_simps(3)[OF this]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1306
      also note kvs[symmetric] 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1307
      also let ?rest1 = "snd (rbtreeify_g (n div 2) kvs)"
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1308
      from "2.prems" \<open>1 < n\<close>
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1309
      have "0 < n div 2" "n div 2 \<le> Suc (length kvs)" by simp_all
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1310
      with True have len: "length ?rest1 = Suc (length kvs) - n div 2" by(rule IH)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1311
      with "2.prems" obtain t1 k' v' kvs''
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1312
        where kvs'': "rbtreeify_g (n div 2) kvs = (t1, (k', v') # kvs'')"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1313
        by(cases ?rest1)(auto simp add: snd_def split: prod.split_asm)
55412
eb2caacf3ba4 avoid old 'prod.simps' -- better be more specific
blanchet
parents: 53374
diff changeset
  1314
      note this also note prod.case also note list.simps(5) 
eb2caacf3ba4 avoid old 'prod.simps' -- better be more specific
blanchet
parents: 53374
diff changeset
  1315
      also note prod.case also note snd_apfst
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1316
      also have "n div 2 \<le> Suc (length kvs'')" 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1317
        using len "2.prems" unfolding kvs'' by simp
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1318
      with True kvs''[symmetric] refl refl \<open>0 < n div 2\<close>
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1319
      have "length (snd (rbtreeify_g (n div 2) kvs'')) = Suc (length kvs'') - n div 2"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1320
        by(rule IH)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1321
      finally show ?thesis using len[unfolded kvs''] "2.prems" True
64246
15d1ee6e847b eliminated irregular aliasses
haftmann
parents: 64243
diff changeset
  1322
        by(simp add: Suc_diff_le[symmetric] mult_2[symmetric] minus_mod_eq_mult_div [symmetric])
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1323
    next
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1324
      case False
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1325
      hence "length (snd (rbtreeify_g n kvs)) = 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1326
        length (snd (rbtreeify_g (Suc (2 * (n div 2))) kvs))"
59554
4044f53326c9 inlined rules to free user-space from technical names
haftmann
parents: 58881
diff changeset
  1327
        by (simp add: mod_eq_0_iff_dvd)
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1328
      also from "2.prems" \<open>1 < n\<close> obtain k v kvs'
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1329
        where kvs: "kvs = (k, v) # kvs'" by(cases kvs) auto
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1330
      also have "0 < n div 2" using \<open>1 < n\<close> by(simp)
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1331
      note rbtreeify_g_simps(4)[OF this]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1332
      also note kvs[symmetric] 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1333
      also let ?rest1 = "snd (rbtreeify_f (n div 2) kvs)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1334
      from "2.prems" have "n div 2 \<le> length kvs" by simp
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1335
      with False have len: "length ?rest1 = length kvs - n div 2" by(rule IH)
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1336
      with "2.prems" \<open>1 < n\<close> False obtain t1 k' v' kvs'' 
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1337
        where kvs'': "rbtreeify_f (n div 2) kvs = (t1, (k', v') # kvs'')"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1338
        by(cases ?rest1)(auto simp add: snd_def split: prod.split_asm, arith)
55412
eb2caacf3ba4 avoid old 'prod.simps' -- better be more specific
blanchet
parents: 53374
diff changeset
  1339
      note this also note prod.case also note list.simps(5) 
eb2caacf3ba4 avoid old 'prod.simps' -- better be more specific
blanchet
parents: 53374
diff changeset
  1340
      also note prod.case also note snd_apfst
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1341
      also have "n div 2 \<le> Suc (length kvs'')" 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1342
        using len "2.prems" False unfolding kvs'' by simp arith
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1343
      with False kvs''[symmetric] refl refl \<open>0 < n div 2\<close>
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1344
      have "length (snd (rbtreeify_g (n div 2) kvs'')) = Suc (length kvs'') - n div 2"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1345
        by(rule IH)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1346
      finally show ?thesis using len[unfolded kvs''] "2.prems" False
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1347
        by(simp add: div2_plus_div2)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1348
    qed
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1349
  qed
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1350
qed
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1351
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1352
lemma rbtreeify_induct [consumes 1, case_names f_0 f_1 f_even f_odd g_0 g_1 g_even g_odd]:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1353
  fixes P Q
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1354
  defines "f0 == (\<And>kvs. P 0 kvs)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1355
  and "f1 == (\<And>k v kvs. P (Suc 0) ((k, v) # kvs))"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1356
  and "feven ==
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1357
    (\<And>n kvs t k v kvs'. \<lbrakk> n > 0; n \<le> length kvs; P n kvs; 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1358
       rbtreeify_f n kvs = (t, (k, v) # kvs'); n \<le> Suc (length kvs'); Q n kvs' \<rbrakk> 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1359
     \<Longrightarrow> P (2 * n) kvs)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1360
  and "fodd == 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1361
    (\<And>n kvs t k v kvs'. \<lbrakk> n > 0; n \<le> length kvs; P n kvs;
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1362
       rbtreeify_f n kvs = (t, (k, v) # kvs'); n \<le> length kvs'; P n kvs' \<rbrakk> 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1363
    \<Longrightarrow> P (Suc (2 * n)) kvs)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1364
  and "g0 == (\<And>kvs. Q 0 kvs)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1365
  and "g1 == (\<And>kvs. Q (Suc 0) kvs)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1366
  and "geven == 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1367
    (\<And>n kvs t k v kvs'. \<lbrakk> n > 0; n \<le> Suc (length kvs); Q n kvs; 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1368
       rbtreeify_g n kvs = (t, (k, v) # kvs'); n \<le> Suc (length kvs'); Q n kvs' \<rbrakk>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1369
    \<Longrightarrow> Q (2 * n) kvs)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1370
  and "godd == 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1371
    (\<And>n kvs t k v kvs'. \<lbrakk> n > 0; n \<le> length kvs; P n kvs;
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1372
       rbtreeify_f n kvs = (t, (k, v) # kvs'); n \<le> Suc (length kvs'); Q n kvs' \<rbrakk>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1373
    \<Longrightarrow> Q (Suc (2 * n)) kvs)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1374
  shows "\<lbrakk> n \<le> length kvs; 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1375
           PROP f0; PROP f1; PROP feven; PROP fodd; 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1376
           PROP g0; PROP g1; PROP geven; PROP godd \<rbrakk>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1377
         \<Longrightarrow> P n kvs"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1378
  and "\<lbrakk> n \<le> Suc (length kvs);
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1379
          PROP f0; PROP f1; PROP feven; PROP fodd; 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1380
          PROP g0; PROP g1; PROP geven; PROP godd \<rbrakk>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1381
       \<Longrightarrow> Q n kvs"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1382
proof -
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1383
  assume f0: "PROP f0" and f1: "PROP f1" and feven: "PROP feven" and fodd: "PROP fodd"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1384
    and g0: "PROP g0" and g1: "PROP g1" and geven: "PROP geven" and godd: "PROP godd"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1385
  show "n \<le> length kvs \<Longrightarrow> P n kvs" and "n \<le> Suc (length kvs) \<Longrightarrow> Q n kvs"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1386
  proof(induction rule: rbtreeify_f_rbtreeify_g.induct)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1387
    case (1 n kvs)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1388
    show ?case
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1389
    proof(cases "n \<le> 1")
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1390
      case True thus ?thesis using "1.prems"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1391
        by(cases n kvs rule: nat.exhaust[case_product list.exhaust])
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1392
          (auto simp add: f0[unfolded f0_def] f1[unfolded f1_def])
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1393
    next
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1394
      case False 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1395
      hence ns: "n \<noteq> 0" "n \<noteq> 1" by simp_all
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1396
      hence ge0: "n div 2 > 0" by simp
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1397
      note IH = "1.IH"[OF ns]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1398
      show ?thesis
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1399
      proof(cases "n mod 2 = 0")
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1400
        case True note ge0 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1401
        moreover from "1.prems" have n2: "n div 2 \<le> length kvs" by simp
53374
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 49810
diff changeset
  1402
        moreover from True n2 have "P (n div 2) kvs" by(rule IH)
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1403
        moreover from length_rbtreeify_f[OF n2] ge0 "1.prems" obtain t k v kvs' 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1404
          where kvs': "rbtreeify_f (n div 2) kvs = (t, (k, v) # kvs')"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1405
          by(cases "snd (rbtreeify_f (n div 2) kvs)")
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1406
            (auto simp add: snd_def split: prod.split_asm)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1407
        moreover from "1.prems" length_rbtreeify_f[OF n2] ge0
53374
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 49810
diff changeset
  1408
        have n2': "n div 2 \<le> Suc (length kvs')" by(simp add: kvs')
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 49810
diff changeset
  1409
        moreover from True kvs'[symmetric] refl refl n2'
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1410
        have "Q (n div 2) kvs'" by(rule IH)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1411
        moreover note feven[unfolded feven_def]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1412
          (* FIXME: why does by(rule feven[unfolded feven_def]) not work? *)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1413
        ultimately have "P (2 * (n div 2)) kvs" by -
64243
aee949f6642d eliminated irregular aliasses
haftmann
parents: 63680
diff changeset
  1414
        thus ?thesis using True by (metis minus_mod_eq_div_mult [symmetric] minus_nat.diff_0 mult.commute)
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1415
      next
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1416
        case False note ge0
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1417
        moreover from "1.prems" have n2: "n div 2 \<le> length kvs" by simp
53374
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 49810
diff changeset
  1418
        moreover from False n2 have "P (n div 2) kvs" by(rule IH)
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1419
        moreover from length_rbtreeify_f[OF n2] ge0 "1.prems" obtain t k v kvs' 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1420
          where kvs': "rbtreeify_f (n div 2) kvs = (t, (k, v) # kvs')"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1421
          by(cases "snd (rbtreeify_f (n div 2) kvs)")
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1422
            (auto simp add: snd_def split: prod.split_asm)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1423
        moreover from "1.prems" length_rbtreeify_f[OF n2] ge0 False
53374
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 49810
diff changeset
  1424
        have n2': "n div 2 \<le> length kvs'" by(simp add: kvs') arith
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 49810
diff changeset
  1425
        moreover from False kvs'[symmetric] refl refl n2' have "P (n div 2) kvs'" by(rule IH)
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1426
        moreover note fodd[unfolded fodd_def]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1427
        ultimately have "P (Suc (2 * (n div 2))) kvs" by -
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1428
        thus ?thesis using False 
64246
15d1ee6e847b eliminated irregular aliasses
haftmann
parents: 64243
diff changeset
  1429
          by simp (metis One_nat_def Suc_eq_plus1_left le_add_diff_inverse mod_less_eq_dividend minus_mod_eq_mult_div [symmetric])
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1430
      qed
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1431
    qed
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1432
  next
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1433
    case (2 n kvs)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1434
    show ?case
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1435
    proof(cases "n \<le> 1")
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1436
      case True thus ?thesis using "2.prems"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1437
        by(cases n kvs rule: nat.exhaust[case_product list.exhaust])
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1438
          (auto simp add: g0[unfolded g0_def] g1[unfolded g1_def])
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1439
    next
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1440
      case False 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1441
      hence ns: "\<not> (n = 0 \<or> n = 1)" by simp
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1442
      hence ge0: "n div 2 > 0" by simp
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1443
      note IH = "2.IH"[OF ns]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1444
      show ?thesis
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1445
      proof(cases "n mod 2 = 0")
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1446
        case True note ge0
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1447
        moreover from "2.prems" have n2: "n div 2 \<le> Suc (length kvs)" by simp
53374
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 49810
diff changeset
  1448
        moreover from True n2 have "Q (n div 2) kvs" by(rule IH)
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1449
        moreover from length_rbtreeify_g[OF ge0 n2] ge0 "2.prems" obtain t k v kvs' 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1450
          where kvs': "rbtreeify_g (n div 2) kvs = (t, (k, v) # kvs')"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1451
          by(cases "snd (rbtreeify_g (n div 2) kvs)")
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1452
            (auto simp add: snd_def split: prod.split_asm)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1453
        moreover from "2.prems" length_rbtreeify_g[OF ge0 n2] ge0
53374
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 49810
diff changeset
  1454
        have n2': "n div 2 \<le> Suc (length kvs')" by(simp add: kvs')
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 49810
diff changeset
  1455
        moreover from True kvs'[symmetric] refl refl  n2'
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1456
        have "Q (n div 2) kvs'" by(rule IH)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1457
        moreover note geven[unfolded geven_def]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1458
        ultimately have "Q (2 * (n div 2)) kvs" by -
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1459
        thus ?thesis using True 
64243
aee949f6642d eliminated irregular aliasses
haftmann
parents: 63680
diff changeset
  1460
          by(metis minus_mod_eq_div_mult [symmetric] minus_nat.diff_0 mult.commute)
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1461
      next
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1462
        case False note ge0
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1463
        moreover from "2.prems" have n2: "n div 2 \<le> length kvs" by simp
53374
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 49810
diff changeset
  1464
        moreover from False n2 have "P (n div 2) kvs" by(rule IH)
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1465
        moreover from length_rbtreeify_f[OF n2] ge0 "2.prems" False obtain t k v kvs' 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1466
          where kvs': "rbtreeify_f (n div 2) kvs = (t, (k, v) # kvs')"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1467
          by(cases "snd (rbtreeify_f (n div 2) kvs)")
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1468
            (auto simp add: snd_def split: prod.split_asm, arith)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1469
        moreover from "2.prems" length_rbtreeify_f[OF n2] ge0 False
53374
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 49810
diff changeset
  1470
        have n2': "n div 2 \<le> Suc (length kvs')" by(simp add: kvs') arith
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 49810
diff changeset
  1471
        moreover from False kvs'[symmetric] refl refl n2'
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1472
        have "Q (n div 2) kvs'" by(rule IH)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1473
        moreover note godd[unfolded godd_def]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1474
        ultimately have "Q (Suc (2 * (n div 2))) kvs" by -
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1475
        thus ?thesis using False 
64246
15d1ee6e847b eliminated irregular aliasses
haftmann
parents: 64243
diff changeset
  1476
          by simp (metis One_nat_def Suc_eq_plus1_left le_add_diff_inverse mod_less_eq_dividend minus_mod_eq_mult_div [symmetric])
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1477
      qed
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1478
    qed
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1479
  qed
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1480
qed
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1481
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1482
lemma inv1_rbtreeify_f: "n \<le> length kvs 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1483
  \<Longrightarrow> inv1 (fst (rbtreeify_f n kvs))"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1484
  and inv1_rbtreeify_g: "n \<le> Suc (length kvs)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1485
  \<Longrightarrow> inv1 (fst (rbtreeify_g n kvs))"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1486
by(induct n kvs and n kvs rule: rbtreeify_induct) simp_all
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1487
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1488
fun plog2 :: "nat \<Rightarrow> nat" 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1489
where "plog2 n = (if n \<le> 1 then 0 else plog2 (n div 2) + 1)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1490
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1491
declare plog2.simps [simp del]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1492
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1493
lemma plog2_simps [simp]:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1494
  "plog2 0 = 0" "plog2 (Suc 0) = 0"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1495
  "0 < n \<Longrightarrow> plog2 (2 * n) = 1 + plog2 n"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1496
  "0 < n \<Longrightarrow> plog2 (Suc (2 * n)) = 1 + plog2 n"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1497
by(subst plog2.simps, simp add: Suc_double_half)+
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1498
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1499
lemma bheight_rbtreeify_f: "n \<le> length kvs
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1500
  \<Longrightarrow> bheight (fst (rbtreeify_f n kvs)) = plog2 n"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1501
  and bheight_rbtreeify_g: "n \<le> Suc (length kvs)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1502
  \<Longrightarrow> bheight (fst (rbtreeify_g n kvs)) = plog2 n"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1503
by(induct n kvs and n kvs rule: rbtreeify_induct) simp_all
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1504
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1505
lemma bheight_rbtreeify_f_eq_plog2I:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1506
  "\<lbrakk> rbtreeify_f n kvs = (t, kvs'); n \<le> length kvs \<rbrakk> 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1507
  \<Longrightarrow> bheight t = plog2 n"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1508
using bheight_rbtreeify_f[of n kvs] by simp
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1509
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1510
lemma bheight_rbtreeify_g_eq_plog2I: 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1511
  "\<lbrakk> rbtreeify_g n kvs = (t, kvs'); n \<le> Suc (length kvs) \<rbrakk>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1512
  \<Longrightarrow> bheight t = plog2 n"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1513
using bheight_rbtreeify_g[of n kvs] by simp
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1514
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1515
hide_const (open) plog2
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1516
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1517
lemma inv2_rbtreeify_f: "n \<le> length kvs
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1518
  \<Longrightarrow> inv2 (fst (rbtreeify_f n kvs))"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1519
  and inv2_rbtreeify_g: "n \<le> Suc (length kvs)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1520
  \<Longrightarrow> inv2 (fst (rbtreeify_g n kvs))"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1521
by(induct n kvs and n kvs rule: rbtreeify_induct)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1522
  (auto simp add: bheight_rbtreeify_f bheight_rbtreeify_g 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1523
        intro: bheight_rbtreeify_f_eq_plog2I bheight_rbtreeify_g_eq_plog2I)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1524
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1525
lemma "n \<le> length kvs \<Longrightarrow> True"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1526
  and color_of_rbtreeify_g:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1527
  "\<lbrakk> n \<le> Suc (length kvs); 0 < n \<rbrakk> 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1528
  \<Longrightarrow> color_of (fst (rbtreeify_g n kvs)) = B"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1529
by(induct n kvs and n kvs rule: rbtreeify_induct) simp_all
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1530
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1531
lemma entries_rbtreeify_f_append:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1532
  "n \<le> length kvs 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1533
  \<Longrightarrow> entries (fst (rbtreeify_f n kvs)) @ snd (rbtreeify_f n kvs) = kvs"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1534
  and entries_rbtreeify_g_append: 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1535
  "n \<le> Suc (length kvs) 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1536
  \<Longrightarrow> entries (fst (rbtreeify_g n kvs)) @ snd (rbtreeify_g n kvs) = kvs"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1537
by(induction rule: rbtreeify_induct) simp_all
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1538
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1539
lemma length_entries_rbtreeify_f:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1540
  "n \<le> length kvs \<Longrightarrow> length (entries (fst (rbtreeify_f n kvs))) = n"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1541
  and length_entries_rbtreeify_g: 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1542
  "n \<le> Suc (length kvs) \<Longrightarrow> length (entries (fst (rbtreeify_g n kvs))) = n - 1"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1543
by(induct rule: rbtreeify_induct) simp_all
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1544
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1545
lemma rbtreeify_f_conv_drop: 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1546
  "n \<le> length kvs \<Longrightarrow> snd (rbtreeify_f n kvs) = drop n kvs"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1547
using entries_rbtreeify_f_append[of n kvs]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1548
by(simp add: append_eq_conv_conj length_entries_rbtreeify_f)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1549
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1550
lemma rbtreeify_g_conv_drop: 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1551
  "n \<le> Suc (length kvs) \<Longrightarrow> snd (rbtreeify_g n kvs) = drop (n - 1) kvs"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1552
using entries_rbtreeify_g_append[of n kvs]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1553
by(simp add: append_eq_conv_conj length_entries_rbtreeify_g)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1554
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1555
lemma entries_rbtreeify_f [simp]:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1556
  "n \<le> length kvs \<Longrightarrow> entries (fst (rbtreeify_f n kvs)) = take n kvs"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1557
using entries_rbtreeify_f_append[of n kvs]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1558
by(simp add: append_eq_conv_conj length_entries_rbtreeify_f)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1559
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1560
lemma entries_rbtreeify_g [simp]:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1561
  "n \<le> Suc (length kvs) \<Longrightarrow> 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1562
  entries (fst (rbtreeify_g n kvs)) = take (n - 1) kvs"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1563
using entries_rbtreeify_g_append[of n kvs]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1564
by(simp add: append_eq_conv_conj length_entries_rbtreeify_g)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1565
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1566
lemma keys_rbtreeify_f [simp]: "n \<le> length kvs
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1567
  \<Longrightarrow> keys (fst (rbtreeify_f n kvs)) = take n (map fst kvs)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1568
by(simp add: keys_def take_map)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1569
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1570
lemma keys_rbtreeify_g [simp]: "n \<le> Suc (length kvs)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1571
  \<Longrightarrow> keys (fst (rbtreeify_g n kvs)) = take (n - 1) (map fst kvs)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1572
by(simp add: keys_def take_map)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1573
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1574
lemma rbtreeify_fD: 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1575
  "\<lbrakk> rbtreeify_f n kvs = (t, kvs'); n \<le> length kvs \<rbrakk> 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1576
  \<Longrightarrow> entries t = take n kvs \<and> kvs' = drop n kvs"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1577
using rbtreeify_f_conv_drop[of n kvs] entries_rbtreeify_f[of n kvs] by simp
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1578
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1579
lemma rbtreeify_gD: 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1580
  "\<lbrakk> rbtreeify_g n kvs = (t, kvs'); n \<le> Suc (length kvs) \<rbrakk>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1581
  \<Longrightarrow> entries t = take (n - 1) kvs \<and> kvs' = drop (n - 1) kvs"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1582
using rbtreeify_g_conv_drop[of n kvs] entries_rbtreeify_g[of n kvs] by simp
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1583
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1584
lemma entries_rbtreeify [simp]: "entries (rbtreeify kvs) = kvs"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1585
by(simp add: rbtreeify_def entries_rbtreeify_g)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1586
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1587
context linorder begin
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1588
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1589
lemma rbt_sorted_rbtreeify_f: 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1590
  "\<lbrakk> n \<le> length kvs; sorted (map fst kvs); distinct (map fst kvs) \<rbrakk> 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1591
  \<Longrightarrow> rbt_sorted (fst (rbtreeify_f n kvs))"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1592
  and rbt_sorted_rbtreeify_g: 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1593
  "\<lbrakk> n \<le> Suc (length kvs); sorted (map fst kvs); distinct (map fst kvs) \<rbrakk>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1594
  \<Longrightarrow> rbt_sorted (fst (rbtreeify_g n kvs))"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1595
proof(induction n kvs and n kvs rule: rbtreeify_induct)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1596
  case (f_even n kvs t k v kvs')
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1597
  from rbtreeify_fD[OF \<open>rbtreeify_f n kvs = (t, (k, v) # kvs')\<close> \<open>n \<le> length kvs\<close>]
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1598
  have "entries t = take n kvs"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1599
    and kvs': "drop n kvs = (k, v) # kvs'" by simp_all
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1600
  hence unfold: "kvs = take n kvs @ (k, v) # kvs'" by(metis append_take_drop_id)
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1601
  from \<open>sorted (map fst kvs)\<close> kvs'
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1602
  have "(\<forall>(x, y) \<in> set (take n kvs). x \<le> k) \<and> (\<forall>(x, y) \<in> set kvs'. k \<le> x)"
68109
cebf36c14226 new def of sorted and sorted_wrt
nipkow
parents: 67408
diff changeset
  1603
    by(subst (asm) unfold)(auto simp add: sorted_append)
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1604
  moreover from \<open>distinct (map fst kvs)\<close> kvs'
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1605
  have "(\<forall>(x, y) \<in> set (take n kvs). x \<noteq> k) \<and> (\<forall>(x, y) \<in> set kvs'. x \<noteq> k)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1606
    by(subst (asm) unfold)(auto intro: rev_image_eqI)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1607
  ultimately have "(\<forall>(x, y) \<in> set (take n kvs). x < k) \<and> (\<forall>(x, y) \<in> set kvs'. k < x)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1608
    by fastforce
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1609
  hence "fst (rbtreeify_f n kvs) |\<guillemotleft> k" "k \<guillemotleft>| fst (rbtreeify_g n kvs')"
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1610
    using \<open>n \<le> Suc (length kvs')\<close> \<open>n \<le> length kvs\<close> set_take_subset[of "n - 1" kvs']
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1611
    by(auto simp add: ord.rbt_greater_prop ord.rbt_less_prop take_map split_def)
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1612
  moreover from \<open>sorted (map fst kvs)\<close> \<open>distinct (map fst kvs)\<close>
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1613
  have "rbt_sorted (fst (rbtreeify_f n kvs))" by(rule f_even.IH)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1614
  moreover have "sorted (map fst kvs')" "distinct (map fst kvs')"
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1615
    using \<open>sorted (map fst kvs)\<close> \<open>distinct (map fst kvs)\<close>
68109
cebf36c14226 new def of sorted and sorted_wrt
nipkow
parents: 67408
diff changeset
  1616
    by(subst (asm) (1 2) unfold, simp add: sorted_append)+
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1617
  hence "rbt_sorted (fst (rbtreeify_g n kvs'))" by(rule f_even.IH)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1618
  ultimately show ?case
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1619
    using \<open>0 < n\<close> \<open>rbtreeify_f n kvs = (t, (k, v) # kvs')\<close> by simp
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1620
next
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1621
  case (f_odd n kvs t k v kvs')
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1622
  from rbtreeify_fD[OF \<open>rbtreeify_f n kvs = (t, (k, v) # kvs')\<close> \<open>n \<le> length kvs\<close>]
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1623
  have "entries t = take n kvs" 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1624
    and kvs': "drop n kvs = (k, v) # kvs'" by simp_all
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1625
  hence unfold: "kvs = take n kvs @ (k, v) # kvs'" by(metis append_take_drop_id)
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1626
  from \<open>sorted (map fst kvs)\<close> kvs'
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1627
  have "(\<forall>(x, y) \<in> set (take n kvs). x \<le> k) \<and> (\<forall>(x, y) \<in> set kvs'. k \<le> x)"
68109
cebf36c14226 new def of sorted and sorted_wrt
nipkow
parents: 67408
diff changeset
  1628
    by(subst (asm) unfold)(auto simp add: sorted_append)
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1629
  moreover from \<open>distinct (map fst kvs)\<close> kvs'
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1630
  have "(\<forall>(x, y) \<in> set (take n kvs). x \<noteq> k) \<and> (\<forall>(x, y) \<in> set kvs'. x \<noteq> k)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1631
    by(subst (asm) unfold)(auto intro: rev_image_eqI)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1632
  ultimately have "(\<forall>(x, y) \<in> set (take n kvs). x < k) \<and> (\<forall>(x, y) \<in> set kvs'. k < x)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1633
    by fastforce
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1634
  hence "fst (rbtreeify_f n kvs) |\<guillemotleft> k" "k \<guillemotleft>| fst (rbtreeify_f n kvs')"
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1635
    using \<open>n \<le> length kvs'\<close> \<open>n \<le> length kvs\<close> set_take_subset[of n kvs']
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1636
    by(auto simp add: rbt_greater_prop rbt_less_prop take_map split_def)
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1637
  moreover from \<open>sorted (map fst kvs)\<close> \<open>distinct (map fst kvs)\<close>
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1638
  have "rbt_sorted (fst (rbtreeify_f n kvs))" by(rule f_odd.IH)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1639
  moreover have "sorted (map fst kvs')" "distinct (map fst kvs')"
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1640
    using \<open>sorted (map fst kvs)\<close> \<open>distinct (map fst kvs)\<close>
68109
cebf36c14226 new def of sorted and sorted_wrt
nipkow
parents: 67408
diff changeset
  1641
    by(subst (asm) (1 2) unfold, simp add: sorted_append)+
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1642
  hence "rbt_sorted (fst (rbtreeify_f n kvs'))" by(rule f_odd.IH)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1643
  ultimately show ?case 
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1644
    using \<open>0 < n\<close> \<open>rbtreeify_f n kvs = (t, (k, v) # kvs')\<close> by simp
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1645
next
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1646
  case (g_even n kvs t k v kvs')
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1647
  from rbtreeify_gD[OF \<open>rbtreeify_g n kvs = (t, (k, v) # kvs')\<close> \<open>n \<le> Suc (length kvs)\<close>]
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1648
  have t: "entries t = take (n - 1) kvs" 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1649
    and kvs': "drop (n - 1) kvs = (k, v) # kvs'" by simp_all
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1650
  hence unfold: "kvs = take (n - 1) kvs @ (k, v) # kvs'" by(metis append_take_drop_id)
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1651
  from \<open>sorted (map fst kvs)\<close> kvs'
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1652
  have "(\<forall>(x, y) \<in> set (take (n - 1) kvs). x \<le> k) \<and> (\<forall>(x, y) \<in> set kvs'. k \<le> x)"
68109
cebf36c14226 new def of sorted and sorted_wrt
nipkow
parents: 67408
diff changeset
  1653
    by(subst (asm) unfold)(auto simp add: sorted_append)
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1654
  moreover from \<open>distinct (map fst kvs)\<close> kvs'
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1655
  have "(\<forall>(x, y) \<in> set (take (n - 1) kvs). x \<noteq> k) \<and> (\<forall>(x, y) \<in> set kvs'. x \<noteq> k)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1656
    by(subst (asm) unfold)(auto intro: rev_image_eqI)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1657
  ultimately have "(\<forall>(x, y) \<in> set (take (n - 1) kvs). x < k) \<and> (\<forall>(x, y) \<in> set kvs'. k < x)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1658
    by fastforce
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1659
  hence "fst (rbtreeify_g n kvs) |\<guillemotleft> k" "k \<guillemotleft>| fst (rbtreeify_g n kvs')"
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1660
    using \<open>n \<le> Suc (length kvs')\<close> \<open>n \<le> Suc (length kvs)\<close> set_take_subset[of "n - 1" kvs']
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1661
    by(auto simp add: rbt_greater_prop rbt_less_prop take_map split_def)
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1662
  moreover from \<open>sorted (map fst kvs)\<close> \<open>distinct (map fst kvs)\<close>
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1663
  have "rbt_sorted (fst (rbtreeify_g n kvs))" by(rule g_even.IH)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1664
  moreover have "sorted (map fst kvs')" "distinct (map fst kvs')"
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1665
    using \<open>sorted (map fst kvs)\<close> \<open>distinct (map fst kvs)\<close>
68109
cebf36c14226 new def of sorted and sorted_wrt
nipkow
parents: 67408
diff changeset
  1666
    by(subst (asm) (1 2) unfold, simp add: sorted_append)+
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1667
  hence "rbt_sorted (fst (rbtreeify_g n kvs'))" by(rule g_even.IH)
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1668
  ultimately show ?case using \<open>0 < n\<close> \<open>rbtreeify_g n kvs = (t, (k, v) # kvs')\<close> by simp
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1669
next
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1670
  case (g_odd n kvs t k v kvs')
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1671
  from rbtreeify_fD[OF \<open>rbtreeify_f n kvs = (t, (k, v) # kvs')\<close> \<open>n \<le> length kvs\<close>]
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1672
  have "entries t = take n kvs"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1673
    and kvs': "drop n kvs = (k, v) # kvs'" by simp_all
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1674
  hence unfold: "kvs = take n kvs @ (k, v) # kvs'" by(metis append_take_drop_id)
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1675
  from \<open>sorted (map fst kvs)\<close> kvs'
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1676
  have "(\<forall>(x, y) \<in> set (take n kvs). x \<le> k) \<and> (\<forall>(x, y) \<in> set kvs'. k \<le> x)"
68109
cebf36c14226 new def of sorted and sorted_wrt
nipkow
parents: 67408
diff changeset
  1677
    by(subst (asm) unfold)(auto simp add: sorted_append)
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1678
  moreover from \<open>distinct (map fst kvs)\<close> kvs'
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1679
  have "(\<forall>(x, y) \<in> set (take n kvs). x \<noteq> k) \<and> (\<forall>(x, y) \<in> set kvs'. x \<noteq> k)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1680
    by(subst (asm) unfold)(auto intro: rev_image_eqI)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1681
  ultimately have "(\<forall>(x, y) \<in> set (take n kvs). x < k) \<and> (\<forall>(x, y) \<in> set kvs'. k < x)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1682
    by fastforce
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1683
  hence "fst (rbtreeify_f n kvs) |\<guillemotleft> k" "k \<guillemotleft>| fst (rbtreeify_g n kvs')"
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1684
    using \<open>n \<le> Suc (length kvs')\<close> \<open>n \<le> length kvs\<close> set_take_subset[of "n - 1" kvs']
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1685
    by(auto simp add: rbt_greater_prop rbt_less_prop take_map split_def)
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1686
  moreover from \<open>sorted (map fst kvs)\<close> \<open>distinct (map fst kvs)\<close>
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1687
  have "rbt_sorted (fst (rbtreeify_f n kvs))" by(rule g_odd.IH)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1688
  moreover have "sorted (map fst kvs')" "distinct (map fst kvs')"
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1689
    using \<open>sorted (map fst kvs)\<close> \<open>distinct (map fst kvs)\<close>
68109
cebf36c14226 new def of sorted and sorted_wrt
nipkow
parents: 67408
diff changeset
  1690
    by(subst (asm) (1 2) unfold, simp add: sorted_append)+
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1691
  hence "rbt_sorted (fst (rbtreeify_g n kvs'))" by(rule g_odd.IH)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1692
  ultimately show ?case
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1693
    using \<open>0 < n\<close> \<open>rbtreeify_f n kvs = (t, (k, v) # kvs')\<close> by simp
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1694
qed simp_all
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1695
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1696
lemma rbt_sorted_rbtreeify: 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1697
  "\<lbrakk> sorted (map fst kvs); distinct (map fst kvs) \<rbrakk> \<Longrightarrow> rbt_sorted (rbtreeify kvs)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1698
by(simp add: rbtreeify_def rbt_sorted_rbtreeify_g)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1699
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1700
lemma is_rbt_rbtreeify: 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1701
  "\<lbrakk> sorted (map fst kvs); distinct (map fst kvs) \<rbrakk>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1702
  \<Longrightarrow> is_rbt (rbtreeify kvs)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1703
by(simp add: is_rbt_def rbtreeify_def inv1_rbtreeify_g inv2_rbtreeify_g rbt_sorted_rbtreeify_g color_of_rbtreeify_g)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1704
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1705
lemma rbt_lookup_rbtreeify:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1706
  "\<lbrakk> sorted (map fst kvs); distinct (map fst kvs) \<rbrakk> \<Longrightarrow> 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1707
  rbt_lookup (rbtreeify kvs) = map_of kvs"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1708
by(simp add: map_of_entries[symmetric] rbt_sorted_rbtreeify)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1709
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1710
end
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1711
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1712
text \<open>
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1713
  Functions to compare the height of two rbt trees, taken from 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1714
  Andrew W. Appel, Efficient Verified Red-Black Trees (September 2011)
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1715
\<close>
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1716
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1717
fun skip_red :: "('a, 'b) rbt \<Rightarrow> ('a, 'b) rbt"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1718
where
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1719
  "skip_red (Branch color.R l k v r) = l"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1720
| "skip_red t = t"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1721
49807
9a0843995fd3 correct definition for skip_black
Andreas Lochbihler
parents: 49770
diff changeset
  1722
definition skip_black :: "('a, 'b) rbt \<Rightarrow> ('a, 'b) rbt"
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1723
where
49807
9a0843995fd3 correct definition for skip_black
Andreas Lochbihler
parents: 49770
diff changeset
  1724
  "skip_black t = (let t' = skip_red t in case t' of Branch color.B l k v r \<Rightarrow> l | _ \<Rightarrow> t')"
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1725
58310
91ea607a34d8 updated news
blanchet
parents: 58257
diff changeset
  1726
datatype compare = LT | GT | EQ
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1727
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1728
partial_function (tailrec) compare_height :: "('a, 'b) rbt \<Rightarrow> ('a, 'b) rbt \<Rightarrow> ('a, 'b) rbt \<Rightarrow> ('a, 'b) rbt \<Rightarrow> compare"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1729
where
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1730
  "compare_height sx s t tx =
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1731
  (case (skip_red sx, skip_red s, skip_red t, skip_red tx) of
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1732
     (Branch _ sx' _ _ _, Branch _ s' _ _ _, Branch _ t' _ _ _, Branch _ tx' _ _ _) \<Rightarrow> 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1733
       compare_height (skip_black sx') s' t' (skip_black tx')
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1734
   | (_, rbt.Empty, _, Branch _ _ _ _ _) \<Rightarrow> LT
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1735
   | (Branch _ _ _ _ _, _, rbt.Empty, _) \<Rightarrow> GT
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1736
   | (Branch _ sx' _ _ _, Branch _ s' _ _ _, Branch _ t' _ _ _, rbt.Empty) \<Rightarrow>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1737
       compare_height (skip_black sx') s' t' rbt.Empty
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1738
   | (rbt.Empty, Branch _ s' _ _ _, Branch _ t' _ _ _, Branch _ tx' _ _ _) \<Rightarrow>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1739
       compare_height rbt.Empty s' t' (skip_black tx')
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1740
   | _ \<Rightarrow> EQ)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1741
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1742
declare compare_height.simps [code]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1743
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1744
hide_type (open) compare
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1745
hide_const (open)
55417
01fbfb60c33e adapted to 'xxx_{case,rec}' renaming, to new theorem names, and to new variable names in theorems
blanchet
parents: 55414
diff changeset
  1746
  compare_height skip_black skip_red LT GT EQ case_compare rec_compare
58257
0662f35534fe half-ported Imperative HOL to new datatypes
blanchet
parents: 58249
diff changeset
  1747
  Abs_compare Rep_compare
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1748
hide_fact (open)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1749
  Abs_compare_cases Abs_compare_induct Abs_compare_inject Abs_compare_inverse
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1750
  Rep_compare Rep_compare_cases Rep_compare_induct Rep_compare_inject Rep_compare_inverse
55642
63beb38e9258 adapted to renaming of datatype 'cases' and 'recs' to 'case' and 'rec'
blanchet
parents: 55466
diff changeset
  1751
  compare.simps compare.exhaust compare.induct compare.rec compare.simps
57983
6edc3529bb4e reordered some (co)datatype property names for more consistency
blanchet
parents: 57512
diff changeset
  1752
  compare.size compare.case_cong compare.case_cong_weak compare.case
62093
bd73a2279fcd more uniform treatment of package internals;
wenzelm
parents: 61585
diff changeset
  1753
  compare.nchotomy compare.split compare.split_asm compare.eq.refl compare.eq.simps
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1754
  equal_compare_def
61121
efe8b18306b7 do not expose low-level "_def" facts of 'function' definitions, to avoid potential confusion with the situation of plain 'definition';
wenzelm
parents: 61076
diff changeset
  1755
  skip_red.simps skip_red.cases skip_red.induct 
49807
9a0843995fd3 correct definition for skip_black
Andreas Lochbihler
parents: 49770
diff changeset
  1756
  skip_black_def
61121
efe8b18306b7 do not expose low-level "_def" facts of 'function' definitions, to avoid potential confusion with the situation of plain 'definition';
wenzelm
parents: 61076
diff changeset
  1757
  compare_height.simps
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1758
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1759
subsection \<open>union and intersection of sorted associative lists\<close>
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1760
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1761
context ord begin
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1762
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1763
function sunion_with :: "('a \<Rightarrow> 'b \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> ('a \<times> 'b) list \<Rightarrow> ('a \<times> 'b) list \<Rightarrow> ('a \<times> 'b) list" 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1764
where
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1765
  "sunion_with f ((k, v) # as) ((k', v') # bs) =
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1766
   (if k > k' then (k', v') # sunion_with f ((k, v) # as) bs
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1767
    else if k < k' then (k, v) # sunion_with f as ((k', v') # bs)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1768
    else (k, f k v v') # sunion_with f as bs)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1769
| "sunion_with f [] bs = bs"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1770
| "sunion_with f as [] = as"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1771
by pat_completeness auto
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1772
termination by lexicographic_order
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1773
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1774
function sinter_with :: "('a \<Rightarrow> 'b \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> ('a \<times> 'b) list \<Rightarrow> ('a \<times> 'b) list \<Rightarrow> ('a \<times> 'b) list"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1775
where
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1776
  "sinter_with f ((k, v) # as) ((k', v') # bs) =
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1777
  (if k > k' then sinter_with f ((k, v) # as) bs
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1778
   else if k < k' then sinter_with f as ((k', v') # bs)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1779
   else (k, f k v v') # sinter_with f as bs)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1780
| "sinter_with f [] _ = []"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1781
| "sinter_with f _ [] = []"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1782
by pat_completeness auto
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1783
termination by lexicographic_order
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1784
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1785
end
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1786
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1787
declare ord.sunion_with.simps [code] ord.sinter_with.simps[code]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1788
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1789
context linorder begin
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1790
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1791
lemma set_fst_sunion_with: 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1792
  "set (map fst (sunion_with f xs ys)) = set (map fst xs) \<union> set (map fst ys)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1793
by(induct f xs ys rule: sunion_with.induct) auto
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1794
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1795
lemma sorted_sunion_with [simp]:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1796
  "\<lbrakk> sorted (map fst xs); sorted (map fst ys) \<rbrakk> 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1797
  \<Longrightarrow> sorted (map fst (sunion_with f xs ys))"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1798
by(induct f xs ys rule: sunion_with.induct)
68109
cebf36c14226 new def of sorted and sorted_wrt
nipkow
parents: 67408
diff changeset
  1799
  (auto simp add: set_fst_sunion_with simp del: set_map)
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1800
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1801
lemma distinct_sunion_with [simp]:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1802
  "\<lbrakk> distinct (map fst xs); distinct (map fst ys); sorted (map fst xs); sorted (map fst ys) \<rbrakk>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1803
  \<Longrightarrow> distinct (map fst (sunion_with f xs ys))"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1804
proof(induct f xs ys rule: sunion_with.induct)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1805
  case (1 f k v xs k' v' ys)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1806
  have "\<lbrakk> \<not> k < k'; \<not> k' < k \<rbrakk> \<Longrightarrow> k = k'" by simp
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1807
  thus ?case using "1"
68109
cebf36c14226 new def of sorted and sorted_wrt
nipkow
parents: 67408
diff changeset
  1808
    by(auto simp add: set_fst_sunion_with simp del: set_map)
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1809
qed simp_all
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1810
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1811
lemma map_of_sunion_with: 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1812
  "\<lbrakk> sorted (map fst xs); sorted (map fst ys) \<rbrakk>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1813
  \<Longrightarrow> map_of (sunion_with f xs ys) k = 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1814
  (case map_of xs k of None \<Rightarrow> map_of ys k 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1815
  | Some v \<Rightarrow> case map_of ys k of None \<Rightarrow> Some v 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1816
              | Some w \<Rightarrow> Some (f k v w))"
68109
cebf36c14226 new def of sorted and sorted_wrt
nipkow
parents: 67408
diff changeset
  1817
by(induct f xs ys rule: sunion_with.induct)(auto split: option.split dest: map_of_SomeD bspec)
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1818
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1819
lemma set_fst_sinter_with [simp]:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1820
  "\<lbrakk> sorted (map fst xs); sorted (map fst ys) \<rbrakk>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1821
  \<Longrightarrow> set (map fst (sinter_with f xs ys)) = set (map fst xs) \<inter> set (map fst ys)"
68109
cebf36c14226 new def of sorted and sorted_wrt
nipkow
parents: 67408
diff changeset
  1822
by(induct f xs ys rule: sinter_with.induct)(auto simp del: set_map)
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1823
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1824
lemma set_fst_sinter_with_subset1:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1825
  "set (map fst (sinter_with f xs ys)) \<subseteq> set (map fst xs)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1826
by(induct f xs ys rule: sinter_with.induct) auto
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1827
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1828
lemma set_fst_sinter_with_subset2:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1829
  "set (map fst (sinter_with f xs ys)) \<subseteq> set (map fst ys)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1830
by(induct f xs ys rule: sinter_with.induct)(auto simp del: set_map)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1831
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1832
lemma sorted_sinter_with [simp]:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1833
  "\<lbrakk> sorted (map fst xs); sorted (map fst ys) \<rbrakk>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1834
  \<Longrightarrow> sorted (map fst (sinter_with f xs ys))"
68109
cebf36c14226 new def of sorted and sorted_wrt
nipkow
parents: 67408
diff changeset
  1835
by(induct f xs ys rule: sinter_with.induct)(auto simp del: set_map)
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1836
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1837
lemma distinct_sinter_with [simp]:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1838
  "\<lbrakk> distinct (map fst xs); distinct (map fst ys) \<rbrakk>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1839
  \<Longrightarrow> distinct (map fst (sinter_with f xs ys))"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1840
proof(induct f xs ys rule: sinter_with.induct)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1841
  case (1 f k v as k' v' bs)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1842
  have "\<lbrakk> \<not> k < k'; \<not> k' < k \<rbrakk> \<Longrightarrow> k = k'" by simp
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1843
  thus ?case using "1" set_fst_sinter_with_subset1[of f as bs]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1844
    set_fst_sinter_with_subset2[of f as bs]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1845
    by(auto simp del: set_map)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1846
qed simp_all
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1847
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1848
lemma map_of_sinter_with:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1849
  "\<lbrakk> sorted (map fst xs); sorted (map fst ys) \<rbrakk>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1850
  \<Longrightarrow> map_of (sinter_with f xs ys) k = 
55466
786edc984c98 merged 'Option.map' and 'Option.map_option'
blanchet
parents: 55417
diff changeset
  1851
  (case map_of xs k of None \<Rightarrow> None | Some v \<Rightarrow> map_option (f k v) (map_of ys k))"
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1852
apply(induct f xs ys rule: sinter_with.induct)
68109
cebf36c14226 new def of sorted and sorted_wrt
nipkow
parents: 67408
diff changeset
  1853
apply(auto simp add: map_option_case split: option.splits dest: map_of_SomeD bspec)
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1854
done
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1855
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1856
end
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1857
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1858
lemma distinct_map_of_rev: "distinct (map fst xs) \<Longrightarrow> map_of (rev xs) = map_of xs"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1859
by(induct xs)(auto 4 3 simp add: map_add_def intro!: ext split: option.split intro: rev_image_eqI)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1860
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1861
lemma map_map_filter: 
55466
786edc984c98 merged 'Option.map' and 'Option.map_option'
blanchet
parents: 55417
diff changeset
  1862
  "map f (List.map_filter g xs) = List.map_filter (map_option f \<circ> g) xs"
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1863
by(auto simp add: List.map_filter_def)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1864
55466
786edc984c98 merged 'Option.map' and 'Option.map_option'
blanchet
parents: 55417
diff changeset
  1865
lemma map_filter_map_option_const: 
786edc984c98 merged 'Option.map' and 'Option.map_option'
blanchet
parents: 55417
diff changeset
  1866
  "List.map_filter (\<lambda>x. map_option (\<lambda>y. f x) (g (f x))) xs = filter (\<lambda>x. g x \<noteq> None) (map f xs)"
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1867
by(auto simp add: map_filter_def filter_map o_def)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1868
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1869
lemma set_map_filter: "set (List.map_filter P xs) = the ` (P ` set xs - {None})"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1870
by(auto simp add: List.map_filter_def intro: rev_image_eqI)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1871
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1872
context ord begin
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1873
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1874
definition rbt_union_with_key :: "('a \<Rightarrow> 'b \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> ('a, 'b) rbt \<Rightarrow> ('a, 'b) rbt \<Rightarrow> ('a, 'b) rbt"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1875
where
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1876
  "rbt_union_with_key f t1 t2 =
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1877
  (case RBT_Impl.compare_height t1 t1 t2 t2
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1878
   of compare.EQ \<Rightarrow> rbtreeify (sunion_with f (entries t1) (entries t2))
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1879
    | compare.LT \<Rightarrow> fold (rbt_insert_with_key (\<lambda>k v w. f k w v)) t1 t2
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1880
    | compare.GT \<Rightarrow> fold (rbt_insert_with_key f) t2 t1)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1881
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1882
definition rbt_union_with where
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1883
  "rbt_union_with f = rbt_union_with_key (\<lambda>_. f)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1884
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1885
definition rbt_union where
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1886
  "rbt_union = rbt_union_with_key (%_ _ rv. rv)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1887
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1888
definition rbt_inter_with_key :: "('a \<Rightarrow> 'b \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> ('a, 'b) rbt \<Rightarrow> ('a, 'b) rbt \<Rightarrow> ('a, 'b) rbt"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1889
where
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1890
  "rbt_inter_with_key f t1 t2 =
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1891
  (case RBT_Impl.compare_height t1 t1 t2 t2 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1892
   of compare.EQ \<Rightarrow> rbtreeify (sinter_with f (entries t1) (entries t2))
55466
786edc984c98 merged 'Option.map' and 'Option.map_option'
blanchet
parents: 55417
diff changeset
  1893
    | compare.LT \<Rightarrow> rbtreeify (List.map_filter (\<lambda>(k, v). map_option (\<lambda>w. (k, f k v w)) (rbt_lookup t2 k)) (entries t1))
786edc984c98 merged 'Option.map' and 'Option.map_option'
blanchet
parents: 55417
diff changeset
  1894
    | compare.GT \<Rightarrow> rbtreeify (List.map_filter (\<lambda>(k, v). map_option (\<lambda>w. (k, f k w v)) (rbt_lookup t1 k)) (entries t2)))"
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1895
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1896
definition rbt_inter_with where
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1897
  "rbt_inter_with f = rbt_inter_with_key (\<lambda>_. f)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1898
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1899
definition rbt_inter where
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1900
  "rbt_inter = rbt_inter_with_key (\<lambda>_ _ rv. rv)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1901
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1902
end
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1903
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1904
context linorder begin
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1905
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1906
lemma rbt_sorted_entries_right_unique:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1907
  "\<lbrakk> (k, v) \<in> set (entries t); (k, v') \<in> set (entries t); 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1908
     rbt_sorted t \<rbrakk> \<Longrightarrow> v = v'"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1909
by(auto dest!: distinct_entries inj_onD[where x="(k, v)" and y="(k, v')"] simp add: distinct_map)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1910
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1911
lemma rbt_sorted_fold_rbt_insertwk:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1912
  "rbt_sorted t \<Longrightarrow> rbt_sorted (List.fold (\<lambda>(k, v). rbt_insert_with_key f k v) xs t)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1913
by(induct xs rule: rev_induct)(auto simp add: rbt_insertwk_rbt_sorted)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1914
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1915
lemma is_rbt_fold_rbt_insertwk:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1916
  assumes "is_rbt t1"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1917
  shows "is_rbt (fold (rbt_insert_with_key f) t2 t1)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1918
proof -
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
  1919
  define xs where "xs = entries t2"
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1920
  from assms show ?thesis unfolding fold_def xs_def[symmetric]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1921
    by(induct xs rule: rev_induct)(auto simp add: rbt_insertwk_is_rbt)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1922
qed
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1923
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1924
lemma rbt_lookup_fold_rbt_insertwk:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1925
  assumes t1: "rbt_sorted t1" and t2: "rbt_sorted t2"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1926
  shows "rbt_lookup (fold (rbt_insert_with_key f) t1 t2) k =
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1927
  (case rbt_lookup t1 k of None \<Rightarrow> rbt_lookup t2 k
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1928
   | Some v \<Rightarrow> case rbt_lookup t2 k of None \<Rightarrow> Some v
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1929
               | Some w \<Rightarrow> Some (f k w v))"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1930
proof -
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62390
diff changeset
  1931
  define xs where "xs = entries t1"
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1932
  hence dt1: "distinct (map fst xs)" using t1 by(simp add: distinct_entries)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1933
  with t2 show ?thesis
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1934
    unfolding fold_def map_of_entries[OF t1, symmetric]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1935
      xs_def[symmetric] distinct_map_of_rev[OF dt1, symmetric]
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1936
    apply(induct xs rule: rev_induct)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1937
    apply(auto simp add: rbt_lookup_rbt_insertwk rbt_sorted_fold_rbt_insertwk split: option.splits)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1938
    apply(auto simp add: distinct_map_of_rev intro: rev_image_eqI)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1939
    done
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1940
qed
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1941
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1942
lemma is_rbt_rbt_unionwk [simp]:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1943
  "\<lbrakk> is_rbt t1; is_rbt t2 \<rbrakk> \<Longrightarrow> is_rbt (rbt_union_with_key f t1 t2)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1944
by(simp add: rbt_union_with_key_def Let_def is_rbt_fold_rbt_insertwk is_rbt_rbtreeify rbt_sorted_entries distinct_entries split: compare.split)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1945
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1946
lemma rbt_lookup_rbt_unionwk:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1947
  "\<lbrakk> rbt_sorted t1; rbt_sorted t2 \<rbrakk> 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1948
  \<Longrightarrow> rbt_lookup (rbt_union_with_key f t1 t2) k = 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1949
  (case rbt_lookup t1 k of None \<Rightarrow> rbt_lookup t2 k 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1950
   | Some v \<Rightarrow> case rbt_lookup t2 k of None \<Rightarrow> Some v 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1951
              | Some w \<Rightarrow> Some (f k v w))"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1952
by(auto simp add: rbt_union_with_key_def Let_def rbt_lookup_fold_rbt_insertwk rbt_sorted_entries distinct_entries map_of_sunion_with map_of_entries rbt_lookup_rbtreeify split: option.split compare.split)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1953
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1954
lemma rbt_unionw_is_rbt: "\<lbrakk> is_rbt lt; is_rbt rt \<rbrakk> \<Longrightarrow> is_rbt (rbt_union_with f lt rt)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1955
by(simp add: rbt_union_with_def)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1956
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1957
lemma rbt_union_is_rbt: "\<lbrakk> is_rbt lt; is_rbt rt \<rbrakk> \<Longrightarrow> is_rbt (rbt_union lt rt)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1958
by(simp add: rbt_union_def)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1959
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1960
lemma rbt_lookup_rbt_union:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1961
  "\<lbrakk> rbt_sorted s; rbt_sorted t \<rbrakk> \<Longrightarrow>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1962
  rbt_lookup (rbt_union s t) = rbt_lookup s ++ rbt_lookup t"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1963
by(rule ext)(simp add: rbt_lookup_rbt_unionwk rbt_union_def map_add_def split: option.split)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1964
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1965
lemma rbt_interwk_is_rbt [simp]:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1966
  "\<lbrakk> rbt_sorted t1; rbt_sorted t2 \<rbrakk> \<Longrightarrow> is_rbt (rbt_inter_with_key f t1 t2)"
55466
786edc984c98 merged 'Option.map' and 'Option.map_option'
blanchet
parents: 55417
diff changeset
  1967
by(auto simp add: rbt_inter_with_key_def Let_def map_map_filter split_def o_def option.map_comp map_filter_map_option_const sorted_filter[where f=id, simplified] rbt_sorted_entries distinct_entries intro: is_rbt_rbtreeify split: compare.split)
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1968
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1969
lemma rbt_interw_is_rbt:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1970
  "\<lbrakk> rbt_sorted t1; rbt_sorted t2 \<rbrakk> \<Longrightarrow> is_rbt (rbt_inter_with f t1 t2)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1971
by(simp add: rbt_inter_with_def)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1972
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1973
lemma rbt_inter_is_rbt:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1974
  "\<lbrakk> rbt_sorted t1; rbt_sorted t2 \<rbrakk> \<Longrightarrow> is_rbt (rbt_inter t1 t2)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1975
by(simp add: rbt_inter_def)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1976
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1977
lemma rbt_lookup_rbt_interwk:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1978
  "\<lbrakk> rbt_sorted t1; rbt_sorted t2 \<rbrakk>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1979
  \<Longrightarrow> rbt_lookup (rbt_inter_with_key f t1 t2) k =
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1980
  (case rbt_lookup t1 k of None \<Rightarrow> None 
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1981
   | Some v \<Rightarrow> case rbt_lookup t2 k of None \<Rightarrow> None
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1982
               | Some w \<Rightarrow> Some (f k v w))"
55466
786edc984c98 merged 'Option.map' and 'Option.map_option'
blanchet
parents: 55417
diff changeset
  1983
by(auto 4 3 simp add: rbt_inter_with_key_def Let_def map_of_entries[symmetric] rbt_lookup_rbtreeify map_map_filter split_def o_def option.map_comp map_filter_map_option_const sorted_filter[where f=id, simplified] rbt_sorted_entries distinct_entries map_of_sinter_with map_of_eq_None_iff set_map_filter split: option.split compare.split intro: rev_image_eqI dest: rbt_sorted_entries_right_unique)
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1984
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1985
lemma rbt_lookup_rbt_inter:
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1986
  "\<lbrakk> rbt_sorted t1; rbt_sorted t2 \<rbrakk>
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1987
  \<Longrightarrow> rbt_lookup (rbt_inter t1 t2) = rbt_lookup t2 |` dom (rbt_lookup t1)"
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1988
by(auto simp add: rbt_inter_def rbt_lookup_rbt_interwk restrict_map_def split: option.split)
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1989
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1990
end
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1991
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  1992
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  1993
subsection \<open>Code generator setup\<close>
49480
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  1994
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1995
lemmas [code] =
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1996
  ord.rbt_less_prop
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1997
  ord.rbt_greater_prop
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1998
  ord.rbt_sorted.simps
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  1999
  ord.rbt_lookup.simps
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  2000
  ord.is_rbt_def
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  2001
  ord.rbt_ins.simps
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  2002
  ord.rbt_insert_with_key_def
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  2003
  ord.rbt_insertw_def
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  2004
  ord.rbt_insert_def
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  2005
  ord.rbt_del_from_left.simps
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  2006
  ord.rbt_del_from_right.simps
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  2007
  ord.rbt_del.simps
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  2008
  ord.rbt_delete_def
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  2009
  ord.sunion_with.simps
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  2010
  ord.sinter_with.simps
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  2011
  ord.rbt_union_with_key_def
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  2012
  ord.rbt_union_with_def
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  2013
  ord.rbt_union_def
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  2014
  ord.rbt_inter_with_key_def
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  2015
  ord.rbt_inter_with_def
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  2016
  ord.rbt_inter_def
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  2017
  ord.rbt_map_entry.simps
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  2018
  ord.rbt_bulkload_def
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  2019
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 68450
diff changeset
  2020
text \<open>More efficient implementations for \<^term>\<open>entries\<close> and \<^term>\<open>keys\<close>\<close>
49480
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2021
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2022
definition gen_entries :: 
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2023
  "(('a \<times> 'b) \<times> ('a, 'b) rbt) list \<Rightarrow> ('a, 'b) rbt \<Rightarrow> ('a \<times> 'b) list"
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2024
where
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  2025
  "gen_entries kvts t = entries t @ concat (map (\<lambda>(kv, t). kv # entries t) kvts)"
49480
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2026
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2027
lemma gen_entries_simps [simp, code]:
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2028
  "gen_entries [] Empty = []"
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2029
  "gen_entries ((kv, t) # kvts) Empty = kv # gen_entries kvts t"
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2030
  "gen_entries kvts (Branch c l k v r) = gen_entries (((k, v), r) # kvts) l"
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2031
by(simp_all add: gen_entries_def)
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2032
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2033
lemma entries_code [code]:
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2034
  "entries = gen_entries []"
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2035
by(simp add: gen_entries_def fun_eq_iff)
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2036
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2037
definition gen_keys :: "('a \<times> ('a, 'b) rbt) list \<Rightarrow> ('a, 'b) rbt \<Rightarrow> 'a list"
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2038
where "gen_keys kts t = RBT_Impl.keys t @ concat (List.map (\<lambda>(k, t). k # keys t) kts)"
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2039
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2040
lemma gen_keys_simps [simp, code]:
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2041
  "gen_keys [] Empty = []"
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2042
  "gen_keys ((k, t) # kts) Empty = k # gen_keys kts t"
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2043
  "gen_keys kts (Branch c l k v r) = gen_keys ((k, r) # kts) l"
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2044
by(simp_all add: gen_keys_def)
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2045
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2046
lemma keys_code [code]:
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2047
  "keys = gen_keys []"
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2048
by(simp add: gen_keys_def fun_eq_iff)
4632b867fba7 more efficient code setup
Andreas Lochbihler
parents: 48621
diff changeset
  2049
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  2050
text \<open>Restore original type constraints for constants\<close>
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  2051
setup \<open>
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  2052
  fold Sign.add_const_constraint
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 68450
diff changeset
  2053
    [(\<^const_name>\<open>rbt_less\<close>, SOME \<^typ>\<open>('a :: order) \<Rightarrow> ('a, 'b) rbt \<Rightarrow> bool\<close>),
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 68450
diff changeset
  2054
     (\<^const_name>\<open>rbt_greater\<close>, SOME \<^typ>\<open>('a :: order) \<Rightarrow> ('a, 'b) rbt \<Rightarrow> bool\<close>),
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 68450
diff changeset
  2055
     (\<^const_name>\<open>rbt_sorted\<close>, SOME \<^typ>\<open>('a :: linorder, 'b) rbt \<Rightarrow> bool\<close>),
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 68450
diff changeset
  2056
     (\<^const_name>\<open>rbt_lookup\<close>, SOME \<^typ>\<open>('a :: linorder, 'b) rbt \<Rightarrow> 'a \<rightharpoonup> 'b\<close>),
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 68450
diff changeset
  2057
     (\<^const_name>\<open>is_rbt\<close>, SOME \<^typ>\<open>('a :: linorder, 'b) rbt \<Rightarrow> bool\<close>),
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 68450
diff changeset
  2058
     (\<^const_name>\<open>rbt_ins\<close>, SOME \<^typ>\<open>('a::linorder \<Rightarrow> 'b \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> 'a \<Rightarrow> 'b \<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt\<close>),
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 68450
diff changeset
  2059
     (\<^const_name>\<open>rbt_insert_with_key\<close>, SOME \<^typ>\<open>('a::linorder \<Rightarrow> 'b \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> 'a \<Rightarrow> 'b \<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt\<close>),
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 68450
diff changeset
  2060
     (\<^const_name>\<open>rbt_insert_with\<close>, SOME \<^typ>\<open>('b \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> ('a :: linorder) \<Rightarrow> 'b \<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt\<close>),
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 68450
diff changeset
  2061
     (\<^const_name>\<open>rbt_insert\<close>, SOME \<^typ>\<open>('a :: linorder) \<Rightarrow> 'b \<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt\<close>),
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 68450
diff changeset
  2062
     (\<^const_name>\<open>rbt_del_from_left\<close>, SOME \<^typ>\<open>('a::linorder) \<Rightarrow> ('a,'b) rbt \<Rightarrow> 'a \<Rightarrow> 'b \<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt\<close>),
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 68450
diff changeset
  2063
     (\<^const_name>\<open>rbt_del_from_right\<close>, SOME \<^typ>\<open>('a::linorder) \<Rightarrow> ('a,'b) rbt \<Rightarrow> 'a \<Rightarrow> 'b \<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt\<close>),
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 68450
diff changeset
  2064
     (\<^const_name>\<open>rbt_del\<close>, SOME \<^typ>\<open>('a::linorder) \<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt\<close>),
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 68450
diff changeset
  2065
     (\<^const_name>\<open>rbt_delete\<close>, SOME \<^typ>\<open>('a::linorder) \<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt\<close>),
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 68450
diff changeset
  2066
     (\<^const_name>\<open>rbt_union_with_key\<close>, SOME \<^typ>\<open>('a::linorder \<Rightarrow> 'b \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt\<close>),
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 68450
diff changeset
  2067
     (\<^const_name>\<open>rbt_union_with\<close>, SOME \<^typ>\<open>('b \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> ('a::linorder,'b) rbt \<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt\<close>),
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 68450
diff changeset
  2068
     (\<^const_name>\<open>rbt_union\<close>, SOME \<^typ>\<open>('a::linorder,'b) rbt \<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt\<close>),
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 68450
diff changeset
  2069
     (\<^const_name>\<open>rbt_map_entry\<close>, SOME \<^typ>\<open>'a::linorder \<Rightarrow> ('b \<Rightarrow> 'b) \<Rightarrow> ('a,'b) rbt \<Rightarrow> ('a,'b) rbt\<close>),
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 68450
diff changeset
  2070
     (\<^const_name>\<open>rbt_bulkload\<close>, SOME \<^typ>\<open>('a \<times> 'b) list \<Rightarrow> ('a::linorder,'b) rbt\<close>)]
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 59575
diff changeset
  2071
\<close>
47450
2ada2be850cb move RBT implementation into type class contexts
Andreas Lochbihler
parents: 47397
diff changeset
  2072
49770
cf6a78acf445 efficient construction of red black trees from sorted associative lists
Andreas Lochbihler
parents: 49480
diff changeset
  2073
hide_const (open) R B Empty entries keys fold gen_keys gen_entries
26192
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
  2074
52617dca8386 new theory of red-black trees, an efficient implementation of finite maps.
krauss
parents:
diff changeset
  2075
end