(** * Addendum to the standard library of Coq *)
Require Export Omega.
Global Obligation Tactic := idtac.
Notation "[ x ; .. ; y ]" := (cons x .. (cons y nil) .. ).
Definition andl {A} (P:A->Prop)(l:list A) : Prop :=
fold_right (fun a res => P a /\ res) True l.
Fixpoint fun_power {A:Type}(n:nat)(f:A->A)(x:A) : A :=
match n with
| 0 => x
| S n' => f (fun_power n' f x)
end.
Definition mod2 (n : nat) : nat :=
n - 2 * div2 n.
Fixpoint power (m n:nat) : nat :=
match n with
| 0 => 1
| S n' => m * power m n'
end.
Definition plusl (l:list nat) : nat :=
fold_right plus 0 l.
Definition multl (l:list nat) : nat :=
fold_right mult 1 l.
Fixpoint maxl l :=
match l with
| nil => 0
| a :: l' => max a (maxl l')
end.

Lemma forallb_map : forall A B (l : list A) (p : B -> bool) (f : A -> B),
(forall x, In x l -> p (f x) = true) ->
forallb p (map f l) = true.