diff -r 4a3612f30865 -r b55e2354d71e src/HOL/ex/AVL.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/ex/AVL.thy Fri May 05 12:51:33 2000 +0200 @@ -0,0 +1,97 @@ +(* Title: HOL/ex/AVL.thy + ID: $Id$ + Author: Cornelia Pusch and Tobias Nipkow + Copyright 1998 TUM + +AVL trees: at the moment only insertion. +This version works exclusively with nat. +Balance check could be simplified by working with int: +"isbal (MKT n l r) = (abs(int(height l) - int(height r)) <= #1 & + isbal l & isbal r)" +*) + +AVL = Main + + +datatype tree = ET | MKT nat tree tree + +consts + height :: "tree => nat" + isin :: "nat => tree => bool" + isord :: "tree => bool" + isbal :: "tree => bool" + +primrec +"height ET = 0" +"height (MKT n l r) = Suc(max (height l) (height r))" + +primrec +"isin k ET = False" +"isin k (MKT n l r) = (k=n | isin k l | isin k r)" + +primrec +"isord ET = True" +"isord (MKT n l r) = ((! n'. isin n' l --> n' < n) & + (! n'. isin n' r --> n < n') & + isord l & isord r)" + +primrec +"isbal ET = True" +"isbal (MKT n l r) = ((height l = height r | + height l = Suc(height r) | + height r = Suc(height l)) & + isbal l & isbal r)" + + +datatype bal = Just | Left | Right + +constdefs + bal :: "tree => bal" +"bal t == case t of ET => Just + | (MKT n l r) => if height l = height r then Just + else if height l < height r then Right else Left" + +consts + r_rot,l_rot,lr_rot,rl_rot :: "nat * tree * tree => tree" + +recdef r_rot "{}" +"r_rot (n, MKT ln ll lr, r) = MKT ln ll (MKT n lr r)" + +recdef l_rot "{}" +"l_rot(n, l, MKT rn rl rr) = MKT rn (MKT n l rl) rr" + +recdef lr_rot "{}" +"lr_rot(n, MKT ln ll (MKT lrn lrl lrr), r) = MKT lrn (MKT ln ll lrl) (MKT n lrr r)" + +recdef rl_rot "{}" +"rl_rot(n, l, MKT rn (MKT rln rll rlr) rr) = MKT rln (MKT n l rll) (MKT rn rlr rr)" + + +constdefs + l_bal :: "nat => tree => tree => tree" +"l_bal n l r == if bal l = Right + then lr_rot (n, l, r) + else r_rot (n, l, r)" + + r_bal :: "nat => tree => tree => tree" +"r_bal n l r == if bal r = Left + then rl_rot (n, l, r) + else l_rot (n, l, r)" + +consts + insert :: "nat => tree => tree" +primrec +"insert x ET = MKT x ET ET" +"insert x (MKT n l r) = + (if x=n + then MKT n l r + else if x