src/HOL/Data_Structures/AVL_Map.thy
author wenzelm
Sat, 28 Nov 2020 15:15:53 +0100
changeset 72755 8dffbe01a3e1
parent 71818 986d5abbe77c
permissions -rw-r--r--
support for Scala compile-time positions;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
61232
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
     1
(* Author: Tobias Nipkow *)
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
     2
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
     3
section "AVL Tree Implementation of Maps"
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
     4
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
     5
theory AVL_Map
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
     6
imports
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
     7
  AVL_Set
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
     8
  Lookup2
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
     9
begin
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
    10
71818
nipkow
parents: 71806
diff changeset
    11
fun update :: "'a::linorder \<Rightarrow> 'b \<Rightarrow> ('a*'b) tree_ht \<Rightarrow> ('a*'b) tree_ht" where
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 68440
diff changeset
    12
"update x y Leaf = Node Leaf ((x,y), 1) Leaf" |
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 68440
diff changeset
    13
"update x y (Node l ((a,b), h) r) = (case cmp x a of
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 68440
diff changeset
    14
   EQ \<Rightarrow> Node l ((x,y), h) r |
61581
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61232
diff changeset
    15
   LT \<Rightarrow> balL (update x y l) (a,b) r |
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61232
diff changeset
    16
   GT \<Rightarrow> balR l (a,b) (update x y r))"
61232
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
    17
71818
nipkow
parents: 71806
diff changeset
    18
fun delete :: "'a::linorder \<Rightarrow> ('a*'b) tree_ht \<Rightarrow> ('a*'b) tree_ht" where
61232
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
    19
"delete _ Leaf = Leaf" |
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 68440
diff changeset
    20
"delete x (Node l ((a,b), h) r) = (case cmp x a of
71636
9d8fb1dbc368 simplified code and proofs
nipkow
parents: 70755
diff changeset
    21
   EQ \<Rightarrow> if l = Leaf then r
9d8fb1dbc368 simplified code and proofs
nipkow
parents: 70755
diff changeset
    22
         else let (l', ab') = split_max l in balR l' ab' r |
61581
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61232
diff changeset
    23
   LT \<Rightarrow> balR (delete x l) (a,b) r |
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61232
diff changeset
    24
   GT \<Rightarrow> balL l (a,b) (delete x r))"
61232
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
    25
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
    26
68422
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    27
subsection \<open>Functional Correctness\<close>
61232
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
    28
68440
6826718f732d qualify interpretations to avoid clashes
nipkow
parents: 68431
diff changeset
    29
theorem inorder_update:
61232
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
    30
  "sorted1(inorder t) \<Longrightarrow> inorder(update x y t) = upd_list x y (inorder t)"
61581
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61232
diff changeset
    31
by (induct t) (auto simp: upd_list_simps inorder_balL inorder_balR)
61232
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
    32
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
    33
68440
6826718f732d qualify interpretations to avoid clashes
nipkow
parents: 68431
diff changeset
    34
theorem inorder_delete:
61232
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
    35
  "sorted1(inorder t) \<Longrightarrow> inorder (delete x t) = del_list x (inorder t)"
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
    36
by(induction t)
61581
00d9682e8dd7 Convertd to 3-way comparisons
nipkow
parents: 61232
diff changeset
    37
  (auto simp: del_list_simps inorder_balL inorder_balR
71636
9d8fb1dbc368 simplified code and proofs
nipkow
parents: 70755
diff changeset
    38
      inorder_split_maxD split: prod.splits)
61232
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
    39
68422
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    40
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    41
subsection \<open>AVL invariants\<close>
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    42
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    43
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    44
subsubsection \<open>Insertion maintains AVL balance\<close>
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    45
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    46
theorem avl_update:
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    47
  assumes "avl t"
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    48
  shows "avl(update x y t)"
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    49
        "(height (update x y t) = height t \<or> height (update x y t) = height t + 1)"
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    50
using assms
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    51
proof (induction x y t rule: update.induct)
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    52
  case eq2: (2 x y l a b h r)
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    53
  case 1
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    54
  show ?case
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    55
  proof(cases "x = a")
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    56
    case True with eq2 1 show ?thesis by simp
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    57
  next
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    58
    case False
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    59
    with eq2 1 show ?thesis 
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    60
    proof(cases "x<a")
71806
884c6c0bc99a use abs(h l - h r) instead of 3 cases, tuned proofs
nipkow
parents: 71636
diff changeset
    61
      case True with eq2 1 show ?thesis by (auto intro!: avl_balL)
