Definition eqb_list {A: Type} (eqb_A: A -> A -> bool): list A -> list A -> bool :=
fix eqb_list (l1 l2: list A): bool :=
match l1, l2 with
| nil, nil => true
| a1 :: l1, a2 :: l2 => eqb_A a1 a2 && eqb_list l1 l2
| _, _ => false
end.

(* Specifications: *)
Lemma eqb_list_spec: forall {A: Type} (eqb_A: A -> A -> bool),
(forall a1 a2, eqb_A a1 a2 = true <-> a1 = a2) ->
(forall l1 l2, eqb_list eqb_A l1 l2 = true <-> l1 = l2).
Lemma nat_ind2_Type:
forall P : nat -> Type,
((forall n, (forall j:nat, (j<n )%nat -> P j) ->  P n):Type) ->
(forall n, P n).
Lemma nat_ind2:
forall P : nat -> Prop,
(forall n, (forall j:nat, (j<n )%nat -> P j) ->  P n) ->
(forall n, P n).
Lemma equiv_e2 : forall A B: Prop, A=B -> B -> A.
Arguments equiv_e2 [A B] _ _.