File: Mathlib/SetTheory/Game/Impartial.lean

full_name: SetTheory.PGame.ImpartialAux
code: /-- The definition for an impartial game, defined using Conway induction. -/
def ImpartialAux : PGame → Prop
  
goal: SetTheory.PGame → Prop

full_name: SetTheory.PGame.impartialAux_def
code: theorem impartialAux_def {G : PGame} :
    G.ImpartialAux ↔
      (G ≈ -G) ∧ (∀ i, ImpartialAux (G.moveLeft i)) ∧ ∀ j, ImpartialAux (G.moveRight j) 
goal: G.ImpartialAux ↔
  G ≈ -G ∧ (∀ (i : G.LeftMoves), (G.moveLeft i).ImpartialAux) ∧ ∀ (j : G.RightMoves), (G.moveRight j).ImpartialAux

full_name: SetTheory.PGame.Impartial.out
code: /-- A typeclass on impartial games. -/
class Impartial (G : PGame) : Prop where
  out : ImpartialAux G
goal: G.ImpartialAux

full_name: SetTheory.PGame.Impartial
code: /-- A typeclass on impartial games. -/
class Impartial (G : PGame) : Prop where
  out : ImpartialAux G
goal: Prop

full_name: SetTheory.PGame.impartial_iff_aux
code: theorem impartial_iff_aux {G : PGame} : G.Impartial ↔ G.ImpartialAux 
goal: G.Impartial ↔ G.ImpartialAux

full_name: SetTheory.PGame.impartial_def
code: theorem impartial_def {G : PGame} :
    G.Impartial ↔ (G ≈ -G) ∧ (∀ i, Impartial (G.moveLeft i)) ∧ ∀ j, Impartial (G.moveRight j) 
goal: G.Impartial ↔ G ≈ -G ∧ (∀ (i : G.LeftMoves), (G.moveLeft i).Impartial) ∧ ∀ (j : G.RightMoves), (G.moveRight j).Impartial

full_name: SetTheory.PGame.Impartial.impartial_zero
code: instance impartial_zero : Impartial 0 
goal: SetTheory.PGame.Impartial 0

full_name: SetTheory.PGame.Impartial.impartial_star
code: instance impartial_star : Impartial star 
goal: SetTheory.PGame.star.Impartial

full_name: SetTheory.PGame.Impartial.neg_equiv_self
code: theorem neg_equiv_self (G : PGame) [h : G.Impartial] : G ≈ -G 
goal: G ≈ -G

full_name: SetTheory.PGame.Impartial.mk'_neg_equiv_self
code: @[simp]
theorem mk'_neg_equiv_self (G : PGame) [G.Impartial] : -(⟦G⟧ : Quotient setoid) = ⟦G⟧ 
goal: -⟦G⟧ = ⟦G⟧

full_name: SetTheory.PGame.Impartial.moveLeft_impartial
code: instance moveLeft_impartial {G : PGame} [h : G.Impartial] (i : G.LeftMoves) :
    (G.moveLeft i).Impartial 
goal: (G.moveLeft i).Impartial

full_name: SetTheory.PGame.Impartial.moveRight_impartial
code: instance moveRight_impartial {G : PGame} [h : G.Impartial] (j : G.RightMoves) :
    (G.moveRight j).Impartial 
goal: (G.moveRight j).Impartial

full_name: SetTheory.PGame.Impartial.impartial_congr
code: theorem impartial_congr : ∀ {G H : PGame} (_ : G ≡r H) [G.Impartial], H.Impartial
  
goal: G.Relabelling H → ∀ [inst : G.Impartial], H.Impartial

full_name: SetTheory.PGame.Impartial.impartial_add
code: instance impartial_add : ∀ (G H : PGame) [G.Impartial] [H.Impartial], (G + H).Impartial
  
goal: (G + H).Impartial

full_name: SetTheory.PGame.Impartial.impartial_neg
code: instance impartial_neg : ∀ (G : PGame) [G.Impartial], (-G).Impartial
  
goal: (-G).Impartial

full_name: SetTheory.PGame.Impartial.nonpos
code: theorem nonpos : ¬0 < G 
goal: ¬0 < G

full_name: SetTheory.PGame.Impartial.nonneg
code: theorem nonneg : ¬G < 0 
goal: ¬G < 0

full_name: SetTheory.PGame.Impartial.equiv_or_fuzzy_zero
code: /-- In an impartial game, either the first player always wins, or the second player always wins. -/
theorem equiv_or_fuzzy_zero : (G ≈ 0) ∨ G ‖ 0 
goal: G ≈ 0 ∨ G.Fuzzy 0

