Fixpoint fold1 (A B: Type) (f: B -> A -> B) (m: t A) (v: B) {struct m} : B :=
    match m with
    | Leaf => v
    | Node l None r =>
        let v1 := fold1 f l v in
        fold1 f r v1
    | Node l (Some x) r =>
        let v1 := fold1 f l v in
        let v2 := f v1 x in
        fold1 f r v2
    end.

(* Specifications: *)
Lemma fold1_xelements: forall (A B: Type) (f: B -> A -> B) m i v l, List.fold_left (fun a p => f a (snd p)) l (fold1 f m v) = List.fold_left (fun a p => f a (snd p)) (xelements m i l) v.
Theorem fold1_spec: forall (A B: Type) (f: B -> A -> B) (v: B) (m: t A), fold1 f m v = List.fold_left (fun a p => f a (snd p)) (elements m) v.
Lemma fold1_xelements: forall (A B: Type) (f: B -> A -> B) m i v l, List.fold_left (fun a p => f a (snd p)) l (fold1 f m v) = List.fold_left (fun a p => f a (snd p)) (xelements m i l) v.
Theorem fold1_spec: forall (A B: Type) (f: B -> A -> B) (v: B) (m: t A), fold1 f m v = List.fold_left (fun a p => f a (snd p)) (elements m) v.