Documentation

EconCSLib.GameTheory.ExtensiveGame.BackwardInduction

EconCSLib.GameTheory.ExtensiveGame.BackwardInduction #

Backward induction on GameTree N U, producing a value function value : GameTree N U → (N → U) together with the optimality lemmas used by ExtensiveGame.SPE to prove Kuhn's theorem.

Minimal assumptions #

The payoff type U carries [TotalPreorder U] (reflexivity + transitivity + totality; no antisymmetry) plus [DecidableLE U] so the argmax — and hence value — is computable. (the Zermelo / examples track) supplies both.

Main definitions #

Main results #

def GameTree.value {N : Type u_1} {U : Type u_2} [TotalPreorder U] [DecidableLE U] :
GameTree N UNU

Value of a game tree: a payoff vector. At a Node, the mover selects a child maximizing their own coordinate (argmax over the total preorder).

Computable — with a decidable comparison [DecidableLE U] the argmax is a left fold, so value runs (#eval/decide) on concrete games.

Equations
Instances For
    def GameTree.valueList {N : Type u_1} {U : Type u_2} [TotalPreorder U] [DecidableLE U] :
    List (GameTree N U)List (NU)

    Pointwise image of value over a list of game trees. Structurally recursive on the list.

    Equations
    Instances For
      @[simp]
      theorem GameTree.value_Leaf {N : Type u_1} {U : Type u_2} [TotalPreorder U] [DecidableLE U] (p : NU) :
      (Leaf p).value = p
      @[simp]
      theorem GameTree.value_Node {N : Type u_1} {U : Type u_2} [TotalPreorder U] [DecidableLE U] (m : N) (h : GameTree N U) (t : List (GameTree N U)) :
      (Node m h t).value = List.argMaxOn (fun (v : NU) => v m) h.value (valueList t)
      @[simp]
      @[simp]
      theorem GameTree.valueList_cons {N : Type u_1} {U : Type u_2} [TotalPreorder U] [DecidableLE U] (x : GameTree N U) (xs : List (GameTree N U)) :
      theorem GameTree.valueList_eq_map {N : Type u_1} {U : Type u_2} [TotalPreorder U] [DecidableLE U] (l : List (GameTree N U)) :

      valueList l is exactly l.map value. Useful for rewriting.

      theorem GameTree.mem_valueList_iff {N : Type u_1} {U : Type u_2} [TotalPreorder U] [DecidableLE U] {v : NU} {l : List (GameTree N U)} :

      Membership in valueList via membership in the source list.

      theorem GameTree.value_Node_ge {N : Type u_1} {U : Type u_2} [TotalPreorder U] [DecidableLE U] (m : N) (h : GameTree N U) (t : List (GameTree N U)) (c : GameTree N U) (hmem : c h :: t) :
      c.value m (Node m h t).value m

      Key optimality lemma: at a Node m h t, the mover m's coordinate of the backward-induction value dominates every child's.

      theorem GameTree.value_Node_eq_some_child_value {N : Type u_1} {U : Type u_2} [TotalPreorder U] [DecidableLE U] (m : N) (h : GameTree N U) (t : List (GameTree N U)) :
      (c : GameTree N U), c h :: t (Node m h t).value = c.value

      The value at a node is itself the value of some child (the argmax). Specifically, argMaxOn ... ∈ value h :: valueList t, so it equals value c for some ch :: t.