Martin Escardo, Paulo Oliva, 9th July 2024. Alternative, equivalent, inductive definition of the type Game of games, which may have some practical advantages, such as more modular definitions of games. \begin{code} {-# OPTIONS --safe --without-K #-} open import MLTT.Spartan hiding (J) module Games.Alternative (R : Type) where open import UF.Equiv open import UF.FunExt open import Games.TypeTrees open import Games.FiniteHistoryDependent R renaming (Game to Game' ; game to game') open import MonadOnTypes.K open K-definitions R data Game : Type₁ where leaf : R → Game branch : (X : Type) → K X → (X → Game) → Game leaf' : R → Game' leaf' r = game' [] (λ ⟨⟩ → r) ⟨⟩ branch' : (X : Type) → K X → (X → Game') → Game' branch' X ϕ Gf = game' (X ∷ (game-tree ∘ Gf)) (λ (x :: xs) → payoff-function (Gf x) xs) (ϕ :: (quantifier-tree ∘ Gf)) from-Game : Game → Game' from-Game (leaf r) = leaf' r from-Game (branch X ϕ Gf) = branch' X ϕ (from-Game ∘ Gf) \end{code} We need the curried version h of the conversion function to-Game defined below to convince the termination checker that the following recursion does terminate. \begin{code} to-Game : Game' → Game to-Game (game' Xt q ϕt) = h Xt q ϕt where h : (Xt : 𝑻) → (Path Xt → R) → 𝓚 Xt → Game h [] q ⟨⟩ = leaf (q ⟨⟩) h (X ∷ Xf) q (ϕ :: ϕf) = branch X ϕ (λ x → h (Xf x) (subpred q x) (ϕf x)) \end{code} The equations we would have liked to use to define the function to-Game are the following: \begin{code} to-Game-base : (q : Path [] → R) → to-Game (game' [] q ⟨⟩) = leaf (q ⟨⟩) to-Game-base q = refl to-Game-step : (X : Type) (Xf : X → 𝑻) (ϕ : K X) (ϕf : (x : X) → 𝓚 (Xf x)) (q : Path (X ∷ Xf) → R) → to-Game (game' (X ∷ Xf) q (ϕ :: ϕf)) = branch X ϕ (λ x → to-Game (game' (Xf x) (subpred q x) (ϕf x))) to-Game-step X Xf ϕ ϕf q = refl \end{code} We also have the following equivalent definitional equalities expressed in terms of leaf' and branch': \begin{code} to-Game-base' : (r : R) → to-Game (leaf' r) = leaf r to-Game-base' r = refl module _ (X : Type) (Xf : X → 𝑻) (ϕ : K X) (ϕf : (x : X) → 𝓚 (Xf x)) (q : Path (X ∷ Xf) → R) where subgame : X → Game' subgame x = game' (Xf x) (subpred q x) (ϕf x) to-Game-step' : to-Game (branch' X ϕ subgame) = branch X ϕ (to-Game ∘ subgame) to-Game-step' = refl \end{code} The above conversion functions are mutually inverse and so the types Game and Game' are equivalent, assuming function extensionality. \begin{code} module _ (fe : Fun-Ext) where from-to-Game : from-Game ∘ to-Game ∼ id from-to-Game (game' Xt q ϕt) = h Xt q ϕt where h : (Xt : 𝑻) (q : Path Xt → R) (ϕt : 𝓚 Xt) → from-Game (to-Game (game' Xt q ϕt)) = game' Xt q ϕt h [] q ⟨⟩ = refl h (X ∷ Xf) q (ϕ :: ϕf) = from-Game (to-Game (game' (X ∷ Xf) q (ϕ :: ϕf))) =⟨ refl ⟩ from-Game (branch X ϕ (to-Game ∘ Gf)) =⟨ refl ⟩ branch' X ϕ Hf =⟨ I ⟩ branch' X ϕ Gf =⟨ refl ⟩ game' (X ∷ Xf) q (ϕ :: ϕf) ∎ where Gf Hf : X → Game' Gf x = subgame X Xf ϕ ϕf q x Hf x = from-Game (to-Game (Gf x)) IH : Hf ∼ Gf IH x = h (Xf x) (subpred q x) (ϕf x) I : branch' X ϕ Hf = branch' X ϕ Gf I = ap (branch' X ϕ) (dfunext fe IH) to-from-Game : to-Game ∘ from-Game ∼ id to-from-Game (leaf x) = refl to-from-Game (branch X ϕ Gf) = to-Game (from-Game (branch X ϕ Gf)) =⟨ refl ⟩ to-Game (branch' X ϕ (from-Game ∘ Gf)) =⟨ refl ⟩ branch X ϕ (to-Game ∘ from-Game ∘ Gf) =⟨ I ⟩ branch X ϕ Gf ∎ where I = ap (branch X ϕ) (dfunext fe (to-from-Game ∘ Gf)) Game-is-equiv-to-Game' : Game ≃ Game' Game-is-equiv-to-Game' = qinveq from-Game (to-Game , to-from-Game , from-to-Game) \end{code}