import Mathlib.Data.Fintype.Basic import Mathlib.Data.Fintype.Card import Mathlib.Data.Fintype.Pi import Mathlib.Data.Fintype.Powerset import Mathlib.Data.Finset.Basic import Mathlib.Data.Finset.Card import Mathlib.Data.Finset.Sort import Mathlib.Data.List.Sublists import Mathlib.Logic.Function.Basic import Mathlib.Algebra.Order.BigOperators.Group.Finset import Mathlib.Tactic.FinCases namespace Base

Sign games and Nash existence

This file defines sign games — finite games in which each player has a set of actions and a preference ordering (not a numeric payoff) over outcomes. The ordering is encoded as a sign function returning pos, neg, or zero.

The main result is nash_exists: every finite sign game has a Nash equilibrium (in mixed strategies, represented as nonempty subsets of actions called faces).

The proof is a descent algorithm: start from the fully mixed profile (all actions in play for every player), and iteratively remove dominated actions. The algorithm terminates because the total number of actions across all players strictly decreases at each step, and the key invariant OutsideDom is preserved.

Main definitions and theorems

    Sign : Three-valued type: pos | neg | zero

    Face V : Nonempty subsets { S : Finset V // S.Nonempty }

    PureProfile I V : A choice of one action per player: ∀ i, V i

    Profile I V : A choice of face (mixed strategy) per player: ∀ i, Face (V i)

    SignGame I V : Cross-profile sign function with refl/antisym/trans axioms

    Dominates i σ A B : Face A weakly dominates face B for player i in context σ

    StrictDom i σ A : A strictly dominates σ i (dominates but is not dominated back)

    IsNash σ : No player has a strict deviation: ∀ i A, ¬ StrictDom i σ A

    OutsideDom i σ : Every action outside σ i is dominated by every action inside

    nash_exists : Every finite sign game has a Nash equilibrium

    ofPayoffs : Construct a sign game from integer payoff functions

    IsPureNash : Pure-strategy Nash: no player improves by switching action

A three-valued sign type representing the result of comparing two actions. pos means the first action is preferred, neg means the second is preferred, zero means indifference.

-- ANCHOR: Sign inductive Sign where | pos : Sign | neg : Sign | zero : Sign -- ANCHOR_END: Sign deriving DecidableEq, Repr namespace Sign instance : Fintype Sign := {.pos, .neg, .zero}, (x : Sign), x {pos, neg, zero} x:Signx {pos, neg, zero}; pos {pos, neg, zero}neg {pos, neg, zero}zero {pos, neg, zero} pos {pos, neg, zero}neg {pos, neg, zero}zero {pos, neg, zero} All goals completed! 🐙

Negation of a sign: swaps pos and neg, fixes zero. Used to express antisymmetry: sign(a,b) = flip(sign(b,a)).

def flip : Sign Sign | pos => neg | neg => pos | zero => zero @[simp] theorem flip_pos : flip pos = neg := rfl@[simp] theorem flip_neg : flip neg = pos := rfl@[simp] theorem flip_zero : flip zero = zero := rfl@[simp] theorem flip_flip (s : Sign) : s.flip.flip = s := s:Signs.flip.flip = s pos.flip.flip = posneg.flip.flip = negzero.flip.flip = zero pos.flip.flip = posneg.flip.flip = negzero.flip.flip = zero All goals completed! 🐙

s.nonneg holds when s is pos or zero (i.e., the first action is at least as good). This is the core predicate used in dominance comparisons.

def nonneg : Sign Prop | pos => True | zero => True | neg => False instance (s : Sign) : Decidable s.nonneg := s:SignDecidable s.nonneg Decidable pos.nonnegDecidable neg.nonnegDecidable zero.nonneg Decidable pos.nonnegDecidable neg.nonnegDecidable zero.nonneg Decidable True Decidable TrueDecidable FalseDecidable True All goals completed! 🐙 @[simp] theorem nonneg_pos : pos.nonneg := trivial@[simp] theorem nonneg_zero : zero.nonneg := trivial lemma not_nonneg_neg : ¬neg.nonneg := id lemma nonneg_flip_of_not_nonneg {s : Sign} (h : ¬s.nonneg) : s.flip.nonneg := s:Signh:¬s.nonnegs.flip.nonneg h:¬pos.nonnegpos.flip.nonnegh:¬neg.nonnegneg.flip.nonnegh:¬zero.nonnegzero.flip.nonneg h:¬pos.nonnegpos.flip.nonnegh:¬neg.nonnegneg.flip.nonnegh:¬zero.nonnegzero.flip.nonneg All goals completed! 🐙 lemma not_nonneg_flip_of_nonneg_of_ne_zero {s : Sign} (h : s.nonneg) (hz : s zero) : ¬s.flip.nonneg := s:Signh:s.nonneghz:s zero¬s.flip.nonneg h:pos.nonneghz:pos zero¬pos.flip.nonnegh:neg.nonneghz:neg zero¬neg.flip.nonnegh:zero.nonneghz:zero zero¬zero.flip.nonneg h:pos.nonneghz:pos zero¬pos.flip.nonnegh:neg.nonneghz:neg zero¬neg.flip.nonnegh:zero.nonneghz:zero zero¬zero.flip.nonneg All goals completed! 🐙

Multiplication of signs. Captures the sign of a product of reals.

def mul : Sign Sign Sign | zero, _ => zero | _, zero => zero | pos, s => s | neg, s => s.flip @[simp] theorem mul_zero (s : Sign) : mul s zero = zero := s:Signs.mul zero = zero pos.mul zero = zeroneg.mul zero = zerozero.mul zero = zero pos.mul zero = zeroneg.mul zero = zerozero.mul zero = zero All goals completed! 🐙@[simp] theorem zero_mul (s : Sign) : mul zero s = zero := s:Signzero.mul s = zero All goals completed! 🐙@[simp] theorem mul_pos (s : Sign) : mul s pos = s := s:Signs.mul pos = s pos.mul pos = posneg.mul pos = negzero.mul pos = zero pos.mul pos = posneg.mul pos = negzero.mul pos = zero All goals completed! 🐙@[simp] theorem pos_mul (s : Sign) : mul pos s = s := s:Signpos.mul s = s pos.mul pos = pospos.mul neg = negpos.mul zero = zero pos.mul pos = pospos.mul neg = negpos.mul zero = zero All goals completed! 🐙@[simp] theorem neg_mul (s : Sign) : mul neg s = s.flip := s:Signneg.mul s = s.flip neg.mul pos = pos.flipneg.mul neg = neg.flipneg.mul zero = zero.flip neg.mul pos = pos.flipneg.mul neg = neg.flipneg.mul zero = zero.flip All goals completed! 🐙 lemma flip_mul (s t : Sign) : (mul s t).flip = mul s.flip t := s:Signt:Sign(s.mul t).flip = s.flip.mul t t:Sign(pos.mul t).flip = pos.flip.mul tt:Sign(neg.mul t).flip = neg.flip.mul tt:Sign(zero.mul t).flip = zero.flip.mul t t:Sign(pos.mul t).flip = pos.flip.mul tt:Sign(neg.mul t).flip = neg.flip.mul tt:Sign(zero.mul t).flip = zero.flip.mul t (zero.mul pos).flip = zero.flip.mul pos(zero.mul neg).flip = zero.flip.mul neg(zero.mul zero).flip = zero.flip.mul zero (pos.mul pos).flip = pos.flip.mul pos(pos.mul neg).flip = pos.flip.mul neg(pos.mul zero).flip = pos.flip.mul zero(neg.mul pos).flip = neg.flip.mul pos(neg.mul neg).flip = neg.flip.mul neg(neg.mul zero).flip = neg.flip.mul zero(zero.mul pos).flip = zero.flip.mul pos(zero.mul neg).flip = zero.flip.mul neg(zero.mul zero).flip = zero.flip.mul zero All goals completed! 🐙 lemma mul_nonneg {s t : Sign} (hs : s.nonneg) (ht : t.nonneg) : (mul s t).nonneg := s:Signt:Signhs:s.nonneght:t.nonneg(s.mul t).nonneg t:Signht:t.nonneghs:pos.nonneg(pos.mul t).nonnegt:Signht:t.nonneghs:neg.nonneg(neg.mul t).nonnegt:Signht:t.nonneghs:zero.nonneg(zero.mul t).nonneg t:Signht:t.nonneghs:pos.nonneg(pos.mul t).nonnegt:Signht:t.nonneghs:neg.nonneg(neg.mul t).nonnegt:Signht:t.nonneghs:zero.nonneg(zero.mul t).nonneg hs:zero.nonneght:pos.nonneg(zero.mul pos).nonneghs:zero.nonneght:neg.nonneg(zero.mul neg).nonneghs:zero.nonneght:zero.nonneg(zero.mul zero).nonneg hs:pos.nonneght:pos.nonneg(pos.mul pos).nonneghs:pos.nonneght:neg.nonneg(pos.mul neg).nonneghs:pos.nonneght:zero.nonneg(pos.mul zero).nonneghs:neg.nonneght:pos.nonneg(neg.mul pos).nonneghs:neg.nonneght:neg.nonneg(neg.mul neg).nonneghs:neg.nonneght:zero.nonneg(neg.mul zero).nonneghs:zero.nonneght:pos.nonneg(zero.mul pos).nonneghs:zero.nonneght:neg.nonneg(zero.mul neg).nonneghs:zero.nonneght:zero.nonneg(zero.mul zero).nonneg All goals completed! 🐙 lemma nonneg_mul_flip_of_not_nonneg {s t : Sign} (hs : ¬s.nonneg) (ht : ¬t.nonneg) : (mul s t).nonneg := s:Signt:Signhs:¬s.nonneght:¬t.nonneg(s.mul t).nonneg t:Signht:¬t.nonneghs:¬pos.nonneg(pos.mul t).nonnegt:Signht:¬t.nonneghs:¬neg.nonneg(neg.mul t).nonnegt:Signht:¬t.nonneghs:¬zero.nonneg(zero.mul t).nonneg t:Signht:¬t.nonneghs:¬pos.nonneg(pos.mul t).nonnegt:Signht:¬t.nonneghs:¬neg.nonneg(neg.mul t).nonnegt:Signht:¬t.nonneghs:¬zero.nonneg(zero.mul t).nonneg hs:¬zero.nonneght:¬pos.nonneg(zero.mul pos).nonneghs:¬zero.nonneght:¬neg.nonneg(zero.mul neg).nonneghs:¬zero.nonneght:¬zero.nonneg(zero.mul zero).nonneg hs:¬pos.nonneght:¬pos.nonneg(pos.mul pos).nonneghs:¬pos.nonneght:¬neg.nonneg(pos.mul neg).nonneghs:¬pos.nonneght:¬zero.nonneg(pos.mul zero).nonneghs:¬neg.nonneght:¬pos.nonneg(neg.mul pos).nonneghs:¬neg.nonneght:¬neg.nonneg(neg.mul neg).nonneghs:¬neg.nonneght:¬zero.nonneg(neg.mul zero).nonneghs:¬zero.nonneght:¬pos.nonneg(zero.mul pos).nonneghs:¬zero.nonneght:¬neg.nonneg(zero.mul neg).nonneghs:¬zero.nonneght:¬zero.nonneg(zero.mul zero).nonneg All goals completed! 🐙

Embed signs into integers: pos ↦ 1, neg ↦ -1, zero ↦ 0.

def toInt : Sign Int | .pos => 1 | .neg => -1 | .zero => 0 @[simp] theorem toInt_pos : pos.toInt = 1 := rfl@[simp] theorem toInt_neg : neg.toInt = -1 := rfl@[simp] theorem toInt_zero : zero.toInt = 0 := rfl end Sign

Comparison sign of two naturals: pos if a < b, neg if a > b, zero if a = b. Convention: cmpSign a b = pos means "b is better" (higher index preferred).

def cmpSign (a b : ) : Sign := if a < b then Sign.pos else if b < a then Sign.neg else Sign.zero @[simp] theorem cmpSign_self (a : ) : cmpSign a a = Sign.zero := a:cmpSign a a = Sign.zero All goals completed! 🐙 lemma cmpSign_flip (a b : ) : (cmpSign a b).flip = cmpSign b a := a:b:(cmpSign a b).flip = cmpSign b a a:b:(if a < b then Sign.pos else if b < a then Sign.neg else Sign.zero).flip = if b < a then Sign.pos else if a < b then Sign.neg else Sign.zero a:b:h✝:a < bSign.pos.flip = if b < a then Sign.pos else Sign.nega:b:h✝:¬a < b(if b < a then Sign.neg else Sign.zero).flip = if b < a then Sign.pos else Sign.zero a:b:h✝:a < bSign.pos.flip = if b < a then Sign.pos else Sign.nega:b:h✝:¬a < b(if b < a then Sign.neg else Sign.zero).flip = if b < a then Sign.pos else Sign.zero (a:b:h✝¹:¬a < bh✝:b < aSign.neg.flip = Sign.posa:b:h✝¹:¬a < bh✝:¬b < aSign.zero.flip = Sign.zero a:b:h✝¹:¬a < bh✝:b < aSign.neg.flip = Sign.posa:b:h✝¹:¬a < bh✝:¬b < aSign.zero.flip = Sign.zero All goals completed! 🐙 a:b:h✝¹:a < bh✝:b < aFalse All goals completed! 🐙) lemma cmpSign_nonneg_iff {a b : } : (cmpSign a b).nonneg a b := a:b:(cmpSign a b).nonneg a b a:b:(if a < b then Sign.pos else if b < a then Sign.neg else Sign.zero).nonneg a b a:b:h✝:a < bSign.pos.nonneg a ba:b:h✝:¬a < b(if b < a then Sign.neg else Sign.zero).nonneg a b a:b:h✝:a < bSign.pos.nonneg a b a:b:h✝:a < ba b; All goals completed! 🐙 a:b:h✝:¬a < b(if b < a then Sign.neg else Sign.zero).nonneg a b a:b:h✝¹:¬a < bh✝:b < aSign.neg.nonneg a ba:b:h✝¹:¬a < bh✝:¬b < aSign.zero.nonneg a b a:b:h✝¹:¬a < bh✝:b < aSign.neg.nonneg a b a:b:h✝¹:¬a < bh✝:b < ab < a; All goals completed! 🐙 a:b:h✝¹:¬a < bh✝:¬b < aSign.zero.nonneg a b a:b:h✝¹:¬a < bh✝:¬b < aa b; All goals completed! 🐙 lemma cmpSign_trans {a b c : } (h1 : (cmpSign a b).nonneg) (h2 : (cmpSign b c).nonneg) : (cmpSign a c).nonneg := a:b:c:h1:(cmpSign a b).nonnegh2:(cmpSign b c).nonneg(cmpSign a c).nonneg a:b:c:h1:a bh2:b ca c; All goals completed! 🐙

A face is a nonempty subset of a finite set. It represents a face of a discrete simplex, the span of the vertices it contains.

@[reducible] -- ANCHOR: Face def Face (V : Type*) [DecidableEq V] := { S : Finset V // S.Nonempty }-- ANCHOR_END: Face namespace Face variable {V : Type*} [DecidableEq V]

Given an element of type V, the set {v} as a face.

def vertex (v : V) : Face V := {v}, Finset.singleton_nonempty v @[simp] theorem vertex_val {v : V} : (vertex v : Face V).1 = {v} := rfl

The full face containing all actions. Represents the maximally mixed strategy.

def full [Fintype V] [Nonempty V] : Face V := Finset.univ, Finset.univ_nonempty @[simp] theorem full_val [Fintype V] [Nonempty V] : (full : Face V).1 = Finset.univ := rfl

The mixture (union) of two faces. Represents mixing the strategies in A with those in B.

def mix (A B : Face V) : Face V := A.1 B.1, A.2.mono Finset.subset_union_left @[simp] theorem mix_val {A B : Face V} : (mix A B).1 = A.1 B.1 := rfl lemma mix_comm (A B : Face V) : mix A B = mix B A := Subtype.ext (Finset.union_comm A.1 B.1) lemma mix_idem (A : Face V) : mix A A = A := Subtype.ext (Finset.union_self A.1) lemma mix_assoc (A B C : Face V) : mix (mix A B) C = mix A (mix B C) := Subtype.ext (Finset.union_assoc A.1 B.1 C.1)

IsSubface A B means A's actions are a subset of B's actions.

def IsSubface (A B : Face V) : Prop := A.1 B.1 lemma IsSubface.refl (A : Face V) : IsSubface A A := fun _ h => h lemma IsSubface.trans {A B C : Face V} (h1 : IsSubface A B) (h2 : IsSubface B C) : IsSubface A C := fun _ h => h2 (h1 h) instance (A B : Face V) : Decidable (IsSubface A B) := inferInstanceAs (Decidable (A.1 B.1)) @[ext] lemma ext {A B : Face V} (h : A.1 = B.1) : A = B := Subtype.ext h instance instFintype [Fintype V] : Fintype (Face V) := V:Type u_1inst✝¹:DecidableEq Vinst✝:Fintype VFintype (Face V) All goals completed! 🐙 end Face -- ================================================================ -- Section 2: Profile types -- ================================================================ variable (I : Type*) [DecidableEq I] (V : I Type*) [ i, DecidableEq (V i)]

A pure profile is a choice of action for each player.

abbrev PureProfile := i : I, V i

A profile is a choice of face (mixed strategy) for each player.

abbrev Profile := i : I, Face (V i)

A deviation σ[i ↦ A] is a new profile in which player i selects A.

scoped notation σ "[" i " ↦ " A "]" => Function.update σ i A

ConsistentAt σ i p says that pure profile p is consistent with mixed profile σ from player i's perspective: every opponent j ≠ i plays an action within their face σ j. Player i's own action in p is unconstrained — this reflects that dominance compares i's alternatives while holding opponents fixed.

def ConsistentAt {I : Type*} {V : I Type*} [ i, DecidableEq (V i)] (σ : Profile I V) (i : I) (p : PureProfile I V) : Prop := j, j i p j (σ j).1

If p is consistent with σ[i ↦ A] at player i, it is also consistent with σ, since updating player i's face doesn't affect opponents' faces.

lemma ConsistentAt.update {I : Type*} [DecidableEq I] {V : I Type*} [ i, DecidableEq (V i)] {σ : Profile I V} {i : I} {A : Face (V i)} {p : PureProfile I V} (h : ConsistentAt (σ[i A]) i p) : ConsistentAt σ i p := fun j hj => I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)σ:Profile I Vi:IA:Face (V i)p:PureProfile I Vh:ConsistentAt (σ[i A]) i pj:Ihj:j ip j (σ j) I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)σ:Profile I Vi:IA:Face (V i)p:PureProfile I Vh:ConsistentAt (σ[i A]) i pj:Ihj:j ithis:p j ((σ[i A]) j) := h j hjp j (σ j); rwa [Function.update_of_ne hjI:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)σ:Profile I Vi:IA:Face (V i)p:PureProfile I Vh:ConsistentAt (σ[i A]) i pj:Ihj:j ithis:p j (σ j)p j (σ j) at this