68422
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    62
    next
71806
884c6c0bc99a use abs(h l - h r) instead of 3 cases, tuned proofs
nipkow
parents: 71636
diff changeset
    63
      case False with eq2 1 \<open>x\<noteq>a\<close> show ?thesis by (auto intro!: avl_balR)
68422
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    64
    qed
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    65
  qed
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    66
  case 2
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    67
  show ?case
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    68
  proof(cases "x = a")
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    69
    case True with eq2 1 show ?thesis by simp
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    70
  next
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    71
    case False
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    72
    show ?thesis 
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    73
    proof(cases "x<a")
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    74
      case True
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    75
      show ?thesis
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    76
      proof(cases "height (update x y l) = height r + 2")
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    77
        case False with eq2 2 \<open>x < a\<close> show ?thesis by (auto simp: height_balL2)
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    78
      next
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    79
        case True 
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    80
        hence "(height (balL (update x y l) (a,b) r) = height r + 2) \<or>
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    81
          (height (balL (update x y l) (a,b) r) = height r + 3)" (is "?A \<or> ?B")
71806
884c6c0bc99a use abs(h l - h r) instead of 3 cases, tuned proofs
nipkow
parents: 71636
diff changeset
    82
          using eq2 2 \<open>x<a\<close> height_balL[OF _ _ True] by simp
68422
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    83
        thus ?thesis
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    84
        proof
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    85
          assume ?A with 2 \<open>x < a\<close> show ?thesis by (auto)
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    86
        next
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    87
          assume ?B with True 1 eq2(2) \<open>x < a\<close> show ?thesis by (simp) arith
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    88
        qed
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    89
      qed
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    90
    next
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    91
      case False
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    92
      show ?thesis
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    93
      proof(cases "height (update x y r) = height l + 2")
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    94
        case False with eq2 2 \<open>\<not>x < a\<close> show ?thesis by (auto simp: height_balR2)
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    95
      next
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    96
        case True 
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    97
        hence "(height (balR l (a,b) (update x y r)) = height l + 2) \<or>
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
    98
          (height (balR l (a,b) (update x y r)) = height l + 3)"  (is "?A \<or> ?B")
71806
884c6c0bc99a use abs(h l - h r) instead of 3 cases, tuned proofs
nipkow
parents: 71636
diff changeset
    99
          using eq2 2 \<open>\<not>x < a\<close> \<open>x \<noteq> a\<close> height_balR[OF _ _ True] by simp
68422
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   100
        thus ?thesis 
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   101
        proof
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   102
          assume ?A with 2 \<open>\<not>x < a\<close> show ?thesis by (auto)
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   103
        next
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   104
          assume ?B with True 1 eq2(4) \<open>\<not>x < a\<close> show ?thesis by (simp) arith
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   105
        qed
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   106
      qed
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   107
    qed
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   108
  qed
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   109
qed simp_all
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   110
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   111
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   112
subsubsection \<open>Deletion maintains AVL balance\<close>
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   113
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   114
theorem avl_delete:
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   115
  assumes "avl t" 
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   116
  shows "avl(delete x t)" and "height t = (height (delete x t)) \<or> height t = height (delete x t) + 1"
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   117
using assms
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 68440
diff changeset
   118
proof (induct t rule: tree2_induct)
71806
884c6c0bc99a use abs(h l - h r) instead of 3 cases, tuned proofs
nipkow
parents: 71636
diff changeset
   119
  case (Node l ab h r)
884c6c0bc99a use abs(h l - h r) instead of 3 cases, tuned proofs
nipkow
parents: 71636
diff changeset
   120
  obtain a b where [simp]: "ab = (a,b)" by fastforce
68422
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   121
  case 1
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   122
  show ?case
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   123
  proof(cases "x = a")
71636
9d8fb1dbc368 simplified code and proofs
nipkow
parents: 70755
diff changeset
   124
    case True with Node 1 show ?thesis
71806
884c6c0bc99a use abs(h l - h r) instead of 3 cases, tuned proofs
nipkow
parents: 71636
diff changeset
   125
      using avl_split_max[of l] by (auto intro!: avl_balR split: prod.split)
68422
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   126
  next
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   127
    case False
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   128
    show ?thesis 
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   129
    proof(cases "x<a")
