Definition fmono (f: nat → nat):= ∀ x y, x ≤ y → f x ≤ f y.

(* Specifications: *)
Lemma forall_and {A:Type} (P Q:A→Prop): (∀ x, P x ∧ Q x) ↔ ((∀ x, P x) ∧ (∀ x, Q x)).
Lemma forall_impl_and {A:Type} (R:A→Prop) (P Q:A→Prop): (∀ x, R x → P x ∧ Q x) ↔ ((∀ x, R x → P x) ∧ (∀ x, R x → Q x)).
Lemma forall_impl2_and {A B:Type} (P Q R : A → B → Prop): (∀ x y, R x y → P x y ∧ Q x y) ↔ ((∀ x y, R x y → P x y) ∧ (∀ x y, R x y → Q x y)).
Lemma neq_lt_gt_iff (m n:nat): m ≠ n ↔ (m < n ∨ n < m).
Lemma length_nil : forall A (l : list A), length l = 0 -> l = nil.
Lemma prod_beq_eq A B (A_beq : A -> A -> bool) (B_beq : B -> B -> bool) (A_beq_eq : forall a1 a2, A_beq a1 a2 = true <-> a1 = a2) (B_beq_eq : forall b1 b2, B_beq b1 b2 = true <-> b1 = b2) p1 p2 : prod_beq _ _ A_beq B_beq p1 p2 = true <-> p1 = p2.
Lemma list_beq_eq A (A_beq : A -> A -> bool) l1 l2 (A_beq_eq : forall a1 a2, In a1 l1 -> In a2 l2 -> (A_beq a1 a2 = true <-> a1 = a2)) : list_beq _ A_beq l1 l2 = true <-> l1 = l2.
Lemma list_beq_refl (A : Type) (A_beq : A -> A -> bool) l : (forall a1 a2 : A, In a1 l -> In a2 l -> (A_beq a1 a2 = true <-> a1 = a2)) -> list_beq _ A_beq l l = true.
Lemma eq_None_neq_Some (A : Type) (x : option A) : x = None <-> forall v, x <> Some v.
Lemma neq_None_eq_Some : forall (A: Type) (x: option A), x <> None <-> (exists a, x = Some a).
Lemma app_insert_r (A : Type) (l1 l1' l l2 l2' : list A): l1 ++ l2 = l1' ++ l2' -> length l2 = length l2' -> l1 ++ l ++ l2 = l1' ++ l ++ l2'.