Consistency is monotone in opponent faces: if p is consistent with σ and every opponent's face in σ is a subface of the corresponding face in τ, then p is consistent with τ.

lemma ConsistentAt.mono {I : Type*} {V : I Type*} [ i, DecidableEq (V i)] {σ τ : Profile I V} {i : I} {p : PureProfile I V} (h : ConsistentAt σ i p) (hsub : j, j i Face.IsSubface (σ j) (τ j)) : ConsistentAt τ i p := fun j hj => hsub j hj (h j hj)

An N-player sign game over player set I and action types V.

For each player i, sign i p q returns the preference of i between outcome p versus outcome q. The result is pos if p is preferred, neg if q is preferred, zero if indifferent.

The axioms require that preferences form a total preorder on outcomes for each player. The within-profile comparison signAction (comparing two actions holding opponents fixed) is derived as sign i (p[i↦a]) (p[i↦b]).

-- ANCHOR: SignGame structure SignGame where sign : (i : I) PureProfile I V PureProfile I V Sign sign_refl : i p, sign i p p = .zero sign_antisym : i p q, sign i p q = (sign i q p).flip sign_trans : i p q r, (sign i p q).nonneg (sign i q r).nonneg (sign i p r).nonneg-- ANCHOR_END: SignGame variable {I} {V} namespace SignGame variable {I : Type*} [DecidableEq I] {V : I Type*} [ i, DecidableEq (V i)]variable (G : SignGame I V)

Within-profile action comparison: compares playing a vs b for player i, holding opponents fixed at p. Defined as sign i (p[i↦a]) (p[i↦b]).

