(** ** Properties of [Forall] and [Forall2] *)

(* Specifications: *)
Lemma Forall_impl A: forall (P Q : A -> Prop), (forall a, P a -> Q a) ->
forall n (v : t A n), Forall P v -> Forall Q v.
Lemma Forall_forall A: forall P n (v : t A n),
Forall P v <-> forall a, In a v -> P a.
Lemma Forall_cons_iff A: forall (P : A -> Prop) a n (v : t A n),
Forall P (a :: v) <-> P a /\ Forall P v.
Lemma Forall_map A B: forall (P : B -> Prop) (f : A -> B) n (v : t A n),
Forall P (map f v) <-> Forall (fun x => P (f x)) v.
Lemma Forall_append A: forall P n m (v : t A n) (w : t A m),
Forall P v -> Forall P w -> Forall P (append v w).
Lemma Forall_nth A: forall P n (v : t A n),
Forall P v <-> forall p, P (nth v p).
Lemma Forall_nth_order A: forall P n (v : t A n),
Forall P v <-> forall i (Hi : i < n), P (nth_order v Hi).
Lemma Forall2_cons_iff A B: forall P n h1 h2 (v1 : t A n) (v2 : t B n),
Forall2 P (h1 :: v1) (h2 :: v2) <-> P h1 h2 /\ Forall2 P v1 v2.
Lemma Forall2_nth A: forall P n (v1 v2 : t A n),
Forall2 P v1 v2 <-> forall p, P (nth v1 p) (nth v2 p).
Lemma Forall2_nth_order A: forall P n (v1 v2 : t A n),
Forall2 P v1 v2
<-> forall i (Hi1 : i < n) (Hi2 : i < n), P (nth_order v1 Hi1) (nth_order v2 Hi2).
Lemma Forall2_append A B: forall P n m (v : t A n) (v' : t B n) (w : t A m) (w' : t B m),
Forall2 P v v' -> Forall2 P w w' -> Forall2 P (append v w) (append v' w').