induction lsa; destruct lsb; intuition.
unfold sumList in *; simpl in *; intuition.
assert (sumList (b :: lsb) (fun b : B => sumList nil (fun a : A => f a b)) == 0).
eapply sumList_0.
intuition.
unfold sumList. simpl.
intuition.
rewrite H.
unfold sumList in *; simpl in *; intuition.
assert (sumList (a :: lsa) (fun a0 : A => sumList nil (fun b : B => f a0 b)) == 0).
eapply sumList_0.
intuition.
unfold sumList in *; simpl in *; intuition.
rewrite H.
unfold sumList in *; simpl in *; intuition.
rewrite sumList_body_eq.
2:{
intuition.
eapply sumList_cons.
}
rewrite sumList_sum.
rewrite (sumList_cons lsa a (fun a0 : A => sumList lsb (f a0))).
rewrite IHlsa.
symmetry.
rewrite sumList_body_eq.
2:{
intuition.
eapply sumList_cons.
}
rewrite sumList_sum.
repeat rewrite sumList_cons.
repeat rewrite <- ratAdd_assoc.
eapply ratAdd_eqRat_compat; intuition.
repeat rewrite ratAdd_assoc.
eapply ratAdd_eqRat_compat; intuition.
eapply ratAdd_comm.
Qed.

(* Specifications: *)
Lemma fold_add_subset' : forall (A : Set)(eqd : eq_dec A)(ls1 ls2 : list A)(f : A -> Rat) init1 init2,
init1 == init2 ->
NoDup ls1 ->
NoDup ls2 ->
(forall a, In a ls1 -> In a ls2) ->
(forall a, In a ls2 -> (~In a ls1) -> (f a) == 0) ->
fold_left (fun r a => r + (f a)) ls1 init1 == fold_left (fun r a => r + (f a)) ls2 init2.