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 BaseSign 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
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:Sign⊢ x ∈ {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:Sign⊢ s.flip.flip = s ⊢ pos.flip.flip = pos⊢ neg.flip.flip = neg⊢ zero.flip.flip = zero ⊢ pos.flip.flip = pos⊢ neg.flip.flip = neg⊢ zero.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:Sign⊢ Decidable s.nonneg ⊢ Decidable pos.nonneg⊢ Decidable neg.nonneg⊢ Decidable zero.nonneg ⊢ Decidable pos.nonneg⊢ Decidable neg.nonneg⊢ Decidable zero.nonneg ⊢ Decidable True ⊢ Decidable True⊢ Decidable False⊢ Decidable 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.nonneg⊢ s.flip.nonneg
h:¬pos.nonneg⊢ pos.flip.nonnegh:¬neg.nonneg⊢ neg.flip.nonnegh:¬zero.nonneg⊢ zero.flip.nonneg h:¬pos.nonneg⊢ pos.flip.nonnegh:¬neg.nonneg⊢ neg.flip.nonnegh:¬zero.nonneg⊢ zero.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:Sign⊢ s.mul zero = zero ⊢ pos.mul zero = zero⊢ neg.mul zero = zero⊢ zero.mul zero = zero ⊢ pos.mul zero = zero⊢ neg.mul zero = zero⊢ zero.mul zero = zero All goals completed! 🐙@[simp] theorem zero_mul (s : Sign) : mul zero s = zero := s:Sign⊢ zero.mul s = zero All goals completed! 🐙@[simp] theorem mul_pos (s : Sign) : mul s pos = s := s:Sign⊢ s.mul pos = s ⊢ pos.mul pos = pos⊢ neg.mul pos = neg⊢ zero.mul pos = zero ⊢ pos.mul pos = pos⊢ neg.mul pos = neg⊢ zero.mul pos = zero All goals completed! 🐙@[simp] theorem pos_mul (s : Sign) : mul pos s = s := s:Sign⊢ pos.mul s = s ⊢ pos.mul pos = pos⊢ pos.mul neg = neg⊢ pos.mul zero = zero ⊢ pos.mul pos = pos⊢ pos.mul neg = neg⊢ pos.mul zero = zero All goals completed! 🐙@[simp] theorem neg_mul (s : Sign) : mul neg s = s.flip := s:Sign⊢ neg.mul s = s.flip ⊢ neg.mul pos = pos.flip⊢ neg.mul neg = neg.flip⊢ neg.mul zero = zero.flip ⊢ neg.mul pos = pos.flip⊢ neg.mul neg = neg.flip⊢ neg.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 SignComparison 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 < b⊢ Sign.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 < b⊢ Sign.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 < a⊢ Sign.neg.flip = Sign.posa:ℕb:ℕh✝¹:¬a < bh✝:¬b < a⊢ Sign.zero.flip = Sign.zero a:ℕb:ℕh✝¹:¬a < bh✝:b < a⊢ Sign.neg.flip = Sign.posa:ℕb:ℕh✝¹:¬a < bh✝:¬b < a⊢ Sign.zero.flip = Sign.zero All goals completed! 🐙 a:ℕb:ℕh✝¹:a < bh✝:b < a⊢ False 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 < b⊢ Sign.pos.nonneg ↔ a ≤ ba:ℕb:ℕh✝:¬a < b⊢ (if b < a then Sign.neg else Sign.zero).nonneg ↔ a ≤ b
a:ℕb:ℕh✝:a < b⊢ Sign.pos.nonneg ↔ a ≤ b a:ℕb:ℕh✝:a < b⊢ a ≤ 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 < a⊢ Sign.neg.nonneg ↔ a ≤ ba:ℕb:ℕh✝¹:¬a < bh✝:¬b < a⊢ Sign.zero.nonneg ↔ a ≤ b
a:ℕb:ℕh✝¹:¬a < bh✝:b < a⊢ Sign.neg.nonneg ↔ a ≤ b a:ℕb:ℕh✝¹:¬a < bh✝:b < a⊢ b < a; All goals completed! 🐙
a:ℕb:ℕh✝¹:¬a < bh✝:¬b < a⊢ Sign.zero.nonneg ↔ a ≤ b a:ℕb:ℕh✝¹:¬a < bh✝:¬b < a⊢ a ≤ 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 ≤ c⊢ a ≤ 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} := rflThe 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 := rflThe 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 V⊢ Fintype (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 iA 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 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 ≠ i⊢ p 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 hj⊢ p 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])
lemma signAction_refl (i : I) (p : PureProfile I V) (a : V i) :
G.signAction i p a a = .zero :=
G.sign_refl i _
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 _ _
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 hbc
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 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 j⊢ G.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 j⊢ p[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 j⊢ p[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 j⊢ p[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 j⊢ p[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
-- 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 C⊢ G.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 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 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 i⊢ 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 ∈ ↑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
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 i's current face
and every action w {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
-- 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 OutsideDomThe 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) hvOutsideDom 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 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 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 ∉ ↑A⊢ w ∈ ↑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 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 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 i⊢ 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)⊢ (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 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
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 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 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 ∈ ↑A⊢ x ∈ ↑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 σ 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 σ A⊢ 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) A⊢ 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.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), ⋯⟩ = σ i⊢ False
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 σ A⊢ G.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)).left⊢ G.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 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 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 i⊢ 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 ∈ ↑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 inThe 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 inReplacing 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 ≠ σ 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 ≠ σ 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: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 σ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 hx⊢ 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 ∈ ↑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 hx⊢ x ∈ ↑(σ 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 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 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 V⊢ Decidable (∀ (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, A⟩
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 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: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 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:∃ 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) =
none⊢ 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) =
none⊢ 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 σ 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 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)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 hfa⊢ 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✝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 x⊢ G.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 x⊢ G.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) = none⊢ G.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) = none⊢ G.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 = none⊢ G.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 = none⊢ G.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 A⊢ G.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 A⊢ G.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, A⟩hi:some ⟨i, A⟩ = some ⟨i, A⟩⊢ G.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.
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 σ A⊢ False
-- 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' ≠ σ i⊢ False
-- 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 ≤ x2⊢ 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 σ 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')) l⊢ False
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 σ 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 σ 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')) l⊢ sub.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 σ 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 σ 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 σ 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 σ 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 σ 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 σ 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 i⊢ x ∈ 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 i⊢ x ∈ ↑(σ 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 i⊢ x ∈ ↑(σ 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 i⊢ x ∈ ↑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 i⊢ x ∈ ↑(σ 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 i⊢ x ∈ ↑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) =
none⊢ 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 G.StrictDom i σ (listToFace sub ⋯) then some (listToFace sub ⋯) else none) = none⊢ False
-- 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 σ 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 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) = none⊢ sub.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 σ = none⊢ G.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 σ 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 σ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 σ 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 σ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 σ A⊢ False
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 σ = 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:∀ 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 σ A⊢ i ∈ 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) = none⊢ False
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 = none⊢ False 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₀, A⟩hdev: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: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₀, A⟩hdev: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₀, A⟩hdev: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₀, A⟩hdev: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, A⟩hdev: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₀, A⟩hdev: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 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 p⊢ 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 Vh✝²:u i p > u i qh✝¹:¬u i q > u i ph✝:u i q = u i p⊢ 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 Vh✝²:u i p > u i qh✝¹:¬u i q > u i ph✝:¬u i q = u i p⊢ Sign.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 p⊢ 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 Vh✝³:¬u i p > u i qh✝²:u i p = u i qh✝¹:¬u i q > u i ph✝:u i q = u i p⊢ Sign.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 p⊢ 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 Vh✝²:¬u i p > u i qh✝¹:¬u i p = u i qh✝:u i q > u i p⊢ Sign.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 p⊢ 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 Vh✝³:¬u i p > u i qh✝²:¬u i p = u i qh✝¹:¬u i q > u i ph✝:¬u i q = u i p⊢ 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 Vh✝¹:u i p > u i qh✝:u i q > u i p⊢ 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 Vh✝²:u i p > u i qh✝¹:¬u i q > u i ph✝:u i q = u i p⊢ 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 Vh✝²:u i p > u i qh✝¹:¬u i q > u i ph✝:¬u i q = u i p⊢ Sign.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 p⊢ 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 Vh✝³:¬u i p > u i qh✝²:u i p = u i qh✝¹:¬u i q > u i ph✝:u i q = u i p⊢ Sign.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 p⊢ 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 Vh✝²:¬u i p > u i qh✝¹:¬u i p = u i qh✝:u i q > u i p⊢ Sign.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 p⊢ 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 Vh✝³:¬u i p > u i qh✝²:¬u i p = u i qh✝¹:¬u i q > u i ph✝:¬u i q = u i p⊢ False 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 p⊢ False | 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