fact: Definition kd {A1 A2 B1 B2 : Type} {chA1 : Choice.class_of A1} {chA2 : Choice.class_of A2} {chB1 : Choice.class_of B1} {chB2 : Choice.class_of B2} {f1 : TypeCat ⦅ nfst (prod_functor choice_incl choice_incl ⟨ Choice.Pack chA1, Choice.Pack chA2 ⟩); nfst (SDistr_squ ⟨Choice.Pack chB1, Choice.Pack chB2 ⟩) ⦆} {f2 : TypeCat ⦅ nsnd (prod_functor choice_incl choice_incl ⟨ Choice.Pack chA1, Choice.Pack chA2 ⟩); nsnd (SDistr_squ ⟨ Choice.Pack chB1, Choice.Pack chB2 ⟩) ⦆} {π : B1 * B2 -> Prop} (dA : SDistr_carrier (F_choice_prod_obj ⟨ Choice.Pack chA1, Choice.Pack chA2 ⟩)) (integral : forall (a1 : A1) (a2 : A2), (0 < dA (a1, a2)) -> exists d : SDistr_carrier (F_choice_prod_obj ⟨ Choice.Pack chB1, Choice.Pack chB2 ⟩), (coupling d (f1 a1) (f2 a2)) /\ (forall (a3 : B1) (a4 : B2), 0 < d (a3, a4) -> (π (a3, a4)))) : { kd : A1 * A2 -> SDistr (F_choice_prod ⟨ Choice.Pack chB1, Choice.Pack chB2 ⟩) | (forall (x1 : A1 * A2), (dA x1 > 0) = true -> coupling (kd x1) (f1 (fst x1)) (f2 (snd x1)) /\ forall (a3 : B1) (a4 : B2), 0 < kd x1 (a3, a4) -> (π (a3, a4))) }.
imports: mathcomp(all_ssreflect all_algebra boolp distr reals realsum) Mon(SpecificationMonads SPropBase SPropMonadicStructures) Relational(OrderEnrichedCategory OrderEnrichedRelativeMonadExamples) Crypt(ChoiceAsOrd SubDistr Couplings Axioms)