intuition.
apply list_choice in H0.
destruct H0.
exists (y <-$ c1; x y).
intuition.
unfold marginal_l.
dist_inline_first.
dist_skip.
specialize (H0 x0); intuition.
eapply H0.
unfold marginal_r.
dist_inline_first.
dist_irr_r.
specialize (H0 x0); intuition.
apply H2.
repeat simp_in_support.
specialize (H0 x0); intuition.
intuition.
eapply (EqDec_dec _).
apply (x <-$ c1; y <-$ c2; z <-$ f1 x; ret (z, y)).
Qed.
(* equational rules for computations with oracles. *)
Transparent evalDist.
Transparent getSupport.

(* Specifications: *)
Theorem oc_comp_spec_eq :
forall (A B C : Set)(c : OracleComp A B C), forall (*(eqda : EqDec A)*) (eqdb : EqDec B) (eqdc : EqDec C)(S1 S2 : Set)(o1 : S1 -> A -> Comp (B * S1))(o2 : S2 -> A -> Comp (B * S2)) eqds1 eqds2 s1 s2 (P : S1 -> S2 -> Prop),
P s1 s2 ->
(forall a x1 x2, P x1 x2 -> comp_spec (fun y1 y2 => fst y1 = fst y2 /\ P (snd y1) (snd y2)) (o1 x1 a) (o2 x2 a)) ->
comp_spec (fun a b => fst a = fst b /\ P (snd a) (snd b))
(c _ eqds1 o1 s1)
(c _ eqds2 o2 s2).