fact: Definition contractprod `{Provide ix i, Provide ix j} {Ωi Ωj} (ci : contract i Ωi) (cj : contract j Ωj) : contract ix (Ωi * Ωj) := {| witness_update := fun (ω : Ωi * Ωj) (α : Type) (e : ix α) (x : α) => (gen_witness_update ci (fst ω) e x, gen_witness_update cj (snd ω) e x) ; caller_obligation := fun (ω : Ωi * Ωj) (α : Type) (e : ix α) => gen_caller_obligation ci (fst ω) e /\ gen_caller_obligation cj (snd ω) e ; callee_obligation := fun (ω : Ωi * Ωj) (α : Type) (e : ix α) (x : α) => gen_callee_obligation ci (fst ω) e x /\ gen_callee_obligation cj (snd ω) e x |}.
imports: Coq(Setoid Morphisms) ExtLib(StateMonad MonadState MonadTrans) FreeSpec.Core(Interface Impure Semantics Component)