Notation "x ≤ y ≤ z" := (x ≤ y ∧ y ≤ z) (at level 70, y at next level).
Notation "x < y ≤ z" := (x < y ∧ y ≤ z) (at level 70, y at next level).
Notation "x ≤ y < z" := (x ≤ y ∧ y < z) (at level 70, y at next level).
Infix "∈" := In (at level 70).
(* Compatibilité 8.4 *)
Infix "=?" := beq_nat (at level 70, no associativity).
Obligation Tactic := idtac.
Scheme Equality for prod.
Scheme Equality for list.
Set Implicit Arguments.
Section Trivial.

(* Specifications: *)
Lemma S_is_suc n: S n = n+1.
End Trivial.
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'.