abbrev signAction (i : I) (p : PureProfile I V) (a b : V i) : Sign := G.sign i (p[i a]) (p[i b]) automatically included section variable(s) unused in theorem `Base.SignGame.signAction_refl`: [(i : I) DecidableEq (V i)] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [(i : I) DecidableEq (V i)] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`lemma signAction_refl (i : I) (p : PureProfile I V) (a : V i) : G.signAction i p a a = .zero := G.sign_refl i _ automatically included section variable(s) unused in theorem `Base.SignGame.signAction_antisym`: [(i : I) DecidableEq (V i)] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [(i : I) DecidableEq (V i)] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`lemma signAction_antisym (i : I) (p : PureProfile I V) (a b : V i) : G.signAction i p a b = (G.signAction i p b a).flip := G.sign_antisym i _ _ automatically included section variable(s) unused in theorem `Base.SignGame.signAction_trans`: [(i : I) DecidableEq (V i)] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [(i : I) DecidableEq (V i)] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`lemma signAction_trans (i : I) (p : PureProfile I V) (a b c : V i) (hab : (G.signAction i p a b).nonneg) (hbc : (G.signAction i p b c).nonneg) : (G.signAction i p a c).nonneg := G.sign_trans i _ _ _ hab hbcautomatically included section variable(s) unused in theorem `Base.SignGame.signAction_irrel`: [(i : I) DecidableEq (V i)] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [(i : I) DecidableEq (V i)] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.signAction_irrel`: [(i : I) DecidableEq (V i)] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [(i : I) DecidableEq (V i)] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.signAction_irrel`: [(i : I) DecidableEq (V i)] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [(i : I) DecidableEq (V i)] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.signAction_irrel`: [(i : I) DecidableEq (V i)] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [(i : I) DecidableEq (V i)] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.signAction_irrel`: [(i : I) DecidableEq (V i)] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [(i : I) DecidableEq (V i)] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.signAction_irrel`: [(i : I) DecidableEq (V i)] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [(i : I) DecidableEq (V i)] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.signAction_irrel`: [(i : I) DecidableEq (V i)] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [(i : I) DecidableEq (V i)] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.signAction_irrel`: [(i : I) DecidableEq (V i)] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [(i : I) DecidableEq (V i)] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.signAction_irrel`: [(i : I) DecidableEq (V i)] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [(i : I) DecidableEq (V i)] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.signAction_irrel`: [(i : I) DecidableEq (V i)] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [(i : I) DecidableEq (V i)] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.signAction_irrel`: [(i : I) DecidableEq (V i)] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [(i : I) DecidableEq (V i)] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.signAction_irrel`: [(i : I) DecidableEq (V i)] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [(i : I) DecidableEq (V i)] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.signAction_irrel`: [(i : I) DecidableEq (V i)] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [(i : I) DecidableEq (V i)] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.signAction_irrel`: [(i : I) DecidableEq (V i)] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [(i : I) DecidableEq (V i)] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.signAction_irrel`: [(i : I) DecidableEq (V i)] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [(i : I) DecidableEq (V i)] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.signAction_irrel`: [(i : I) DecidableEq (V i)] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [(i : I) DecidableEq (V i)] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.signAction_irrel`: [(i : I) DecidableEq (V i)] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [(i : I) DecidableEq (V i)] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` automatically included section variable(s) unused in theorem `Base.SignGame.signAction_irrel`: [(i : I) DecidableEq (V i)] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [(i : I) DecidableEq (V i)] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`lemma signAction_irrel (i : I) (p q : PureProfile I V) (a b : V i) (h : j, j i p j = q j) : G.signAction i p a b = G.signAction i q a b := I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ip:PureProfile I Vq:PureProfile I Va:V ib:V ih: (j : I), j i p j = q jG.signAction i p a b = G.signAction i q a b I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ip:PureProfile I Vq:PureProfile I Va:V ib:V ih: (j : I), j i p j = q jG.sign i (p[i a]) (p[i b]) = G.sign i (q[i a]) (q[i b]) I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ip:PureProfile I Vq:PureProfile I Va:V ib:V ih: (j : I), j i p j = q jp[i a] = q[i a]I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ip:PureProfile I Vq:PureProfile I Va:V ib:V ih: (j : I), j i p j = q jp[i b] = q[i b] I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ip:PureProfile I Vq:PureProfile I Va:V ib:V ih: (j : I), j i p j = q jp[i a] = q[i a]I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ip:PureProfile I Vq:PureProfile I Va:V ib:V ih: (j : I), j i p j = q jp[i b] = q[i b] I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ip:PureProfile I Vq:PureProfile I Va:V ib:V ih: (j : I), j i p j = q jj:I(p[i b]) j = (q[i b]) j I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ip:PureProfile I Vq:PureProfile I Va:V ib:V ih: (j : I), j i p j = q jj:I(p[i a]) j = (q[i a]) jI:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ip:PureProfile I Vq:PureProfile I Va:V ib:V ih: (j : I), j i p j = q jj:I(p[i b]) j = (q[i b]) j I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ip:PureProfile I Vq:PureProfile I Va:V ib:V ih: (j : I), j i p j = q jj:Ihji:j = i(p[i b]) j = (q[i b]) jI:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ip:PureProfile I Vq:PureProfile I Va:V ib:V ih: (j : I), j i p j = q jj:Ihji:¬j = i(p[i b]) j = (q[i b]) j I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ip:PureProfile I Vq:PureProfile I Va:V ib:V ih: (j : I), j i p j = q jj:Ihji:j = i(p[i a]) j = (q[i a]) j I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vp:PureProfile I Vq:PureProfile I Vj:Ia:V jb:V jh: (j_1 : I), j_1 j p j_1 = q j_1(p[j a]) j = (q[j a]) j; All goals completed! 🐙 I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ip:PureProfile I Vq:PureProfile I Va:V ib:V ih: (j : I), j i p j = q jj:Ihji:¬j = i(p[i a]) j = (q[i a]) j All goals completed! 🐙 I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ip:PureProfile I Vq:PureProfile I Va:V ib:V ih: (j : I), j i p j = q jj:Ihji:j = i(p[i b]) j = (q[i b]) j I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vp:PureProfile I Vq:PureProfile I Vj:Ia:V jb:V jh: (j_1 : I), j_1 j p j_1 = q j_1(p[j b]) j = (q[j b]) j; All goals completed! 🐙 I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ip:PureProfile I Vq:PureProfile I Va:V ib:V ih: (j : I), j i p j = q jj:Ihji:¬j = i(p[i b]) j = (q[i b]) j All goals completed! 🐙

Face A weakly dominates face B for player i in profile σ.

This means: for every action a ∈ A, every pure profile p where opponents play within their faces in σ, and every action b ∈ B, player i weakly prefers a to b. Equivalently, every action in A is at least as good as every action in B, regardless of what the opponents do (within their current faces).

This is a conservative (worst-case) notion of dominance — since we don't know the exact probability distribution opponents use, we require dominance against all possible opponent action combinations.

-- ANCHOR: Dominates def Dominates (i : I) (σ : Profile I V) (A B : Face (V i)) : Prop := a A.1, p : PureProfile I V, ConsistentAt σ i p b B.1, (G.signAction i p a b).nonneg-- ANCHOR_END: Dominates -- ================================================================ -- Section 5: Monotonicity and transitivity -- ================================================================ namespace Dominates

Antitonicity in opponent faces: if A dominates B against the larger opponent profile τ, it also dominates against the smaller profile σ (where each opponent's face is a subface of the corresponding face in τ). Larger opponent faces mean more opponent scenarios to check, so domination against a larger profile is stronger.

protected lemma antitone {i : I} {σ τ : Profile I V} (h : j, j i Face.IsSubface (σ j) (τ j)) {A B : Face (V i)} (hle : G.Dominates i τ A B) : G.Dominates i σ A B := fun a ha p hp b hb => hle a ha p (hp.mono h) b hb

Left monotonicity: if A' dominates B, then any subface A ⊆ A' also dominates B, since fewer actions in A means fewer conditions to satisfy.

protected lemma mono_left {i : I} {σ : Profile I V} {A A' B : Face (V i)} (h : Face.IsSubface A A') (hle : G.Dominates i σ A' B) : G.Dominates i σ A B := fun a ha p hp b hb => hle a (h ha) p hp b hb

Right monotonicity: if A dominates the larger face B', then A dominates any subface B ⊆ B', since there are fewer actions in B that need to be dominated.

protected lemma mono_right {i : I} {σ : Profile I V} {A B B' : Face (V i)} (h : Face.IsSubface B B') (hle : G.Dominates i σ A B') : G.Dominates i σ A B := fun a ha p hp b hb => hle a ha p hp b (h hb)

Transitivity: if A dominates B and B dominates C, then A dominates C. Uses the transitivity of the underlying sign function (sign_trans).

protected lemma trans {i : I} {σ : Profile I V} {A B C : Face (V i)} (hAB : G.Dominates i σ A B) (hBC : G.Dominates i σ B C) : G.Dominates i σ A C := I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)B:Face (V i)C:Face (V i)hAB:G.Dominates i σ A BhBC:G.Dominates i σ B CG.Dominates i σ A C intro a I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)B:Face (V i)C:Face (V i)hAB:G.Dominates i σ A BhBC:G.Dominates i σ B Ca:V iha:a A (p : PureProfile I V), ConsistentAt σ i p b C, (G.signAction i p a b).nonneg I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)B:Face (V i)C:Face (V i)hAB:G.Dominates i σ A BhBC:G.Dominates i σ B Ca:V iha:a Ap:PureProfile I VConsistentAt σ i p b C, (G.signAction i p a b).nonneg I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)B:Face (V i)C:Face (V i)hAB:G.Dominates i σ A BhBC:G.Dominates i σ B Ca:V iha:a Ap:PureProfile I Vhp:ConsistentAt σ i p b C, (G.signAction i p a b).nonneg I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)B:Face (V i)C:Face (V i)hAB:G.Dominates i σ A BhBC:G.Dominates i σ B Ca:V iha:a Ap:PureProfile I Vhp:ConsistentAt σ i pc:V ic C (G.signAction i p a c).nonneg I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)B:Face (V i)C:Face (V i)hAB:G.Dominates i σ A BhBC:G.Dominates i σ B Ca:V iha:a Ap:PureProfile I Vhp:ConsistentAt σ i pc:V ihc:c C(G.signAction i p a c).nonneg I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)B:Face (V i)C:Face (V i)hAB:G.Dominates i σ A BhBC:G.Dominates i σ B Ca:V iha:a Ap:PureProfile I Vhp:ConsistentAt σ i pc:V ihc:c Cb:V ihb:b B(G.signAction i p a c).nonneg All goals completed! 🐙 end Dominates

Player i has a strictly better deviation to face A from profile σ. This means A weakly dominates σ i (player i's current face), but σ i does not weakly dominate A — so A is genuinely better in at least one scenario.

-- ANCHOR: StrictDom def StrictDom (i : I) (σ : Profile I V) (A : Face (V i)) : Prop := G.Dominates i σ A (σ i) ¬G.Dominates i σ (σ i) A def IsNash (σ : Profile I V) : Prop := (i : I) (A : Face (V i)), ¬G.StrictDom i σ A

The OutsideDom (outside dominated) invariant for player i at profile σ.

OutsideDom i σ says that for every action v outside player i's current face and every action w inside it, {w} dominates {v}. In other words, every excluded action has already been checked and found to be worse than every included action.

This is the key invariant maintained by the Nash existence descent algorithm: it ensures that restricting a player's face to a dominating subface doesn't invalidate previous elimination steps.

Game-theoretic interpretation. OutsideDom is the invariant of iterated elimination of strictly dominated strategies (IESDS): it is preserved under the descent, and a profile where it holds can be interpreted as a state of the IESDS algorithm in which every eliminated action is dominated by every surviving one. Our condition is slightly stronger than classical rationalizability, which only requires each eliminated action to be dominated by some mixed strategy.

-- ANCHOR: OutsideDom def OutsideDom (i : I) (σ : Profile I V) : Prop := v, v (σ i).1 w, w (σ i).1 G.Dominates i σ (Face.vertex w) (Face.vertex v)-- ANCHOR_END: OutsideDom -- ================================================================ -- Section 8-9: OutsideDom API -- ================================================================ namespace OutsideDom

The full profile (every player plays every action) trivially satisfies OutsideDom, since there are no excluded actions to check. This is the starting point of the Nash descent algorithm.

protected lemma maximal (i : I) [ j, Fintype (V j)] [ j, Nonempty (V j)] : G.OutsideDom i (fun _ => Face.full) := fun v hv => absurd (Finset.mem_univ v) hv

OutsideDom is preserved for the deviating player when they restrict to a subface.

If player i restricts their face from σ i to a subface A ⊆ σ i that dominates σ i, then OutsideDom still holds for player i in the updated profile σ[i ↦ A].

The proof handles two cases for an excluded action v:

    If v was already outside σ i: use the old OutsideDom hypothesis.

    If v was in σ i but is now outside A: use the fact that A dominates σ i.

protected lemma preserved {i : I} {σ : Profile I V} {A : Face (V i)} (h_inv : G.OutsideDom i σ) (h_sub : Face.IsSubface A (σ i)) (h_dev : G.Dominates i σ A (σ i)) : G.OutsideDom i (σ[i A]) := I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)G.OutsideDom i (σ[i A]) intro v I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)v:V ihv:v ((σ[i A]) i) w ((σ[i A]) i), G.Dominates i (σ[i A]) (Face.vertex w) (Face.vertex v) I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)v:V ihv:v ((σ[i A]) i)w:V iw ((σ[i A]) i) G.Dominates i (σ[i A]) (Face.vertex w) (Face.vertex v) I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)v:V ihv:v ((σ[i A]) i)w:V ihw:w ((σ[i A]) i)G.Dominates i (σ[i A]) (Face.vertex w) (Face.vertex v) have hv' : v A.1 := I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)G.OutsideDom i (σ[i A]) rwa [show (Function.update σ i A i).1 = A.1 from I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)v:V ihv:v ((σ[i A]) i)w:V ihw:w ((σ[i A]) i)((σ[i A]) i) = A All goals completed! 🐙I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)v:V ihv:v Aw:V ihw:w ((σ[i A]) i)v A at hv have hw' : w A.1 := I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)G.OutsideDom i (σ[i A]) rwa [show (Function.update σ i A i).1 = A.1 from I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)v:V ihv:v ((σ[i A]) i)w:V ihw:w ((σ[i A]) i)hv':v A := Eq.mp (congrArg (fun _a => v _a) (have this := of_eq_true (Eq.trans (congrArg (fun x => x = A) (Function.update_self i A σ)) (eq_self A)); this)) hv((σ[i A]) i) = A All goals completed! 🐙I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)v:V ihv:v ((σ[i A]) i)w:V ihw:w Ahv':v Aw A at hw intro a I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)v:V ihv:v ((σ[i A]) i)w:V ihw:w ((σ[i A]) i)hv':v A := Eq.mp (congrArg (fun _a => v _a) (have this := of_eq_true (Eq.trans (congrArg (fun x => x = A) (Function.update_self i A σ)) (eq_self A)); this)) hvhw':w A := Eq.mp (congrArg (fun _a => w _a) (have this := of_eq_true (Eq.trans (congrArg (fun x => x = A) (Function.update_self i A σ)) (eq_self A)); this)) hwa:V iha_w:a (Face.vertex w) (p : PureProfile I V), ConsistentAt (σ[i A]) i p b (Face.vertex v), (G.signAction i p a b).nonneg I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)v:V ihv:v ((σ[i A]) i)w:V ihw:w ((σ[i A]) i)hv':v A := Eq.mp (congrArg (fun _a => v _a) (have this := of_eq_true (Eq.trans (congrArg (fun x => x = A) (Function.update_self i A σ)) (eq_self A)); this)) hvhw':w A := Eq.mp (congrArg (fun _a => w _a) (have this := of_eq_true (Eq.trans (congrArg (fun x => x = A) (Function.update_self i A σ)) (eq_self A)); this)) hwa:V iha_w:a (Face.vertex w)p:PureProfile I VConsistentAt (σ[i A]) i p b (Face.vertex v), (G.signAction i p a b).nonneg I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)v:V ihv:v ((σ[i A]) i)w:V ihw:w ((σ[i A]) i)hv':v A := Eq.mp (congrArg (fun _a => v _a) (have this := of_eq_true (Eq.trans (congrArg (fun x => x = A) (Function.update_self i A σ)) (eq_self A)); this)) hvhw':w A := Eq.mp (congrArg (fun _a => w _a) (have this := of_eq_true (Eq.trans (congrArg (fun x => x = A) (Function.update_self i A σ)) (eq_self A)); this)) hwa:V iha_w:a (Face.vertex w)p:PureProfile I Vhp:ConsistentAt (σ[i A]) i p b (Face.vertex v), (G.signAction i p a b).nonneg I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)v:V ihv:v ((σ[i A]) i)w:V ihw:w ((σ[i A]) i)hv':v A := Eq.mp (congrArg (fun _a => v _a) (have this := of_eq_true (Eq.trans (congrArg (fun x => x = A) (Function.update_self i A σ)) (eq_self A)); this)) hvhw':w A := Eq.mp (congrArg (fun _a => w _a) (have this := of_eq_true (Eq.trans (congrArg (fun x => x = A) (Function.update_self i A σ)) (eq_self A)); this)) hwa:V iha_w:a (Face.vertex w)p:PureProfile I Vhp:ConsistentAt (σ[i A]) i pb:V ib (Face.vertex v) (G.signAction i p a b).nonneg I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)v:V ihv:v ((σ[i A]) i)w:V ihw:w ((σ[i A]) i)hv':v A := Eq.mp (congrArg (fun _a => v _a) (have this := of_eq_true (Eq.trans (congrArg (fun x => x = A) (Function.update_self i A σ)) (eq_self A)); this)) hvhw':w A := Eq.mp (congrArg (fun _a => w _a) (have this := of_eq_true (Eq.trans (congrArg (fun x => x = A) (Function.update_self i A σ)) (eq_self A)); this)) hwa:V iha_w:a (Face.vertex w)p:PureProfile I Vhp:ConsistentAt (σ[i A]) i pb:V ihb_v:b (Face.vertex v)(G.signAction i p a b).nonneg I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)v:V ihv:v ((σ[i A]) i)w:V ihw:w ((σ[i A]) i)hv':v A := Eq.mp (congrArg (fun _a => v _a) (have this := of_eq_true (Eq.trans (congrArg (fun x => x = A) (Function.update_self i A σ)) (eq_self A)); this)) hvhw':w A := Eq.mp (congrArg (fun _a => w _a) (have this := of_eq_true (Eq.trans (congrArg (fun x => x = A) (Function.update_self i A σ)) (eq_self A)); this)) hwa:V iha_w:a (Face.vertex w)p:PureProfile I Vhp:ConsistentAt (σ[i A]) i pb:V ihb_v:b (Face.vertex v)ha:a = w := Finset.mem_singleton.mp ha_w(G.signAction i p a b).nonneg I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)v:V ihv:v ((σ[i A]) i)w:V ihw:w ((σ[i A]) i)hv':v A := Eq.mp (congrArg (fun _a => v _a) (have this := of_eq_true (Eq.trans (congrArg (fun x => x = A) (Function.update_self i A σ)) (eq_self A)); this)) hvhw':w A := Eq.mp (congrArg (fun _a => w _a) (have this := of_eq_true (Eq.trans (congrArg (fun x => x = A) (Function.update_self i A σ)) (eq_self A)); this)) hwa:V iha_w:a (Face.vertex w)p:PureProfile I Vhp:ConsistentAt (σ[i A]) i pb:V ihb_v:b (Face.vertex v)ha:a = w := Finset.mem_singleton.mp ha_whb:b = v := Finset.mem_singleton.mp hb_v(G.signAction i p a b).nonneg I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)v:V ihv:v ((σ[i A]) i)hv':v A := Eq.mp (congrArg (fun _a => v _a) (have this := of_eq_true (Eq.trans (congrArg (fun x => x = A) (Function.update_self i A σ)) (eq_self A)); this)) hva:V ip:PureProfile I Vhp:ConsistentAt (σ[i A]) i pb:V ihb_v:b (Face.vertex v)hb:b = v := Finset.mem_singleton.mp hb_vhw:a ((σ[i A]) i)hw':a Aha_w:a (Face.vertex a)(G.signAction i p a b).nonneg; I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)a:V ip:PureProfile I Vhp:ConsistentAt (σ[i A]) i pb:V ihw:a ((σ[i A]) i)hw':a Aha_w:a (Face.vertex a)hv:b ((σ[i A]) i)hv':b Ahb_v:b (Face.vertex b)(G.signAction i p a b).nonneg -- After subst: a replaces w, b replaces v; hw' : a ∈ A.1, hv' : b ∉ A.1 I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)a:V ip:PureProfile I Vhp:ConsistentAt (σ[i A]) i pb:V ihw:a ((σ[i A]) i)hw':a Aha_w:a (Face.vertex a)hv:b ((σ[i A]) i)hv':b Ahb_v:b (Face.vertex b)hp':ConsistentAt σ i p := ConsistentAt.update hp(G.signAction i p a b).nonneg I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)a:V ip:PureProfile I Vhp:ConsistentAt (σ[i A]) i pb:V ihw:a ((σ[i A]) i)hw':a Aha_w:a (Face.vertex a)hv:b ((σ[i A]) i)hv':b Ahb_v:b (Face.vertex b)hp':ConsistentAt σ i p := ConsistentAt.update hphb_in:b (σ i)(G.signAction i p a b).nonnegI:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)a:V ip:PureProfile I Vhp:ConsistentAt (σ[i A]) i pb:V ihw:a ((σ[i A]) i)hw':a Aha_w:a (Face.vertex a)hv:b ((σ[i A]) i)hv':b Ahb_v:b (Face.vertex b)hp':ConsistentAt σ i p := ConsistentAt.update hphb_in:b (σ i)(G.signAction i p a b).nonneg I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)a:V ip:PureProfile I Vhp:ConsistentAt (σ[i A]) i pb:V ihw:a ((σ[i A]) i)hw':a Aha_w:a (Face.vertex a)hv:b ((σ[i A]) i)hv':b Ahb_v:b (Face.vertex b)hp':ConsistentAt σ i p := ConsistentAt.update hphb_in:b (σ i)(G.signAction i p a b).nonneg All goals completed! 🐙 I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_sub:A.IsSubface (σ i)h_dev:G.Dominates i σ A (σ i)a:V ip:PureProfile I Vhp:ConsistentAt (σ[i A]) i pb:V ihw:a ((σ[i A]) i)hw':a Aha_w:a (Face.vertex a)hv:b ((σ[i A]) i)hv':b Ahb_v:b (Face.vertex b)hp':ConsistentAt σ i p := ConsistentAt.update hphb_in:b (σ i)(G.signAction i p a b).nonneg All goals completed! 🐙

OutsideDom is preserved for other players when player i restricts their face.

If player i shrinks their face to A ⊆ σ i, then OutsideDom for any other player j ≠ i is preserved. This follows from antitonicity: shrinking an opponent's face makes domination easier (fewer opponent scenarios to check).

protected lemma preserved_other {i j : I} (hij : j i) {σ : Profile I V} {A : Face (V i)} (h_inv : G.OutsideDom j σ) (h_sub : Face.IsSubface A (σ i)) : G.OutsideDom j (σ[i A]) := I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ij:Ihij:j iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom j σh_sub:A.IsSubface (σ i)G.OutsideDom j (σ[i A]) intro v I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ij:Ihij:j iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom j σh_sub:A.IsSubface (σ i)v:V jhv:v ((σ[i A]) j) w ((σ[i A]) j), G.Dominates j (σ[i A]) (Face.vertex w) (Face.vertex v) I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ij:Ihij:j iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom j σh_sub:A.IsSubface (σ i)v:V jhv:v ((σ[i A]) j)w:V jw ((σ[i A]) j) G.Dominates j (σ[i A]) (Face.vertex w) (Face.vertex v) I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ij:Ihij:j iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom j σh_sub:A.IsSubface (σ i)v:V jhv:v ((σ[i A]) j)w:V jhw:w ((σ[i A]) j)G.Dominates j (σ[i A]) (Face.vertex w) (Face.vertex v) I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ij:Ihij:j iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom j σh_sub:A.IsSubface (σ i)v:V jhv:v (σ j)w:V jhw:w (σ j)G.Dominates j (σ[i A]) (Face.vertex w) (Face.vertex v) I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ij:Ihij:j iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom j σh_sub:A.IsSubface (σ i)v:V jhv:v (σ j)w:V jhw:w (σ j) (j_1 : I), j_1 j ((σ[i A]) j_1).IsSubface (σ j_1)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ij:Ihij:j iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom j σh_sub:A.IsSubface (σ i)v:V jhv:v (σ j)w:V jhw:w (σ j)G.Dominates j σ (Face.vertex w) (Face.vertex v) I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ij:Ihij:j iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom j σh_sub:A.IsSubface (σ i)v:V jhv:v (σ j)w:V jhw:w (σ j) (j_1 : I), j_1 j ((σ[i A]) j_1).IsSubface (σ j_1) intro k I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ij:Ihij:j iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom j σh_sub:A.IsSubface (σ i)v:V jhv:v (σ j)w:V jhw:w (σ j)k:Ihk:k j((σ[i A]) k).IsSubface (σ k) I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ij:Ihij:j iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom j σh_sub:A.IsSubface (σ i)v:V jhv:v (σ j)w:V jhw:w (σ j)k:Ihk:k jhki:k = i((σ[i A]) k).IsSubface (σ k)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ij:Ihij:j iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom j σh_sub:A.IsSubface (σ i)v:V jhv:v (σ j)w:V jhw:w (σ j)k:Ihk:k jhki:¬k = i((σ[i A]) k).IsSubface (σ k) I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ij:Ihij:j iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom j σh_sub:A.IsSubface (σ i)v:V jhv:v (σ j)w:V jhw:w (σ j)k:Ihk:k jhki:k = i((σ[i A]) k).IsSubface (σ k) I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vj:Iσ:Profile I Vh_inv:G.OutsideDom j σv:V jhv:v (σ j)w:V jhw:w (σ j)k:Ihk:k jhij:j kA:Face (V k)h_sub:A.IsSubface (σ k)((σ[k A]) k).IsSubface (σ k); exact fun x hx => h_sub (I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vj:Iσ:Profile I Vh_inv:G.OutsideDom j σv:V jhv:v (σ j)w:V jhw:w (σ j)k:Ihk:k jhij:j kA:Face (V k)h_sub:A.IsSubface (σ k)x:V khx:x ((σ[k A]) k)x A rwa [Function.update_selfI:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vj:Iσ:Profile I Vh_inv:G.OutsideDom j σv:V jhv:v (σ j)w:V jhw:w (σ j)k:Ihk:k jhij:j kA:Face (V k)h_sub:A.IsSubface (σ k)x:V khx:x Ax A at hx) I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ij:Ihij:j iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom j σh_sub:A.IsSubface (σ i)v:V jhv:v (σ j)w:V jhw:w (σ j)k:Ihk:k jhki:¬k = i((σ[i A]) k).IsSubface (σ k) intro x I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ij:Ihij:j iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom j σh_sub:A.IsSubface (σ i)v:V jhv:v (σ j)w:V jhw:w (σ j)k:Ihk:k jhki:¬k = ix:V khx:x ((σ[i A]) k)x (σ k); rwa [Function.update_of_ne hkiI:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ij:Ihij:j iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom j σh_sub:A.IsSubface (σ i)v:V jhv:v (σ j)w:V jhw:w (σ j)k:Ihk:k jhki:¬k = ix:V khx:x (σ k)x (σ k) at hx I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Ij:Ihij:j iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom j σh_sub:A.IsSubface (σ i)v:V jhv:v (σ j)w:V jhw:w (σ j)G.Dominates j σ (Face.vertex w) (Face.vertex v) All goals completed! 🐙 end OutsideDom

When OutsideDom holds and σ i does not dominate A, the witnessing action b ∈ A (the one that σ i fails to dominate) must actually lie in σ i.

This is because any b ∈ A that is outside σ i would be dominated by every action in σ i (by OutsideDom), contradicting the fact that b witnesses the failure of domination. So the "problematic" action b must be inside the current face.

This is a technical lemma used by restrictStrictDom to show that strict deviations can always be restricted to subfaces of the current face.

private lemma outsideDom_witness_mem {i : I} {σ : Profile I V} {A : Face (V i)} (h_inv : G.OutsideDom i σ) (h_neg : ¬G.Dominates i σ (σ i) A) : a (σ i).1, p : PureProfile I V, ConsistentAt σ i p b A.1, ¬(G.signAction i p a b).nonneg b (σ i).1 := I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_neg:¬G.Dominates i σ (σ i) A a (σ i), p, ConsistentAt σ i p b A, ¬(G.signAction i p a b).nonneg b (σ i) I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_neg:¬ a (σ i), (p : PureProfile I V), (∀ (j : I), j i p j (σ j)) b A, (G.signAction i p a b).nonneg a (σ i), p, ConsistentAt σ i p b A, ¬(G.signAction i p a b).nonneg b (σ i); I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_neg: a (σ i), p, (∀ (j : I), j i p j (σ j)) b A, ¬(G.signAction i p a b).nonneg a (σ i), p, ConsistentAt σ i p b A, ¬(G.signAction i p a b).nonneg b (σ i) I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σa:V iha:a (σ i)p:PureProfile I Vhp: (j : I), j i p j (σ j)b:V ihb:b Ahn:¬(G.signAction i p a b).nonneg a (σ i), p, ConsistentAt σ i p b A, ¬(G.signAction i p a b).nonneg b (σ i) I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σa:V iha:a (σ i)p:PureProfile I Vhp: (j : I), j i p j (σ j)b:V ihb:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i) a (σ i), p, ConsistentAt σ i p b A, ¬(G.signAction i p a b).nonneg b (σ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σa:V iha:a (σ i)p:PureProfile I Vhp: (j : I), j i p j (σ j)b:V ihb:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i) a (σ i), p, ConsistentAt σ i p b A, ¬(G.signAction i p a b).nonneg b (σ i) I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σa:V iha:a (σ i)p:PureProfile I Vhp: (j : I), j i p j (σ j)b:V ihb:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i) a (σ i), p, ConsistentAt σ i p b A, ¬(G.signAction i p a b).nonneg b (σ i) All goals completed! 🐙 I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σa:V iha:a (σ i)p:PureProfile I Vhp: (j : I), j i p j (σ j)b:V ihb:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i) a (σ i), p, ConsistentAt σ i p b A, ¬(G.signAction i p a b).nonneg b (σ i) All goals completed! 🐙

Restriction lemma: any strict deviation can be "restricted" to a subface of the current face.

If OutsideDom holds and player i has a strict deviation to some face A, then A' = A ∩ σ i is also a strict deviation, is a proper subface of σ i, and satisfies A' ≠ σ i. This is crucial for the descent algorithm: it ensures each step strictly shrinks the deviating player's face.

Returned as a subtype (data + proofs) rather than an existential, so it's usable both in proof-level arguments and in the computable findNashOf descent.

def restrictStrictDom {i : I} {σ : Profile I V} {A : Face (V i)} (h_inv : G.OutsideDom i σ) (h_dev : G.StrictDom i σ A) : { A' : Face (V i) // G.StrictDom i σ A' Face.IsSubface A' (σ i) A' σ i } := A.1 (σ i).1, I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_dev:G.StrictDom i σ A(A (σ i)).Nonempty I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σleft✝:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) A(A (σ i)).Nonempty I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σleft✝³:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) Aw✝¹:V ileft✝²:w✝¹ (σ i)w✝:PureProfile I Vleft✝¹:ConsistentAt σ i w✝b:V ihb:b Aleft✝:¬(G.signAction i w✝ w✝¹ b).nonneghb_σ:b (σ i)(A (σ i)).Nonempty All goals completed! 🐙, I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_dev:G.StrictDom i σ AG.StrictDom i σ A (σ i), Face.IsSubface A (σ i), (σ i) A (σ i), σ i I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_fwd:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) AG.StrictDom i σ A (σ i), Face.IsSubface A (σ i), (σ i) A (σ i), σ i I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_fwd:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) Aa:V iha_σ:a (σ i)p:PureProfile I Vhp:ConsistentAt σ i pb:V ihb_A:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i)G.StrictDom i σ A (σ i), Face.IsSubface A (σ i), (σ i) A (σ i), σ i I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_fwd:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) Aa:V iha_σ:a (σ i)p:PureProfile I Vhp:ConsistentAt σ i pb:V ihb_A:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i)G.Dominates i σ A (σ i), (σ i)I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_fwd:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) Aa:V iha_σ:a (σ i)p:PureProfile I Vhp:ConsistentAt σ i pb:V ihb_A:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i)¬G.Dominates i σ (σ i) A (σ i), I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_fwd:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) Aa:V iha_σ:a (σ i)p:PureProfile I Vhp:ConsistentAt σ i pb:V ihb_A:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i)A (σ i), σ i I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_fwd:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) Aa:V iha_σ:a (σ i)p:PureProfile I Vhp:ConsistentAt σ i pb:V ihb_A:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i)G.Dominates i σ A (σ i), (σ i) All goals completed! 🐙 I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_fwd:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) Aa:V iha_σ:a (σ i)p:PureProfile I Vhp:ConsistentAt σ i pb:V ihb_A:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i)¬G.Dominates i σ (σ i) A (σ i), I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_fwd:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) Aa:V iha_σ:a (σ i)p:PureProfile I Vhp:ConsistentAt σ i pb:V ihb_A:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i)h_contra:G.Dominates i σ (σ i) A (σ i), False All goals completed! 🐙 I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_fwd:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) Aa:V iha_σ:a (σ i)p:PureProfile I Vhp:ConsistentAt σ i pb:V ihb_A:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i)A (σ i), σ i I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_fwd:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) Aa:V iha_σ:a (σ i)p:PureProfile I Vhp:ConsistentAt σ i pb:V ihb_A:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i)heq:A (σ i), = σ iFalse have h_σ_sub_A : Face.IsSubface (σ i) A := I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_dev:G.StrictDom i σ AG.StrictDom i σ A (σ i), Face.IsSubface A (σ i), (σ i) A (σ i), σ i intro x I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_fwd:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) Aa:V iha_σ:a (σ i)p:PureProfile I Vhp:ConsistentAt σ i pb:V ihb_A:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i)heq:A (σ i), = σ ix:V ihx:x (σ i)x A; All goals completed! 🐙 I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_fwd:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) Aa:V iha_σ:a (σ i)p:PureProfile I Vhp:ConsistentAt σ i pb:V ihb_A:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i)heq:A (σ i), = σ ih_σ_sub_A:(σ i).IsSubface A := fun x hx => (Finset.mem_inter.mp (Eq.symm heq hx)).leftG.Dominates i σ (σ i) A intro x I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_fwd:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) Aa:V iha_σ:a (σ i)p:PureProfile I Vhp:ConsistentAt σ i pb:V ihb_A:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i)heq:A (σ i), = σ ih_σ_sub_A:(σ i).IsSubface A := fun x hx => (Finset.mem_inter.mp (Eq.symm heq hx)).leftx:V ihx:x (σ i) (p : PureProfile I V), ConsistentAt σ i p b A, (G.signAction i p x b).nonneg I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_fwd:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) Aa:V iha_σ:a (σ i)p:PureProfile I Vhp:ConsistentAt σ i pb:V ihb_A:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i)heq:A (σ i), = σ ih_σ_sub_A:(σ i).IsSubface A := fun x hx => (Finset.mem_inter.mp (Eq.symm heq hx)).leftx:V ihx:x (σ i)p':PureProfile I VConsistentAt σ i p' b A, (G.signAction i p' x b).nonneg I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_fwd:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) Aa:V iha_σ:a (σ i)p:PureProfile I Vhp:ConsistentAt σ i pb:V ihb_A:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i)heq:A (σ i), = σ ih_σ_sub_A:(σ i).IsSubface A := fun x hx => (Finset.mem_inter.mp (Eq.symm heq hx)).leftx:V ihx:x (σ i)p':PureProfile I Vhp':ConsistentAt σ i p' b A, (G.signAction i p' x b).nonneg I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_fwd:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) Aa:V iha_σ:a (σ i)p:PureProfile I Vhp:ConsistentAt σ i pb:V ihb_A:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i)heq:A (σ i), = σ ih_σ_sub_A:(σ i).IsSubface A := fun x hx => (Finset.mem_inter.mp (Eq.symm heq hx)).leftx:V ihx:x (σ i)p':PureProfile I Vhp':ConsistentAt σ i p'y:V iy A (G.signAction i p' x y).nonneg I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_fwd:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) Aa:V iha_σ:a (σ i)p:PureProfile I Vhp:ConsistentAt σ i pb:V ihb_A:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i)heq:A (σ i), = σ ih_σ_sub_A:(σ i).IsSubface A := fun x hx => (Finset.mem_inter.mp (Eq.symm heq hx)).leftx:V ihx:x (σ i)p':PureProfile I Vhp':ConsistentAt σ i p'y:V ihy:y A(G.signAction i p' x y).nonneg I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_fwd:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) Aa:V iha_σ:a (σ i)p:PureProfile I Vhp:ConsistentAt σ i pb:V ihb_A:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i)heq:A (σ i), = σ ih_σ_sub_A:(σ i).IsSubface A := fun x hx => (Finset.mem_inter.mp (Eq.symm heq hx)).leftx:V ihx:x (σ i)p':PureProfile I Vhp':ConsistentAt σ i p'y:V ihy:y Ahy_σ:y (σ i)(G.signAction i p' x y).nonnegI✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_fwd:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) Aa:V iha_σ:a (σ i)p:PureProfile I Vhp:ConsistentAt σ i pb:V ihb_A:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i)heq:A (σ i), = σ ih_σ_sub_A:(σ i).IsSubface A := fun x hx => (Finset.mem_inter.mp (Eq.symm heq hx)).leftx:V ihx:x (σ i)p':PureProfile I Vhp':ConsistentAt σ i p'y:V ihy:y Ahy_σ:y (σ i)(G.signAction i p' x y).nonneg I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_fwd:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) Aa:V iha_σ:a (σ i)p:PureProfile I Vhp:ConsistentAt σ i pb:V ihb_A:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i)heq:A (σ i), = σ ih_σ_sub_A:(σ i).IsSubface A := fun x hx => (Finset.mem_inter.mp (Eq.symm heq hx)).leftx:V ihx:x (σ i)p':PureProfile I Vhp':ConsistentAt σ i p'y:V ihy:y Ahy_σ:y (σ i)(G.signAction i p' x y).nonneg All goals completed! 🐙 I✝:Type u_1inst✝³:DecidableEq I✝V✝:I✝ Type u_2inst✝²:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝¹:DecidableEq IV:I Type u_4inst✝:(i : I) DecidableEq (V i)G:SignGame I Vi:Iσ:Profile I VA:Face (V i)h_inv:G.OutsideDom i σh_fwd:G.Dominates i σ A (σ i)h_bwd:¬G.Dominates i σ (σ i) Aa:V iha_σ:a (σ i)p:PureProfile I Vhp:ConsistentAt σ i pb:V ihb_A:b Ahn:¬(G.signAction i p a b).nonneghb_σ:b (σ i)heq:A (σ i), = σ ih_σ_sub_A:(σ i).IsSubface A := fun x hx => (Finset.mem_inter.mp (Eq.symm heq hx)).leftx:V ihx:x (σ i)p':PureProfile I Vhp':ConsistentAt σ i p'y:V ihy:y Ahy_σ:y (σ i)(G.signAction i p' x y).nonneg All goals completed! 🐙 -- ================================================================ -- Section 11: Profile size and descent -- ================================================================ omit G in

The total number of actions across all players' faces. Used as the termination measure for the Nash descent algorithm — each step strictly decreases this value.

def profileSize [Fintype I] (σ : Profile I V) : := Finset.univ.sum (fun i => (σ i).1.card) omit G in

Replacing one player's face with a proper subface strictly decreases the profile size.

lemma profileSize_decreases [Fintype I] {i : I} {σ : Profile I V} {A : Face (V i)} (hsub : Face.IsSubface A (σ i)) (hne : A σ i) : profileSize (σ[i A]) < profileSize σ := I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)inst✝:Fintype Ii:Iσ:Profile I VA:Face (V i)hsub:A.IsSubface (σ i)hne:A σ iprofileSize (σ[i A]) < profileSize σ I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)inst✝:Fintype Ii:Iσ:Profile I VA:Face (V i)hsub:A.IsSubface (σ i)hne:A σ i i_1, (↑((σ[i A]) i_1)).card < i, (↑(σ i)).card I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)inst✝:Fintype Ii:Iσ:Profile I VA:Face (V i)hsub:A.IsSubface (σ i)hne:A σ i i_1 Finset.univ, (↑((σ[i A]) i_1)).card (↑(σ i_1)).cardI:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)inst✝:Fintype Ii:Iσ:Profile I VA:Face (V i)hsub:A.IsSubface (σ i)hne:A σ i i_1 Finset.univ, (↑((σ[i A]) i_1)).card < (↑(σ i_1)).card I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)inst✝:Fintype Ii:Iσ:Profile I VA:Face (V i)hsub:A.IsSubface (σ i)hne:A σ i i_1 Finset.univ, (↑((σ[i A]) i_1)).card (↑(σ i_1)).card intro j I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)inst✝:Fintype Ii:Iσ:Profile I VA:Face (V i)hsub:A.IsSubface (σ i)hne:A σ ij:Ia✝:j Finset.univ(↑((σ[i A]) j)).card (↑(σ j)).card I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)inst✝:Fintype Ii:Iσ:Profile I VA:Face (V i)hsub:A.IsSubface (σ i)hne:A σ ij:Ia✝:j Finset.univhji:j = i(↑((σ[i A]) j)).card (↑(σ j)).cardI:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)inst✝:Fintype Ii:Iσ:Profile I VA:Face (V i)hsub:A.IsSubface (σ i)hne:A σ ij:Ia✝:j Finset.univhji:¬j = i(↑((σ[i A]) j)).card (↑(σ j)).card I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)inst✝:Fintype Ii:Iσ:Profile I VA:Face (V i)hsub:A.IsSubface (σ i)hne:A σ ij:Ia✝:j Finset.univhji:j = i(↑((σ[i A]) j)).card (↑(σ j)).card I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)inst✝:Fintype Iσ:Profile I Vj:Ia✝:j Finset.univA:Face (V j)hsub:A.IsSubface (σ j)hne:A σ j(↑((σ[j A]) j)).card (↑(σ j)).card; I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)inst✝:Fintype Iσ:Profile I Vj:Ia✝:j Finset.univA:Face (V j)hsub:A.IsSubface (σ j)hne:A σ j(↑A).card (↑(σ j)).card; All goals completed! 🐙 I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)inst✝:Fintype Ii:Iσ:Profile I VA:Face (V i)hsub:A.IsSubface (σ i)hne:A σ ij:Ia✝:j Finset.univhji:¬j = i(↑((σ[i A]) j)).card (↑(σ j)).card All goals completed! 🐙 I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)inst✝:Fintype Ii:Iσ:Profile I VA:Face (V i)hsub:A.IsSubface (σ i)hne:A σ i i_1 Finset.univ, (↑((σ[i A]) i_1)).card < (↑(σ i_1)).card exact i, Finset.mem_univ i, I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)inst✝:Fintype Ii:Iσ:Profile I VA:Face (V i)hsub:A.IsSubface (σ i)hne:A σ i(↑((σ[i A]) i)).card < (↑(σ i)).card I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)inst✝:Fintype Ii:Iσ:Profile I VA:Face (V i)hsub:A.IsSubface (σ i)hne:A σ i(↑A).card < (↑(σ i)).card All goals completed! 🐙

Nash existence from OutsideDom: given any profile satisfying the OutsideDom invariant, there exists a Nash equilibrium. Additionally tracks that the resulting Nash profile τ is a subprofile of the starting profile σ and still satisfies OutsideDom.

This is the core of the Nash existence proof. The algorithm:

    If σ is already Nash, return it.

    Otherwise, some player i has a strict deviation to A.

    By restrictStrictDom, get A' ⊆ σ i with A' ≠ σ i that is still a strict deviation.

    Update σ[i ↦ A']. OutsideDom is preserved (by preserved and preserved_other).

    Profile size strictly decreases, so recurse.

Termination is guaranteed because profileSize is a natural number that decreases at each step. For a directly executable version, see findNashOf below.

theorem nash_exists_sub_of_outsideDom [Fintype I] (σ : Profile I V) (h_od : i, G.OutsideDom i σ) : τ, G.IsNash τ ( i, Face.IsSubface (τ i) (σ i)) ( i, G.OutsideDom i τ) := I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σ τ, G.IsNash τ (∀ (i : I), (τ i).IsSubface (σ i)) (i : I), G.OutsideDom i τ I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σh:G.IsNash σ τ, G.IsNash τ (∀ (i : I), (τ i).IsSubface (σ i)) (i : I), G.OutsideDom i τI:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σh:¬G.IsNash σ τ, G.IsNash τ (∀ (i : I), (τ i).IsSubface (σ i)) (i : I), G.OutsideDom i τ I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σh:G.IsNash σ τ, G.IsNash τ (∀ (i : I), (τ i).IsSubface (σ i)) (i : I), G.OutsideDom i τ All goals completed! 🐙 I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σh:¬G.IsNash σ τ, G.IsNash τ (∀ (i : I), (τ i).IsSubface (σ i)) (i : I), G.OutsideDom i τ I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σh: x x_1, G.StrictDom x σ x_1 τ, G.IsNash τ (∀ (i : I), (τ i).IsSubface (σ i)) (i : I), G.OutsideDom i τ I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σi₀:IA:Face (V i₀)hA:G.StrictDom i₀ σ A τ, G.IsNash τ (∀ (i : I), (τ i).IsSubface (σ i)) (i : I), G.OutsideDom i τ I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σi₀:IA:Face (V i₀)hA:G.StrictDom i₀ σ AA':Face (V i₀)hdev:G.StrictDom i₀ σ A'hsub:A'.IsSubface (σ i₀)hne:A' σ i₀ τ, G.IsNash τ (∀ (i : I), (τ i).IsSubface (σ i)) (i : I), G.OutsideDom i τ I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σi₀:IA:Face (V i₀)hA:G.StrictDom i₀ σ AA':Face (V i₀)hdev:G.StrictDom i₀ σ A'hsub:A'.IsSubface (σ i₀)hne:A' σ i₀hdec:profileSize (σ[i₀ A']) < profileSize σ := profileSize_decreases hsub hne τ, G.IsNash τ (∀ (i : I), (τ i).IsSubface (σ i)) (i : I), G.OutsideDom i τ have h_od' : j, G.OutsideDom j (σ[i₀ A']) := fun j => I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σi₀:IA:Face (V i₀)hA:G.StrictDom i₀ σ AA':Face (V i₀)hdev:G.StrictDom i₀ σ A'hsub:A'.IsSubface (σ i₀)hne:A' σ i₀hdec:profileSize (σ[i₀ A']) < profileSize σ := profileSize_decreases hsub hnej:IG.OutsideDom j (σ[i₀ A']) I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σi₀:IA:Face (V i₀)hA:G.StrictDom i₀ σ AA':Face (V i₀)hdev:G.StrictDom i₀ σ A'hsub:A'.IsSubface (σ i₀)hne:A' σ i₀hdec:profileSize (σ[i₀ A']) < profileSize σ := profileSize_decreases hsub hnej:Ihij:j = i₀G.OutsideDom j (σ[i₀ A'])I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σi₀:IA:Face (V i₀)hA:G.StrictDom i₀ σ AA':Face (V i₀)hdev:G.StrictDom i₀ σ A'hsub:A'.IsSubface (σ i₀)hne:A' σ i₀hdec:profileSize (σ[i₀ A']) < profileSize σ := profileSize_decreases hsub hnej:Ihij:¬j = i₀G.OutsideDom j (σ[i₀ A']) I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σi₀:IA:Face (V i₀)hA:G.StrictDom i₀ σ AA':Face (V i₀)hdev:G.StrictDom i₀ σ A'hsub:A'.IsSubface (σ i₀)hne:A' σ i₀hdec:profileSize (σ[i₀ A']) < profileSize σ := profileSize_decreases hsub hnej:Ihij:j = i₀G.OutsideDom j (σ[i₀ A']) I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σj:IA:Face (V j)hA:G.StrictDom j σ AA':Face (V j)hdev:G.StrictDom j σ A'hsub:A'.IsSubface (σ j)hne:A' σ jhdec:profileSize (σ[j A']) < profileSize σG.OutsideDom j (σ[j A']); All goals completed! 🐙 I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σi₀:IA:Face (V i₀)hA:G.StrictDom i₀ σ AA':Face (V i₀)hdev:G.StrictDom i₀ σ A'hsub:A'.IsSubface (σ i₀)hne:A' σ i₀hdec:profileSize (σ[i₀ A']) < profileSize σ := profileSize_decreases hsub hnej:Ihij:¬j = i₀G.OutsideDom j (σ[i₀ A']) All goals completed! 🐙 I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σi₀:IA:Face (V i₀)hA:G.StrictDom i₀ σ AA':Face (V i₀)hdev:G.StrictDom i₀ σ A'hsub:A'.IsSubface (σ i₀)hne:A' σ i₀hdec:profileSize (σ[i₀ A']) < profileSize σ := profileSize_decreases hsub hneh_od': (j : I), G.OutsideDom j (σ[i₀ A']) := fun j => if hij : j = i₀ then Eq.ndrec (motive := fun i₀ => (A : Face (V i₀)), G.StrictDom i₀ σ A (A' : Face (V i₀)), G.StrictDom i₀ σ A' A'.IsSubface (σ i₀) A' σ i₀ profileSize (σ[i₀ A']) < profileSize σ G.OutsideDom j (σ[i₀ A'])) (fun A hA A' hdev hsub hne hdec => OutsideDom.preserved G (h_od j) hsub hdev.left) hij A hA A' hdev hsub hne hdec else OutsideDom.preserved_other G hij (h_od j) hsubτ:Profile I VhτN:G.IsNash τhτ_sub: (i : I), (τ i).IsSubface ((σ[i₀ A']) i)hτ_od: (i : I), G.OutsideDom i τ τ, G.IsNash τ (∀ (i : I), (τ i).IsSubface (σ i)) (i : I), G.OutsideDom i τ I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σi₀:IA:Face (V i₀)hA:G.StrictDom i₀ σ AA':Face (V i₀)hdev:G.StrictDom i₀ σ A'hsub:A'.IsSubface (σ i₀)hne:A' σ i₀hdec:profileSize (σ[i₀ A']) < profileSize σ := profileSize_decreases hsub hneh_od': (j : I), G.OutsideDom j (σ[i₀ A']) := fun j => if hij : j = i₀ then Eq.ndrec (motive := fun i₀ => (A : Face (V i₀)), G.StrictDom i₀ σ A (A' : Face (V i₀)), G.StrictDom i₀ σ A' A'.IsSubface (σ i₀) A' σ i₀ profileSize (σ[i₀ A']) < profileSize σ G.OutsideDom j (σ[i₀ A'])) (fun A hA A' hdev hsub hne hdec => OutsideDom.preserved G (h_od j) hsub hdev.left) hij A hA A' hdev hsub hne hdec else OutsideDom.preserved_other G hij (h_od j) hsubτ:Profile I VhτN:G.IsNash τhτ_sub: (i : I), (τ i).IsSubface ((σ[i₀ A']) i)hτ_od: (i : I), G.OutsideDom i τj:I(τ j).IsSubface (σ j) I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σi₀:IA:Face (V i₀)hA:G.StrictDom i₀ σ AA':Face (V i₀)hdev:G.StrictDom i₀ σ A'hsub:A'.IsSubface (σ i₀)hne:A' σ i₀hdec:profileSize (σ[i₀ A']) < profileSize σ := profileSize_decreases hsub hneh_od': (j : I), G.OutsideDom j (σ[i₀ A']) := fun j => if hij : j = i₀ then Eq.ndrec (motive := fun i₀ => (A : Face (V i₀)), G.StrictDom i₀ σ A (A' : Face (V i₀)), G.StrictDom i₀ σ A' A'.IsSubface (σ i₀) A' σ i₀ profileSize (σ[i₀ A']) < profileSize σ G.OutsideDom j (σ[i₀ A'])) (fun A hA A' hdev hsub hne hdec => OutsideDom.preserved G (h_od j) hsub hdev.left) hij A hA A' hdev hsub hne hdec else OutsideDom.preserved_other G hij (h_od j) hsubτ:Profile I VhτN:G.IsNash τhτ_sub: (i : I), (τ i).IsSubface ((σ[i₀ A']) i)hτ_od: (i : I), G.OutsideDom i τj:Ihji:j = i₀(τ j).IsSubface (σ j)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σi₀:IA:Face (V i₀)hA:G.StrictDom i₀ σ AA':Face (V i₀)hdev:G.StrictDom i₀ σ A'hsub:A'.IsSubface (σ i₀)hne:A' σ i₀hdec:profileSize (σ[i₀ A']) < profileSize σ := profileSize_decreases hsub hneh_od': (j : I), G.OutsideDom j (σ[i₀ A']) := fun j => if hij : j = i₀ then Eq.ndrec (motive := fun i₀ => (A : Face (V i₀)), G.StrictDom i₀ σ A (A' : Face (V i₀)), G.StrictDom i₀ σ A' A'.IsSubface (σ i₀) A' σ i₀ profileSize (σ[i₀ A']) < profileSize σ G.OutsideDom j (σ[i₀ A'])) (fun A hA A' hdev hsub hne hdec => OutsideDom.preserved G (h_od j) hsub hdev.left) hij A hA A' hdev hsub hne hdec else OutsideDom.preserved_other G hij (h_od j) hsubτ:Profile I VhτN:G.IsNash τhτ_sub: (i : I), (τ i).IsSubface ((σ[i₀ A']) i)hτ_od: (i : I), G.OutsideDom i τj:Ihji:¬j = i₀(τ j).IsSubface (σ j) I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σi₀:IA:Face (V i₀)hA:G.StrictDom i₀ σ AA':Face (V i₀)hdev:G.StrictDom i₀ σ A'hsub:A'.IsSubface (σ i₀)hne:A' σ i₀hdec:profileSize (σ[i₀ A']) < profileSize σ := profileSize_decreases hsub hneh_od': (j : I), G.OutsideDom j (σ[i₀ A']) := fun j => if hij : j = i₀ then Eq.ndrec (motive := fun i₀ => (A : Face (V i₀)), G.StrictDom i₀ σ A (A' : Face (V i₀)), G.StrictDom i₀ σ A' A'.IsSubface (σ i₀) A' σ i₀ profileSize (σ[i₀ A']) < profileSize σ G.OutsideDom j (σ[i₀ A'])) (fun A hA A' hdev hsub hne hdec => OutsideDom.preserved G (h_od j) hsub hdev.left) hij A hA A' hdev hsub hne hdec else OutsideDom.preserved_other G hij (h_od j) hsubτ:Profile I VhτN:G.IsNash τhτ_sub: (i : I), (τ i).IsSubface ((σ[i₀ A']) i)hτ_od: (i : I), G.OutsideDom i τj:Ihji:j = i₀(τ j).IsSubface (σ j) I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i στ:Profile I VhτN:G.IsNash τhτ_od: (i : I), G.OutsideDom i τj:IA:Face (V j)hA:G.StrictDom j σ AA':Face (V j)hdev:G.StrictDom j σ A'hsub:A'.IsSubface (σ j)hne:A' σ jhdec:profileSize (σ[j A']) < profileSize σh_od': (j_1 : I), G.OutsideDom j_1 (σ[j A'])hτ_sub: (i : I), (τ i).IsSubface ((σ[j A']) i)(τ j).IsSubface (σ j) intro x I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i στ:Profile I VhτN:G.IsNash τhτ_od: (i : I), G.OutsideDom i τj:IA:Face (V j)hA:G.StrictDom j σ AA':Face (V j)hdev:G.StrictDom j σ A'hsub:A'.IsSubface (σ j)hne:A' σ jhdec:profileSize (σ[j A']) < profileSize σh_od': (j_1 : I), G.OutsideDom j_1 (σ[j A'])hτ_sub: (i : I), (τ i).IsSubface ((σ[j A']) i)x:V jhx:x (τ j)x (σ j) I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i στ:Profile I VhτN:G.IsNash τhτ_od: (i : I), G.OutsideDom i τj:IA:Face (V j)hA:G.StrictDom j σ AA':Face (V j)hdev:G.StrictDom j σ A'hsub:A'.IsSubface (σ j)hne:A' σ jhdec:profileSize (σ[j A']) < profileSize σh_od': (j_1 : I), G.OutsideDom j_1 (σ[j A'])hτ_sub: (i : I), (τ i).IsSubface ((σ[j A']) i)x:V jhx:x (τ j)hx':x ((σ[j A']) j) := hτ_sub j hxx (σ j) I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i στ:Profile I VhτN:G.IsNash τhτ_od: (i : I), G.OutsideDom i τj:IA:Face (V j)hA:G.StrictDom j σ AA':Face (V j)hdev:G.StrictDom j σ A'hsub:A'.IsSubface (σ j)hne:A' σ jhdec:profileSize (σ[j A']) < profileSize σh_od': (j_1 : I), G.OutsideDom j_1 (σ[j A'])hτ_sub: (i : I), (τ i).IsSubface ((σ[j A']) i)x:V jhx:x (τ j)hx':x A'x (σ j) All goals completed! 🐙 I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σi₀:IA:Face (V i₀)hA:G.StrictDom i₀ σ AA':Face (V i₀)hdev:G.StrictDom i₀ σ A'hsub:A'.IsSubface (σ i₀)hne:A' σ i₀hdec:profileSize (σ[i₀ A']) < profileSize σ := profileSize_decreases hsub hneh_od': (j : I), G.OutsideDom j (σ[i₀ A']) := fun j => if hij : j = i₀ then Eq.ndrec (motive := fun i₀ => (A : Face (V i₀)), G.StrictDom i₀ σ A (A' : Face (V i₀)), G.StrictDom i₀ σ A' A'.IsSubface (σ i₀) A' σ i₀ profileSize (σ[i₀ A']) < profileSize σ G.OutsideDom j (σ[i₀ A'])) (fun A hA A' hdev hsub hne hdec => OutsideDom.preserved G (h_od j) hsub hdev.left) hij A hA A' hdev hsub hne hdec else OutsideDom.preserved_other G hij (h_od j) hsubτ:Profile I VhτN:G.IsNash τhτ_sub: (i : I), (τ i).IsSubface ((σ[i₀ A']) i)hτ_od: (i : I), G.OutsideDom i τj:Ihji:¬j = i₀(τ j).IsSubface (σ j) intro x I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σi₀:IA:Face (V i₀)hA:G.StrictDom i₀ σ AA':Face (V i₀)hdev:G.StrictDom i₀ σ A'hsub:A'.IsSubface (σ i₀)hne:A' σ i₀hdec:profileSize (σ[i₀ A']) < profileSize σ := profileSize_decreases hsub hneh_od': (j : I), G.OutsideDom j (σ[i₀ A']) := fun j => if hij : j = i₀ then Eq.ndrec (motive := fun i₀ => (A : Face (V i₀)), G.StrictDom i₀ σ A (A' : Face (V i₀)), G.StrictDom i₀ σ A' A'.IsSubface (σ i₀) A' σ i₀ profileSize (σ[i₀ A']) < profileSize σ G.OutsideDom j (σ[i₀ A'])) (fun A hA A' hdev hsub hne hdec => OutsideDom.preserved G (h_od j) hsub hdev.left) hij A hA A' hdev hsub hne hdec else OutsideDom.preserved_other G hij (h_od j) hsubτ:Profile I VhτN:G.IsNash τhτ_sub: (i : I), (τ i).IsSubface ((σ[i₀ A']) i)hτ_od: (i : I), G.OutsideDom i τj:Ihji:¬j = i₀x:V jhx:x (τ j)x (σ j) I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σi₀:IA:Face (V i₀)hA:G.StrictDom i₀ σ AA':Face (V i₀)hdev:G.StrictDom i₀ σ A'hsub:A'.IsSubface (σ i₀)hne:A' σ i₀hdec:profileSize (σ[i₀ A']) < profileSize σ := profileSize_decreases hsub hneh_od': (j : I), G.OutsideDom j (σ[i₀ A']) := fun j => if hij : j = i₀ then Eq.ndrec (motive := fun i₀ => (A : Face (V i₀)), G.StrictDom i₀ σ A (A' : Face (V i₀)), G.StrictDom i₀ σ A' A'.IsSubface (σ i₀) A' σ i₀ profileSize (σ[i₀ A']) < profileSize σ G.OutsideDom j (σ[i₀ A'])) (fun A hA A' hdev hsub hne hdec => OutsideDom.preserved G (h_od j) hsub hdev.left) hij A hA A' hdev hsub hne hdec else OutsideDom.preserved_other G hij (h_od j) hsubτ:Profile I VhτN:G.IsNash τhτ_sub: (i : I), (τ i).IsSubface ((σ[i₀ A']) i)hτ_od: (i : I), G.OutsideDom i τj:Ihji:¬j = i₀x:V jhx:x (τ j)this:x ((σ[i₀ A']) j) := hτ_sub j hxx (σ j) rwa [Function.update_of_ne hjiI:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iσ:Profile I Vh_od: (i : I), G.OutsideDom i σi₀:IA:Face (V i₀)hA:G.StrictDom i₀ σ AA':Face (V i₀)hdev:G.StrictDom i₀ σ A'hsub:A'.IsSubface (σ i₀)hne:A' σ i₀hdec:profileSize (σ[i₀ A']) < profileSize σ := profileSize_decreases hsub hneh_od': (j : I), G.OutsideDom j (σ[i₀ A']) := fun j => if hij : j = i₀ then Eq.ndrec (motive := fun i₀ => (A : Face (V i₀)), G.StrictDom i₀ σ A (A' : Face (V i₀)), G.StrictDom i₀ σ A' A'.IsSubface (σ i₀) A' σ i₀ profileSize (σ[i₀ A']) < profileSize σ G.OutsideDom j (σ[i₀ A'])) (fun A hA A' hdev hsub hne hdec => OutsideDom.preserved G (h_od j) hsub hdev.left) hij A hA A' hdev hsub hne hdec else OutsideDom.preserved_other G hij (h_od j) hsubτ:Profile I VhτN:G.IsNash τhτ_sub: (i : I), (τ i).IsSubface ((σ[i₀ A']) i)hτ_od: (i : I), G.OutsideDom i τj:Ihji:¬j = i₀x:V jhx:x (τ j)this:x (σ j)x (σ j) at this termination_by profileSize σ

Main theorem: every finite sign game has a Nash equilibrium. Proved by starting from the fully mixed profile and applying the descent algorithm.

This is the existence statement — it uses Classical.em internally (via by_cases on IsNash) and so is not directly executable. For an actual #eval-able function returning a Nash profile, see findNash below, which requires LinearOrder on the player and action types to make the deviation search computable.

-- ANCHOR: nash_exists theorem nash_exists [Fintype I] [ i, Fintype (V i)] [ i, Nonempty (V i)] : σ, G.IsNash σ := -- ANCHOR_END: nash_exists (G.nash_exists_sub_of_outsideDom (fun _ => Face.full) (fun i => OutsideDom.maximal G i)).imp (fun _ h => h.1)

The existential theorems above (nash_exists, nash_exists_sub_of_outsideDom) are not directly executable: they're theorems, and the descent uses by_cases on IsNash which falls back to Classical.em. This section provides their computable counterparts — defs findNash and findNashOf returning an actual Nash profile, ready for #eval.

The algorithm is literally the same descent. The only differences are:

    Decidable instances for Dominates, StrictDom, IsNash (so we can branch on IsNash without invoking classical logic);

    a computable search findDev that finds a strict deviation via Finset.sort + List.sublists — this is why the computable versions require LinearOrder on I and on each V i, while the existence theorems need only Fintype.

The underlying restrictStrictDom is shared between both paths: it was already written as a computable def returning a subtype, so the existence theorems destructure it the same way they would destructure an existential.

section Computable variable [Fintype I] [ i, Fintype (V i)]variable [LinearOrder I] [ i, LinearOrder (V i)]

Dominates is decidable given finiteness of players and actions.

instance Dominates.instDecidable (i : I) (σ : Profile I V) (A B : Face (V i)) : Decidable (G.Dominates i σ A B) := I✝:Type u_1inst✝⁷:DecidableEq I✝V✝:I✝ Type u_2inst✝⁶:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)i:Iσ:Profile I VA:Face (V i)B:Face (V i)Decidable (G.Dominates i σ A B) I✝:Type u_1inst✝⁷:DecidableEq I✝V✝:I✝ Type u_2inst✝⁶:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)i:Iσ:Profile I VA:Face (V i)B:Face (V i)Decidable (∀ a A, (p : PureProfile I V), (∀ (j : I), j i p j (σ j)) b B, (G.signAction i p a b).nonneg) All goals completed! 🐙

StrictDom is decidable.

instance StrictDom.instDecidable (i : I) (σ : Profile I V) (A : Face (V i)) : Decidable (G.StrictDom i σ A) := I✝:Type u_1inst✝⁷:DecidableEq I✝V✝:I✝ Type u_2inst✝⁶:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)i:Iσ:Profile I VA:Face (V i)Decidable (G.StrictDom i σ A) I✝:Type u_1inst✝⁷:DecidableEq I✝V✝:I✝ Type u_2inst✝⁶:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)i:Iσ:Profile I VA:Face (V i)Decidable (G.Dominates i σ A (σ i) ¬G.Dominates i σ (σ i) A) All goals completed! 🐙

IsNash is decidable.

instance IsNash.instDecidable (σ : Profile I V) : Decidable (G.IsNash σ) := I✝:Type u_1inst✝⁷:DecidableEq I✝V✝:I✝ Type u_2inst✝⁶:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I VDecidable (G.IsNash σ) I✝:Type u_1inst✝⁷:DecidableEq I✝V✝:I✝ Type u_2inst✝⁶:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I VDecidable (∀ (i : I) (A : Face (V i)), ¬G.StrictDom i σ A) All goals completed! 🐙

Convert a list of vertices into a face, given a proof that it's nonempty.

private def listToFace {V : Type*} [DecidableEq V] (l : List V) (h : l []) : Face V := l.toFinset, I✝:Type u_1inst✝⁸:DecidableEq I✝V✝¹:I✝ Type u_2inst✝⁷:(i : I✝) DecidableEq (V✝¹ i)I:Type u_3inst✝⁶:DecidableEq IV✝:I Type u_4inst✝⁵:(i : I) DecidableEq (V✝ i)G:SignGame I V✝inst✝⁴:Fintype Iinst✝³:(i : I) Fintype (V✝ i)inst✝²:LinearOrder Iinst✝¹:(i : I) LinearOrder (V✝ i)V:Type u_5inst✝:DecidableEq Vl:List Vh:l []l.toFinset.Nonempty cases l with I✝:Type u_1inst✝⁸:DecidableEq I✝V✝¹:I✝ Type u_2inst✝⁷:(i : I✝) DecidableEq (V✝¹ i)I:Type u_3inst✝⁶:DecidableEq IV✝:I Type u_4inst✝⁵:(i : I) DecidableEq (V✝ i)G:SignGame I V✝inst✝⁴:Fintype Iinst✝³:(i : I) Fintype (V✝ i)inst✝²:LinearOrder Iinst✝¹:(i : I) LinearOrder (V✝ i)V:Type u_5inst✝:DecidableEq Vh:[] [][].toFinset.Nonempty All goals completed! 🐙 I✝:Type u_1inst✝⁸:DecidableEq I✝V✝¹:I✝ Type u_2inst✝⁷:(i : I✝) DecidableEq (V✝¹ i)I:Type u_3inst✝⁶:DecidableEq IV✝:I Type u_4inst✝⁵:(i : I) DecidableEq (V✝ i)G:SignGame I V✝inst✝⁴:Fintype Iinst✝³:(i : I) Fintype (V✝ i)inst✝²:LinearOrder Iinst✝¹:(i : I) LinearOrder (V✝ i)V:Type u_5inst✝:DecidableEq Vv:Vtail✝:List Vh:v :: tail✝ [](v :: tail✝).toFinset.Nonempty All goals completed! 🐙

Computable search for a strict deviation at a single player. Iterates over all nonempty subfaces of σ i via List.sublists of the sorted vertex list.

def findDevAt (σ : Profile I V) (i : I) : Option (Face (V i)) := ((σ i).1.sort (· ·)).sublists.findSome? fun sub => if hne : sub [] then let A : Face (V i) := listToFace sub hne if G.StrictDom i σ A then some A else none else none

Computable search for a strict deviation in σ. Iterates players in sorted order; for each player, iterates subfaces of σ i via List.sublists.

def findDev (σ : Profile I V) : Option ((i : I) × Face (V i)) := ((Finset.univ : Finset I).sort (· ·)).findSome? fun i => (G.findDevAt σ i).map fun A => i, Aautomatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_some_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_some_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_some_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_some_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_some_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_some_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_some_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_some_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_some_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_some_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_some_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_some_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_some_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_some_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_some_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_some_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_some_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_some_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_some_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`lemma findDevAt_eq_some_strictDom {σ : Profile I V} {i : I} {A : Face (V i)} (h : G.findDevAt σ i = some A) : G.StrictDom i σ A := I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:IA:Face (V i)h:G.findDevAt σ i = some AG.StrictDom i σ A I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:IA:Face (V i)h:List.findSome? (fun sub => if hne : sub [] then have A := listToFace sub hne; if G.StrictDom i σ A then some A else none else none) ((↑(σ i)).sort fun x1 x2 => x1 x2).sublists = some AG.StrictDom i σ A I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:IA:Face (V i)h: l₁ a l₂, ((↑(σ i)).sort fun x1 x2 => x1 x2).sublists = l₁ ++ a :: l₂ (if hne : a [] then have A := listToFace a hne; if G.StrictDom i σ A then some A else none else none) = some A x l₁, (if hne : x [] then have A := listToFace x hne; if G.StrictDom i σ A then some A else none else none) = noneG.StrictDom i σ A I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:IA:Face (V i)w✝¹:List (List (V i))sub:List (V i)w✝:List (List (V i))left✝:((↑(σ i)).sort fun x1 x2 => x1 x2).sublists = w✝¹ ++ sub :: w✝hfa:(if hne : sub [] then have A := listToFace sub hne; if G.StrictDom i σ A then some A else none else none) = some Aright✝: x w✝¹, (if hne : x [] then have A := listToFace x hne; if G.StrictDom i σ A then some A else none else none) = noneG.StrictDom i σ A I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:IA:Face (V i)w✝¹:List (List (V i))sub:List (V i)w✝:List (List (V i))left✝:((↑(σ i)).sort fun x1 x2 => x1 x2).sublists = w✝¹ ++ sub :: w✝hfa:(if hne : sub [] then have A := listToFace sub hne; if G.StrictDom i σ A then some A else none else none) = some Aright✝: x w✝¹, (if hne : x [] then have A := listToFace x hne; if G.StrictDom i σ A then some A else none else none) = nonehne:sub []G.StrictDom i σ AI:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:IA:Face (V i)w✝¹:List (List (V i))sub:List (V i)w✝:List (List (V i))left✝:((↑(σ i)).sort fun x1 x2 => x1 x2).sublists = w✝¹ ++ sub :: w✝hfa:(if hne : sub [] then have A := listToFace sub hne; if G.StrictDom i σ A then some A else none else none) = some Aright✝: x w✝¹, (if hne : x [] then have A := listToFace x hne; if G.StrictDom i σ A then some A else none else none) = nonehne:¬sub []G.StrictDom i σ A I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:IA:Face (V i)w✝¹:List (List (V i))sub:List (V i)w✝:List (List (V i))left✝:((↑(σ i)).sort fun x1 x2 => x1 x2).sublists = w✝¹ ++ sub :: w✝hfa:(if hne : sub [] then have A := listToFace sub hne; if G.StrictDom i σ A then some A else none else none) = some Aright✝: x w✝¹, (if hne : x [] then have A := listToFace x hne; if G.StrictDom i σ A then some A else none else none) = nonehne:sub []G.StrictDom i σ A I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:IA:Face (V i)w✝¹:List (List (V i))sub:List (V i)w✝:List (List (V i))left✝:((↑(σ i)).sort fun x1 x2 => x1 x2).sublists = w✝¹ ++ sub :: w✝right✝: x w✝¹, (if hne : x [] then have A := listToFace x hne; if G.StrictDom i σ A then some A else none else none) = nonehne:sub []hfa:(have A := listToFace sub hne; if G.StrictDom i σ A then some A else none) = some AG.StrictDom i σ A I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:IA:Face (V i)w✝¹:List (List (V i))sub:List (V i)w✝:List (List (V i))left✝:((↑(σ i)).sort fun x1 x2 => x1 x2).sublists = w✝¹ ++ sub :: w✝right✝: x w✝¹, (if hne : x [] then have A := listToFace x hne; if G.StrictDom i σ A then some A else none else none) = nonehne:sub []hfa:(have A := listToFace sub hne; if G.StrictDom i σ A then some A else none) = some Ahsd:G.StrictDom i σ (listToFace sub hne)G.StrictDom i σ AI:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:IA:Face (V i)w✝¹:List (List (V i))sub:List (V i)w✝:List (List (V i))left✝:((↑(σ i)).sort fun x1 x2 => x1 x2).sublists = w✝¹ ++ sub :: w✝right✝: x w✝¹, (if hne : x [] then have A := listToFace x hne; if G.StrictDom i σ A then some A else none else none) = nonehne:sub []hfa:(have A := listToFace sub hne; if G.StrictDom i σ A then some A else none) = some Ahsd:¬G.StrictDom i σ (listToFace sub hne)G.StrictDom i σ A I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:IA:Face (V i)w✝¹:List (List (V i))sub:List (V i)w✝:List (List (V i))left✝:((↑(σ i)).sort fun x1 x2 => x1 x2).sublists = w✝¹ ++ sub :: w✝right✝: x w✝¹, (if hne : x [] then have A := listToFace x hne; if G.StrictDom i σ A then some A else none else none) = nonehne:sub []hfa:(have A := listToFace sub hne; if G.StrictDom i σ A then some A else none) = some Ahsd:G.StrictDom i σ (listToFace sub hne)G.StrictDom i σ A I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:IA:Face (V i)w✝¹:List (List (V i))sub:List (V i)w✝:List (List (V i))left✝:((↑(σ i)).sort fun x1 x2 => x1 x2).sublists = w✝¹ ++ sub :: w✝right✝: x w✝¹, (if hne : x [] then have A := listToFace x hne; if G.StrictDom i σ A then some A else none else none) = nonehne:sub []hfa:some (listToFace sub hne) = some Ahsd:G.StrictDom i σ (listToFace sub hne)G.StrictDom i σ A I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:IA:Face (V i)w✝¹:List (List (V i))sub:List (V i)w✝:List (List (V i))left✝:((↑(σ i)).sort fun x1 x2 => x1 x2).sublists = w✝¹ ++ sub :: w✝right✝: x w✝¹, (if hne : x [] then have A := listToFace x hne; if G.StrictDom i σ A then some A else none else none) = nonehne:sub []hfa:some (listToFace sub hne) = some Ahsd:G.StrictDom i σ (listToFace sub hne)heq:listToFace sub hne = A := Option.some.inj hfaG.StrictDom i σ A All goals completed! 🐙 I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:IA:Face (V i)w✝¹:List (List (V i))sub:List (V i)w✝:List (List (V i))left✝:((↑(σ i)).sort fun x1 x2 => x1 x2).sublists = w✝¹ ++ sub :: w✝right✝: x w✝¹, (if hne : x [] then have A := listToFace x hne; if G.StrictDom i σ A then some A else none else none) = nonehne:sub []hfa:(have A := listToFace sub hne; if G.StrictDom i σ A then some A else none) = some Ahsd:¬G.StrictDom i σ (listToFace sub hne)G.StrictDom i σ A I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:IA:Face (V i)w✝¹:List (List (V i))sub:List (V i)w✝:List (List (V i))left✝:((↑(σ i)).sort fun x1 x2 => x1 x2).sublists = w✝¹ ++ sub :: w✝right✝: x w✝¹, (if hne : x [] then have A := listToFace x hne; if G.StrictDom i σ A then some A else none else none) = nonehne:sub []hfa:none = some Ahsd:¬G.StrictDom i σ (listToFace sub hne)G.StrictDom i σ A; All goals completed! 🐙 I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:IA:Face (V i)w✝¹:List (List (V i))sub:List (V i)w✝:List (List (V i))left✝:((↑(σ i)).sort fun x1 x2 => x1 x2).sublists = w✝¹ ++ sub :: w✝hfa:(if hne : sub [] then have A := listToFace sub hne; if G.StrictDom i σ A then some A else none else none) = some Aright✝: x w✝¹, (if hne : x [] then have A := listToFace x hne; if G.StrictDom i σ A then some A else none else none) = nonehne:¬sub []G.StrictDom i σ A I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:IA:Face (V i)w✝¹:List (List (V i))sub:List (V i)w✝:List (List (V i))left✝:((↑(σ i)).sort fun x1 x2 => x1 x2).sublists = w✝¹ ++ sub :: w✝hfa:none = some Aright✝: x w✝¹, (if hne : x [] then have A := listToFace x hne; if G.StrictDom i σ A then some A else none else none) = nonehne:¬sub []G.StrictDom i σ A; All goals completed! 🐙 lemma findDev_eq_some_strictDom {σ : Profile I V} {x : (i : I) × Face (V i)} (h : G.findDev σ = some x) : G.StrictDom x.1 σ x.2 := I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vx:(i : I) × Face (V i)h:G.findDev σ = some xG.StrictDom x.fst σ x.snd I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vx:(i : I) × Face (V i)h:List.findSome? (fun i => Option.map (fun A => i, A) (G.findDevAt σ i)) (Finset.univ.sort fun x1 x2 => x1 x2) = some xG.StrictDom x.fst σ x.snd I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vx:(i : I) × Face (V i)h: l₁ a l₂, (Finset.univ.sort fun x1 x2 => x1 x2) = l₁ ++ a :: l₂ Option.map (fun A => a, A) (G.findDevAt σ a) = some x x l₁, Option.map (fun A => x, A) (G.findDevAt σ x) = noneG.StrictDom x.fst σ x.snd I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vx:(i : I) × Face (V i)w✝¹:List Ii:Iw✝:List Ileft✝:(Finset.univ.sort fun x1 x2 => x1 x2) = w✝¹ ++ i :: w✝hi:Option.map (fun A => i, A) (G.findDevAt σ i) = some xright✝: x w✝¹, Option.map (fun A => x, A) (G.findDevAt σ x) = noneG.StrictDom x.fst σ x.snd match hfd : G.findDevAt σ i, hi with I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vx:(i : I) × Face (V i)w✝¹:List Ii:Iw✝:List Ileft✝:(Finset.univ.sort fun x1 x2 => x1 x2) = w✝¹ ++ i :: w✝hi✝:Option.map (fun A => i, A) (G.findDevAt σ i) = some xright✝: x w✝¹, Option.map (fun A => x, A) (G.findDevAt σ x) = nonehi:Option.map (fun A => i, A) none = some xhfd:G.findDevAt σ i = noneG.StrictDom x.fst σ x.snd I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vx:(i : I) × Face (V i)w✝¹:List Ii:Iw✝:List Ileft✝:(Finset.univ.sort fun x1 x2 => x1 x2) = w✝¹ ++ i :: w✝hi✝:Option.map (fun A => i, A) (G.findDevAt σ i) = some xright✝: x w✝¹, Option.map (fun A => x, A) (G.findDevAt σ x) = nonehi:none = some xhfd:G.findDevAt σ i = noneG.StrictDom x.fst σ x.snd; All goals completed! 🐙 I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vx:(i : I) × Face (V i)w✝¹:List Ii:Iw✝:List Ileft✝:(Finset.univ.sort fun x1 x2 => x1 x2) = w✝¹ ++ i :: w✝hi✝:Option.map (fun A => i, A) (G.findDevAt σ i) = some xright✝: x w✝¹, Option.map (fun A => x, A) (G.findDevAt σ x) = noneA:Face (V i)hi:Option.map (fun A => i, A) (some A) = some xhfd:G.findDevAt σ i = some AG.StrictDom x.fst σ x.snd I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vx:(i : I) × Face (V i)w✝¹:List Ii:Iw✝:List Ileft✝:(Finset.univ.sort fun x1 x2 => x1 x2) = w✝¹ ++ i :: w✝hi✝:Option.map (fun A => i, A) (G.findDevAt σ i) = some xright✝: x w✝¹, Option.map (fun A => x, A) (G.findDevAt σ x) = noneA:Face (V i)hi:some i, A = some xhfd:G.findDevAt σ i = some AG.StrictDom x.fst σ x.snd I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vw✝¹:List Ii:Iw✝:List Ileft✝:(Finset.univ.sort fun x1 x2 => x1 x2) = w✝¹ ++ i :: w✝right✝: x w✝¹, Option.map (fun A => x, A) (G.findDevAt σ x) = noneA:Face (V i)hfd:G.findDevAt σ i = some Ahi✝:Option.map (fun A => i, A) (G.findDevAt σ i) = some i, Ahi:some i, A = some i, AG.StrictDom i, A.fst σ i, A.snd All goals completed! 🐙

