Fixpoint andl (l : list Prop) : Prop :=
match l with
| nil => True
| P :: l' => P /\ andl l'
end.

(* Specifications: *)
Lemma andl_cons: forall a l, andl (a::l) <-> a /\ (andl l).
Lemma andl_in : forall l P, andl l -> In P l -> P.
Lemma andl_in_map (A:Type): forall l (a:A) P, andl (map P l) -> In a l -> P a.
Lemma andl_map (A : Type) (f g : A -> Prop) l :
andl (map f l) -> (forall a, In a l -> f a -> g a) -> andl (map g l).
Lemma andl_app l1 l2 : andl (l1 ++ l2) <-> andl l1 /\ andl l2.
Fixpoint orl (l : list Prop) : Prop :=
match l with
| nil => False
| P :: l' => P \/ orl l'
end.
Lemma andl_concat l:
andl (concat l) <-> forall l', In l' l -> andl l'.
Lemma orl_map (A : Type) (P : A -> Prop) l : orl (map P l) <-> exists x, In x l /\ P x.
Section Maxl.