Fixpoint listReplace (ls : list A)(i : nat)(a def : A) :=
    match i with
      | O => 
        match ls with
        | nil => a :: nil
        | a' :: ls' => a :: ls'
        end
      | S i' => 
        match ls with
        | nil => def :: (listReplace nil i' a def)
        | a' :: ls' =>
          a' :: (listReplace ls' i' a def)
        end
    end.Definition sumList(ls : list A)(f : A -> Rat) := fold_left (fun a b => a + (f b)) ls 0.

(* Specifications: *)
Lemma fold_add_iter_le : forall (A : Set)(ls : list A) f r init, fold_left (fun r a => r + (f a)) ls init <= r -> init <= r /\ (forall a, In a ls -> f a <= r).
Lemma sumList_iter_le : forall (A : Set)(ls : list A) f r a, sumList ls f <= r -> In a ls -> f a <= r.