(* Title: HOL/ex/AVL.ML ID: $Id: AVL_fragment.ML,v 1.3 2004/02/02 15:01:37 smaus Exp $ Author: Cornelia Pusch and Tobias Nipkow modified by B. Wolff Copyright 1998 TUM This is a fragment for the AVL.ML file as received by Smaus from Wolff. Several symmetric cases are left out. It is part of exercise sheet 15 of "Modeling & Reasoning". *) (****************************** isbal **********************************) Addsimps[Let_def]; (* rotations preserve isbal property *) Goalw [bal_def] "height l = Suc(Suc(height r)) --> bal l ~= Right --> isbal l --> isbal r \ \ --> isbal (r_rot (n, l, r))"; by (case_tac "l" 1); by (Asm_simp_tac 1); by (asm_simp_tac (simpset() addsimps [max_def]) 1); qed_spec_mp "isbal_r_rot"; Goalw [bal_def] "height l = Suc(Suc(height r)) --> bal l = Right --> isbal l --> isbal r \ \ --> isbal (lr_rot (n, l, r))"; by (case_tac "l" 1); by (Asm_simp_tac 1); by (case_tac "tree2" 1); by (Asm_simp_tac 1); by (asm_simp_tac (simpset() addsimps [max_def]) 1); by (arith_tac 1); qed_spec_mp "isbal_lr_rot"; (*symmetric*) qed_spec_mp "isbal_l_rot"; (*symmetric*) qed_spec_mp "isbal_rl_rot"; (* lemmas about height after rotation *) Goalw [bal_def] "bal l = Right --> height l = Suc(Suc(height r)) \ \ --> Suc(height (lr_rot (n, l, r))) = height (Node n l r) "; by (case_tac "l" 1); by (Asm_simp_tac 1); by (case_tac "tree2" 1); by (Asm_simp_tac 1); by (asm_simp_tac (simpset() addsimps [max_def]) 1); qed_spec_mp "height_lr_rot"; Goalw [bal_def] "height l = Suc(Suc(height r)) --> bal l ~= Right \ \ --> Suc(height (r_rot (n, l, r))) = height (Node n l r) | \ \ height (r_rot (n, l, r)) = height (Node n l r)"; by (case_tac "l" 1); by (Asm_simp_tac 1); by (asm_simp_tac (simpset() addsimps [max_def]) 1); qed_spec_mp "height_r_rot"; Goalw [l_bal_def] "height l = Suc(Suc(height r)) \ \ --> Suc(height (l_bal n l r)) = height (Node n l r) | \ \ height (l_bal n l r) = height (Node n l r)"; by (case_tac "bal l = Right" 1); by (fast_tac (claset() addDs [height_lr_rot] addss simpset()) 1); by (fast_tac (claset() addDs [height_r_rot] addss simpset()) 1); qed_spec_mp "height_l_bal"; (*symmetric*) qed_spec_mp "height_rl_rot"; (*symmetric*) qed_spec_mp "height_l_rot"; (*symmetric*) qed_spec_mp "height_r_bal"; (* lemma about height after insert *) (*For some reason this does not work anymore. It hangs for at least 30 minutes*) (* Goal "isbal t \ \ --> height (insert x t) = height t | height (insert x t) = Suc(height t)"; by (induct_tac "t" 1); by (Simp_tac 1); by (case_tac "x=a" 1); by (Asm_simp_tac 1); by (case_tac "x height (insert x t) = height t | height (insert x t) = Suc(height t)"; by (induct_tac "t" 1); by (Simp_tac 1); by (case_tac "x=a" 1); by (Asm_simp_tac 1); by (case_tac "x isbal (Node n (insert x l) r)"; by (cut_inst_tac [("x","x"),("t","l")] height_insert 1); by (Asm_full_simp_tac 1); by (fast_tac (claset() addss simpset()) 1); qed "isbal_insert_left"; (*symmetric*) qed "isbal_insert_right"; (* insert-operation preserves isbal property *) Goal "isbal t --> isbal(insert x t)"; by (induct_tac "t" 1); by (Simp_tac 1); by (case_tac "x=a" 1); by (Asm_simp_tac 1); by (case_tac "x bal l = Right \ \ --> isin x (lr_rot (n, l, r)) = isin x (Node n l r)"; by (case_tac "l" 1); by (Asm_simp_tac 1); by (case_tac "tree2" 1); by (Asm_simp_tac 1); by (fast_tac (claset() addss simpset()) 1); qed_spec_mp "isin_lr_rot"; Goalw [bal_def] "height l = Suc(Suc(height r)) --> bal l ~= Right \ \ --> isin x (r_rot (n, l, r)) = isin x (Node n l r)"; by (case_tac "l" 1); by (Asm_simp_tac 1); by (fast_tac (claset() addss simpset()) 1); qed_spec_mp "isin_r_rot"; (*symmetric*) qed_spec_mp "isin_rl_rot"; (*symmetric*) qed_spec_mp "isin_l_rot"; (* isin insert *) Goal "isin y (insert x t) = (y=x | isin y t)"; by (induct_tac "t" 1); by (Asm_simp_tac 1); by(asm_simp_tac (simpset() addsimps [l_bal_def,isin_lr_rot,isin_r_rot, r_bal_def,isin_rl_rot,isin_l_rot]) 1); by(Blast_tac 1); qed "isin_insert"; (****************************** isord **********************************) (* rotations preserve isord property *) Goalw [bal_def] "height l = Suc(Suc(height r)) --> bal l = Right --> isord (Node n l r) \ \ --> isord (lr_rot (n, l, r))"; by (case_tac "l" 1); by (Asm_simp_tac 1); by (case_tac "tree2" 1); by (Asm_simp_tac 1); by (Asm_simp_tac 1); by(blast_tac (claset() addIs [order_less_trans])1); qed_spec_mp "isord_lr_rot"; Goalw [bal_def] "height l = Suc(Suc(height r)) --> bal l ~= Right --> isord (Node n l r) \ \ --> isord (r_rot (n, l, r))"; by (case_tac "l" 1); by (Asm_simp_tac 1); by (auto_tac (claset() addIs [order_less_trans],simpset())); qed_spec_mp "isord_r_rot"; (*symmetric*) qed_spec_mp "isord_rl_rot"; (*symmetric*) qed_spec_mp "isord_l_rot"; (* insert operation preserves isord property *) Goal "isord t --> isord(insert (x::'a::linorder) t)"; by (induct_tac "t" 1); by (Simp_tac 1); by (cut_inst_tac [("x","x"),("y","a")] linorder_less_linear 1); by (fast_tac (claset() addss (simpset() addsimps [l_bal_def,isord_lr_rot, isord_r_rot,r_bal_def,isord_l_rot,isord_rl_rot,isin_insert])) 1); qed_spec_mp "isord_insert";