{-# OPTIONS --allow-unsolved-meta #-}
{-
  plan for today:

  1. game theory
  2. simply-typed lambda calculus
  3. your questions
-}


{-
  In Standard Agda and in ordinary Martin-Löf type theory,
  for any two types "A" and "B", we have a type "A ≡ B"
  of equality witnesses between "A" and "B". However,
  unlike in HoTT / CTT, this type is severely underspecified.

  In HoTT / CTT, this defect is remedied. Namely:
  Every equivalence A → B can be turned into an equality witness A ≡ B.
  ("univalence axiom")
-}

module transcript10a where

data  : Set where
  zero : 
  succ :   

data _⊎_ (X Y : Set) : Set where
  left  : X  X  Y
  right : Y  X  Y

module _ (String : Set) where
  data Bool : Set where
    false true : Bool

  record Person : Set where
    field
      surname : String
      age     : 
      address : String

  jenny : Person
  jenny = record
    { surname = {!!}
    ; age     = succ (succ zero)
    ; address = {!!}
    }

  isOfLegalAge : Person  Bool
  isOfLegalAge (record { surname = surname ; age = age ; address = address }) = {!age ≥? 18!}

  isOfLegalAge' : (surname : String) (age : ) (address : String)  Bool
  isOfLegalAge' surname age address = {!!}

record Game : Set₁ where
  field
    Pos  : Set               -- type of possible positions
    Move : Pos  Pos  Set   -- Move a b is the type of possible moves from position a to pos. b

module Basics (G : Game) where
  open Game G
  -- now we have "Pos" and "Move" available;
  -- without opening, we would need to write "Game.Pos G"

  data Winning : Pos  Set
  data Loosing : Pos  Set

  data Winning where
    -- win : {a : Pos} → ...there is a move out of position a which results in a loosing position... → Winning a
    win : {a b : Pos}  Move a b  Loosing b  Winning a
 
  data Loosing where
    -- trivial : {a : Pos} → (...no moves are possible starting in position a...) → Loosing a
    -- trivial : {a : Pos} → ({b : Pos} → Move a b → ⊥) → Loosing a
    -- the "trivial" constructor is redundant

    -- loose   : {a : Pos} → (...no matter which move we take, the next position) → Loosing a
    --                          will be a winning position.....................
    loose   : {a : Pos}  ({b : Pos}  Move a b  Winning b)  Loosing a

  module _ (enum : {!!}) where
    determined : (a : Pos)  Winning a  Loosing a
    determined = {!!}
  
{-
  |  |  |  |  |  |  |  |  |  |  |
  |  |  |  |  |  |  |  |  |  |  |
  |  |  |  |  |  |  |  |  |  |  |
  |  |  |  |  |  |  |  |  |  |  |
-}
module Take-3 where
  Pos : Set
  Pos = 

  data Move : Pos  Pos  Set where
    take₁ : {n : Pos}  Move (succ n)               n
    take₂ : {n : Pos}  Move (succ (succ n))        n
    take₃ : {n : Pos}  Move (succ (succ (succ n))) n

  G : Game
  G = record { Pos = Pos ; Move = Move }

  open Basics G

  0-loosing : Loosing zero
  0-loosing = loose  ())

  1-winning : Winning (succ zero)
  1-winning = win take₁ 0-loosing

  -- TASK: Verify that G is finite in the sense required by "determined".

module Chomp where
  -- 1. The game is finite.
  -- 2. No draw possible.
  -- 3. Hence the game is determined: For one of the two players, a winning strategy needs to exist.
  -- 4. Even though concrete winning strategies are unknown in most cases, we do know that
  --    there is a winning strategy for the first player. ("strategy stealing")