induction ls; intuition; simpl in *.
intuition.
pairInv.
unfold collidesWith, funcCollision in *.
simpl in *.
repeat rewrite eqb_refl.
simpl.
case_eq (findCollision_1 eqda eqdb ls a b1); intuition.
rewrite H0 in H.
discriminate.
unfold collidesWith, funcCollision in *.
simpl in *.
case_eq (eqb a0 a); intuition.
rewrite eqb_leibniz in H0.
subst.
rewrite eqb_refl.
simpl.
case_eq (findCollision_1 eqda eqdb ls a b0); intuition;
rewrite H0 in H.
discriminate.
case_eq (eqb b1 b0); intuition.
simpl.
eapply IHls; intuition.
simpl.
eapply IHls; intuition.
assert (a <> a0).
intuition.
subst.
rewrite eqb_refl in H0.
discriminate.
case_eq (eqb a a0); intuition.
rewrite eqb_leibniz in H3.
subst.
intuition.
simpl.
case_eq (eqb b1 b0); intuition.
simpl.
rewrite eqb_leibniz in H4.
subst.
specialize (in_impl_collidesWith  _ _ ls _ H1 H2); intuition.
unfold collidesWith in H4.
destruct (findCollision_1 eqda eqdb ls a0 b0);
discriminate.
simpl.
case_eq (findCollision_1 eqda eqdb ls a0 b0); intuition.
rewrite H5 in H.
discriminate.
rewrite H5 in H.
eapply IHls; intuition.
Qed.

(* Specifications: *)
Theorem arrayLookup_Some_In_split:
forall (A B : Set) (eqd : EqDec A) (arr : list (A * B)) (a : A) (b : B),
arrayLookup eqd arr a = Some b -> In a (fst (split arr)).
Theorem arrayLookup_Some_In_split:
forall (A B : Set) (eqd : EqDec A) (arr : list (A * B)) (a : A) (b : B),
arrayLookup eqd arr a = Some b -> In a (fst (split arr)).