(** * 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.
Fixpoint repeat {A:Type}(n:nat)(x:A) : list A :=
match n with
| 0 => nil
| S n' => x :: repeat n' x
end.

Lemma firstn_repeat_le :
forall A (x:A) m n,
m <= n ->
firstn m (repeat n x) = repeat m x.