If no proper subface of σ i is found by findDevAt, and OutsideDom holds at i, then no face is a strict deviation for player i.

automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` automatically included section variable(s) unused in theorem `Base.SignGame.findDevAt_eq_none_no_strictDom`: [LinearOrder I] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [LinearOrder I] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`lemma findDevAt_eq_none_no_strictDom {σ : Profile I V} {i : I} (h_od : G.OutsideDom i σ) (h : G.findDevAt σ i = none) {A : Face (V i)} (hStrict : G.StrictDom i σ A) : False := I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AFalse -- By restrictStrictDom, there is a subface A' ⊆ σ i, A' ≠ σ i, which is a strict dev. I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ iFalse -- A'.1 is a nonempty subset of (σ i).1. Let sub = (σ i).1.sort.filter (· ∈ A'.1). -- sub is a sublist of (σ i).1.sort, and sub.toFinset = A'.1. I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2False I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lFalse have hsub_sub : sub l.sublists := I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AFalse I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lsub.Sublist l All goals completed! 🐙 have hsub_ne : sub [] := I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AFalse I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lhsub_sub:sub l.sublists := Eq.mpr (id (congrArg (fun _a => _a) (propext List.mem_sublists))) List.filter_sublistv:V ihv:v A'sub [] I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lhsub_sub:sub l.sublists := Eq.mpr (id (congrArg (fun _a => _a) (propext List.mem_sublists))) List.filter_sublistv:V ihv:v A'hcontra:sub = []False have : v sub := I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AFalse I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lhsub_sub:sub l.sublists := Eq.mpr (id (congrArg (fun _a => _a) (propext List.mem_sublists))) List.filter_sublistv:V ihv:v A'hcontra:sub = []v l v A' I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lhsub_sub:sub l.sublists := Eq.mpr (id (congrArg (fun _a => _a) (propext List.mem_sublists))) List.filter_sublistv:V ihv:v A'hcontra:sub = []v l I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lhsub_sub:sub l.sublists := Eq.mpr (id (congrArg (fun _a => _a) (propext List.mem_sublists))) List.filter_sublistv:V ihv:v A'hcontra:sub = []v (σ i) All goals completed! 🐙 I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lhsub_sub:sub l.sublists := Eq.mpr (id (congrArg (fun _a => _a) (propext List.mem_sublists))) List.filter_sublistv:V ihv:v A'hcontra:sub = []this:v []False All goals completed! 🐙 have hsub_toFinset : sub.toFinset = A'.1 := I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AFalse I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lhsub_sub:sub l.sublists := Eq.mpr (id (congrArg (fun _a => _a) (propext List.mem_sublists))) List.filter_sublisthsub_ne:sub [] := Exists.casesOn A'.property fun v hv hcontra => have this := Eq.mpr (id (Eq.trans findDevAt_eq_none_no_strictDom._simp_1 (congrArg (And (v l)) decide_eq_true_eq))) Eq.mpr (id (findDevAt_eq_none_no_strictDom._simp_2 fun x1 x2 => x1 x2)) (hA'sub hv), hv; List.not_mem_nil (Eq.mp (congrArg (fun _a => v _a) hcontra) this)x:V ix sub.toFinset x A' I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lhsub_sub:sub l.sublists := Eq.mpr (id (congrArg (fun _a => _a) (propext List.mem_sublists))) List.filter_sublisthsub_ne:sub [] := Exists.casesOn A'.property fun v hv hcontra => have this := Eq.mpr (id (Eq.trans findDevAt_eq_none_no_strictDom._simp_1 (congrArg (And (v l)) decide_eq_true_eq))) Eq.mpr (id (findDevAt_eq_none_no_strictDom._simp_2 fun x1 x2 => x1 x2)) (hA'sub hv), hv; List.not_mem_nil (Eq.mp (congrArg (fun _a => v _a) hcontra) this)x:V ix (σ i) x A' x A' I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lhsub_sub:sub l.sublists := Eq.mpr (id (congrArg (fun _a => _a) (propext List.mem_sublists))) List.filter_sublisthsub_ne:sub [] := Exists.casesOn A'.property fun v hv hcontra => have this := Eq.mpr (id (Eq.trans findDevAt_eq_none_no_strictDom._simp_1 (congrArg (And (v l)) decide_eq_true_eq))) Eq.mpr (id (findDevAt_eq_none_no_strictDom._simp_2 fun x1 x2 => x1 x2)) (hA'sub hv), hv; List.not_mem_nil (Eq.mp (congrArg (fun _a => v _a) hcontra) this)x:V ix (σ i) x A' x A'I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lhsub_sub:sub l.sublists := Eq.mpr (id (congrArg (fun _a => _a) (propext List.mem_sublists))) List.filter_sublisthsub_ne:sub [] := Exists.casesOn A'.property fun v hv hcontra => have this := Eq.mpr (id (Eq.trans findDevAt_eq_none_no_strictDom._simp_1 (congrArg (And (v l)) decide_eq_true_eq))) Eq.mpr (id (findDevAt_eq_none_no_strictDom._simp_2 fun x1 x2 => x1 x2)) (hA'sub hv), hv; List.not_mem_nil (Eq.mp (congrArg (fun _a => v _a) hcontra) this)x:V ix A' x (σ i) x A' I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lhsub_sub:sub l.sublists := Eq.mpr (id (congrArg (fun _a => _a) (propext List.mem_sublists))) List.filter_sublisthsub_ne:sub [] := Exists.casesOn A'.property fun v hv hcontra => have this := Eq.mpr (id (Eq.trans findDevAt_eq_none_no_strictDom._simp_1 (congrArg (And (v l)) decide_eq_true_eq))) Eq.mpr (id (findDevAt_eq_none_no_strictDom._simp_2 fun x1 x2 => x1 x2)) (hA'sub hv), hv; List.not_mem_nil (Eq.mp (congrArg (fun _a => v _a) hcontra) this)x:V ix (σ i) x A' x A' I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lhsub_sub:sub l.sublists := Eq.mpr (id (congrArg (fun _a => _a) (propext List.mem_sublists))) List.filter_sublisthsub_ne:sub [] := Exists.casesOn A'.property fun v hv hcontra => have this := Eq.mpr (id (Eq.trans findDevAt_eq_none_no_strictDom._simp_1 (congrArg (And (v l)) decide_eq_true_eq))) Eq.mpr (id (findDevAt_eq_none_no_strictDom._simp_2 fun x1 x2 => x1 x2)) (hA'sub hv), hv; List.not_mem_nil (Eq.mp (congrArg (fun _a => v _a) hcontra) this)x:V ileft✝:x (σ i)hx:x A'x A'; All goals completed! 🐙 I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lhsub_sub:sub l.sublists := Eq.mpr (id (congrArg (fun _a => _a) (propext List.mem_sublists))) List.filter_sublisthsub_ne:sub [] := Exists.casesOn A'.property fun v hv hcontra => have this := Eq.mpr (id (Eq.trans findDevAt_eq_none_no_strictDom._simp_1 (congrArg (And (v l)) decide_eq_true_eq))) Eq.mpr (id (findDevAt_eq_none_no_strictDom._simp_2 fun x1 x2 => x1 x2)) (hA'sub hv), hv; List.not_mem_nil (Eq.mp (congrArg (fun _a => v _a) hcontra) this)x:V ix A' x (σ i) x A' I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lhsub_sub:sub l.sublists := Eq.mpr (id (congrArg (fun _a => _a) (propext List.mem_sublists))) List.filter_sublisthsub_ne:sub [] := Exists.casesOn A'.property fun v hv hcontra => have this := Eq.mpr (id (Eq.trans findDevAt_eq_none_no_strictDom._simp_1 (congrArg (And (v l)) decide_eq_true_eq))) Eq.mpr (id (findDevAt_eq_none_no_strictDom._simp_2 fun x1 x2 => x1 x2)) (hA'sub hv), hv; List.not_mem_nil (Eq.mp (congrArg (fun _a => v _a) hcontra) this)x:V ihx:x A'x (σ i) x A'; All goals completed! 🐙 -- Now show findDevAt would have returned some at this sublist I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:List.findSome? (fun sub => if hne : sub [] then have A := listToFace sub hne; if G.StrictDom i σ A then some A else none else none) ((↑(σ i)).sort fun x1 x2 => x1 x2).sublists = noneA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lhsub_sub:sub l.sublists := Eq.mpr (id (congrArg (fun _a => _a) (propext List.mem_sublists))) List.filter_sublisthsub_ne:sub [] := Exists.casesOn A'.property fun v hv hcontra => have this := Eq.mpr (id (Eq.trans findDevAt_eq_none_no_strictDom._simp_1 (congrArg (And (v l)) decide_eq_true_eq))) Eq.mpr (id (findDevAt_eq_none_no_strictDom._simp_2 fun x1 x2 => x1 x2)) (hA'sub hv), hv; List.not_mem_nil (Eq.mp (congrArg (fun _a => v _a) hcontra) this)hsub_toFinset:sub.toFinset = A' := Finset.ext fun x => Eq.mpr (id (congrArg (fun x_1 => x_1 x A') (Eq.trans findDevAt_eq_none_no_strictDom._simp_3 (Eq.trans findDevAt_eq_none_no_strictDom._simp_1 (congr (congrArg And (findDevAt_eq_none_no_strictDom._simp_2 fun x1 x2 => x1 x2)) decide_eq_true_eq))))) { mp := fun a => And.casesOn a fun left hx => hx, mpr := fun hx => hA'sub hx, hx }False I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh: x ((↑(σ i)).sort fun x1 x2 => x1 x2).sublists, (if hne : x [] then have A := listToFace x hne; if G.StrictDom i σ A then some A else none else none) = noneA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lhsub_sub:sub l.sublistshsub_ne:sub []hsub_toFinset:sub.toFinset = A'False I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lhsub_sub:sub l.sublistshsub_ne:sub []hsub_toFinset:sub.toFinset = A'h:(if hne : sub [] then have A := listToFace sub hne; if G.StrictDom i σ A then some A else none else none) = noneFalse I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lhsub_sub:sub l.sublistshsub_ne:sub []hsub_toFinset:sub.toFinset = A'h:(if G.StrictDom i σ (listToFace sub ) then some (listToFace sub ) else none) = noneFalse -- h says the if branch returned none, so strict dom fails have hface_eq : listToFace sub hsub_ne = A' := I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σh:G.findDevAt σ i = noneA:Face (V i)hStrict:G.StrictDom i σ AFalse I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lhsub_sub:sub l.sublistshsub_ne:sub []hsub_toFinset:sub.toFinset = A'h:(if G.StrictDom i σ (listToFace sub ) then some (listToFace sub ) else none) = none(listToFace sub hsub_ne) = A' I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lhsub_sub:sub l.sublistshsub_ne:sub []hsub_toFinset:sub.toFinset = A'h:(if G.StrictDom i σ (listToFace sub ) then some (listToFace sub ) else none) = nonesub.toFinset = A' All goals completed! 🐙 I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vi:Ih_od:G.OutsideDom i σA:Face (V i)hStrict:G.StrictDom i σ AA':Face (V i)hA'dev:G.StrictDom i σ A'hA'sub:A'.IsSubface (σ i)right✝:A' σ il:List (V i) := (↑(σ i)).sort fun x1 x2 => x1 x2sub:List (V i) := List.filter (fun x => decide (x A')) lhsub_sub:sub l.sublistshsub_ne:sub []hsub_toFinset:sub.toFinset = A'h:some A' = nonehface_eq:listToFace sub hsub_ne = A'False All goals completed! 🐙 lemma findDev_eq_none_isNash {σ : Profile I V} (h_od : i, G.OutsideDom i σ) (h : G.findDev σ = none) : G.IsNash σ := I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vh_od: (i : I), G.OutsideDom i σh:G.findDev σ = noneG.IsNash σ intro i I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vh_od: (i : I), G.OutsideDom i σh:G.findDev σ = nonei:IA:Face (V i)¬G.StrictDom i σ A I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vh_od: (i : I), G.OutsideDom i σh:G.findDev σ = nonei:IA:Face (V i)hStrict:G.StrictDom i σ AFalse I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vh_od: (i : I), G.OutsideDom i σh:List.findSome? (fun i => Option.map (fun A => i, A) (G.findDevAt σ i)) (Finset.univ.sort fun x1 x2 => x1 x2) = nonei:IA:Face (V i)hStrict:G.StrictDom i σ AFalse I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vh_od: (i : I), G.OutsideDom i σh: x Finset.univ.sort fun x1 x2 => x1 x2, Option.map (fun A => x, A) (G.findDevAt σ x) = nonei:IA:Face (V i)hStrict:G.StrictDom i σ AFalse have hmem : i (Finset.univ : Finset I).sort (· ·) := I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vh_od: (i : I), G.OutsideDom i σh:G.findDev σ = noneG.IsNash σ I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vh_od: (i : I), G.OutsideDom i σh: x Finset.univ.sort fun x1 x2 => x1 x2, Option.map (fun A => x, A) (G.findDevAt σ x) = nonei:IA:Face (V i)hStrict:G.StrictDom i σ Ai Finset.univ; All goals completed! 🐙 I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vh_od: (i : I), G.OutsideDom i σi:IA:Face (V i)hStrict:G.StrictDom i σ Ahmem:i Finset.univ.sort fun x1 x2 => x1 x2 := Eq.mpr (id (congrArg (fun _a => _a) (propext (Finset.mem_sort fun x1 x2 => x1 x2)))) (Finset.mem_univ i)h:Option.map (fun A => i, A) (G.findDevAt σ i) = noneFalse match hfd : G.findDevAt σ i with I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vh_od: (i : I), G.OutsideDom i σi:IA:Face (V i)hStrict:G.StrictDom i σ Ahmem:i Finset.univ.sort fun x1 x2 => x1 x2 := Eq.mpr (id (congrArg (fun _a => _a) (propext (Finset.mem_sort fun x1 x2 => x1 x2)))) (Finset.mem_univ i)h:Option.map (fun A => i, A) (G.findDevAt σ i) = nonehfd:G.findDevAt σ i = noneFalse All goals completed! 🐙 I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vh_od: (i : I), G.OutsideDom i σi:IA:Face (V i)hStrict:G.StrictDom i σ Ahmem:i Finset.univ.sort fun x1 x2 => x1 x2 := Eq.mpr (id (congrArg (fun _a => _a) (propext (Finset.mem_sort fun x1 x2 => x1 x2)))) (Finset.mem_univ i)h:Option.map (fun A => i, A) (G.findDevAt σ i) = noneA':Face (V i)hfd:G.findDevAt σ i = some A'False I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vh_od: (i : I), G.OutsideDom i σi:IA:Face (V i)hStrict:G.StrictDom i σ Ahmem:i Finset.univ.sort fun x1 x2 => x1 x2 := Eq.mpr (id (congrArg (fun _a => _a) (propext (Finset.mem_sort fun x1 x2 => x1 x2)))) (Finset.mem_univ i)A':Face (V i)h:Option.map (fun A => i, A) (some A') = nonehfd:G.findDevAt σ i = some A'False All goals completed! 🐙

Computable Nash descent: given a profile satisfying OutsideDom, returns an actual Nash equilibrium as data (subtype). This is the executable counterpart of nash_exists_sub_of_outsideDom — same algorithm, but with decidable branching and a sorted search instead of by_cases + Classical.em, at the cost of requiring LinearOrder I and LinearOrder (V i).

def findNashOf (σ : Profile I V) (h_od : i, G.OutsideDom i σ) : { τ : Profile I V // G.IsNash τ } := match hfd : G.findDev σ with | none => σ, G.findDev_eq_none_isNash h_od hfd | some i₀, A => have hdev : G.StrictDom i₀ σ A := G.findDev_eq_some_strictDom hfd let r := G.restrictStrictDom (h_od i₀) hdev have hsub : Face.IsSubface r.1 (σ i₀) := r.2.2.1 have hne : r.1 σ i₀ := r.2.2.2 have hdec : profileSize (σ[i₀ r.1]) < profileSize σ := profileSize_decreases hsub hne findNashOf (σ[i₀ r.1]) (fun j => I✝:Type u_1inst✝⁷:DecidableEq I✝V✝:I✝ Type u_2inst✝⁶:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vh_od: (i : I), G.OutsideDom i σi₀:IA:Face (V i₀)hfd:G.findDev σ = some i₀, Ahdev:G.StrictDom i₀ σ A := findDev_eq_some_strictDom G hfdr:{ A' // G.StrictDom i₀ σ A' A'.IsSubface (σ i₀) A' σ i₀ } := G.restrictStrictDom hdevhsub:(↑r).IsSubface (σ i₀) := r.property.right.lefthne:r σ i₀ := r.property.right.righthdec:profileSize (σ[i₀ r]) < profileSize σ := profileSize_decreases hsub hnej:IG.OutsideDom j (σ[i₀ r]) I✝:Type u_1inst✝⁷:DecidableEq I✝V✝:I✝ Type u_2inst✝⁶:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vh_od: (i : I), G.OutsideDom i σi₀:IA:Face (V i₀)hfd:G.findDev σ = some i₀, Ahdev:G.StrictDom i₀ σ A := findDev_eq_some_strictDom G hfdr:{ A' // G.StrictDom i₀ σ A' A'.IsSubface (σ i₀) A' σ i₀ } := G.restrictStrictDom hdevhsub:(↑r).IsSubface (σ i₀) := r.property.right.lefthne:r σ i₀ := r.property.right.righthdec:profileSize (σ[i₀ r]) < profileSize σ := profileSize_decreases hsub hnej:Ihij:j = i₀G.OutsideDom j (σ[i₀ r])I✝:Type u_1inst✝⁷:DecidableEq I✝V✝:I✝ Type u_2inst✝⁶:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vh_od: (i : I), G.OutsideDom i σi₀:IA:Face (V i₀)hfd:G.findDev σ = some i₀, Ahdev:G.StrictDom i₀ σ A := findDev_eq_some_strictDom G hfdr:{ A' // G.StrictDom i₀ σ A' A'.IsSubface (σ i₀) A' σ i₀ } := G.restrictStrictDom hdevhsub:(↑r).IsSubface (σ i₀) := r.property.right.lefthne:r σ i₀ := r.property.right.righthdec:profileSize (σ[i₀ r]) < profileSize σ := profileSize_decreases hsub hnej:Ihij:¬j = i₀G.OutsideDom j (σ[i₀ r]) I✝:Type u_1inst✝⁷:DecidableEq I✝V✝:I✝ Type u_2inst✝⁶:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vh_od: (i : I), G.OutsideDom i σi₀:IA:Face (V i₀)hfd:G.findDev σ = some i₀, Ahdev:G.StrictDom i₀ σ A := findDev_eq_some_strictDom G hfdr:{ A' // G.StrictDom i₀ σ A' A'.IsSubface (σ i₀) A' σ i₀ } := G.restrictStrictDom hdevhsub:(↑r).IsSubface (σ i₀) := r.property.right.lefthne:r σ i₀ := r.property.right.righthdec:profileSize (σ[i₀ r]) < profileSize σ := profileSize_decreases hsub hnej:Ihij:j = i₀G.OutsideDom j (σ[i₀ r]) I✝:Type u_1inst✝⁷:DecidableEq I✝V✝:I✝ Type u_2inst✝⁶:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vh_od: (i : I), G.OutsideDom i σj:IA:Face (V j)hfd:G.findDev σ = some j, Ahdev:G.StrictDom j σ Ar:{ A' // G.StrictDom j σ A' A'.IsSubface (σ j) A' σ j } := G.restrictStrictDom hdevhsub:(↑r).IsSubface (σ j)hne:r σ jhdec:profileSize (σ[j r]) < profileSize σG.OutsideDom j (σ[j r]); All goals completed! 🐙 I✝:Type u_1inst✝⁷:DecidableEq I✝V✝:I✝ Type u_2inst✝⁶:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝⁵:DecidableEq IV:I Type u_4inst✝⁴:(i : I) DecidableEq (V i)G:SignGame I Vinst✝³:Fintype Iinst✝²:(i : I) Fintype (V i)inst✝¹:LinearOrder Iinst✝:(i : I) LinearOrder (V i)σ:Profile I Vh_od: (i : I), G.OutsideDom i σi₀:IA:Face (V i₀)hfd:G.findDev σ = some i₀, Ahdev:G.StrictDom i₀ σ A := findDev_eq_some_strictDom G hfdr:{ A' // G.StrictDom i₀ σ A' A'.IsSubface (σ i₀) A' σ i₀ } := G.restrictStrictDom hdevhsub:(↑r).IsSubface (σ i₀) := r.property.right.lefthne:r σ i₀ := r.property.right.righthdec:profileSize (σ[i₀ r]) < profileSize σ := profileSize_decreases hsub hnej:Ihij:¬j = i₀G.OutsideDom j (σ[i₀ r]) All goals completed! 🐙) termination_by profileSize σ

Computable Nash existence: starting from the fully mixed profile, returns a Nash equilibrium as data. Executable counterpart of nash_exists; can be #eval-ed directly on a concrete SignGame. See findNashOf for the version with an arbitrary starting profile.

-- ANCHOR: findNash def findNash [Nonempty I] [ i, Nonempty (V i)] : { σ : Profile I V // G.IsNash σ } := -- ANCHOR_END: findNash G.findNashOf (fun _ => Face.full) (fun i => OutsideDom.maximal G i) end Computable

Construct a SignGame from integer-valued payoff functions.

Given payoff functions u i : (∀ j, V j) → Int for each player i, the sign between actions a and b for player i at profile p is determined by comparing u i (p[i ↦ a]) with u i (p[i ↦ b]): positive if a gives higher payoff, negative if b does, zero if equal. The resulting sign game depends only on the ordinal ranking of payoffs — any strictly monotone transformation of each player's payoffs produces the same game (see ofPayoffs_strictMono_invariant in Invariance.lean).

def ofPayoffs [Fintype I] (u : (i : I) PureProfile I V Int) : SignGame I V where sign i p q := if u i p > u i q then .pos else if u i p = u i q then .zero else .neg sign_refl i p := I✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I V(if u i p > u i p then Sign.pos else if u i p = u i p then Sign.zero else Sign.neg) = Sign.zero All goals completed! 🐙 sign_antisym i p q := I✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I V(if u i p > u i q then Sign.pos else if u i p = u i q then Sign.zero else Sign.neg) = (if u i q > u i p then Sign.pos else if u i q = u i p then Sign.zero else Sign.neg).flip I✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I V(if u i p > u i q then Sign.pos else if u i p = u i q then Sign.zero else Sign.neg) = match if u i q > u i p then Sign.pos else if u i q = u i p then Sign.zero else Sign.neg with | Sign.pos => Sign.neg | Sign.neg => Sign.pos | Sign.zero => Sign.zero I✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vh✝¹:u i p > u i qh✝:u i q > u i pFalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vh✝²:u i p > u i qh✝¹:¬u i q > u i ph✝:u i q = u i pFalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vh✝²:u i p > u i qh✝¹:¬u i q > u i ph✝:¬u i q = u i pSign.pos = match Sign.neg with | Sign.pos => Sign.neg | Sign.neg => Sign.pos | Sign.zero => Sign.zeroI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vh✝²:¬u i p > u i qh✝¹:u i p = u i qh✝:u i q > u i pFalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vh✝³:¬u i p > u i qh✝²:u i p = u i qh✝¹:¬u i q > u i ph✝:u i q = u i pSign.zero = match Sign.zero with | Sign.pos => Sign.neg | Sign.neg => Sign.pos | Sign.zero => Sign.zeroI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vh✝³:¬u i p > u i qh✝²:u i p = u i qh✝¹:¬u i q > u i ph✝:¬u i q = u i pFalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vh✝²:¬u i p > u i qh✝¹:¬u i p = u i qh✝:u i q > u i pSign.neg = match Sign.pos with | Sign.pos => Sign.neg | Sign.neg => Sign.pos | Sign.zero => Sign.zeroI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vh✝³:¬u i p > u i qh✝²:¬u i p = u i qh✝¹:¬u i q > u i ph✝:u i q = u i pFalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vh✝³:¬u i p > u i qh✝²:¬u i p = u i qh✝¹:¬u i q > u i ph✝:¬u i q = u i pFalse I✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vh✝¹:u i p > u i qh✝:u i q > u i pFalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vh✝²:u i p > u i qh✝¹:¬u i q > u i ph✝:u i q = u i pFalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vh✝²:u i p > u i qh✝¹:¬u i q > u i ph✝:¬u i q = u i pSign.pos = match Sign.neg with | Sign.pos => Sign.neg | Sign.neg => Sign.pos | Sign.zero => Sign.zeroI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vh✝²:¬u i p > u i qh✝¹:u i p = u i qh✝:u i q > u i pFalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vh✝³:¬u i p > u i qh✝²:u i p = u i qh✝¹:¬u i q > u i ph✝:u i q = u i pSign.zero = match Sign.zero with | Sign.pos => Sign.neg | Sign.neg => Sign.pos | Sign.zero => Sign.zeroI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vh✝³:¬u i p > u i qh✝²:u i p = u i qh✝¹:¬u i q > u i ph✝:¬u i q = u i pFalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vh✝²:¬u i p > u i qh✝¹:¬u i p = u i qh✝:u i q > u i pSign.neg = match Sign.pos with | Sign.pos => Sign.neg | Sign.neg => Sign.pos | Sign.zero => Sign.zeroI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vh✝³:¬u i p > u i qh✝²:¬u i p = u i qh✝¹:¬u i q > u i ph✝:u i q = u i pFalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vh✝³:¬u i p > u i qh✝²:¬u i p = u i qh✝¹:¬u i q > u i ph✝:¬u i q = u i pFalse first | I✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vh✝³:¬u i p > u i qh✝²:¬u i p = u i qh✝¹:¬u i q > u i ph✝:¬u i q = u i pFalse | All goals completed! 🐙 sign_trans i p q r := I✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I V(if u i p > u i q then Sign.pos else if u i p = u i q then Sign.zero else Sign.neg).nonneg (if u i q > u i r then Sign.pos else if u i q = u i r then Sign.zero else Sign.neg).nonneg (if u i p > u i r then Sign.pos else if u i p = u i r then Sign.zero else Sign.neg).nonneg I✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I V(match if u i p > u i q then Sign.pos else if u i p = u i q then Sign.zero else Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match if u i q > u i r then Sign.pos else if u i q = u i r then Sign.zero else Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match if u i p > u i r then Sign.pos else if u i p = u i r then Sign.zero else Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False I✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝²:u i p > u i qh✝¹:u i q > u i rh✝:u i p > u i r(match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝³:u i p > u i qh✝²:u i q > u i rh✝¹:¬u i p > u i rh✝:u i p = u i r(match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝³:u i p > u i qh✝²:u i q > u i rh✝¹:¬u i p > u i rh✝:¬u i p = u i r(match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝³:u i p > u i qh✝²:¬u i q > u i rh✝¹:u i q = u i rh✝:u i p > u i r(match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:u i p > u i qh✝³:¬u i q > u i rh✝²:u i q = u i rh✝¹:¬u i p > u i rh✝:u i p = u i r(match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:u i p > u i qh✝³:¬u i q > u i rh✝²:u i q = u i rh✝¹:¬u i p > u i rh✝:¬u i p = u i r(match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝³:u i p > u i qh✝²:¬u i q > u i rh✝¹:¬u i q = u i rh✝:u i p > u i r(match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:u i p > u i qh✝³:¬u i q > u i rh✝²:¬u i q = u i rh✝¹:¬u i p > u i rh✝:u i p = u i r(match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:u i p > u i qh✝³:¬u i q > u i rh✝²:¬u i q = u i rh✝¹:¬u i p > u i rh✝:¬u i p = u i r(match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝³:¬u i p > u i qh✝²:u i p = u i qh✝¹:u i q > u i rh✝:u i p > u i r(match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:¬u i p > u i qh✝³:u i p = u i qh✝²:u i q > u i rh✝¹:¬u i p > u i rh✝:u i p = u i r(match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:¬u i p > u i qh✝³:u i p = u i qh✝²:u i q > u i rh✝¹:¬u i p > u i rh✝:¬u i p = u i r(match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:¬u i p > u i qh✝³:u i p = u i qh✝²:¬u i q > u i rh✝¹:u i q = u i rh✝:u i p > u i r(match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁵:¬u i p > u i qh✝⁴:u i p = u i qh✝³:¬u i q > u i rh✝²:u i q = u i rh✝¹:¬u i p > u i rh✝:u i p = u i r(match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁵:¬u i p > u i qh✝⁴:u i p = u i qh✝³:¬u i q > u i rh✝²:u i q = u i rh✝¹:¬u i p > u i rh✝:¬u i p = u i r(match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:¬u i p > u i qh✝³:u i p = u i qh✝²:¬u i q > u i rh✝¹:¬u i q = u i rh✝:u i p > u i r(match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁵:¬u i p > u i qh✝⁴:u i p = u i qh✝³:¬u i q > u i rh✝²:¬u i q = u i rh✝¹:¬u i p > u i rh✝:u i p = u i r(match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁵:¬u i p > u i qh✝⁴:u i p = u i qh✝³:¬u i q > u i rh✝²:¬u i q = u i rh✝¹:¬u i p > u i rh✝:¬u i p = u i r(match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝³:¬u i p > u i qh✝²:¬u i p = u i qh✝¹:u i q > u i rh✝:u i p > u i r(match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:¬u i p > u i qh✝³:¬u i p = u i qh✝²:u i q > u i rh✝¹:¬u i p > u i rh✝:u i p = u i r(match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:¬u i p > u i qh✝³:¬u i p = u i qh✝²:u i q > u i rh✝¹:¬u i p > u i rh✝:¬u i p = u i r(match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:¬u i p > u i qh✝³:¬u i p = u i qh✝²:¬u i q > u i rh✝¹:u i q = u i rh✝:u i p > u i r(match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁵:¬u i p > u i qh✝⁴:¬u i p = u i qh✝³:¬u i q > u i rh✝²:u i q = u i rh✝¹:¬u i p > u i rh✝:u i p = u i r(match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁵:¬u i p > u i qh✝⁴:¬u i p = u i qh✝³:¬u i q > u i rh✝²:u i q = u i rh✝¹:¬u i p > u i rh✝:¬u i p = u i r(match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:¬u i p > u i qh✝³:¬u i p = u i qh✝²:¬u i q > u i rh✝¹:¬u i q = u i rh✝:u i p > u i r(match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁵:¬u i p > u i qh✝⁴:¬u i p = u i qh✝³:¬u i q > u i rh✝²:¬u i q = u i rh✝¹:¬u i p > u i rh✝:u i p = u i r(match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁵:¬u i p > u i qh✝⁴:¬u i p = u i qh✝³:¬u i q > u i rh✝²:¬u i q = u i rh✝¹:¬u i p > u i rh✝:¬u i p = u i r(match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False I✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝²:u i p > u i qh✝¹:u i q > u i rh✝:u i p > u i r(match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝³:u i p > u i qh✝²:u i q > u i rh✝¹:¬u i p > u i rh✝:u i p = u i r(match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝³:u i p > u i qh✝²:u i q > u i rh✝¹:¬u i p > u i rh✝:¬u i p = u i r(match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝³:u i p > u i qh✝²:¬u i q > u i rh✝¹:u i q = u i rh✝:u i p > u i r(match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:u i p > u i qh✝³:¬u i q > u i rh✝²:u i q = u i rh✝¹:¬u i p > u i rh✝:u i p = u i r(match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:u i p > u i qh✝³:¬u i q > u i rh✝²:u i q = u i rh✝¹:¬u i p > u i rh✝:¬u i p = u i r(match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝³:u i p > u i qh✝²:¬u i q > u i rh✝¹:¬u i q = u i rh✝:u i p > u i r(match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:u i p > u i qh✝³:¬u i q > u i rh✝²:¬u i q = u i rh✝¹:¬u i p > u i rh✝:u i p = u i r(match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:u i p > u i qh✝³:¬u i q > u i rh✝²:¬u i q = u i rh✝¹:¬u i p > u i rh✝:¬u i p = u i r(match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝³:¬u i p > u i qh✝²:u i p = u i qh✝¹:u i q > u i rh✝:u i p > u i r(match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:¬u i p > u i qh✝³:u i p = u i qh✝²:u i q > u i rh✝¹:¬u i p > u i rh✝:u i p = u i r(match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:¬u i p > u i qh✝³:u i p = u i qh✝²:u i q > u i rh✝¹:¬u i p > u i rh✝:¬u i p = u i r(match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:¬u i p > u i qh✝³:u i p = u i qh✝²:¬u i q > u i rh✝¹:u i q = u i rh✝:u i p > u i r(match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁵:¬u i p > u i qh✝⁴:u i p = u i qh✝³:¬u i q > u i rh✝²:u i q = u i rh✝¹:¬u i p > u i rh✝:u i p = u i r(match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁵:¬u i p > u i qh✝⁴:u i p = u i qh✝³:¬u i q > u i rh✝²:u i q = u i rh✝¹:¬u i p > u i rh✝:¬u i p = u i r(match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:¬u i p > u i qh✝³:u i p = u i qh✝²:¬u i q > u i rh✝¹:¬u i q = u i rh✝:u i p > u i r(match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁵:¬u i p > u i qh✝⁴:u i p = u i qh✝³:¬u i q > u i rh✝²:¬u i q = u i rh✝¹:¬u i p > u i rh✝:u i p = u i r(match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁵:¬u i p > u i qh✝⁴:u i p = u i qh✝³:¬u i q > u i rh✝²:¬u i q = u i rh✝¹:¬u i p > u i rh✝:¬u i p = u i r(match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝³:¬u i p > u i qh✝²:¬u i p = u i qh✝¹:u i q > u i rh✝:u i p > u i r(match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:¬u i p > u i qh✝³:¬u i p = u i qh✝²:u i q > u i rh✝¹:¬u i p > u i rh✝:u i p = u i r(match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:¬u i p > u i qh✝³:¬u i p = u i qh✝²:u i q > u i rh✝¹:¬u i p > u i rh✝:¬u i p = u i r(match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:¬u i p > u i qh✝³:¬u i p = u i qh✝²:¬u i q > u i rh✝¹:u i q = u i rh✝:u i p > u i r(match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁵:¬u i p > u i qh✝⁴:¬u i p = u i qh✝³:¬u i q > u i rh✝²:u i q = u i rh✝¹:¬u i p > u i rh✝:u i p = u i r(match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁵:¬u i p > u i qh✝⁴:¬u i p = u i qh✝³:¬u i q > u i rh✝²:u i q = u i rh✝¹:¬u i p > u i rh✝:¬u i p = u i r(match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁴:¬u i p > u i qh✝³:¬u i p = u i qh✝²:¬u i q > u i rh✝¹:¬u i q = u i rh✝:u i p > u i r(match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.pos with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁵:¬u i p > u i qh✝⁴:¬u i p = u i qh✝³:¬u i q > u i rh✝²:¬u i q = u i rh✝¹:¬u i p > u i rh✝:u i p = u i r(match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.zero with | Sign.pos => True | Sign.zero => True | Sign.neg => FalseI✝:Type u_1inst✝⁴:DecidableEq I✝V✝:I✝ Type u_2inst✝³:(i : I✝) DecidableEq (V✝ i)I:Type u_3inst✝²:DecidableEq IV:I Type u_4inst✝¹:(i : I) DecidableEq (V i)G:SignGame I Vinst✝:Fintype Iu:I PureProfile I V i:Ip:PureProfile I Vq:PureProfile I Vr:PureProfile I Vh✝⁵:¬u i p > u i qh✝⁴:¬u i p = u i qh✝³:¬u i q > u i rh✝²:¬u i q = u i rh✝¹:¬u i p > u i rh✝:¬u i p = u i r(match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) (match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False) match Sign.neg with | Sign.pos => True | Sign.zero => True | Sign.neg => False All goals completed! 🐙; All goals completed! 🐙

A pure profile p is a pure Nash equilibrium if no player can improve by switching to any other action, holding all opponents fixed. Equivalently, sign i p (p i) v ≥ 0 for all players i and alternative actions v.

def IsPureNash (p : PureProfile I V) : Prop := (i : I) (v : V i), (G.signAction i p (p i) v).nonneg end SignGame end Base