Definition eq_bool_dec : forall a b : bool, {a = b} + {a <> b}.Fixpoint le_bool (a b : nat) {struct b} : bool :=
  match a, b with
  | O, _ => true
  | S a1, S b1 => le_bool a1 b1
  | _, _ => false
  end.

(* Specifications: *)
Theorem le_bool_correct1 : forall a b : nat, a <= b -> le_bool a b = true.
Theorem le_bool_correct2 : forall a b : nat, b < a -> le_bool a b = false.
Theorem le_bool_correct3 : forall a b : nat, le_bool a b = true -> a <= b.
Theorem le_bool_correct4 : forall a b : nat, le_bool a b = false -> b <= a.
Theorem fold_left_app : forall a l1 l2, fold_left f (l1 ++ l2) a = fold_left f l2 (fold_left f l1 a).
Theorem fold_left_eta : forall l a f1, (forall a b, In b l -> f a b = f1 a b) -> fold_left f l a = fold_left f1 l a.
Theorem fold_left_map : forall (C : Type) a l (k : C -> B), fold_left f (map k l) a = fold_left (fun a b => f a (k b)) l a.
Theorem fold_right_app : forall a l1 l2, fold_right g a (l1 ++ l2) = fold_right g (fold_right g a l2) l1.
Theorem fold_left_init : (forall (a : A) (b : B), h (f a b) = f (h a) b) -> forall (a : A) (l : list B), fold_left f l (h a) = h (fold_left f l a).
Theorem list_length_ind : forall P : list A -> Prop, (forall l1 : list A, (forall l2 : list A, length l2 < length l1 -> P l2) -> P l1) -> forall l : list A, P l.