71806
884c6c0bc99a use abs(h l - h r) instead of 3 cases, tuned proofs
nipkow
parents: 71636
diff changeset
   130
      case True with Node 1 show ?thesis by (auto intro!: avl_balR)
68422
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   131
    next
71806
884c6c0bc99a use abs(h l - h r) instead of 3 cases, tuned proofs
nipkow
parents: 71636
diff changeset
   132
      case False with Node 1 \<open>x\<noteq>a\<close> show ?thesis by (auto intro!: avl_balL)
68422
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   133
    qed
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   134
  qed
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   135
  case 2
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   136
  show ?case
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   137
  proof(cases "x = a")
71636
9d8fb1dbc368 simplified code and proofs
nipkow
parents: 70755
diff changeset
   138
    case True then show ?thesis using 1 avl_split_max[of l]
9d8fb1dbc368 simplified code and proofs
nipkow
parents: 70755
diff changeset
   139
      by(auto simp: balR_def max_absorb2 split!: if_splits prod.split tree.split)
68422
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   140
  next
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   141
    case False
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   142
    show ?thesis 
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   143
    proof(cases "x<a")
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   144
      case True
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   145
      show ?thesis
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   146
      proof(cases "height r = height (delete x l) + 2")
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   147
        case False with Node 1 \<open>x < a\<close> show ?thesis by(auto simp: balR_def)
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   148
      next
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   149
        case True 
71806
884c6c0bc99a use abs(h l - h r) instead of 3 cases, tuned proofs
nipkow
parents: 71636
diff changeset
   150
        thus ?thesis using height_balR[OF _ _ True, of ab] 2 Node(1,2) \<open>x < a\<close> by simp linarith
68422
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   151
      qed
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   152
    next
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   153
      case False
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   154
      show ?thesis
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   155
      proof(cases "height l = height (delete x r) + 2")
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   156
        case False with Node 1 \<open>\<not>x < a\<close> \<open>x \<noteq> a\<close> show ?thesis by(auto simp: balL_def)
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   157
      next
71806
884c6c0bc99a use abs(h l - h r) instead of 3 cases, tuned proofs
nipkow
parents: 71636
diff changeset
   158
        case True
884c6c0bc99a use abs(h l - h r) instead of 3 cases, tuned proofs
nipkow
parents: 71636
diff changeset
   159
        thus ?thesis
884c6c0bc99a use abs(h l - h r) instead of 3 cases, tuned proofs
nipkow
parents: 71636
diff changeset
   160
          using height_balL[OF _ _ True, of ab] 2 Node(3,4) \<open>\<not>x < a\<close> \<open>x \<noteq> a\<close> by auto
68422
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   161
      qed
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   162
    qed
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   163
  qed
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   164
qed simp_all
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   165
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   166
68440
6826718f732d qualify interpretations to avoid clashes
nipkow
parents: 68431
diff changeset
   167
interpretation M: Map_by_Ordered
68431
b294e095f64c more abstract naming
nipkow
parents: 68422
diff changeset
   168
where empty = empty and lookup = lookup and update = update and delete = delete
68422
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   169
and inorder = inorder and inv = avl
61232
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
   170
proof (standard, goal_cases)
68431
b294e095f64c more abstract naming
nipkow
parents: 68422
diff changeset
   171
  case 1 show ?case by (simp add: empty_def)
61232
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
   172
next
61790
0494964bb226 avoid name clashes
nipkow
parents: 61686
diff changeset
   173
  case 2 thus ?case by(simp add: lookup_map_of)
61232
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
   174
next
68440
6826718f732d qualify interpretations to avoid clashes
nipkow
parents: 68431
diff changeset
   175
  case 3 thus ?case by(simp add: inorder_update)
61232
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
   176
next
68440
6826718f732d qualify interpretations to avoid clashes
nipkow
parents: 68431
diff changeset
   177
  case 4 thus ?case by(simp add: inorder_delete)
68422
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   178
next
68431
b294e095f64c more abstract naming
nipkow
parents: 68422
diff changeset
   179
  case 5 show ?case by (simp add: empty_def)
68422
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   180
next
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   181
  case 6 thus ?case by(simp add: avl_update(1))
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   182
next
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   183
  case 7 thus ?case by(simp add: avl_delete(1))
0a3a36fa1d63 proved avl for map (finally); tuned
nipkow
parents: 68413
diff changeset
   184
qed
61232
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
   185
c46faf9762f7 added AVL and lookup function
nipkow
parents:
diff changeset
   186
end