induction ls; intros; simpl in *;
subst; try discriminate.
destruct a.
case_eq (findCollision_1 eqd1 eqd2 ls a b0); intros.
rewrite H0 in H.
eapply findCollision_1_correct in H0.
intuition.
subst.
inversion H; clear H; subst.
intuition.
inversion H; clear H; subst.
intuition.
inversion H; clear H; subst.
intuition.
rewrite H0 in H.
eapply IHls in H.
intuition.
Qed.
apply findCollision_correct in H2.
intuition.
case_eq (eqb l l0); intuition.
rewrite eqb_leibniz in H4.
intuition.
simpl.
assert (forall a b, In (a, b) (fst (split l1)) -> b = F x a).
intuition.
eapply (@oc_comp_invariant _ _ _ _ _ (fun l1 => forall a b, In (a, b) (fst (split l1)) -> b = F x a)) in H0.
eauto.
intuition.
unfold F_randomFunc in *.
case_eq (arrayLookup_f (Bvector_EqDec b) c0 (F x d)); intuition.
rewrite H11 in H7.
repeat simp_in_support.
simpl in *.
remember (split c0) as z.
destruct z.
simpl in *.
intuition.
pairInv.
trivial.
rewrite H11 in H7.
repeat simp_in_support.
simpl in *.
remember (split c0) as z.
destruct z.
simpl in *.
intuition.
pairInv.
trivial.
intuition.
simpl in *.
intuition.
trivial.
assert (b0 = F x l).
eapply H6.
trivial.
eapply H6 in H5.
subst.
rewrite H7.
rewrite eqbBvector_complete.
trivial.
comp_simp.
rewrite eqb_refl.
simpl.
eapply comp_spec_eq_refl.
Qed.

(* Specifications: *)
Theorem G2_3_4_close :
| Pr[x <-$ G2_3; ret fst x] - Pr[x <-$ G2_4; ret fst x] | <=
Adv_WCR _ _ F (Rnd k) au_F_A.