type __ = Obj.t let __ = let rec f _ = Obj.repr f in Obj.repr f (** val negb : bool -> bool **) let negb = function | true -> false | false -> true type nat = | O | S of nat type 'a option = | Some of 'a | None (** val fst : ('a1 * 'a2) -> 'a1 **) let fst = function | (x, _) -> x (** val snd : ('a1 * 'a2) -> 'a2 **) let snd = function | (_, y) -> y type 'a list = | Nil | Cons of 'a * 'a list (** val app : 'a1 list -> 'a1 list -> 'a1 list **) let rec app l m = match l with | Nil -> m | Cons (a, l1) -> Cons (a, (app l1 m)) (** val compOpp : int -> int **) let compOpp = function | 0 -> 0 | (-1) -> 1 | 1 -> (-1) type sumbool = | Left | Right (** val add : nat -> nat -> nat **) let rec add n m = match n with | O -> m | S p -> S (add p m) type positive = | XI of positive | XO of positive | XH type z = | Z0 | Zpos of positive | Zneg of positive module type EqLtLe = sig type t end module MakeOrderTac = functor (O:EqLtLe) -> functor (P:sig end) -> struct end module Pos = struct (** val succ : positive -> positive **) let rec succ = function | XI p -> XO (succ p) | XO p -> XI p | XH -> XO XH (** val add : positive -> positive -> positive **) let rec add x y = match x with | XI p -> (match y with | XI q -> XO (add_carry p q) | XO q -> XI (add p q) | XH -> XO (succ p)) | XO p -> (match y with | XI q -> XI (add p q) | XO q -> XO (add p q) | XH -> XI p) | XH -> (match y with | XI q -> XO (succ q) | XO q -> XI q | XH -> XO XH) (** val add_carry : positive -> positive -> positive **) and add_carry x y = match x with | XI p -> (match y with | XI q -> XI (add_carry p q) | XO q -> XO (add_carry p q) | XH -> XI (succ p)) | XO p -> (match y with | XI q -> XO (add_carry p q) | XO q -> XI (add p q) | XH -> XO (succ p)) | XH -> (match y with | XI q -> XI (succ q) | XO q -> XO (succ q) | XH -> XI XH) (** val pred_double : positive -> positive **) let rec pred_double = function | XI p -> XI (XO p) | XO p -> XI (pred_double p) | XH -> XH (** val mul : positive -> positive -> positive **) let rec mul x y = match x with | XI p -> add y (XO (mul p y)) | XO p -> XO (mul p y) | XH -> y (** val compare_cont : int -> positive -> positive -> int **) let rec compare_cont r x y = match x with | XI p -> (match y with | XI q -> compare_cont r p q | XO q -> compare_cont 1 p q | XH -> 1) | XO p -> (match y with | XI q -> compare_cont (-1) p q | XO q -> compare_cont r p q | XH -> 1) | XH -> (match y with | XH -> r | _ -> (-1)) (** val compare : positive -> positive -> int **) let compare = compare_cont 0 (** val eqb : positive -> positive -> bool **) let rec eqb p q = match p with | XI p0 -> (match q with | XI q0 -> eqb p0 q0 | _ -> false) | XO p0 -> (match q with | XO q0 -> eqb p0 q0 | _ -> false) | XH -> (match q with | XH -> true | _ -> false) (** val eq_dec : positive -> positive -> sumbool **) let rec eq_dec p x0 = match p with | XI p0 -> (match x0 with | XI p1 -> eq_dec p0 p1 | _ -> Right) | XO p0 -> (match x0 with | XO p1 -> eq_dec p0 p1 | _ -> Right) | XH -> (match x0 with | XH -> Left | _ -> Right) end module Z = struct (** val double : z -> z **) let double = function | Z0 -> Z0 | Zpos p -> Zpos (XO p) | Zneg p -> Zneg (XO p) (** val succ_double : z -> z **) let succ_double = function | Z0 -> Zpos XH | Zpos p -> Zpos (XI p) | Zneg p -> Zneg (Pos.pred_double p) (** val pred_double : z -> z **) let pred_double = function | Z0 -> Zneg XH | Zpos p -> Zpos (Pos.pred_double p) | Zneg p -> Zneg (XI p) (** val pos_sub : positive -> positive -> z **) let rec pos_sub x y = match x with | XI p -> (match y with | XI q -> double (pos_sub p q) | XO q -> succ_double (pos_sub p q) | XH -> Zpos (XO p)) | XO p -> (match y with | XI q -> pred_double (pos_sub p q) | XO q -> double (pos_sub p q) | XH -> Zpos (Pos.pred_double p)) | XH -> (match y with | XI q -> Zneg (XO q) | XO q -> Zneg (Pos.pred_double q) | XH -> Z0) (** val add : z -> z -> z **) let add x y = match x with | Z0 -> y | Zpos x' -> (match y with | Z0 -> x | Zpos y' -> Zpos (Pos.add x' y') | Zneg y' -> pos_sub x' y') | Zneg x' -> (match y with | Z0 -> x | Zpos y' -> pos_sub y' x' | Zneg y' -> Zneg (Pos.add x' y')) (** val opp : z -> z **) let opp = function | Z0 -> Z0 | Zpos x0 -> Zneg x0 | Zneg x0 -> Zpos x0 (** val sub : z -> z -> z **) let sub m n = add m (opp n) (** val mul : z -> z -> z **) let mul x y = match x with | Z0 -> Z0 | Zpos x' -> (match y with | Z0 -> Z0 | Zpos y' -> Zpos (Pos.mul x' y') | Zneg y' -> Zneg (Pos.mul x' y')) | Zneg x' -> (match y with | Z0 -> Z0 | Zpos y' -> Zneg (Pos.mul x' y') | Zneg y' -> Zpos (Pos.mul x' y')) (** val compare : z -> z -> int **) let compare x y = match x with | Z0 -> (match y with | Z0 -> 0 | Zpos _ -> (-1) | Zneg _ -> 1) | Zpos x' -> (match y with | Zpos y' -> Pos.compare x' y' | _ -> 1) | Zneg x' -> (match y with | Zneg y' -> compOpp (Pos.compare x' y') | _ -> (-1)) (** val leb : z -> z -> bool **) let leb x y = match compare x y with | 1 -> false | _ -> true (** val ltb : z -> z -> bool **) let ltb x y = match compare x y with | (-1) -> true | _ -> false (** val eqb : z -> z -> bool **) let eqb x y = match x with | Z0 -> (match y with | Z0 -> true | _ -> false) | Zpos p -> (match y with | Zpos q -> Pos.eqb p q | _ -> false) | Zneg p -> (match y with | Zneg q -> Pos.eqb p q | _ -> false) (** val max : z -> z -> z **) let max n m = match compare n m with | (-1) -> m | _ -> n (** val eq_dec : z -> z -> sumbool **) let eq_dec x y = match x with | Z0 -> (match y with | Z0 -> Left | _ -> Right) | Zpos x0 -> (match y with | Zpos p0 -> Pos.eq_dec x0 p0 | _ -> Right) | Zneg x0 -> (match y with | Zneg p0 -> Pos.eq_dec x0 p0 | _ -> Right) end (** val rev : 'a1 list -> 'a1 list **) let rec rev = function | Nil -> Nil | Cons (x, l') -> app (rev l') (Cons (x, Nil)) (** val fold_left : ('a1 -> 'a2 -> 'a1) -> 'a2 list -> 'a1 -> 'a1 **) let rec fold_left f l a0 = match l with | Nil -> a0 | Cons (b, t0) -> fold_left f t0 (f a0 b) (** val fold_right : ('a2 -> 'a1 -> 'a1) -> 'a1 -> 'a2 list -> 'a1 **) let rec fold_right f a0 = function | Nil -> a0 | Cons (b, t0) -> f b (fold_right f a0 t0) (** val size : nat **) let size = S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S O)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) (** val lsl0 : Uint63.t -> Uint63.t -> Uint63.t **) let lsl0 = Uint63.l_sl (** val lsr0 : Uint63.t -> Uint63.t -> Uint63.t **) let lsr0 = Uint63.l_sr (** val lxor0 : Uint63.t -> Uint63.t -> Uint63.t **) let lxor0 = Uint63.l_xor (** val add0 : Uint63.t -> Uint63.t -> Uint63.t **) let add0 = Uint63.add (** val sub0 : Uint63.t -> Uint63.t -> Uint63.t **) let sub0 = Uint63.sub (** val eqb0 : Uint63.t -> Uint63.t -> bool **) let eqb0 = Uint63.equal (** val ltb0 : Uint63.t -> Uint63.t -> bool **) let ltb0 = Uint63.lt (** val leb0 : Uint63.t -> Uint63.t -> bool **) let leb0 = Uint63.le (** val digits : Uint63.t **) let digits = (Uint63.of_int (63)) (** val is_zero : Uint63.t -> bool **) let is_zero i = eqb0 i (Uint63.of_int (0)) (** val bit : Uint63.t -> Uint63.t -> bool **) let bit i n = negb (is_zero (lsl0 (lsr0 i n) (sub0 digits (Uint63.of_int (1))))) (** val compare0 : Uint63.t -> Uint63.t -> int **) let compare0 = Uint63.compare type 'x compare1 = | LT | EQ | GT module type OrderedType = sig type t val compare : t -> t -> t compare1 val eq_dec : t -> t -> sumbool end module OrderedTypeFacts = functor (O:OrderedType) -> struct module TO = struct type t = O.t end module IsTO = struct end module OrderTac = MakeOrderTac(TO)(IsTO) (** val eq_dec : O.t -> O.t -> sumbool **) let eq_dec = O.eq_dec (** val lt_dec : O.t -> O.t -> sumbool **) let lt_dec x y = match O.compare x y with | LT -> Left | _ -> Right (** val eqb : O.t -> O.t -> bool **) let eqb x y = match eq_dec x y with | Left -> true | Right -> false end module KeyOrderedType = functor (O:OrderedType) -> struct module MO = OrderedTypeFacts(O) end module Raw = functor (X:OrderedType) -> struct module MX = OrderedTypeFacts(X) module PX = KeyOrderedType(X) type key = X.t type 'elt t = (X.t * 'elt) list (** val empty : 'a1 t **) let empty = Nil (** val is_empty : 'a1 t -> bool **) let is_empty = function | Nil -> true | Cons (_, _) -> false (** val mem : key -> 'a1 t -> bool **) let rec mem k = function | Nil -> false | Cons (p, l) -> let (k', _) = p in (match X.compare k k' with | LT -> false | EQ -> true | GT -> mem k l) type 'elt coq_R_mem = | R_mem_0 of 'elt t | R_mem_1 of 'elt t * X.t * 'elt * (X.t * 'elt) list | R_mem_2 of 'elt t * X.t * 'elt * (X.t * 'elt) list | R_mem_3 of 'elt t * X.t * 'elt * (X.t * 'elt) list * bool * 'elt coq_R_mem (** val coq_R_mem_rect : key -> ('a1 t -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> bool -> 'a1 coq_R_mem -> 'a2 -> 'a2) -> 'a1 t -> bool -> 'a1 coq_R_mem -> 'a2 **) let rec coq_R_mem_rect k f f0 f1 f2 _ _ = function | R_mem_0 s -> f s __ | R_mem_1 (s, k', _x, l) -> f0 s k' _x l __ __ __ | R_mem_2 (s, k', _x, l) -> f1 s k' _x l __ __ __ | R_mem_3 (s, k', _x, l, _res, r0) -> f2 s k' _x l __ __ __ _res r0 (coq_R_mem_rect k f f0 f1 f2 l _res r0) (** val coq_R_mem_rec : key -> ('a1 t -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> bool -> 'a1 coq_R_mem -> 'a2 -> 'a2) -> 'a1 t -> bool -> 'a1 coq_R_mem -> 'a2 **) let rec coq_R_mem_rec k f f0 f1 f2 _ _ = function | R_mem_0 s -> f s __ | R_mem_1 (s, k', _x, l) -> f0 s k' _x l __ __ __ | R_mem_2 (s, k', _x, l) -> f1 s k' _x l __ __ __ | R_mem_3 (s, k', _x, l, _res, r0) -> f2 s k' _x l __ __ __ _res r0 (coq_R_mem_rec k f f0 f1 f2 l _res r0) (** val mem_rect : key -> ('a1 t -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2 -> 'a2) -> 'a1 t -> 'a2 **) let rec mem_rect k f2 f1 f0 f s = let f3 = f2 s in let f4 = f1 s in let f5 = f0 s in let f6 = f s in (match s with | Nil -> f3 __ | Cons (p, l) -> let (t0, e) = p in let f7 = f6 t0 e l __ in let f8 = fun _ _ -> let hrec = mem_rect k f2 f1 f0 f l in f7 __ __ hrec in let f9 = f5 t0 e l __ in let f10 = f4 t0 e l __ in (match X.compare k t0 with | LT -> f10 __ __ | EQ -> f9 __ __ | GT -> f8 __ __)) (** val mem_rec : key -> ('a1 t -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2 -> 'a2) -> 'a1 t -> 'a2 **) let mem_rec = mem_rect (** val coq_R_mem_correct : key -> 'a1 t -> bool -> 'a1 coq_R_mem **) let coq_R_mem_correct k s _res = Obj.magic mem_rect k (fun y _ _ _ -> R_mem_0 y) (fun y y0 y1 y2 _ _ _ _ _ -> R_mem_1 (y, y0, y1, y2)) (fun y y0 y1 y2 _ _ _ _ _ -> R_mem_2 (y, y0, y1, y2)) (fun y y0 y1 y2 _ _ _ y6 _ _ -> R_mem_3 (y, y0, y1, y2, (mem k y2), (y6 (mem k y2) __))) s _res __ (** val find : key -> 'a1 t -> 'a1 option **) let rec find k = function | Nil -> None | Cons (p, s') -> let (k', x) = p in (match X.compare k k' with | LT -> None | EQ -> Some x | GT -> find k s') type 'elt coq_R_find = | R_find_0 of 'elt t | R_find_1 of 'elt t * X.t * 'elt * (X.t * 'elt) list | R_find_2 of 'elt t * X.t * 'elt * (X.t * 'elt) list | R_find_3 of 'elt t * X.t * 'elt * (X.t * 'elt) list * 'elt option * 'elt coq_R_find (** val coq_R_find_rect : key -> ('a1 t -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a1 option -> 'a1 coq_R_find -> 'a2 -> 'a2) -> 'a1 t -> 'a1 option -> 'a1 coq_R_find -> 'a2 **) let rec coq_R_find_rect k f f0 f1 f2 _ _ = function | R_find_0 s -> f s __ | R_find_1 (s, k', x, s') -> f0 s k' x s' __ __ __ | R_find_2 (s, k', x, s') -> f1 s k' x s' __ __ __ | R_find_3 (s, k', x, s', _res, r0) -> f2 s k' x s' __ __ __ _res r0 (coq_R_find_rect k f f0 f1 f2 s' _res r0) (** val coq_R_find_rec : key -> ('a1 t -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a1 option -> 'a1 coq_R_find -> 'a2 -> 'a2) -> 'a1 t -> 'a1 option -> 'a1 coq_R_find -> 'a2 **) let rec coq_R_find_rec k f f0 f1 f2 _ _ = function | R_find_0 s -> f s __ | R_find_1 (s, k', x, s') -> f0 s k' x s' __ __ __ | R_find_2 (s, k', x, s') -> f1 s k' x s' __ __ __ | R_find_3 (s, k', x, s', _res, r0) -> f2 s k' x s' __ __ __ _res r0 (coq_R_find_rec k f f0 f1 f2 s' _res r0) (** val find_rect : key -> ('a1 t -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2 -> 'a2) -> 'a1 t -> 'a2 **) let rec find_rect k f2 f1 f0 f s = let f3 = f2 s in let f4 = f1 s in let f5 = f0 s in let f6 = f s in (match s with | Nil -> f3 __ | Cons (p, l) -> let (t0, e) = p in let f7 = f6 t0 e l __ in let f8 = fun _ _ -> let hrec = find_rect k f2 f1 f0 f l in f7 __ __ hrec in let f9 = f5 t0 e l __ in let f10 = f4 t0 e l __ in (match X.compare k t0 with | LT -> f10 __ __ | EQ -> f9 __ __ | GT -> f8 __ __)) (** val find_rec : key -> ('a1 t -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2 -> 'a2) -> 'a1 t -> 'a2 **) let find_rec = find_rect (** val coq_R_find_correct : key -> 'a1 t -> 'a1 option -> 'a1 coq_R_find **) let coq_R_find_correct k s _res = Obj.magic find_rect k (fun y _ _ _ -> R_find_0 y) (fun y y0 y1 y2 _ _ _ _ _ -> R_find_1 (y, y0, y1, y2)) (fun y y0 y1 y2 _ _ _ _ _ -> R_find_2 (y, y0, y1, y2)) (fun y y0 y1 y2 _ _ _ y6 _ _ -> R_find_3 (y, y0, y1, y2, (find k y2), (y6 (find k y2) __))) s _res __ (** val add : key -> 'a1 -> 'a1 t -> 'a1 t **) let rec add k x s = match s with | Nil -> Cons ((k, x), Nil) | Cons (p, l) -> let (k', y) = p in (match X.compare k k' with | LT -> Cons ((k, x), s) | EQ -> Cons ((k, x), l) | GT -> Cons ((k', y), (add k x l))) type 'elt coq_R_add = | R_add_0 of 'elt t | R_add_1 of 'elt t * X.t * 'elt * (X.t * 'elt) list | R_add_2 of 'elt t * X.t * 'elt * (X.t * 'elt) list | R_add_3 of 'elt t * X.t * 'elt * (X.t * 'elt) list * 'elt t * 'elt coq_R_add (** val coq_R_add_rect : key -> 'a1 -> ('a1 t -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a1 t -> 'a1 coq_R_add -> 'a2 -> 'a2) -> 'a1 t -> 'a1 t -> 'a1 coq_R_add -> 'a2 **) let rec coq_R_add_rect k x f f0 f1 f2 _ _ = function | R_add_0 s -> f s __ | R_add_1 (s, k', y, l) -> f0 s k' y l __ __ __ | R_add_2 (s, k', y, l) -> f1 s k' y l __ __ __ | R_add_3 (s, k', y, l, _res, r0) -> f2 s k' y l __ __ __ _res r0 (coq_R_add_rect k x f f0 f1 f2 l _res r0) (** val coq_R_add_rec : key -> 'a1 -> ('a1 t -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a1 t -> 'a1 coq_R_add -> 'a2 -> 'a2) -> 'a1 t -> 'a1 t -> 'a1 coq_R_add -> 'a2 **) let rec coq_R_add_rec k x f f0 f1 f2 _ _ = function | R_add_0 s -> f s __ | R_add_1 (s, k', y, l) -> f0 s k' y l __ __ __ | R_add_2 (s, k', y, l) -> f1 s k' y l __ __ __ | R_add_3 (s, k', y, l, _res, r0) -> f2 s k' y l __ __ __ _res r0 (coq_R_add_rec k x f f0 f1 f2 l _res r0) (** val add_rect : key -> 'a1 -> ('a1 t -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2 -> 'a2) -> 'a1 t -> 'a2 **) let rec add_rect k x f2 f1 f0 f s = let f3 = f2 s in let f4 = f1 s in let f5 = f0 s in let f6 = f s in (match s with | Nil -> f3 __ | Cons (p, l) -> let (t0, e) = p in let f7 = f6 t0 e l __ in let f8 = fun _ _ -> let hrec = add_rect k x f2 f1 f0 f l in f7 __ __ hrec in let f9 = f5 t0 e l __ in let f10 = f4 t0 e l __ in (match X.compare k t0 with | LT -> f10 __ __ | EQ -> f9 __ __ | GT -> f8 __ __)) (** val add_rec : key -> 'a1 -> ('a1 t -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2 -> 'a2) -> 'a1 t -> 'a2 **) let add_rec = add_rect (** val coq_R_add_correct : key -> 'a1 -> 'a1 t -> 'a1 t -> 'a1 coq_R_add **) let coq_R_add_correct k x s _res = add_rect k x (fun y _ _ _ -> R_add_0 y) (fun y y0 y1 y2 _ _ _ _ _ -> R_add_1 (y, y0, y1, y2)) (fun y y0 y1 y2 _ _ _ _ _ -> R_add_2 (y, y0, y1, y2)) (fun y y0 y1 y2 _ _ _ y6 _ _ -> R_add_3 (y, y0, y1, y2, (add k x y2), (y6 (add k x y2) __))) s _res __ (** val remove : key -> 'a1 t -> 'a1 t **) let rec remove k s = match s with | Nil -> Nil | Cons (p, l) -> let (k', x) = p in (match X.compare k k' with | LT -> s | EQ -> l | GT -> Cons ((k', x), (remove k l))) type 'elt coq_R_remove = | R_remove_0 of 'elt t | R_remove_1 of 'elt t * X.t * 'elt * (X.t * 'elt) list | R_remove_2 of 'elt t * X.t * 'elt * (X.t * 'elt) list | R_remove_3 of 'elt t * X.t * 'elt * (X.t * 'elt) list * 'elt t * 'elt coq_R_remove (** val coq_R_remove_rect : key -> ('a1 t -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a1 t -> 'a1 coq_R_remove -> 'a2 -> 'a2) -> 'a1 t -> 'a1 t -> 'a1 coq_R_remove -> 'a2 **) let rec coq_R_remove_rect k f f0 f1 f2 _ _ = function | R_remove_0 s -> f s __ | R_remove_1 (s, k', x, l) -> f0 s k' x l __ __ __ | R_remove_2 (s, k', x, l) -> f1 s k' x l __ __ __ | R_remove_3 (s, k', x, l, _res, r0) -> f2 s k' x l __ __ __ _res r0 (coq_R_remove_rect k f f0 f1 f2 l _res r0) (** val coq_R_remove_rec : key -> ('a1 t -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a1 t -> 'a1 coq_R_remove -> 'a2 -> 'a2) -> 'a1 t -> 'a1 t -> 'a1 coq_R_remove -> 'a2 **) let rec coq_R_remove_rec k f f0 f1 f2 _ _ = function | R_remove_0 s -> f s __ | R_remove_1 (s, k', x, l) -> f0 s k' x l __ __ __ | R_remove_2 (s, k', x, l) -> f1 s k' x l __ __ __ | R_remove_3 (s, k', x, l, _res, r0) -> f2 s k' x l __ __ __ _res r0 (coq_R_remove_rec k f f0 f1 f2 l _res r0) (** val remove_rect : key -> ('a1 t -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2 -> 'a2) -> 'a1 t -> 'a2 **) let rec remove_rect k f2 f1 f0 f s = let f3 = f2 s in let f4 = f1 s in let f5 = f0 s in let f6 = f s in (match s with | Nil -> f3 __ | Cons (p, l) -> let (t0, e) = p in let f7 = f6 t0 e l __ in let f8 = fun _ _ -> let hrec = remove_rect k f2 f1 f0 f l in f7 __ __ hrec in let f9 = f5 t0 e l __ in let f10 = f4 t0 e l __ in (match X.compare k t0 with | LT -> f10 __ __ | EQ -> f9 __ __ | GT -> f8 __ __)) (** val remove_rec : key -> ('a1 t -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2) -> ('a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2 -> 'a2) -> 'a1 t -> 'a2 **) let remove_rec = remove_rect (** val coq_R_remove_correct : key -> 'a1 t -> 'a1 t -> 'a1 coq_R_remove **) let coq_R_remove_correct k s _res = Obj.magic remove_rect k (fun y _ _ _ -> R_remove_0 y) (fun y y0 y1 y2 _ _ _ _ _ -> R_remove_1 (y, y0, y1, y2)) (fun y y0 y1 y2 _ _ _ _ _ -> R_remove_2 (y, y0, y1, y2)) (fun y y0 y1 y2 _ _ _ y6 _ _ -> R_remove_3 (y, y0, y1, y2, (remove k y2), (y6 (remove k y2) __))) s _res __ (** val elements : 'a1 t -> 'a1 t **) let elements m = m (** val fold : (key -> 'a1 -> 'a2 -> 'a2) -> 'a1 t -> 'a2 -> 'a2 **) let rec fold f m acc = match m with | Nil -> acc | Cons (p, m') -> let (k, e) = p in fold f m' (f k e acc) type ('elt, 'a) coq_R_fold = | R_fold_0 of 'elt t * 'a | R_fold_1 of 'elt t * 'a * X.t * 'elt * (X.t * 'elt) list * 'a * ('elt, 'a) coq_R_fold (** val coq_R_fold_rect : (key -> 'a1 -> 'a2 -> 'a2) -> ('a1 t -> 'a2 -> __ -> 'a3) -> ('a1 t -> 'a2 -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> 'a2 -> ('a1, 'a2) coq_R_fold -> 'a3 -> 'a3) -> 'a1 t -> 'a2 -> 'a2 -> ('a1, 'a2) coq_R_fold -> 'a3 **) let rec coq_R_fold_rect f f0 f1 _ _ _ = function | R_fold_0 (m, acc) -> f0 m acc __ | R_fold_1 (m, acc, k, e, m', _res, r0) -> f1 m acc k e m' __ _res r0 (coq_R_fold_rect f f0 f1 m' (f k e acc) _res r0) (** val coq_R_fold_rec : (key -> 'a1 -> 'a2 -> 'a2) -> ('a1 t -> 'a2 -> __ -> 'a3) -> ('a1 t -> 'a2 -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> 'a2 -> ('a1, 'a2) coq_R_fold -> 'a3 -> 'a3) -> 'a1 t -> 'a2 -> 'a2 -> ('a1, 'a2) coq_R_fold -> 'a3 **) let rec coq_R_fold_rec f f0 f1 _ _ _ = function | R_fold_0 (m, acc) -> f0 m acc __ | R_fold_1 (m, acc, k, e, m', _res, r0) -> f1 m acc k e m' __ _res r0 (coq_R_fold_rec f f0 f1 m' (f k e acc) _res r0) (** val fold_rect : (key -> 'a1 -> 'a2 -> 'a2) -> ('a1 t -> 'a2 -> __ -> 'a3) -> ('a1 t -> 'a2 -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> 'a3 -> 'a3) -> 'a1 t -> 'a2 -> 'a3 **) let rec fold_rect f1 f0 f m acc = let f2 = f0 m acc in let f3 = f m acc in (match m with | Nil -> f2 __ | Cons (p, l) -> let (t0, e) = p in let f4 = f3 t0 e l __ in let hrec = fold_rect f1 f0 f l (f1 t0 e acc) in f4 hrec) (** val fold_rec : (key -> 'a1 -> 'a2 -> 'a2) -> ('a1 t -> 'a2 -> __ -> 'a3) -> ('a1 t -> 'a2 -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> 'a3 -> 'a3) -> 'a1 t -> 'a2 -> 'a3 **) let fold_rec = fold_rect (** val coq_R_fold_correct : (key -> 'a1 -> 'a2 -> 'a2) -> 'a1 t -> 'a2 -> 'a2 -> ('a1, 'a2) coq_R_fold **) let coq_R_fold_correct f m acc _res = fold_rect f (fun y y0 _ _ _ -> R_fold_0 (y, y0)) (fun y y0 y1 y2 y3 _ y5 _ _ -> R_fold_1 (y, y0, y1, y2, y3, (fold f y3 (f y1 y2 y0)), (y5 (fold f y3 (f y1 y2 y0)) __))) m acc _res __ (** val equal : ('a1 -> 'a1 -> bool) -> 'a1 t -> 'a1 t -> bool **) let rec equal cmp m m' = match m with | Nil -> (match m' with | Nil -> true | Cons (_, _) -> false) | Cons (p, l) -> let (x, e) = p in (match m' with | Nil -> false | Cons (p0, l') -> let (x', e') = p0 in (match X.compare x x' with | EQ -> if cmp e e' then equal cmp l l' else false | _ -> false)) type 'elt coq_R_equal = | R_equal_0 of 'elt t * 'elt t | R_equal_1 of 'elt t * 'elt t * X.t * 'elt * (X.t * 'elt) list * X.t * 'elt * (X.t * 'elt) list * bool * 'elt coq_R_equal | R_equal_2 of 'elt t * 'elt t * X.t * 'elt * (X.t * 'elt) list * X.t * 'elt * (X.t * 'elt) list * X.t compare1 | R_equal_3 of 'elt t * 'elt t * 'elt t * 'elt t (** val coq_R_equal_rect : ('a1 -> 'a1 -> bool) -> ('a1 t -> 'a1 t -> __ -> __ -> 'a2) -> ('a1 t -> 'a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> bool -> 'a1 coq_R_equal -> 'a2 -> 'a2) -> ('a1 t -> 'a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> X.t compare1 -> __ -> __ -> 'a2) -> ('a1 t -> 'a1 t -> 'a1 t -> __ -> 'a1 t -> __ -> __ -> 'a2) -> 'a1 t -> 'a1 t -> bool -> 'a1 coq_R_equal -> 'a2 **) let rec coq_R_equal_rect cmp f f0 f1 f2 _ _ _ = function | R_equal_0 (m, m') -> f m m' __ __ | R_equal_1 (m, m', x, e, l, x', e', l', _res, r0) -> f0 m m' x e l __ x' e' l' __ __ __ _res r0 (coq_R_equal_rect cmp f f0 f1 f2 l l' _res r0) | R_equal_2 (m, m', x, e, l, x', e', l', _x) -> f1 m m' x e l __ x' e' l' __ _x __ __ | R_equal_3 (m, m', _x, _x0) -> f2 m m' _x __ _x0 __ __ (** val coq_R_equal_rec : ('a1 -> 'a1 -> bool) -> ('a1 t -> 'a1 t -> __ -> __ -> 'a2) -> ('a1 t -> 'a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> bool -> 'a1 coq_R_equal -> 'a2 -> 'a2) -> ('a1 t -> 'a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> X.t compare1 -> __ -> __ -> 'a2) -> ('a1 t -> 'a1 t -> 'a1 t -> __ -> 'a1 t -> __ -> __ -> 'a2) -> 'a1 t -> 'a1 t -> bool -> 'a1 coq_R_equal -> 'a2 **) let rec coq_R_equal_rec cmp f f0 f1 f2 _ _ _ = function | R_equal_0 (m, m') -> f m m' __ __ | R_equal_1 (m, m', x, e, l, x', e', l', _res, r0) -> f0 m m' x e l __ x' e' l' __ __ __ _res r0 (coq_R_equal_rec cmp f f0 f1 f2 l l' _res r0) | R_equal_2 (m, m', x, e, l, x', e', l', _x) -> f1 m m' x e l __ x' e' l' __ _x __ __ | R_equal_3 (m, m', _x, _x0) -> f2 m m' _x __ _x0 __ __ (** val equal_rect : ('a1 -> 'a1 -> bool) -> ('a1 t -> 'a1 t -> __ -> __ -> 'a2) -> ('a1 t -> 'a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2 -> 'a2) -> ('a1 t -> 'a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> X.t compare1 -> __ -> __ -> 'a2) -> ('a1 t -> 'a1 t -> 'a1 t -> __ -> 'a1 t -> __ -> __ -> 'a2) -> 'a1 t -> 'a1 t -> 'a2 **) let rec equal_rect cmp f2 f1 f0 f m m' = let f3 = f2 m m' in let f4 = f1 m m' in let f5 = f0 m m' in let f6 = f m m' in let f7 = f6 m __ in let f8 = f7 m' __ in (match m with | Nil -> let f9 = f3 __ in (match m' with | Nil -> f9 __ | Cons (_, _) -> f8 __) | Cons (p, l) -> let (t0, e) = p in let f9 = f5 t0 e l __ in let f10 = f4 t0 e l __ in (match m' with | Nil -> f8 __ | Cons (p0, l0) -> let (t1, e0) = p0 in let f11 = f9 t1 e0 l0 __ in let f12 = let _x = X.compare t0 t1 in f11 _x __ in let f13 = f10 t1 e0 l0 __ in let f14 = fun _ _ -> let hrec = equal_rect cmp f2 f1 f0 f l l0 in f13 __ __ hrec in (match X.compare t0 t1 with | EQ -> f14 __ __ | _ -> f12 __))) (** val equal_rec : ('a1 -> 'a1 -> bool) -> ('a1 t -> 'a1 t -> __ -> __ -> 'a2) -> ('a1 t -> 'a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> __ -> __ -> 'a2 -> 'a2) -> ('a1 t -> 'a1 t -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> X.t -> 'a1 -> (X.t * 'a1) list -> __ -> X.t compare1 -> __ -> __ -> 'a2) -> ('a1 t -> 'a1 t -> 'a1 t -> __ -> 'a1 t -> __ -> __ -> 'a2) -> 'a1 t -> 'a1 t -> 'a2 **) let equal_rec = equal_rect (** val coq_R_equal_correct : ('a1 -> 'a1 -> bool) -> 'a1 t -> 'a1 t -> bool -> 'a1 coq_R_equal **) let coq_R_equal_correct cmp m m' _res = equal_rect cmp (fun y y0 _ _ _ _ -> R_equal_0 (y, y0)) (fun y y0 y1 y2 y3 _ y5 y6 y7 _ _ _ y11 _ _ -> R_equal_1 (y, y0, y1, y2, y3, y5, y6, y7, (equal cmp y3 y7), (y11 (equal cmp y3 y7) __))) (fun y y0 y1 y2 y3 _ y5 y6 y7 _ y9 _ _ _ _ -> R_equal_2 (y, y0, y1, y2, y3, y5, y6, y7, y9)) (fun y y0 y1 _ y3 _ _ _ _ -> R_equal_3 (y, y0, y1, y3)) m m' _res __ (** val map : ('a1 -> 'a2) -> 'a1 t -> 'a2 t **) let rec map f = function | Nil -> Nil | Cons (p, m') -> let (k, e) = p in Cons ((k, (f e)), (map f m')) (** val mapi : (key -> 'a1 -> 'a2) -> 'a1 t -> 'a2 t **) let rec mapi f = function | Nil -> Nil | Cons (p, m') -> let (k, e) = p in Cons ((k, (f k e)), (mapi f m')) (** val option_cons : key -> 'a1 option -> (key * 'a1) list -> (key * 'a1) list **) let option_cons k o l = match o with | Some e -> Cons ((k, e), l) | None -> l (** val map2_l : ('a1 option -> 'a2 option -> 'a3 option) -> 'a1 t -> 'a3 t **) let rec map2_l f = function | Nil -> Nil | Cons (p, l) -> let (k, e) = p in option_cons k (f (Some e) None) (map2_l f l) (** val map2_r : ('a1 option -> 'a2 option -> 'a3 option) -> 'a2 t -> 'a3 t **) let rec map2_r f = function | Nil -> Nil | Cons (p, l') -> let (k, e') = p in option_cons k (f None (Some e')) (map2_r f l') (** val map2 : ('a1 option -> 'a2 option -> 'a3 option) -> 'a1 t -> 'a2 t -> 'a3 t **) let rec map2 f m = match m with | Nil -> map2_r f | Cons (p, l) -> let (k, e) = p in let rec map2_aux m' = match m' with | Nil -> map2_l f m | Cons (p0, l') -> let (k', e') = p0 in (match X.compare k k' with | LT -> option_cons k (f (Some e) None) (map2 f l m') | EQ -> option_cons k (f (Some e) (Some e')) (map2 f l l') | GT -> option_cons k' (f None (Some e')) (map2_aux l')) in map2_aux (** val combine : 'a1 t -> 'a2 t -> ('a1 option * 'a2 option) t **) let rec combine m = match m with | Nil -> map (fun e' -> (None, (Some e'))) | Cons (p, l) -> let (k, e) = p in let rec combine_aux m' = match m' with | Nil -> map (fun e0 -> ((Some e0), None)) m | Cons (p0, l') -> let (k', e') = p0 in (match X.compare k k' with | LT -> Cons ((k, ((Some e), None)), (combine l m')) | EQ -> Cons ((k, ((Some e), (Some e'))), (combine l l')) | GT -> Cons ((k', (None, (Some e'))), (combine_aux l'))) in combine_aux (** val fold_right_pair : ('a1 -> 'a2 -> 'a3 -> 'a3) -> ('a1 * 'a2) list -> 'a3 -> 'a3 **) let fold_right_pair f l i = fold_right (fun p -> f (fst p) (snd p)) i l (** val map2_alt : ('a1 option -> 'a2 option -> 'a3 option) -> 'a1 t -> 'a2 t -> (key * 'a3) list **) let map2_alt f m m' = let m0 = combine m m' in let m1 = map (fun p -> f (fst p) (snd p)) m0 in fold_right_pair option_cons m1 Nil (** val at_least_one : 'a1 option -> 'a2 option -> ('a1 option * 'a2 option) option **) let at_least_one o o' = match o with | Some _ -> Some (o, o') | None -> (match o' with | Some _ -> Some (o, o') | None -> None) (** val at_least_one_then_f : ('a1 option -> 'a2 option -> 'a3 option) -> 'a1 option -> 'a2 option -> 'a3 option **) let at_least_one_then_f f o o' = match o with | Some _ -> f o o' | None -> (match o' with | Some _ -> f o o' | None -> None) end module type Int = sig type t val i2z : t -> z val _0 : t val _1 : t val _2 : t val _3 : t val add : t -> t -> t val opp : t -> t val sub : t -> t -> t val mul : t -> t -> t val max : t -> t -> t val eqb : t -> t -> bool val ltb : t -> t -> bool val leb : t -> t -> bool val gt_le_dec : t -> t -> sumbool val ge_lt_dec : t -> t -> sumbool val eq_dec : t -> t -> sumbool end module Z_as_Int = struct type t = z (** val _0 : z **) let _0 = Z0 (** val _1 : z **) let _1 = Zpos XH (** val _2 : z **) let _2 = Zpos (XO XH) (** val _3 : z **) let _3 = Zpos (XI XH) (** val add : z -> z -> z **) let add = Z.add (** val opp : z -> z **) let opp = Z.opp (** val sub : z -> z -> z **) let sub = Z.sub (** val mul : z -> z -> z **) let mul = Z.mul (** val max : z -> z -> z **) let max = Z.max (** val eqb : z -> z -> bool **) let eqb = Z.eqb (** val ltb : z -> z -> bool **) let ltb = Z.ltb (** val leb : z -> z -> bool **) let leb = Z.leb (** val eq_dec : z -> z -> sumbool **) let eq_dec = Z.eq_dec (** val gt_le_dec : z -> z -> sumbool **) let gt_le_dec i j = let b = Z.ltb j i in if b then Left else Right (** val ge_lt_dec : z -> z -> sumbool **) let ge_lt_dec i j = let b = Z.ltb i j in if b then Right else Left (** val i2z : t -> z **) let i2z n = n end module Coq_Raw = functor (I:Int) -> functor (X:OrderedType) -> struct type key = X.t type 'elt tree = | Leaf | Node of 'elt tree * key * 'elt * 'elt tree * I.t (** val tree_rect : 'a2 -> ('a1 tree -> 'a2 -> key -> 'a1 -> 'a1 tree -> 'a2 -> I.t -> 'a2) -> 'a1 tree -> 'a2 **) let rec tree_rect f f0 = function | Leaf -> f | Node (t1, k, y, t2, t3) -> f0 t1 (tree_rect f f0 t1) k y t2 (tree_rect f f0 t2) t3 (** val tree_rec : 'a2 -> ('a1 tree -> 'a2 -> key -> 'a1 -> 'a1 tree -> 'a2 -> I.t -> 'a2) -> 'a1 tree -> 'a2 **) let rec tree_rec f f0 = function | Leaf -> f | Node (t1, k, y, t2, t3) -> f0 t1 (tree_rec f f0 t1) k y t2 (tree_rec f f0 t2) t3 (** val height : 'a1 tree -> I.t **) let height = function | Leaf -> I._0 | Node (_, _, _, _, h) -> h (** val cardinal : 'a1 tree -> nat **) let rec cardinal = function | Leaf -> O | Node (l, _, _, r, _) -> S (add (cardinal l) (cardinal r)) (** val empty : 'a1 tree **) let empty = Leaf (** val is_empty : 'a1 tree -> bool **) let is_empty = function | Leaf -> true | Node (_, _, _, _, _) -> false (** val mem : X.t -> 'a1 tree -> bool **) let rec mem x = function | Leaf -> false | Node (l, y, _, r, _) -> (match X.compare x y with | LT -> mem x l | EQ -> true | GT -> mem x r) (** val find : X.t -> 'a1 tree -> 'a1 option **) let rec find x = function | Leaf -> None | Node (l, y, d, r, _) -> (match X.compare x y with | LT -> find x l | EQ -> Some d | GT -> find x r) (** val create : 'a1 tree -> key -> 'a1 -> 'a1 tree -> 'a1 tree **) let create l x e r = Node (l, x, e, r, (I.add (I.max (height l) (height r)) I._1)) (** val assert_false : 'a1 tree -> key -> 'a1 -> 'a1 tree -> 'a1 tree **) let assert_false = create (** val bal : 'a1 tree -> key -> 'a1 -> 'a1 tree -> 'a1 tree **) let bal l x d r = let hl = height l in let hr = height r in (match I.gt_le_dec hl (I.add hr I._2) with | Left -> (match l with | Leaf -> assert_false l x d r | Node (ll, lx, ld, lr, _) -> (match I.ge_lt_dec (height ll) (height lr) with | Left -> create ll lx ld (create lr x d r) | Right -> (match lr with | Leaf -> assert_false l x d r | Node (lrl, lrx, lrd, lrr, _) -> create (create ll lx ld lrl) lrx lrd (create lrr x d r)))) | Right -> (match I.gt_le_dec hr (I.add hl I._2) with | Left -> (match r with | Leaf -> assert_false l x d r | Node (rl, rx, rd, rr, _) -> (match I.ge_lt_dec (height rr) (height rl) with | Left -> create (create l x d rl) rx rd rr | Right -> (match rl with | Leaf -> assert_false l x d r | Node (rll, rlx, rld, rlr, _) -> create (create l x d rll) rlx rld (create rlr rx rd rr)))) | Right -> create l x d r)) (** val add : key -> 'a1 -> 'a1 tree -> 'a1 tree **) let rec add x d = function | Leaf -> Node (Leaf, x, d, Leaf, I._1) | Node (l, y, d', r, h) -> (match X.compare x y with | LT -> bal (add x d l) y d' r | EQ -> Node (l, y, d, r, h) | GT -> bal l y d' (add x d r)) (** val remove_min : 'a1 tree -> key -> 'a1 -> 'a1 tree -> 'a1 tree * (key * 'a1) **) let rec remove_min l x d r = match l with | Leaf -> (r, (x, d)) | Node (ll, lx, ld, lr, _) -> let (l', m) = remove_min ll lx ld lr in ((bal l' x d r), m) (** val merge : 'a1 tree -> 'a1 tree -> 'a1 tree **) let merge s1 s2 = match s1 with | Leaf -> s2 | Node (_, _, _, _, _) -> (match s2 with | Leaf -> s1 | Node (l2, x2, d2, r2, _) -> let (s2', p) = remove_min l2 x2 d2 r2 in let (x, d) = p in bal s1 x d s2') (** val remove : X.t -> 'a1 tree -> 'a1 tree **) let rec remove x = function | Leaf -> Leaf | Node (l, y, d, r, _) -> (match X.compare x y with | LT -> bal (remove x l) y d r | EQ -> merge l r | GT -> bal l y d (remove x r)) (** val join : 'a1 tree -> key -> 'a1 -> 'a1 tree -> 'a1 tree **) let rec join l = match l with | Leaf -> add | Node (ll, lx, ld, lr, lh) -> (fun x d -> let rec join_aux r = match r with | Leaf -> add x d l | Node (rl, rx, rd, rr, rh) -> (match I.gt_le_dec lh (I.add rh I._2) with | Left -> bal ll lx ld (join lr x d r) | Right -> (match I.gt_le_dec rh (I.add lh I._2) with | Left -> bal (join_aux rl) rx rd rr | Right -> create l x d r)) in join_aux) type 'elt triple = { t_left : 'elt tree; t_opt : 'elt option; t_right : 'elt tree } (** val t_left : 'a1 triple -> 'a1 tree **) let t_left t0 = t0.t_left (** val t_opt : 'a1 triple -> 'a1 option **) let t_opt t0 = t0.t_opt (** val t_right : 'a1 triple -> 'a1 tree **) let t_right t0 = t0.t_right (** val split : X.t -> 'a1 tree -> 'a1 triple **) let rec split x = function | Leaf -> { t_left = Leaf; t_opt = None; t_right = Leaf } | Node (l, y, d, r, _) -> (match X.compare x y with | LT -> let { t_left = ll; t_opt = o; t_right = rl } = split x l in { t_left = ll; t_opt = o; t_right = (join rl y d r) } | EQ -> { t_left = l; t_opt = (Some d); t_right = r } | GT -> let { t_left = rl; t_opt = o; t_right = rr } = split x r in { t_left = (join l y d rl); t_opt = o; t_right = rr }) (** val concat : 'a1 tree -> 'a1 tree -> 'a1 tree **) let concat m1 m2 = match m1 with | Leaf -> m2 | Node (_, _, _, _, _) -> (match m2 with | Leaf -> m1 | Node (l2, x2, d2, r2, _) -> let (m2', xd) = remove_min l2 x2 d2 r2 in join m1 (fst xd) (snd xd) m2') (** val elements_aux : (key * 'a1) list -> 'a1 tree -> (key * 'a1) list **) let rec elements_aux acc = function | Leaf -> acc | Node (l, x, d, r, _) -> elements_aux (Cons ((x, d), (elements_aux acc r))) l (** val elements : 'a1 tree -> (key * 'a1) list **) let elements m = elements_aux Nil m (** val fold : (key -> 'a1 -> 'a2 -> 'a2) -> 'a1 tree -> 'a2 -> 'a2 **) let rec fold f m a = match m with | Leaf -> a | Node (l, x, d, r, _) -> fold f r (f x d (fold f l a)) type 'elt enumeration = | End | More of key * 'elt * 'elt tree * 'elt enumeration (** val enumeration_rect : 'a2 -> (key -> 'a1 -> 'a1 tree -> 'a1 enumeration -> 'a2 -> 'a2) -> 'a1 enumeration -> 'a2 **) let rec enumeration_rect f f0 = function | End -> f | More (k, e0, t0, e1) -> f0 k e0 t0 e1 (enumeration_rect f f0 e1) (** val enumeration_rec : 'a2 -> (key -> 'a1 -> 'a1 tree -> 'a1 enumeration -> 'a2 -> 'a2) -> 'a1 enumeration -> 'a2 **) let rec enumeration_rec f f0 = function | End -> f | More (k, e0, t0, e1) -> f0 k e0 t0 e1 (enumeration_rec f f0 e1) (** val cons : 'a1 tree -> 'a1 enumeration -> 'a1 enumeration **) let rec cons m e = match m with | Leaf -> e | Node (l, x, d, r, _) -> cons l (More (x, d, r, e)) (** val equal_more : ('a1 -> 'a1 -> bool) -> X.t -> 'a1 -> ('a1 enumeration -> bool) -> 'a1 enumeration -> bool **) let equal_more cmp x1 d1 cont = function | End -> false | More (x2, d2, r2, e3) -> (match X.compare x1 x2 with | EQ -> if cmp d1 d2 then cont (cons r2 e3) else false | _ -> false) (** val equal_cont : ('a1 -> 'a1 -> bool) -> 'a1 tree -> ('a1 enumeration -> bool) -> 'a1 enumeration -> bool **) let rec equal_cont cmp m1 cont e2 = match m1 with | Leaf -> cont e2 | Node (l1, x1, d1, r1, _) -> equal_cont cmp l1 (equal_more cmp x1 d1 (equal_cont cmp r1 cont)) e2 (** val equal_end : 'a1 enumeration -> bool **) let equal_end = function | End -> true | More (_, _, _, _) -> false (** val equal : ('a1 -> 'a1 -> bool) -> 'a1 tree -> 'a1 tree -> bool **) let equal cmp m1 m2 = equal_cont cmp m1 equal_end (cons m2 End) (** val map : ('a1 -> 'a2) -> 'a1 tree -> 'a2 tree **) let rec map f = function | Leaf -> Leaf | Node (l, x, d, r, h) -> Node ((map f l), x, (f d), (map f r), h) (** val mapi : (key -> 'a1 -> 'a2) -> 'a1 tree -> 'a2 tree **) let rec mapi f = function | Leaf -> Leaf | Node (l, x, d, r, h) -> Node ((mapi f l), x, (f x d), (mapi f r), h) (** val map_option : (key -> 'a1 -> 'a2 option) -> 'a1 tree -> 'a2 tree **) let rec map_option f = function | Leaf -> Leaf | Node (l, x, d, r, _) -> (match f x d with | Some d' -> join (map_option f l) x d' (map_option f r) | None -> concat (map_option f l) (map_option f r)) (** val map2_opt : (key -> 'a1 -> 'a2 option -> 'a3 option) -> ('a1 tree -> 'a3 tree) -> ('a2 tree -> 'a3 tree) -> 'a1 tree -> 'a2 tree -> 'a3 tree **) let rec map2_opt f mapl mapr m1 m2 = match m1 with | Leaf -> mapr m2 | Node (l1, x1, d1, r1, _) -> (match m2 with | Leaf -> mapl m1 | Node (_, _, _, _, _) -> let { t_left = l2'; t_opt = o2; t_right = r2' } = split x1 m2 in (match f x1 d1 o2 with | Some e -> join (map2_opt f mapl mapr l1 l2') x1 e (map2_opt f mapl mapr r1 r2') | None -> concat (map2_opt f mapl mapr l1 l2') (map2_opt f mapl mapr r1 r2'))) (** val map2 : ('a1 option -> 'a2 option -> 'a3 option) -> 'a1 tree -> 'a2 tree -> 'a3 tree **) let map2 f = map2_opt (fun _ d o -> f (Some d) o) (map_option (fun _ d -> f (Some d) None)) (map_option (fun _ d' -> f None (Some d'))) module Proofs = struct module MX = OrderedTypeFacts(X) module PX = KeyOrderedType(X) module L = Raw(X) type 'elt coq_R_mem = | R_mem_0 of 'elt tree | R_mem_1 of 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t * bool * 'elt coq_R_mem | R_mem_2 of 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t | R_mem_3 of 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t * bool * 'elt coq_R_mem (** val coq_R_mem_rect : X.t -> ('a1 tree -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> bool -> 'a1 coq_R_mem -> 'a2 -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> bool -> 'a1 coq_R_mem -> 'a2 -> 'a2) -> 'a1 tree -> bool -> 'a1 coq_R_mem -> 'a2 **) let rec coq_R_mem_rect x f f0 f1 f2 _ _ = function | R_mem_0 m -> f m __ | R_mem_1 (m, l, y, _x, r0, _x0, _res, r1) -> f0 m l y _x r0 _x0 __ __ __ _res r1 (coq_R_mem_rect x f f0 f1 f2 l _res r1) | R_mem_2 (m, l, y, _x, r0, _x0) -> f1 m l y _x r0 _x0 __ __ __ | R_mem_3 (m, l, y, _x, r0, _x0, _res, r1) -> f2 m l y _x r0 _x0 __ __ __ _res r1 (coq_R_mem_rect x f f0 f1 f2 r0 _res r1) (** val coq_R_mem_rec : X.t -> ('a1 tree -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> bool -> 'a1 coq_R_mem -> 'a2 -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> bool -> 'a1 coq_R_mem -> 'a2 -> 'a2) -> 'a1 tree -> bool -> 'a1 coq_R_mem -> 'a2 **) let rec coq_R_mem_rec x f f0 f1 f2 _ _ = function | R_mem_0 m -> f m __ | R_mem_1 (m, l, y, _x, r0, _x0, _res, r1) -> f0 m l y _x r0 _x0 __ __ __ _res r1 (coq_R_mem_rec x f f0 f1 f2 l _res r1) | R_mem_2 (m, l, y, _x, r0, _x0) -> f1 m l y _x r0 _x0 __ __ __ | R_mem_3 (m, l, y, _x, r0, _x0, _res, r1) -> f2 m l y _x r0 _x0 __ __ __ _res r1 (coq_R_mem_rec x f f0 f1 f2 r0 _res r1) type 'elt coq_R_find = | R_find_0 of 'elt tree | R_find_1 of 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t * 'elt option * 'elt coq_R_find | R_find_2 of 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t | R_find_3 of 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t * 'elt option * 'elt coq_R_find (** val coq_R_find_rect : X.t -> ('a1 tree -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a1 option -> 'a1 coq_R_find -> 'a2 -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a1 option -> 'a1 coq_R_find -> 'a2 -> 'a2) -> 'a1 tree -> 'a1 option -> 'a1 coq_R_find -> 'a2 **) let rec coq_R_find_rect x f f0 f1 f2 _ _ = function | R_find_0 m -> f m __ | R_find_1 (m, l, y, d, r0, _x, _res, r1) -> f0 m l y d r0 _x __ __ __ _res r1 (coq_R_find_rect x f f0 f1 f2 l _res r1) | R_find_2 (m, l, y, d, r0, _x) -> f1 m l y d r0 _x __ __ __ | R_find_3 (m, l, y, d, r0, _x, _res, r1) -> f2 m l y d r0 _x __ __ __ _res r1 (coq_R_find_rect x f f0 f1 f2 r0 _res r1) (** val coq_R_find_rec : X.t -> ('a1 tree -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a1 option -> 'a1 coq_R_find -> 'a2 -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a1 option -> 'a1 coq_R_find -> 'a2 -> 'a2) -> 'a1 tree -> 'a1 option -> 'a1 coq_R_find -> 'a2 **) let rec coq_R_find_rec x f f0 f1 f2 _ _ = function | R_find_0 m -> f m __ | R_find_1 (m, l, y, d, r0, _x, _res, r1) -> f0 m l y d r0 _x __ __ __ _res r1 (coq_R_find_rec x f f0 f1 f2 l _res r1) | R_find_2 (m, l, y, d, r0, _x) -> f1 m l y d r0 _x __ __ __ | R_find_3 (m, l, y, d, r0, _x, _res, r1) -> f2 m l y d r0 _x __ __ __ _res r1 (coq_R_find_rec x f f0 f1 f2 r0 _res r1) type 'elt coq_R_bal = | R_bal_0 of 'elt tree * key * 'elt * 'elt tree | R_bal_1 of 'elt tree * key * 'elt * 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t | R_bal_2 of 'elt tree * key * 'elt * 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t | R_bal_3 of 'elt tree * key * 'elt * 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t * 'elt tree * key * 'elt * 'elt tree * I.t | R_bal_4 of 'elt tree * key * 'elt * 'elt tree | R_bal_5 of 'elt tree * key * 'elt * 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t | R_bal_6 of 'elt tree * key * 'elt * 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t | R_bal_7 of 'elt tree * key * 'elt * 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t * 'elt tree * key * 'elt * 'elt tree * I.t | R_bal_8 of 'elt tree * key * 'elt * 'elt tree (** val coq_R_bal_rect : ('a1 tree -> key -> 'a1 -> 'a1 tree -> __ -> __ -> __ -> 'a2) -> ('a1 tree -> key -> 'a1 -> 'a1 tree -> __ -> __ -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a2) -> ('a1 tree -> key -> 'a1 -> 'a1 tree -> __ -> __ -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> __ -> 'a2) -> ('a1 tree -> key -> 'a1 -> 'a1 tree -> __ -> __ -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> 'a2) -> ('a1 tree -> key -> 'a1 -> 'a1 tree -> __ -> __ -> __ -> __ -> __ -> 'a2) -> ('a1 tree -> key -> 'a1 -> 'a1 tree -> __ -> __ -> __ -> __ -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a2) -> ('a1 tree -> key -> 'a1 -> 'a1 tree -> __ -> __ -> __ -> __ -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> __ -> 'a2) -> ('a1 tree -> key -> 'a1 -> 'a1 tree -> __ -> __ -> __ -> __ -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> 'a2) -> ('a1 tree -> key -> 'a1 -> 'a1 tree -> __ -> __ -> __ -> __ -> 'a2) -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> 'a1 tree -> 'a1 coq_R_bal -> 'a2 **) let coq_R_bal_rect f f0 f1 f2 f3 f4 f5 f6 f7 _ _ _ _ _ = function | R_bal_0 (x, x0, x1, x2) -> f x x0 x1 x2 __ __ __ | R_bal_1 (x, x0, x1, x2, x3, x4, x5, x6, x7) -> f0 x x0 x1 x2 __ __ x3 x4 x5 x6 x7 __ __ __ | R_bal_2 (x, x0, x1, x2, x3, x4, x5, x6, x7) -> f1 x x0 x1 x2 __ __ x3 x4 x5 x6 x7 __ __ __ __ | R_bal_3 (x, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12) -> f2 x x0 x1 x2 __ __ x3 x4 x5 x6 x7 __ __ __ x8 x9 x10 x11 x12 __ | R_bal_4 (x, x0, x1, x2) -> f3 x x0 x1 x2 __ __ __ __ __ | R_bal_5 (x, x0, x1, x2, x3, x4, x5, x6, x7) -> f4 x x0 x1 x2 __ __ __ __ x3 x4 x5 x6 x7 __ __ __ | R_bal_6 (x, x0, x1, x2, x3, x4, x5, x6, x7) -> f5 x x0 x1 x2 __ __ __ __ x3 x4 x5 x6 x7 __ __ __ __ | R_bal_7 (x, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12) -> f6 x x0 x1 x2 __ __ __ __ x3 x4 x5 x6 x7 __ __ __ x8 x9 x10 x11 x12 __ | R_bal_8 (x, x0, x1, x2) -> f7 x x0 x1 x2 __ __ __ __ (** val coq_R_bal_rec : ('a1 tree -> key -> 'a1 -> 'a1 tree -> __ -> __ -> __ -> 'a2) -> ('a1 tree -> key -> 'a1 -> 'a1 tree -> __ -> __ -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a2) -> ('a1 tree -> key -> 'a1 -> 'a1 tree -> __ -> __ -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> __ -> 'a2) -> ('a1 tree -> key -> 'a1 -> 'a1 tree -> __ -> __ -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> 'a2) -> ('a1 tree -> key -> 'a1 -> 'a1 tree -> __ -> __ -> __ -> __ -> __ -> 'a2) -> ('a1 tree -> key -> 'a1 -> 'a1 tree -> __ -> __ -> __ -> __ -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a2) -> ('a1 tree -> key -> 'a1 -> 'a1 tree -> __ -> __ -> __ -> __ -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> __ -> 'a2) -> ('a1 tree -> key -> 'a1 -> 'a1 tree -> __ -> __ -> __ -> __ -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> 'a2) -> ('a1 tree -> key -> 'a1 -> 'a1 tree -> __ -> __ -> __ -> __ -> 'a2) -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> 'a1 tree -> 'a1 coq_R_bal -> 'a2 **) let coq_R_bal_rec f f0 f1 f2 f3 f4 f5 f6 f7 _ _ _ _ _ = function | R_bal_0 (x, x0, x1, x2) -> f x x0 x1 x2 __ __ __ | R_bal_1 (x, x0, x1, x2, x3, x4, x5, x6, x7) -> f0 x x0 x1 x2 __ __ x3 x4 x5 x6 x7 __ __ __ | R_bal_2 (x, x0, x1, x2, x3, x4, x5, x6, x7) -> f1 x x0 x1 x2 __ __ x3 x4 x5 x6 x7 __ __ __ __ | R_bal_3 (x, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12) -> f2 x x0 x1 x2 __ __ x3 x4 x5 x6 x7 __ __ __ x8 x9 x10 x11 x12 __ | R_bal_4 (x, x0, x1, x2) -> f3 x x0 x1 x2 __ __ __ __ __ | R_bal_5 (x, x0, x1, x2, x3, x4, x5, x6, x7) -> f4 x x0 x1 x2 __ __ __ __ x3 x4 x5 x6 x7 __ __ __ | R_bal_6 (x, x0, x1, x2, x3, x4, x5, x6, x7) -> f5 x x0 x1 x2 __ __ __ __ x3 x4 x5 x6 x7 __ __ __ __ | R_bal_7 (x, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12) -> f6 x x0 x1 x2 __ __ __ __ x3 x4 x5 x6 x7 __ __ __ x8 x9 x10 x11 x12 __ | R_bal_8 (x, x0, x1, x2) -> f7 x x0 x1 x2 __ __ __ __ type 'elt coq_R_add = | R_add_0 of 'elt tree | R_add_1 of 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t * 'elt tree * 'elt coq_R_add | R_add_2 of 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t | R_add_3 of 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t * 'elt tree * 'elt coq_R_add (** val coq_R_add_rect : key -> 'a1 -> ('a1 tree -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a1 tree -> 'a1 coq_R_add -> 'a2 -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a1 tree -> 'a1 coq_R_add -> 'a2 -> 'a2) -> 'a1 tree -> 'a1 tree -> 'a1 coq_R_add -> 'a2 **) let rec coq_R_add_rect x d f f0 f1 f2 _ _ = function | R_add_0 m -> f m __ | R_add_1 (m, l, y, d', r0, h, _res, r1) -> f0 m l y d' r0 h __ __ __ _res r1 (coq_R_add_rect x d f f0 f1 f2 l _res r1) | R_add_2 (m, l, y, d', r0, h) -> f1 m l y d' r0 h __ __ __ | R_add_3 (m, l, y, d', r0, h, _res, r1) -> f2 m l y d' r0 h __ __ __ _res r1 (coq_R_add_rect x d f f0 f1 f2 r0 _res r1) (** val coq_R_add_rec : key -> 'a1 -> ('a1 tree -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a1 tree -> 'a1 coq_R_add -> 'a2 -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a1 tree -> 'a1 coq_R_add -> 'a2 -> 'a2) -> 'a1 tree -> 'a1 tree -> 'a1 coq_R_add -> 'a2 **) let rec coq_R_add_rec x d f f0 f1 f2 _ _ = function | R_add_0 m -> f m __ | R_add_1 (m, l, y, d', r0, h, _res, r1) -> f0 m l y d' r0 h __ __ __ _res r1 (coq_R_add_rec x d f f0 f1 f2 l _res r1) | R_add_2 (m, l, y, d', r0, h) -> f1 m l y d' r0 h __ __ __ | R_add_3 (m, l, y, d', r0, h, _res, r1) -> f2 m l y d' r0 h __ __ __ _res r1 (coq_R_add_rec x d f f0 f1 f2 r0 _res r1) type 'elt coq_R_remove_min = | R_remove_min_0 of 'elt tree * key * 'elt * 'elt tree | R_remove_min_1 of 'elt tree * key * 'elt * 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t * ('elt tree * (key * 'elt)) * 'elt coq_R_remove_min * 'elt tree * (key * 'elt) (** val coq_R_remove_min_rect : ('a1 tree -> key -> 'a1 -> 'a1 tree -> __ -> 'a2) -> ('a1 tree -> key -> 'a1 -> 'a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> ('a1 tree * (key * 'a1)) -> 'a1 coq_R_remove_min -> 'a2 -> 'a1 tree -> (key * 'a1) -> __ -> 'a2) -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> ('a1 tree * (key * 'a1)) -> 'a1 coq_R_remove_min -> 'a2 **) let rec coq_R_remove_min_rect f f0 _ _ _ _ _ = function | R_remove_min_0 (l, x, d, r0) -> f l x d r0 __ | R_remove_min_1 (l, x, d, r0, ll, lx, ld, lr, _x, _res, r1, l', m) -> f0 l x d r0 ll lx ld lr _x __ _res r1 (coq_R_remove_min_rect f f0 ll lx ld lr _res r1) l' m __ (** val coq_R_remove_min_rec : ('a1 tree -> key -> 'a1 -> 'a1 tree -> __ -> 'a2) -> ('a1 tree -> key -> 'a1 -> 'a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> ('a1 tree * (key * 'a1)) -> 'a1 coq_R_remove_min -> 'a2 -> 'a1 tree -> (key * 'a1) -> __ -> 'a2) -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> ('a1 tree * (key * 'a1)) -> 'a1 coq_R_remove_min -> 'a2 **) let rec coq_R_remove_min_rec f f0 _ _ _ _ _ = function | R_remove_min_0 (l, x, d, r0) -> f l x d r0 __ | R_remove_min_1 (l, x, d, r0, ll, lx, ld, lr, _x, _res, r1, l', m) -> f0 l x d r0 ll lx ld lr _x __ _res r1 (coq_R_remove_min_rec f f0 ll lx ld lr _res r1) l' m __ type 'elt coq_R_merge = | R_merge_0 of 'elt tree * 'elt tree | R_merge_1 of 'elt tree * 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t | R_merge_2 of 'elt tree * 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t * 'elt tree * key * 'elt * 'elt tree * I.t * 'elt tree * (key * 'elt) * key * 'elt (** val coq_R_merge_rect : ('a1 tree -> 'a1 tree -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> 'a1 tree -> (key * 'a1) -> __ -> key -> 'a1 -> __ -> 'a2) -> 'a1 tree -> 'a1 tree -> 'a1 tree -> 'a1 coq_R_merge -> 'a2 **) let coq_R_merge_rect f f0 f1 _ _ _ = function | R_merge_0 (x, x0) -> f x x0 __ | R_merge_1 (x, x0, x1, x2, x3, x4, x5) -> f0 x x0 x1 x2 x3 x4 x5 __ __ | R_merge_2 (x, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14) -> f1 x x0 x1 x2 x3 x4 x5 __ x6 x7 x8 x9 x10 __ x11 x12 __ x13 x14 __ (** val coq_R_merge_rec : ('a1 tree -> 'a1 tree -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> 'a1 tree -> (key * 'a1) -> __ -> key -> 'a1 -> __ -> 'a2) -> 'a1 tree -> 'a1 tree -> 'a1 tree -> 'a1 coq_R_merge -> 'a2 **) let coq_R_merge_rec f f0 f1 _ _ _ = function | R_merge_0 (x, x0) -> f x x0 __ | R_merge_1 (x, x0, x1, x2, x3, x4, x5) -> f0 x x0 x1 x2 x3 x4 x5 __ __ | R_merge_2 (x, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14) -> f1 x x0 x1 x2 x3 x4 x5 __ x6 x7 x8 x9 x10 __ x11 x12 __ x13 x14 __ type 'elt coq_R_remove = | R_remove_0 of 'elt tree | R_remove_1 of 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t * 'elt tree * 'elt coq_R_remove | R_remove_2 of 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t | R_remove_3 of 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t * 'elt tree * 'elt coq_R_remove (** val coq_R_remove_rect : X.t -> ('a1 tree -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a1 tree -> 'a1 coq_R_remove -> 'a2 -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a1 tree -> 'a1 coq_R_remove -> 'a2 -> 'a2) -> 'a1 tree -> 'a1 tree -> 'a1 coq_R_remove -> 'a2 **) let rec coq_R_remove_rect x f f0 f1 f2 _ _ = function | R_remove_0 m -> f m __ | R_remove_1 (m, l, y, d, r0, _x, _res, r1) -> f0 m l y d r0 _x __ __ __ _res r1 (coq_R_remove_rect x f f0 f1 f2 l _res r1) | R_remove_2 (m, l, y, d, r0, _x) -> f1 m l y d r0 _x __ __ __ | R_remove_3 (m, l, y, d, r0, _x, _res, r1) -> f2 m l y d r0 _x __ __ __ _res r1 (coq_R_remove_rect x f f0 f1 f2 r0 _res r1) (** val coq_R_remove_rec : X.t -> ('a1 tree -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a1 tree -> 'a1 coq_R_remove -> 'a2 -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a1 tree -> 'a1 coq_R_remove -> 'a2 -> 'a2) -> 'a1 tree -> 'a1 tree -> 'a1 coq_R_remove -> 'a2 **) let rec coq_R_remove_rec x f f0 f1 f2 _ _ = function | R_remove_0 m -> f m __ | R_remove_1 (m, l, y, d, r0, _x, _res, r1) -> f0 m l y d r0 _x __ __ __ _res r1 (coq_R_remove_rec x f f0 f1 f2 l _res r1) | R_remove_2 (m, l, y, d, r0, _x) -> f1 m l y d r0 _x __ __ __ | R_remove_3 (m, l, y, d, r0, _x, _res, r1) -> f2 m l y d r0 _x __ __ __ _res r1 (coq_R_remove_rec x f f0 f1 f2 r0 _res r1) type 'elt coq_R_concat = | R_concat_0 of 'elt tree * 'elt tree | R_concat_1 of 'elt tree * 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t | R_concat_2 of 'elt tree * 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t * 'elt tree * key * 'elt * 'elt tree * I.t * 'elt tree * (key * 'elt) (** val coq_R_concat_rect : ('a1 tree -> 'a1 tree -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> 'a1 tree -> (key * 'a1) -> __ -> 'a2) -> 'a1 tree -> 'a1 tree -> 'a1 tree -> 'a1 coq_R_concat -> 'a2 **) let coq_R_concat_rect f f0 f1 _ _ _ = function | R_concat_0 (x, x0) -> f x x0 __ | R_concat_1 (x, x0, x1, x2, x3, x4, x5) -> f0 x x0 x1 x2 x3 x4 x5 __ __ | R_concat_2 (x, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12) -> f1 x x0 x1 x2 x3 x4 x5 __ x6 x7 x8 x9 x10 __ x11 x12 __ (** val coq_R_concat_rec : ('a1 tree -> 'a1 tree -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> 'a1 tree -> (key * 'a1) -> __ -> 'a2) -> 'a1 tree -> 'a1 tree -> 'a1 tree -> 'a1 coq_R_concat -> 'a2 **) let coq_R_concat_rec f f0 f1 _ _ _ = function | R_concat_0 (x, x0) -> f x x0 __ | R_concat_1 (x, x0, x1, x2, x3, x4, x5) -> f0 x x0 x1 x2 x3 x4 x5 __ __ | R_concat_2 (x, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12) -> f1 x x0 x1 x2 x3 x4 x5 __ x6 x7 x8 x9 x10 __ x11 x12 __ type 'elt coq_R_split = | R_split_0 of 'elt tree | R_split_1 of 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t * 'elt triple * 'elt coq_R_split * 'elt tree * 'elt option * 'elt tree | R_split_2 of 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t | R_split_3 of 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t * 'elt triple * 'elt coq_R_split * 'elt tree * 'elt option * 'elt tree (** val coq_R_split_rect : X.t -> ('a1 tree -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a1 triple -> 'a1 coq_R_split -> 'a2 -> 'a1 tree -> 'a1 option -> 'a1 tree -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a1 triple -> 'a1 coq_R_split -> 'a2 -> 'a1 tree -> 'a1 option -> 'a1 tree -> __ -> 'a2) -> 'a1 tree -> 'a1 triple -> 'a1 coq_R_split -> 'a2 **) let rec coq_R_split_rect x f f0 f1 f2 _ _ = function | R_split_0 m -> f m __ | R_split_1 (m, l, y, d, r0, _x, _res, r1, ll, o, rl) -> f0 m l y d r0 _x __ __ __ _res r1 (coq_R_split_rect x f f0 f1 f2 l _res r1) ll o rl __ | R_split_2 (m, l, y, d, r0, _x) -> f1 m l y d r0 _x __ __ __ | R_split_3 (m, l, y, d, r0, _x, _res, r1, rl, o, rr) -> f2 m l y d r0 _x __ __ __ _res r1 (coq_R_split_rect x f f0 f1 f2 r0 _res r1) rl o rr __ (** val coq_R_split_rec : X.t -> ('a1 tree -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a1 triple -> 'a1 coq_R_split -> 'a2 -> 'a1 tree -> 'a1 option -> 'a1 tree -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a2) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> __ -> 'a1 triple -> 'a1 coq_R_split -> 'a2 -> 'a1 tree -> 'a1 option -> 'a1 tree -> __ -> 'a2) -> 'a1 tree -> 'a1 triple -> 'a1 coq_R_split -> 'a2 **) let rec coq_R_split_rec x f f0 f1 f2 _ _ = function | R_split_0 m -> f m __ | R_split_1 (m, l, y, d, r0, _x, _res, r1, ll, o, rl) -> f0 m l y d r0 _x __ __ __ _res r1 (coq_R_split_rec x f f0 f1 f2 l _res r1) ll o rl __ | R_split_2 (m, l, y, d, r0, _x) -> f1 m l y d r0 _x __ __ __ | R_split_3 (m, l, y, d, r0, _x, _res, r1, rl, o, rr) -> f2 m l y d r0 _x __ __ __ _res r1 (coq_R_split_rec x f f0 f1 f2 r0 _res r1) rl o rr __ type ('elt, 'x) coq_R_map_option = | R_map_option_0 of 'elt tree | R_map_option_1 of 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t * 'x * 'x tree * ('elt, 'x) coq_R_map_option * 'x tree * ('elt, 'x) coq_R_map_option | R_map_option_2 of 'elt tree * 'elt tree * key * 'elt * 'elt tree * I.t * 'x tree * ('elt, 'x) coq_R_map_option * 'x tree * ('elt, 'x) coq_R_map_option (** val coq_R_map_option_rect : (key -> 'a1 -> 'a2 option) -> ('a1 tree -> __ -> 'a3) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> 'a2 -> __ -> 'a2 tree -> ('a1, 'a2) coq_R_map_option -> 'a3 -> 'a2 tree -> ('a1, 'a2) coq_R_map_option -> 'a3 -> 'a3) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> 'a2 tree -> ('a1, 'a2) coq_R_map_option -> 'a3 -> 'a2 tree -> ('a1, 'a2) coq_R_map_option -> 'a3 -> 'a3) -> 'a1 tree -> 'a2 tree -> ('a1, 'a2) coq_R_map_option -> 'a3 **) let rec coq_R_map_option_rect f f0 f1 f2 _ _ = function | R_map_option_0 m -> f0 m __ | R_map_option_1 (m, l, x, d, r0, _x, d', _res0, r1, _res, r2) -> f1 m l x d r0 _x __ d' __ _res0 r1 (coq_R_map_option_rect f f0 f1 f2 l _res0 r1) _res r2 (coq_R_map_option_rect f f0 f1 f2 r0 _res r2) | R_map_option_2 (m, l, x, d, r0, _x, _res0, r1, _res, r2) -> f2 m l x d r0 _x __ __ _res0 r1 (coq_R_map_option_rect f f0 f1 f2 l _res0 r1) _res r2 (coq_R_map_option_rect f f0 f1 f2 r0 _res r2) (** val coq_R_map_option_rec : (key -> 'a1 -> 'a2 option) -> ('a1 tree -> __ -> 'a3) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> 'a2 -> __ -> 'a2 tree -> ('a1, 'a2) coq_R_map_option -> 'a3 -> 'a2 tree -> ('a1, 'a2) coq_R_map_option -> 'a3 -> 'a3) -> ('a1 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> 'a2 tree -> ('a1, 'a2) coq_R_map_option -> 'a3 -> 'a2 tree -> ('a1, 'a2) coq_R_map_option -> 'a3 -> 'a3) -> 'a1 tree -> 'a2 tree -> ('a1, 'a2) coq_R_map_option -> 'a3 **) let rec coq_R_map_option_rec f f0 f1 f2 _ _ = function | R_map_option_0 m -> f0 m __ | R_map_option_1 (m, l, x, d, r0, _x, d', _res0, r1, _res, r2) -> f1 m l x d r0 _x __ d' __ _res0 r1 (coq_R_map_option_rec f f0 f1 f2 l _res0 r1) _res r2 (coq_R_map_option_rec f f0 f1 f2 r0 _res r2) | R_map_option_2 (m, l, x, d, r0, _x, _res0, r1, _res, r2) -> f2 m l x d r0 _x __ __ _res0 r1 (coq_R_map_option_rec f f0 f1 f2 l _res0 r1) _res r2 (coq_R_map_option_rec f f0 f1 f2 r0 _res r2) type ('elt, 'x0, 'x) coq_R_map2_opt = | R_map2_opt_0 of 'elt tree * 'x0 tree | R_map2_opt_1 of 'elt tree * 'x0 tree * 'elt tree * key * 'elt * 'elt tree * I.t | R_map2_opt_2 of 'elt tree * 'x0 tree * 'elt tree * key * 'elt * 'elt tree * I.t * 'x0 tree * key * 'x0 * 'x0 tree * I.t * 'x0 tree * 'x0 option * 'x0 tree * 'x * 'x tree * ('elt, 'x0, 'x) coq_R_map2_opt * 'x tree * ('elt, 'x0, 'x) coq_R_map2_opt | R_map2_opt_3 of 'elt tree * 'x0 tree * 'elt tree * key * 'elt * 'elt tree * I.t * 'x0 tree * key * 'x0 * 'x0 tree * I.t * 'x0 tree * 'x0 option * 'x0 tree * 'x tree * ('elt, 'x0, 'x) coq_R_map2_opt * 'x tree * ('elt, 'x0, 'x) coq_R_map2_opt (** val coq_R_map2_opt_rect : (key -> 'a1 -> 'a2 option -> 'a3 option) -> ('a1 tree -> 'a3 tree) -> ('a2 tree -> 'a3 tree) -> ('a1 tree -> 'a2 tree -> __ -> 'a4) -> ('a1 tree -> 'a2 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> 'a4) -> ('a1 tree -> 'a2 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> 'a2 tree -> key -> 'a2 -> 'a2 tree -> I.t -> __ -> 'a2 tree -> 'a2 option -> 'a2 tree -> __ -> 'a3 -> __ -> 'a3 tree -> ('a1, 'a2, 'a3) coq_R_map2_opt -> 'a4 -> 'a3 tree -> ('a1, 'a2, 'a3) coq_R_map2_opt -> 'a4 -> 'a4) -> ('a1 tree -> 'a2 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> 'a2 tree -> key -> 'a2 -> 'a2 tree -> I.t -> __ -> 'a2 tree -> 'a2 option -> 'a2 tree -> __ -> __ -> 'a3 tree -> ('a1, 'a2, 'a3) coq_R_map2_opt -> 'a4 -> 'a3 tree -> ('a1, 'a2, 'a3) coq_R_map2_opt -> 'a4 -> 'a4) -> 'a1 tree -> 'a2 tree -> 'a3 tree -> ('a1, 'a2, 'a3) coq_R_map2_opt -> 'a4 **) let rec coq_R_map2_opt_rect f mapl mapr f0 f1 f2 f3 _ _ _ = function | R_map2_opt_0 (m1, m2) -> f0 m1 m2 __ | R_map2_opt_1 (m1, m2, l1, x1, d1, r1, _x) -> f1 m1 m2 l1 x1 d1 r1 _x __ __ | R_map2_opt_2 (m1, m2, l1, x1, d1, r1, _x, _x0, _x1, _x2, _x3, _x4, l2', o2, r2', e, _res0, r0, _res, r2) -> f2 m1 m2 l1 x1 d1 r1 _x __ _x0 _x1 _x2 _x3 _x4 __ l2' o2 r2' __ e __ _res0 r0 (coq_R_map2_opt_rect f mapl mapr f0 f1 f2 f3 l1 l2' _res0 r0) _res r2 (coq_R_map2_opt_rect f mapl mapr f0 f1 f2 f3 r1 r2' _res r2) | R_map2_opt_3 (m1, m2, l1, x1, d1, r1, _x, _x0, _x1, _x2, _x3, _x4, l2', o2, r2', _res0, r0, _res, r2) -> f3 m1 m2 l1 x1 d1 r1 _x __ _x0 _x1 _x2 _x3 _x4 __ l2' o2 r2' __ __ _res0 r0 (coq_R_map2_opt_rect f mapl mapr f0 f1 f2 f3 l1 l2' _res0 r0) _res r2 (coq_R_map2_opt_rect f mapl mapr f0 f1 f2 f3 r1 r2' _res r2) (** val coq_R_map2_opt_rec : (key -> 'a1 -> 'a2 option -> 'a3 option) -> ('a1 tree -> 'a3 tree) -> ('a2 tree -> 'a3 tree) -> ('a1 tree -> 'a2 tree -> __ -> 'a4) -> ('a1 tree -> 'a2 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> __ -> 'a4) -> ('a1 tree -> 'a2 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> 'a2 tree -> key -> 'a2 -> 'a2 tree -> I.t -> __ -> 'a2 tree -> 'a2 option -> 'a2 tree -> __ -> 'a3 -> __ -> 'a3 tree -> ('a1, 'a2, 'a3) coq_R_map2_opt -> 'a4 -> 'a3 tree -> ('a1, 'a2, 'a3) coq_R_map2_opt -> 'a4 -> 'a4) -> ('a1 tree -> 'a2 tree -> 'a1 tree -> key -> 'a1 -> 'a1 tree -> I.t -> __ -> 'a2 tree -> key -> 'a2 -> 'a2 tree -> I.t -> __ -> 'a2 tree -> 'a2 option -> 'a2 tree -> __ -> __ -> 'a3 tree -> ('a1, 'a2, 'a3) coq_R_map2_opt -> 'a4 -> 'a3 tree -> ('a1, 'a2, 'a3) coq_R_map2_opt -> 'a4 -> 'a4) -> 'a1 tree -> 'a2 tree -> 'a3 tree -> ('a1, 'a2, 'a3) coq_R_map2_opt -> 'a4 **) let rec coq_R_map2_opt_rec f mapl mapr f0 f1 f2 f3 _ _ _ = function | R_map2_opt_0 (m1, m2) -> f0 m1 m2 __ | R_map2_opt_1 (m1, m2, l1, x1, d1, r1, _x) -> f1 m1 m2 l1 x1 d1 r1 _x __ __ | R_map2_opt_2 (m1, m2, l1, x1, d1, r1, _x, _x0, _x1, _x2, _x3, _x4, l2', o2, r2', e, _res0, r0, _res, r2) -> f2 m1 m2 l1 x1 d1 r1 _x __ _x0 _x1 _x2 _x3 _x4 __ l2' o2 r2' __ e __ _res0 r0 (coq_R_map2_opt_rec f mapl mapr f0 f1 f2 f3 l1 l2' _res0 r0) _res r2 (coq_R_map2_opt_rec f mapl mapr f0 f1 f2 f3 r1 r2' _res r2) | R_map2_opt_3 (m1, m2, l1, x1, d1, r1, _x, _x0, _x1, _x2, _x3, _x4, l2', o2, r2', _res0, r0, _res, r2) -> f3 m1 m2 l1 x1 d1 r1 _x __ _x0 _x1 _x2 _x3 _x4 __ l2' o2 r2' __ __ _res0 r0 (coq_R_map2_opt_rec f mapl mapr f0 f1 f2 f3 l1 l2' _res0 r0) _res r2 (coq_R_map2_opt_rec f mapl mapr f0 f1 f2 f3 r1 r2' _res r2) (** val fold' : (key -> 'a1 -> 'a2 -> 'a2) -> 'a1 tree -> 'a2 -> 'a2 **) let fold' f s = L.fold f (elements s) (** val flatten_e : 'a1 enumeration -> (key * 'a1) list **) let rec flatten_e = function | End -> Nil | More (x, e0, t0, r) -> Cons ((x, e0), (app (elements t0) (flatten_e r))) end end module IntMake = functor (I:Int) -> functor (X:OrderedType) -> struct module E = X module Raw = Coq_Raw(I)(X) type 'elt bst = 'elt Raw.tree (* singleton inductive, whose constructor was Bst *) (** val this : 'a1 bst -> 'a1 Raw.tree **) let this b = b type 'elt t = 'elt bst type key = E.t (** val empty : 'a1 t **) let empty = Raw.empty (** val is_empty : 'a1 t -> bool **) let is_empty m = Raw.is_empty (this m) (** val add : key -> 'a1 -> 'a1 t -> 'a1 t **) let add x e m = Raw.add x e (this m) (** val remove : key -> 'a1 t -> 'a1 t **) let remove x m = Raw.remove x (this m) (** val mem : key -> 'a1 t -> bool **) let mem x m = Raw.mem x (this m) (** val find : key -> 'a1 t -> 'a1 option **) let find x m = Raw.find x (this m) (** val map : ('a1 -> 'a2) -> 'a1 t -> 'a2 t **) let map f m = Raw.map f (this m) (** val mapi : (key -> 'a1 -> 'a2) -> 'a1 t -> 'a2 t **) let mapi f m = Raw.mapi f (this m) (** val map2 : ('a1 option -> 'a2 option -> 'a3 option) -> 'a1 t -> 'a2 t -> 'a3 t **) let map2 f m m' = Raw.map2 f (this m) (this m') (** val elements : 'a1 t -> (key * 'a1) list **) let elements m = Raw.elements (this m) (** val cardinal : 'a1 t -> nat **) let cardinal m = Raw.cardinal (this m) (** val fold : (key -> 'a1 -> 'a2 -> 'a2) -> 'a1 t -> 'a2 -> 'a2 **) let fold f m i = Raw.fold f (this m) i (** val equal : ('a1 -> 'a1 -> bool) -> 'a1 t -> 'a1 t -> bool **) let equal cmp m m' = Raw.equal cmp (this m) (this m') end module Make = functor (X:OrderedType) -> IntMake(Z_as_Int)(X) module IntOrderedType = struct type t = Uint63.t (** val compare : Uint63.t -> Uint63.t -> Uint63.t compare1 **) let compare x y = if ltb0 x y then LT else if eqb0 x y then EQ else GT (** val eq_dec : Uint63.t -> Uint63.t -> sumbool **) let eq_dec x y = if eqb0 x y then Left else Right end module Map = Make(IntOrderedType) type 'a array = ('a Map.t * 'a) * Uint63.t (** val make : Uint63.t -> 'a1 -> 'a1 array **) let make l d = ((Map.empty, d), l) module Coq__1 = struct (** val get : 'a1 array -> Uint63.t -> 'a1 **) let get t0 i = let (td, l) = t0 in let (t1, d) = td in if ltb0 i l then (match Map.find i t1 with | Some x -> x | None -> d) else d end include Coq__1 (** val set : 'a1 array -> Uint63.t -> 'a1 -> 'a1 array **) let set t0 i a = let (td, l) = t0 in if leb0 l i then t0 else let (t1, d) = td in (((Map.add i a t1), d), l) (** val length : 'a1 array -> Uint63.t **) let length = function | (_, l) -> l (** val iter_int63_aux : nat -> Uint63.t -> ('a1 -> 'a1) -> 'a1 -> 'a1 **) let rec iter_int63_aux n i f = match n with | O -> (fun x -> x) | S n0 -> if eqb0 i (Uint63.of_int (0)) then (fun x -> x) else let g = iter_int63_aux n0 (lsr0 i (Uint63.of_int (1))) f in (fun x -> if bit i (Uint63.of_int (0)) then f (g (g x)) else g (g x)) (** val iter_int63 : Uint63.t -> ('a1 -> 'a1) -> 'a1 -> 'a1 **) let iter_int63 i f x = iter_int63_aux size i f x (** val foldi : (Uint63.t -> 'a1 -> 'a1) -> Uint63.t -> Uint63.t -> 'a1 -> 'a1 **) let foldi f from to0 a = if leb0 to0 from then a else let (_, r) = iter_int63 (sub0 to0 from) (fun jy -> let (j, y) = jy in ((add0 j (Uint63.of_int (1))), (f j y))) (from, a) in r (** val to_list : 'a1 array -> 'a1 list **) let to_list t0 = rev (foldi (fun i l -> Cons ((get t0 i), l)) (Uint63.of_int (0)) (length t0) Nil) module Lit = struct (** val _true : Uint63.t **) let _true = (Uint63.of_int (0)) end module C = struct type t = Uint63.t list (** val _true : t **) let _true = Cons (Lit._true, Nil) (** val is_false : t -> bool **) let is_false = function | Nil -> true | Cons (_, _) -> false (** val or_aux : (t -> t -> t) -> Uint63.t -> t -> t -> Uint63.t list **) let rec or_aux or0 l1 c1 c2 = match c2 with | Nil -> Cons (l1, c1) | Cons (l2, c2') -> (match compare0 l1 l2 with | 0 -> Cons (l1, (or0 c1 c2')) | (-1) -> Cons (l1, (or0 c1 c2)) | 1 -> Cons (l2, (or_aux or0 l1 c1 c2'))) (** val coq_or : t -> t -> t **) let rec coq_or c1 c2 = match c1 with | Nil -> c2 | Cons (l1, c3) -> (match c2 with | Nil -> c1 | Cons (l2, c2') -> (match compare0 l1 l2 with | 0 -> Cons (l1, (coq_or c3 c2')) | (-1) -> Cons (l1, (coq_or c3 c2)) | 1 -> Cons (l2, (or_aux coq_or l1 c3 c2')))) (** val resolve_aux : (t -> t -> t) -> Uint63.t -> t -> t -> t **) let rec resolve_aux resolve0 l1 c1 c2 = match c2 with | Nil -> _true | Cons (l2, c2') -> (match compare0 l1 l2 with | 0 -> Cons (l1, (resolve0 c1 c2')) | (-1) -> if eqb0 (lxor0 l1 l2) (Uint63.of_int (1)) then coq_or c1 c2' else Cons (l1, (resolve0 c1 c2)) | 1 -> if eqb0 (lxor0 l1 l2) (Uint63.of_int (1)) then coq_or c1 c2' else Cons (l2, (resolve_aux resolve0 l1 c1 c2'))) (** val resolve : t -> t -> t **) let rec resolve c1 c2 = match c1 with | Nil -> _true | Cons (l1, c3) -> (match c2 with | Nil -> _true | Cons (l2, c2') -> (match compare0 l1 l2 with | 0 -> Cons (l1, (resolve c3 c2')) | (-1) -> if eqb0 (lxor0 l1 l2) (Uint63.of_int (1)) then coq_or c3 c2' else Cons (l1, (resolve c3 c2)) | 1 -> if eqb0 (lxor0 l1 l2) (Uint63.of_int (1)) then coq_or c3 c2' else Cons (l2, (resolve_aux resolve l1 c3 c2')))) end module S = struct type t = C.t array (** val get : t -> Uint63.t -> C.t **) let get = get (** val internal_set : t -> Uint63.t -> C.t -> t **) let internal_set = set (** val make : Uint63.t -> t **) let make nclauses = make nclauses C._true (** val insert_no_simpl : Uint63.t -> Uint63.t list -> Uint63.t list **) let rec insert_no_simpl l1 c = match c with | Nil -> Cons (l1, Nil) | Cons (l2, c') -> (match compare0 l1 l2 with | 0 -> c | (-1) -> Cons (l1, c) | 1 -> Cons (l2, (insert_no_simpl l1 c'))) (** val sort : Uint63.t list -> Uint63.t list **) let rec sort = function | Nil -> Nil | Cons (l1, c0) -> insert_no_simpl l1 (sort c0) (** val set_clause : t -> Uint63.t -> C.t -> t **) let set_clause s pos c = set s pos (sort c) (** val set_resolve : t -> Uint63.t -> Uint63.t array -> t **) let set_resolve s pos r = let len = length r in if eqb0 len (Uint63.of_int (0)) then s else let c = foldi (fun i c' -> C.resolve (get s (Coq__1.get r i)) c') (Uint63.of_int (1)) len (get s (Coq__1.get r (Uint63.of_int (0)))) in internal_set s pos c end type 'step _trace_ = 'step list * 'step (** val _checker_ : (S.t -> 'a1 -> S.t) -> (C.t -> bool) -> S.t -> 'a1 _trace_ -> Uint63.t -> bool **) let _checker_ check_step is_false0 s t0 confl = let s' = fold_left check_step (fst t0) s in is_false0 (S.get s' confl) module Sat_Checker = struct type step = | Res of Uint63.t * Uint63.t array (** val resolution_checker : (C.t -> bool) -> S.t -> step _trace_ -> Uint63.t -> bool **) let resolution_checker s t0 = _checker_ (fun s0 st -> let Res (pos, r) = st in S.set_resolve s0 pos r) s t0 type dimacs = Uint63.t array array type certif = | Certif of Uint63.t * step _trace_ * Uint63.t (** val add_roots : S.t -> dimacs -> S.t **) let add_roots s d = foldi (fun i s0 -> S.set_clause s0 i (to_list (get d i))) (Uint63.of_int (0)) (length d) s (** val checker : dimacs -> certif -> bool **) let checker d = function | Certif (nclauses, t0, confl_id) -> resolution_checker C.is_false (add_roots (S.make nclauses) d) t0 confl_id end