(************************************************************************)
(* lookup                                                               *)


Inductive lookup (key : Int) : avl_tree -> B -> Prop :=
  | Lookup_Equal :
      forall (d : B) (l r : avl_tree) (b : bal),
      lookup key (Avl_Node key d l r b) d
  | Lookup_Left :
      forall (k : Int) (d : B) (l r : avl_tree) (b : bal) (data : B),
      lookup key l data -> lookup key (Avl_Node k d l r b) data
  | Lookup_Right :
      forall (k : Int) (d : B) (l r : avl_tree) (b : bal) (data : B),
      lookup key r data -> lookup key (Avl_Node k d l r b) data.(************************************************************************)
(* lookup                                                               *)


Inductive lookup (key : Int) : avl_tree -> B -> Prop :=
  | Lookup_Equal :
      forall (d : B) (l r : avl_tree) (b : bal),
      lookup key (Avl_Node key d l r b) d
  | Lookup_Left :
      forall (k : Int) (d : B) (l r : avl_tree) (b : bal) (data : B),
      lookup key l data -> lookup key (Avl_Node k d l r b) data
  | Lookup_Right :
      forall (k : Int) (d : B) (l r : avl_tree) (b : bal) (data : B),
      lookup key r data -> lookup key (Avl_Node k d l r b) data.(************************************************************************)
(* lookup                                                               *)


Inductive lookup (key : Int) : avl_tree -> B -> Prop :=
  | Lookup_Equal :
      forall (d : B) (l r : avl_tree) (b : bal),
      lookup key (Avl_Node key d l r b) d
  | Lookup_Left :
      forall (k : Int) (d : B) (l r : avl_tree) (b : bal) (data : B),
      lookup key l data -> lookup key (Avl_Node k d l r b) data
  | Lookup_Right :
      forall (k : Int) (d : B) (l r : avl_tree) (b : bal) (data : B),
      lookup key r data -> lookup key (Avl_Node k d l r b) data.(************************************************************************)
(* lookup                                                               *)


Inductive lookup (key : Int) : avl_tree -> B -> Prop :=
  | Lookup_Equal :
      forall (d : B) (l r : avl_tree) (b : bal),
      lookup key (Avl_Node key d l r b) d
  | Lookup_Left :
      forall (k : Int) (d : B) (l r : avl_tree) (b : bal) (data : B),
      lookup key l data -> lookup key (Avl_Node k d l r b) data
  | Lookup_Right :
      forall (k : Int) (d : B) (l r : avl_tree) (b : bal) (data : B),
      lookup key r data -> lookup key (Avl_Node k d l r b) data.

(* Specifications: *)
Lemma inv_lookup_nil : forall (key : Int) (data : B), lookup key Avl_Nil data -> False.
Lemma inv_lookup : forall (key k : Int) (d : B) (l r : avl_tree) (b : bal) (data : B), lookup key (Avl_Node k d l r b) data -> k = key /\ d = data \/ lookup key l data \/ lookup key r data.
Lemma lookup_below_less : forall (key : Int) (t : avl_tree) (data : B) (k0 : Int), lookup key t data -> is_below t k0 -> Less key k0.
Lemma lookup_above_greater : forall (key : Int) (t : avl_tree) (data : B) (k0 : Int), lookup key t data -> is_above t k0 -> Less k0 key.
Lemma lookup_less_below : forall (t : avl_tree) (k0 : Int), (forall (k : Int) (d : B), lookup k t d -> Less k k0) -> is_below t k0.
Lemma lookup_greater_above : forall (t : avl_tree) (k0 : Int), (forall (k : Int) (d : B), lookup k t d -> Less k0 k) -> is_above t k0.
Lemma lookup_above_lookup : forall (key k : Int) (d : B) (l r : avl_tree) (b : bal) (data : B), lookup key (Avl_Node k d l r b) data -> Less key k -> is_above r key -> lookup key l data.
Lemma lookup_below_lookup : forall (key k : Int) (d : B) (l r : avl_tree) (b : bal) (data : B), lookup key (Avl_Node k d l r b) data -> Less k key -> is_below l key -> lookup key r data.
Lemma lookup_below_false : forall (key : Int) (t : avl_tree) (data : B), lookup key t data -> is_below t key -> False.
Lemma lookup_above_false : forall (key : Int) (t : avl_tree) (data : B), lookup key t data -> is_above t key -> False.