Martin Escardo, Paulo Oliva, 2023

\begin{code}

{-# OPTIONS --safe --without-K #-}

open import MLTT.Spartan hiding (J)

module Games.K where

open import Games.Monad

𝕂 : Type  Monad
𝕂 R = record {
       functor = λ X  (X  R)  R ;
       η       = λ x p  p x ;
       ext     = λ f ϕ p  ϕ  x  f x p) ;
       ext-η   = λ x  refl ;
       unit    = λ f x  refl ;
       assoc   = λ g f x  refl
      }

module K-definitions (R : Type) where

 K : Type  Type
 K = functor (𝕂 R)

 _⊗ᴷ_ : {X : Type} {Y : X  Type}
       K X
       ((x : X)  K (Y x))
       K (Σ x  X , Y x)
 _⊗ᴷ_ = _⊗_ (𝕂 R)

 ⊗ᴷ-direct-definition : {X : Type} {Y : X  Type}
                        (ϕ : K X)
                        (γ : (x : X)  K (Y x))
                       ϕ ⊗ᴷ γ   q  ϕ  x  γ x (curry q x)))
 ⊗ᴷ-direct-definition ϕ γ q = refl

 ηᴷ : {X : Type}  X  K X
 ηᴷ = η (𝕂 R)

 extᴷ : {X Y : Type}  (X  K Y)  K X  K Y
 extᴷ = ext (𝕂 R)

 mapᴷ : {X Y : Type}  (X  Y)  K X  K Y
 mapᴷ = map (𝕂 R)

\end{code}