src/HOL/ex/AVL.ML
author nipkow
Thu, 30 May 2002 10:12:52 +0200
changeset 13187 e5434b822a96
parent 12486 0ed8bdd883e0
child 13601 fd3e3d6b37b2
permissions -rw-r--r--
Modifications due to enhanced linear arithmetic.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8797
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
     1
(*  Title:      HOL/ex/AVL.ML
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
     2
    ID:         $Id$
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
     3
    Author:     Cornelia Pusch and Tobias Nipkow
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
     4
    Copyright   1998  TUM
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
     5
*)
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
     6
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
     7
(******************************    isbal    **********************************)
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
     8
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
     9
Addsimps[Let_def];
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    10
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    11
(* rotations preserve isbal property *)
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    12
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    13
Goalw [bal_def]
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    14
"height l = Suc(Suc(height r)) --> bal l = Right --> isbal l --> isbal r \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    15
\ --> isbal (lr_rot (n, l, r))";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    16
by (case_tac "l" 1); 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    17
 by (Asm_simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    18
by (case_tac "tree2" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    19
 by (Asm_simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    20
by (asm_simp_tac (simpset() addsimps [max_def]) 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    21
by (arith_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    22
qed_spec_mp "isbal_lr_rot";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    23
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    24
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    25
Goalw [bal_def]
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    26
"height l = Suc(Suc(height r)) --> bal l ~= Right --> isbal l --> isbal r \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    27
\ --> isbal (r_rot (n, l, r))";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    28
by (case_tac "l" 1); 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    29
 by (Asm_simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    30
by (asm_simp_tac (simpset() addsimps [max_def]) 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    31
qed_spec_mp "isbal_r_rot";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    32
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    33
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    34
Goalw [bal_def]
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    35
"height r = Suc(Suc(height l)) --> bal r = Left --> isbal l --> isbal r \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    36
\ --> isbal (rl_rot (n, l, r))";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    37
by (case_tac "r" 1); 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    38
 by (Asm_simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    39
by (case_tac "tree1" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    40
 by (asm_simp_tac (simpset() addsimps [max_def]) 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    41
by (asm_simp_tac (simpset() addsimps [max_def]) 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    42
by (arith_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    43
qed_spec_mp "isbal_rl_rot";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    44
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    45
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    46
Goalw [bal_def]
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    47
"height r = Suc(Suc(height l)) --> bal r ~= Left --> isbal l --> isbal r \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    48
\ --> isbal (l_rot (n, l, r))";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    49
by (case_tac "r" 1); 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    50
 by (Asm_simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    51
by (asm_simp_tac (simpset() addsimps [max_def]) 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    52
qed_spec_mp "isbal_l_rot";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    53
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    54
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    55
(* lemmas about height after rotation *)
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    56
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    57
Goalw [bal_def]
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    58
"bal l = Right --> height l = Suc(Suc(height r))   \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    59
\ -->     Suc(height (lr_rot (n, l, r)))  = height (MKT n l r) ";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    60
by (case_tac "l" 1); 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    61
 by (Asm_simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    62
by (case_tac "tree2" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    63
 by (Asm_simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    64
by (asm_simp_tac (simpset() addsimps [max_def]) 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    65
qed_spec_mp "height_lr_rot";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    66
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    67
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    68
Goalw [bal_def]
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    69
"height l = Suc(Suc(height r)) --> bal l ~= Right \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    70
\ --> Suc(height (r_rot (n, l, r))) = height (MKT n l r) | \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    71
\         height (r_rot (n, l, r))  = height (MKT n l r)";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    72
by (case_tac "l" 1); 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    73
 by (Asm_simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    74
by (asm_simp_tac (simpset() addsimps [max_def]) 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    75
qed_spec_mp "height_r_rot";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    76
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    77
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    78
Goalw [l_bal_def]
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    79
"height l = Suc(Suc(height r))  \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    80
\ --> Suc(height (l_bal n l r)) = height (MKT n l r) | \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    81
\         height (l_bal n l r)  = height (MKT n l r)";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    82
by (case_tac "bal l = Right" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    83
 by (fast_tac (claset() addDs [height_lr_rot] addss simpset()) 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    84
by (fast_tac (claset() addDs [height_r_rot] addss simpset()) 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    85
qed_spec_mp "height_l_bal";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    86
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    87
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    88
Goalw [bal_def]
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    89
"height r = Suc(Suc(height l)) --> bal r = Left \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    90
\ -->     Suc(height (rl_rot (n, l, r)))  = height (MKT n l r)";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    91
by (case_tac "r" 1); 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    92
 by (Asm_simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    93
by (case_tac "tree1" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    94
 by (Asm_simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    95
by (asm_simp_tac (simpset() addsimps [max_def]) 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    96
qed_spec_mp "height_rl_rot";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    97
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    98
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
    99
Goalw [bal_def]
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   100
"height r = Suc(Suc(height l)) --> bal r ~= Left \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   101
\ --> Suc(height (l_rot (n, l, r))) = height (MKT n l r) | \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   102
\         height (l_rot (n, l, r))  = height (MKT n l r)";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   103
by (case_tac "r" 1); 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   104
 by (Asm_simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   105
by (asm_simp_tac (simpset() addsimps [max_def]) 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   106
qed_spec_mp "height_l_rot";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   107
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   108
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   109
Goalw [r_bal_def]
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   110
"height r = Suc(Suc(height l))  \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   111
\ --> Suc(height (r_bal n l r)) = height (MKT n l r) | \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   112
\         height (r_bal n l r)  = height (MKT n l r)";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   113
by (case_tac "bal r = Left" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   114
 by (fast_tac (claset() addDs [height_rl_rot] addss simpset()) 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   115
by (fast_tac (claset() addDs [height_l_rot] addss simpset()) 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   116
qed_spec_mp "height_r_bal";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   117
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   118
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   119
(* lemma about height after insert *)
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   120
Goal
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   121
"isbal t  \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   122
\ --> height (insert x t) = height t | height (insert x t) = Suc(height t)";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   123
by (induct_tac "t" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   124
 by (Simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   125
by (case_tac "x=nat" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   126
 by (Asm_simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   127
by (case_tac "x<nat" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   128
 by (case_tac "height (insert x tree1) = Suc (Suc (height tree2))" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   129
  by (forw_inst_tac [("n","nat")]  height_l_bal 1);  
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   130
  by (asm_full_simp_tac (simpset() addsimps [max_def]) 1);
12486
0ed8bdd883e0 isatool expandshort;
wenzelm
parents: 8797
diff changeset
   131
  by (fast_tac (claset() addss simpset()) 1);
8797
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   132
 by (asm_full_simp_tac (simpset() addsimps [max_def]) 1);
12486
0ed8bdd883e0 isatool expandshort;
wenzelm
parents: 8797
diff changeset
   133
 by (fast_tac (claset() addss simpset()) 1);
8797
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   134
by (case_tac "height (insert x tree2) = Suc (Suc (height tree1))" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   135
 by (forw_inst_tac [("n","nat")]  height_r_bal 1); 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   136
 by (asm_full_simp_tac (simpset() addsimps [max_def]) 1);
12486
0ed8bdd883e0 isatool expandshort;
wenzelm
parents: 8797
diff changeset
   137
 by (fast_tac (claset() addss simpset()) 1);
8797
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   138
by (asm_full_simp_tac (simpset() addsimps [max_def]) 1);
12486
0ed8bdd883e0 isatool expandshort;
wenzelm
parents: 8797
diff changeset
   139
by (fast_tac (claset() addss simpset()) 1);
8797
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   140
qed_spec_mp "height_insert";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   141
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   142
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   143
Goal
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   144
"!!x. [| height (insert x l) ~= Suc(Suc(height r)); isbal (insert x l); isbal (MKT n l r) |] \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   145
\ ==> isbal (MKT n (insert x l) r)";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   146
by (cut_inst_tac [("x","x"),("t","l")] height_insert 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   147
 by (Asm_full_simp_tac 1); 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   148
by (fast_tac (claset() addss simpset()) 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   149
qed "isbal_insert_left";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   150
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   151
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   152
Goal
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   153
"!!x. [| height (insert x r) ~= Suc(Suc(height l)); isbal (insert x r); isbal (MKT n l r) |] \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   154
\ ==> isbal (MKT n l (insert x r))";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   155
by (cut_inst_tac [("x","x"),("t","r")] height_insert 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   156
 by (Asm_full_simp_tac 1); 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   157
by (fast_tac (claset() addss simpset()) 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   158
qed "isbal_insert_right";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   159
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   160
(* insert-operation preserves isbal property *)
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   161
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   162
Goal
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   163
"isbal t --> isbal(insert x t)";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   164
by (induct_tac "t" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   165
 by (Simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   166
by (case_tac "x=nat" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   167
 by (Asm_simp_tac 1); 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   168
by (case_tac "x<nat" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   169
 by (case_tac "height (insert x tree1) = Suc (Suc (height tree2))" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   170
  by (case_tac "bal (insert x tree1) = Right" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   171
   by (fast_tac (claset() addIs [isbal_lr_rot] addss (simpset() 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   172
	addsimps [l_bal_def])) 1);  
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   173
  by (fast_tac (claset() addIs [isbal_r_rot] addss (simpset() 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   174
	addsimps [l_bal_def])) 1);  
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   175
 by (Clarify_tac 1);
12486
0ed8bdd883e0 isatool expandshort;
wenzelm
parents: 8797
diff changeset
   176
 by (ftac isbal_insert_left 1);
8797
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   177
   by (Asm_full_simp_tac 1); 
12486
0ed8bdd883e0 isatool expandshort;
wenzelm
parents: 8797
diff changeset
   178
  by (assume_tac 1);
8797
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   179
 by (Asm_full_simp_tac 1); 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   180
by (case_tac "height (insert x tree2) = Suc (Suc (height tree1))" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   181
 by (case_tac "bal (insert x tree2) = Left" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   182
  by (fast_tac (claset() addIs [isbal_rl_rot] addss (simpset() 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   183
	addsimps [r_bal_def])) 1);  
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   184
 by (fast_tac (claset() addIs [isbal_l_rot] addss (simpset() 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   185
	addsimps [r_bal_def])) 1);  
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   186
by (Clarify_tac 1);
12486
0ed8bdd883e0 isatool expandshort;
wenzelm
parents: 8797
diff changeset
   187
by (ftac isbal_insert_right 1);
8797
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   188
   by (Asm_full_simp_tac 1); 
12486
0ed8bdd883e0 isatool expandshort;
wenzelm
parents: 8797
diff changeset
   189
  by (assume_tac 1);
8797
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   190
 by (Asm_full_simp_tac 1); 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   191
qed_spec_mp "isbal_insert";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   192
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   193
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   194
(******************************    isin    **********************************)
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   195
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   196
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   197
(* rotations preserve isin property *)
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   198
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   199
Goalw [bal_def]
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   200
"height l = Suc(Suc(height r)) --> bal l = Right  \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   201
\ --> isin x (lr_rot (n, l, r)) = isin x (MKT n l r)";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   202
by (case_tac "l" 1); 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   203
 by (Asm_simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   204
by (case_tac "tree2" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   205
 by (Asm_simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   206
by (fast_tac (claset() addss simpset()) 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   207
qed_spec_mp "isin_lr_rot";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   208
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   209
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   210
Goalw [bal_def]
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   211
"height l = Suc(Suc(height r)) --> bal l ~= Right  \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   212
\ --> isin x (r_rot (n, l, r)) = isin x (MKT n l r)";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   213
by (case_tac "l" 1); 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   214
 by (Asm_simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   215
by (fast_tac (claset() addss simpset()) 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   216
qed_spec_mp "isin_r_rot";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   217
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   218
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   219
Goalw [bal_def]
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   220
"height r = Suc(Suc(height l)) --> bal r = Left  \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   221
\ --> isin x (rl_rot (n, l, r)) = isin x (MKT n l r)";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   222
by (case_tac "r" 1); 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   223
 by (Asm_simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   224
by (case_tac "tree1" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   225
 by (asm_simp_tac (simpset() addsimps [max_def,le_def]) 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   226
by (fast_tac (claset() addss simpset()) 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   227
qed_spec_mp "isin_rl_rot";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   228
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   229
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   230
Goalw [bal_def]
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   231
"height r = Suc(Suc(height l)) --> bal r ~= Left  \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   232
\ --> isin x (l_rot (n, l, r)) = isin x (MKT n l r)";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   233
by (case_tac "r" 1); 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   234
 by (Asm_simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   235
by (fast_tac (claset() addss simpset()) 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   236
qed_spec_mp "isin_l_rot";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   237
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   238
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   239
(* isin insert *)
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   240
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   241
Goal
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   242
"isin y (insert x t) = (y=x | isin y t)";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   243
by (induct_tac "t" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   244
 by (Asm_simp_tac 1);
12486
0ed8bdd883e0 isatool expandshort;
wenzelm
parents: 8797
diff changeset
   245
by (asm_simp_tac (simpset() addsimps [l_bal_def,isin_lr_rot,isin_r_rot,
8797
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   246
	r_bal_def,isin_rl_rot,isin_l_rot]) 1);
12486
0ed8bdd883e0 isatool expandshort;
wenzelm
parents: 8797
diff changeset
   247
by (Blast_tac 1);
8797
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   248
qed "isin_insert";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   249
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   250
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   251
(******************************    isord    **********************************)
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   252
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   253
(* rotations preserve isord property *)
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   254
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   255
Goalw [bal_def]
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   256
"height l = Suc(Suc(height r)) --> bal l = Right --> isord (MKT n l r) \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   257
\ --> isord (lr_rot (n, l, r))";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   258
by (case_tac "l" 1); 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   259
 by (Asm_simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   260
by (case_tac "tree2" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   261
 by (Asm_simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   262
by (Asm_simp_tac 1);
12486
0ed8bdd883e0 isatool expandshort;
wenzelm
parents: 8797
diff changeset
   263
by (blast_tac (claset() addIs [less_trans])1);
8797
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   264
qed_spec_mp "isord_lr_rot";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   265
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   266
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   267
Goalw [bal_def]
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   268
"height l = Suc(Suc(height r)) --> bal l ~= Right --> isord (MKT n l r) \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   269
\ --> isord (r_rot (n, l, r))";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   270
by (case_tac "l" 1); 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   271
 by (Asm_simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   272
by (auto_tac (claset() addIs [less_trans],simpset()));
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   273
qed_spec_mp "isord_r_rot";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   274
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   275
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   276
Goalw [bal_def]
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   277
"height r = Suc(Suc(height l)) --> bal r = Left --> isord (MKT n l r) \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   278
\ --> isord (rl_rot (n, l, r))";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   279
by (case_tac "r" 1); 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   280
 by (Asm_simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   281
by (case_tac "tree1" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   282
 by (asm_simp_tac (simpset() addsimps [le_def]) 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   283
by (Asm_simp_tac 1);
12486
0ed8bdd883e0 isatool expandshort;
wenzelm
parents: 8797
diff changeset
   284
by (blast_tac (claset() addIs [less_trans])1);
8797
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   285
qed_spec_mp "isord_rl_rot";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   286
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   287
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   288
Goalw [bal_def]
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   289
"height r = Suc(Suc(height l)) --> bal r ~= Left --> isord (MKT n l r)  \
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   290
\ --> isord (l_rot (n, l, r))";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   291
by (case_tac "r" 1); 
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   292
 by (Asm_simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   293
by (Asm_simp_tac 1);
12486
0ed8bdd883e0 isatool expandshort;
wenzelm
parents: 8797
diff changeset
   294
by (blast_tac (claset() addIs [less_trans])1);
8797
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   295
qed_spec_mp "isord_l_rot";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   296
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   297
(* insert operation presreves isord property *)
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   298
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   299
Goal
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   300
"isord t --> isord(insert x t)";
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   301
by (induct_tac "t" 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   302
 by (Simp_tac 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   303
by (cut_inst_tac [("m","x"),("n","nat")] less_linear 1);
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   304
 by (fast_tac (claset() addss (simpset() addsimps [l_bal_def,isord_lr_rot,
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   305
	isord_r_rot,r_bal_def,isord_l_rot,isord_rl_rot,isin_insert])) 1);  
b55e2354d71e Added AVL
nipkow
parents:
diff changeset
   306
qed_spec_mp "isord_insert";