1
Require Import ZArith Coq.Program.Wf Coq.Program.Utils.
7
| Node : t -> data -> t -> Z -> t.
9
Parameter avl : t -> Prop.
10
Parameter bst : t -> Prop.
11
Parameter In : data -> t -> Prop.
12
Parameter cardinal : t -> nat.
13
Definition card2 (s:t*t) := let (s1,s2) := s in cardinal s1 + cardinal s2.
15
Parameter split : data -> t -> t*(bool*t).
16
Parameter join : t -> data -> t -> t.
17
Parameter add : data -> t -> t.
19
Program Fixpoint union
21
(hb1: bst (fst s))(ha1: avl (fst s))(hb2: bst (snd s))(hb2: avl (snd s))
23
{s' : t | bst s' /\ avl s' /\ forall x, In x s' <-> In x (fst s) \/ In x (snd
28
| (Node l1 v1 r1 h1, Node l2 v2 r2 h2) =>
29
if (Z_ge_lt_dec h1 h2) then
33
let (l2', r2') := split v1 (snd s) in
34
join (union (l1,l2') _ _ _ _) v1 (union (r1,snd r2') _ _ _ _)
39
let (l1', r1') := split v2 (fst s) in
40
join (union (l1',l2) _ _ _ _) v2 (union (snd r1',r2) _ _ _ _)