full_name: SetTheory.PGame.Impartial.not_equiv_zero_iff
code: @[simp]
theorem not_equiv_zero_iff : ¬(G ≈ 0) ↔ G ‖ 0 
goal: ¬G ≈ 0 ↔ G.Fuzzy 0

full_name: SetTheory.PGame.Impartial.not_fuzzy_zero_iff
code: @[simp]
theorem not_fuzzy_zero_iff : ¬G ‖ 0 ↔ (G ≈ 0) 
goal: ¬G.Fuzzy 0 ↔ G ≈ 0

full_name: SetTheory.PGame.Impartial.add_self
code: theorem add_self : G + G ≈ 0 
goal: G + G ≈ 0

full_name: SetTheory.PGame.Impartial.mk'_add_self
code: @[simp]
theorem mk'_add_self : (⟦G⟧ : Quotient setoid) + ⟦G⟧ = 0 
goal: ⟦G⟧ + ⟦G⟧ = 0

full_name: SetTheory.PGame.Impartial.equiv_iff_add_equiv_zero
code: /-- This lemma doesn't require `H` to be impartial. -/
theorem equiv_iff_add_equiv_zero (H : PGame) : (H ≈ G) ↔ (H + G ≈ 0) 
goal: H ≈ G ↔ H + G ≈ 0

full_name: SetTheory.PGame.Impartial.equiv_iff_add_equiv_zero'
code: /-- This lemma doesn't require `H` to be impartial. -/
theorem equiv_iff_add_equiv_zero' (H : PGame) : (G ≈ H) ↔ (G + H ≈ 0) 
goal: G ≈ H ↔ G + H ≈ 0

full_name: SetTheory.PGame.Impartial.le_zero_iff
code: theorem le_zero_iff {G : PGame} [G.Impartial] : G ≤ 0 ↔ 0 ≤ G 
goal: G ≤ 0 ↔ 0 ≤ G

full_name: SetTheory.PGame.Impartial.lf_zero_iff
code: theorem lf_zero_iff {G : PGame} [G.Impartial] : G ⧏ 0 ↔ 0 ⧏ G 
goal: G.LF 0 ↔ SetTheory.PGame.LF 0 G

full_name: SetTheory.PGame.Impartial.equiv_zero_iff_le
code: theorem equiv_zero_iff_le : (G ≈ 0) ↔ G ≤ 0 
goal: G ≈ 0 ↔ G ≤ 0

full_name: SetTheory.PGame.Impartial.fuzzy_zero_iff_lf
code: theorem fuzzy_zero_iff_lf : G ‖ 0 ↔ G ⧏ 0 
goal: G.Fuzzy 0 ↔ G.LF 0

full_name: SetTheory.PGame.Impartial.equiv_zero_iff_ge
code: theorem equiv_zero_iff_ge : (G ≈ 0) ↔ 0 ≤ G 
goal: G ≈ 0 ↔ 0 ≤ G

full_name: SetTheory.PGame.Impartial.fuzzy_zero_iff_gf
code: theorem fuzzy_zero_iff_gf : G ‖ 0 ↔ 0 ⧏ G 
goal: G.Fuzzy 0 ↔ SetTheory.PGame.LF 0 G

full_name: SetTheory.PGame.Impartial.forall_leftMoves_fuzzy_iff_equiv_zero
code: theorem forall_leftMoves_fuzzy_iff_equiv_zero : (∀ i, G.moveLeft i ‖ 0) ↔ (G ≈ 0) 
goal: (∀ (i : G.LeftMoves), (G.moveLeft i).Fuzzy 0) ↔ G ≈ 0

full_name: SetTheory.PGame.Impartial.forall_rightMoves_fuzzy_iff_equiv_zero
code: theorem forall_rightMoves_fuzzy_iff_equiv_zero : (∀ j, G.moveRight j ‖ 0) ↔ (G ≈ 0) 
goal: (∀ (j : G.RightMoves), (G.moveRight j).Fuzzy 0) ↔ G ≈ 0

full_name: SetTheory.PGame.Impartial.exists_left_move_equiv_iff_fuzzy_zero
code: theorem exists_left_move_equiv_iff_fuzzy_zero : (∃ i, G.moveLeft i ≈ 0) ↔ G ‖ 0 
goal: (∃ i, G.moveLeft i ≈ 0) ↔ G.Fuzzy 0

full_name: SetTheory.PGame.Impartial.exists_right_move_equiv_iff_fuzzy_zero
code: theorem exists_right_move_equiv_iff_fuzzy_zero : (∃ j, G.moveRight j ≈ 0) ↔ G ‖ 0 
goal: (∃ j, G.moveRight j ≈ 0) ↔ G.Fuzzy 0