Principal declarations
theorem Game.rolloutWinner_channel
Module NimGame
(lean/phase2/NimGame.lean, lines 171–176) · file SHA-256 23df6bb87ecfd344… Axioms reported by the fresh build: propext, Quot.sound
RO_{pi_0}(P) = sigma_0 and RO_{pi_j}(P) = sigma_j XOR sigma_0 (j ≥ 1), proved for
the executed rollout.
Statement as elaborated and printed by Lean 4.26.0
∀ (j : ℕ) (p : List ℕ), NimAudit.Game.rolloutWinner j p = NimAudit.channel j (NimAudit.nimSum p)
Exact source text, lines 171–176
171/-- RO_{pi_0}(P) = sigma_0 and RO_{pi_j}(P) = sigma_j XOR sigma_0 (j ≥ 1), proved for172 the executed rollout. -/173theorem rolloutWinner_channel (j : Nat) (p : List Nat) :174 rolloutWinner j p = channel j (nimSum p) := by175 rw [rolloutWinner_eq]176 exact rolloutMoves_parity j p
Project declarations in the statement: Game.rolloutWinner, channel, nimSum
Project declarations used by the proof or definition body
Game.rolloutWinner, Game.rolloutWinner_eq, Rollout.rolloutMoves, Rollout.rolloutMoves_parity, channel, nimSum
theorem Game.agent_wins
Module NimGame
(lean/phase2/NimGame.lean, lines 376–388) · file SHA-256 23df6bb87ecfd344… Axioms reported by the fresh build: propext, Quot.sound
END-TO-END STRATEGY GUARANTEE (Target 1C): on B-bit boards, the agent that
queries the B structured rollouts, reconstructs the nim-sum and plays the
selected move wins from every nonzero-nim-sum position against every legal
opponent.
Statement as elaborated and printed by Lean 4.26.0
∀ {B : ℕ} (p : List ℕ),
NimAudit.Game.Width B p → NimAudit.nimSum p ≠ 0 → NimAudit.Game.Wins (NimAudit.Game.agent B) p
Exact source text, lines 376–388
376/-- END-TO-END STRATEGY GUARANTEE (Target 1C): on B-bit boards, the agent that377 queries the B structured rollouts, reconstructs the nim-sum and plays the378 selected move wins from every nonzero-nim-sum position against every legal379 opponent. -/380theorem agent_wins {B : Nat} (p : List Nat) (hw : Width B p) (h : nimSum p ≠ 0) :381 Wins (agent B) p := by382 obtain ⟨q, hsel, hm, hq⟩ := selectMove_zero h383 refine Wins.intro p q (by rw [agent_eq hw]; exact hsel) hm ?_384 intro r hr385 have h1 := move_sum_lt hm386 have h2 := move_sum_lt hr387 exact agent_wins r (width_move (width_move hw hm) hr) (move_from_zero hr hq)388termination_by p.sum
Project declarations in the statement: Game.Width, Game.Wins, Game.agent, nimSum
Project declarations used by the proof or definition body
Game.Move, Game.Width, Game.Wins, Game.Wins.intro, Game.agent, Game.agent_eq, Game.move_from_zero, Game.move_sum_lt, Game.selectMove, Game.selectMove_zero, Game.width_move, nimSum
theorem RolloutExec.mhExec_wins
Module RolloutExec
(lean/phase6/RolloutExec.lean, lines 517–520) · file SHA-256 c7b63a6e02d1d425… Axioms reported by the fresh build: propext, Classical.choice, Quot.sound
WHOLE-GAME THEOREM FOR THE FULLY EXECUTED MULTI-HEAD PLAYER: from every nonzero board
of width B it wins against every legal opponent; no outcome bit is supplied for free.
Statement as elaborated and printed by Lean 4.26.0
∀ {B : ℕ} {P : List ℕ},
NimAudit.Game.Width B P →
NimAudit.nimSum P ≠ 0 → NimAudit.Game.Wins (NimAudit.RolloutExec.mhExecSel B) P
Exact source text, lines 517–520
517/-- WHOLE-GAME THEOREM FOR THE FULLY EXECUTED MULTI-HEAD PLAYER: from every nonzero board518 of width B it wins against every legal opponent; no outcome bit is supplied for free. -/519theorem mhExec_wins {B : Nat} {P : List Nat} (hw : Width B P) (h : nimSum P ≠ 0) : Wins (mhExecSel B) P :=520 wins_congr (fun Q hQ => mhExecSel_eq hQ) hw (ctrl_wins P h)
Project declarations in the statement: Game.Width, Game.Wins, RolloutExec.mhExecSel, nimSum
Project declarations used by the proof or definition body
Controller.ctrlSel, Controller.ctrl_wins, Game.Width, RolloutExec.mhExecSel, RolloutExec.mhExecSel_eq, WholeGame.wins_congr, nimSum
theorem RolloutExec.mhExec_evals
Module RolloutExec
(lean/phase6/RolloutExec.lean, lines 522–547) · file SHA-256 c7b63a6e02d1d425… Axioms reported by the fresh build: propext, Classical.choice, Quot.sound
EVALUATION ACCOUNTING for one multi-head decision: rollout j makes L_j + 1 policy
evaluations; together Σ_j (L_j + 1) = (total simulated moves) + B ≤ B·(N(2^B−1)+1);
in addition there are B reset steps (one per rollout) and ONE readout evaluation.
Statement as elaborated and printed by Lean 4.26.0
∀ {B : ℕ} {P : List ℕ},
NimAudit.Game.Width B P →
(∀ (j : ℕ), NimAudit.RolloutExec.polEvals B j P = NimAudit.Rollout.rolloutMoves j P + 1) ∧
(List.map (fun j => NimAudit.RolloutExec.polEvals B j P) (List.range B)).sum =
NimAudit.Game.totalRolloutMoves B P + B ∧
NimAudit.Game.totalRolloutMoves B P + B ≤ B * NimAudit.RolloutExec.clockBound B P.length
Exact source text, lines 522–547
522/-- EVALUATION ACCOUNTING for one multi-head decision: rollout j makes L_j + 1 policy523 evaluations; together Σ_j (L_j + 1) = (total simulated moves) + B ≤ B·(N(2^B−1)+1);524 in addition there are B reset steps (one per rollout) and ONE readout evaluation. -/525theorem mhExec_evals {B : Nat} {P : List Nat} (hw : Width B P) :526 (∀ j, polEvals B j P = rolloutMoves j P + 1) ∧527 ((List.range B).map (fun j => polEvals B j P)).sum = totalRolloutMoves B P + B ∧528 totalRolloutMoves B P + B ≤ B * clockBound B P.length := by529 have he : ∀ j, polEvals B j P = rolloutMoves j P + 1 := fun j => (execRollN_spec _ hw).2.2530 refine ⟨he, ?_, ?_⟩531 · unfold totalRolloutMoves532 rw [List.map_congr_left (fun j _ => he j)]533 induction B with534 | zero => simp535 | succ k ih =>536 rw [List.range_succ, List.map_append, List.map_append, List.sum_append_nat, List.sum_append_nat]537 simp only [List.map_cons, List.map_nil, List.sum_cons, List.sum_nil]538 have : ((List.range k).map (fun j => rolloutMoves j P + 1)).sum = ((List.range k).map (fun j => rolloutMoves j P)).sum + k := by539 clear ih he hw540 induction k with541 | zero => simp542 | succ k ih2 =>543 rw [List.range_succ, List.map_append, List.map_append, List.sum_append_nat, List.sum_append_nat, ih2]544 simp; omega545 omega546 · have := totalRolloutMoves_le hw547 unfold clockBound; rw [Nat.mul_add, Nat.mul_one]; omega
Project declarations in the statement: Game.Width, Game.totalRolloutMoves, Rollout.rolloutMoves, RolloutExec.clockBound, RolloutExec.polEvals
Project declarations used by the proof or definition body
Game.Width, Game.rolloutWinner, Game.totalRolloutMoves, Game.totalRolloutMoves_le, Rollout.rolloutMoves, RolloutExec.clockBound, RolloutExec.execRollN, RolloutExec.execRollN_spec, RolloutExec.polEvals
theorem Game.totalRolloutMoves_le
Module NimGame
(lean/phase2/NimGame.lean, lines 454–467) · file SHA-256 23df6bb87ecfd344… Axioms reported by the fresh build: propext, Quot.sound
Statement as elaborated and printed by Lean 4.26.0
∀ {B : ℕ} {p : List ℕ},
NimAudit.Game.Width B p → NimAudit.Game.totalRolloutMoves B p ≤ B * (p.length * (2 ^ B - 1))
Exact source text, lines 454–467
454theorem totalRolloutMoves_le {B : Nat} {p : List Nat} (hw : Width B p) :455 totalRolloutMoves B p ≤ B * (p.length * (2 ^ B - 1)) := by456 unfold totalRolloutMoves457 have key : ∀ k, ((List.range k).map (fun j => rolloutMoves j p)).sum ≤458 k * (p.length * (2 ^ B - 1)) := by459 intro k460 induction k with461 | zero => simp462 | succ k ih =>463 rw [List.range_succ, List.map_append, List.sum_append_nat, Nat.succ_mul]464 simp only [List.map_cons, List.map_nil, List.sum_cons, List.sum_nil, Nat.add_zero]465 have := rolloutMoves_le (j := k) hw466 omega467 exact key B
Project declarations in the statement: Game.Width, Game.totalRolloutMoves
Project declarations used by the proof or definition body
Game.Width, Game.rolloutMoves_le, Game.totalRolloutMoves, Rollout.rolloutMoves
theorem Rollout.run_length
Module NimRollout
(lean/NimRollout.lean, lines 88–94) · file SHA-256 1a99428d71573d31… Axioms reported by the fresh build: propext, Quot.sound
EXECUTION COUNT: every complete run of `pi_j`, under any tie-breaking rule,
has exactly `sum_h (h / 2^j + h % 2^j)` moves.
Statement as elaborated and printed by Lean 4.26.0
∀ {j : ℕ} {p : List ℕ} {n : ℕ}, NimAudit.Rollout.Run j p n → n = NimAudit.rolloutCount j p
Exact source text, lines 88–94
88/-- EXECUTION COUNT: every complete run of `pi_j`, under any tie-breaking rule,89 has exactly `sum_h (h / 2^j + h % 2^j)` moves. -/90theorem run_length {j : Nat} {p : List Nat} {n : Nat} (hr : Run j p n) :91 n = rolloutCount j p := by92 induction hr with93 | done p hz => exact (rolloutCount_zero hz).symm94 | step p q n hm _ ih => rw [ih, policyMove_count hm]
Project declarations in the statement: Rollout.Run, rolloutCount
Project declarations used by the proof or definition body
Rollout.PolicyMove, Rollout.Run, Rollout.Run.rec, Rollout.policyMove_count, Rollout.rolloutCount_zero, rolloutCount
theorem Mastery.mh_strong
Module WeakMastery
(lean/phase8/WeakMastery.lean, lines 845–852) · file SHA-256 4c83e573f527989c… Axioms reported by the fresh build: propext, Classical.choice, Quot.sound
The multi-head player is in fact STRONGLY masterful on B-bit families, for both roles.
Statement as elaborated and printed by Lean 4.26.0
∀ (B : ℕ) (r : NimAudit.Mastery.Role),
NimAudit.Mastery.StrongMastery (fun P => NimAudit.Game.Width B P) r
(NimAudit.Mastery.ofSel (NimAudit.WholeGame.mhSelect B))
Exact source text, lines 845–852
845/-- The multi-head player is in fact STRONGLY masterful on B-bit families, for both roles. -/846theorem mh_strong (B : Nat) (r : Role) : StrongMastery (fun P => Width B P) r (ofSel (mhSelect B)) := by847 intro P0 hw h hl _ hnz848 have hwh : Width B (cur h) := legal_width hl hw849 obtain ⟨i, v, hd, hz⟩ := (Controller.decision_correct (cur h)).2.2 hnz850 obtain ⟨x, _, _, hmv⟩ := (Controller.decision_correct (cur h)).2.1 i v hd851 refine ⟨(cur h).set i v, ?_, hmv, hz⟩852 unfold ofSel; rw [mhSelect_eq hwh]; simp [Controller.ctrlSel, hd]
Project declarations in the statement: Game.Width, Mastery.Role, Mastery.StrongMastery, Mastery.ofSel, WholeGame.mhSelect
Project declarations used by the proof or definition body
Controller.ctrlSel, Controller.decisionMove, Controller.decision_correct, Game.Move, Game.Terminal, Game.Width, Mastery.Hist, Mastery.Legal, Mastery.Role, Mastery.cur, Mastery.legal_width, Mastery.mover, Mastery.ofSel, WholeGame.mhSelect, WholeGame.mhSelect_eq, nimSum
Definitions these statements use
def Game.agent
Module NimGame
(lean/phase2/NimGame.lean, lines 257–259) · file SHA-256 23df6bb87ecfd344…
The agent: reconstruct the nim-sum from the B root rollouts, then select.
Statement as elaborated and printed by Lean 4.26.0
ℕ → List ℕ → Option (List ℕ)
Exact source text, lines 257–259
257/-- The agent: reconstruct the nim-sum from the B root rollouts, then select. -/258def agent (B : Nat) (p : List Nat) : Option (List Nat) :=259 selectMove (reconstruct B (outcomes p)) p
Project declarations in the statement: none
Project declarations used by the proof or definition body
Game.outcomes, Game.reconstruct, Game.selectMove
def Game.reconstruct
Module NimGame
(lean/phase2/NimGame.lean, lines 211–212) · file SHA-256 23df6bb87ecfd344…
The nim-sum reconstructed from the B rollout outcomes o 0, ..., o (B-1).
Statement as elaborated and printed by Lean 4.26.0
ℕ → (ℕ → Bool) → ℕ
Exact source text, lines 211–212
211/-- The nim-sum reconstructed from the B rollout outcomes o 0, ..., o (B-1). -/212def reconstruct (B : Nat) (o : Nat → Bool) : Nat := ofBits B (recoverBit o)
Project declarations in the statement: none
Project declarations used by the proof or definition body
Game.ofBits, Game.recoverBit
def Game.rolloutWinner
Module NimGame
(lean/phase2/NimGame.lean, lines 142–152) · file SHA-256 23df6bb87ecfd344…
Rollout outcome RO_{pi_j}(P) as a game: both players follow pi_j; the result is
`true` iff the player to move at P (the first player) wins under normal play.
At a terminal start it is `false`.
Statement as elaborated and printed by Lean 4.26.0
ℕ → List ℕ → Bool
Exact source text, lines 142–152
142/-- Rollout outcome RO_{pi_j}(P) as a game: both players follow pi_j; the result is143 `true` iff the player to move at P (the first player) wins under normal play.144 At a terminal start it is `false`. -/145def rolloutWinner (j : Nat) (p : List Nat) : Bool :=146 match h : policyStep j p with147 | none => false148 | some q => !rolloutWinner j q149termination_by rolloutCount j p150decreasing_by151 have := policyMove_count (policyStep_some h)152 omega
Project declarations in the statement: none
Project declarations used by the proof or definition body
Rollout.policyMove_count, Rollout.policyStep, Rollout.policyStep_some, rolloutCount
def channel
Module NimCore
(lean/NimCore.lean, lines 77–78) · file SHA-256 b07db6c505210d5a…
Statement as elaborated and printed by Lean 4.26.0
ℕ → ℕ → Bool
Exact source text, lines 77–78
77def channel (j sigma : Nat) : Bool :=78 if j = 0 then sigma.testBit 0 else xor (sigma.testBit j) (sigma.testBit 0)
Project declarations in the statement: none
Project declarations used by the proof or definition body
none
def nimSum
Module NimCore
(lean/NimCore.lean, lines 7–9) · file SHA-256 b07db6c505210d5a…
Statement as elaborated and printed by Lean 4.26.0
List ℕ → ℕ
Exact source text, lines 7–9
7def nimSum : List Nat → Nat8 | [] => 09 | h :: t => h ^^^ nimSum t
Project declarations in the statement: none
Project declarations used by the proof or definition body
none
def Game.Width
Module NimGame
(lean/phase2/NimGame.lean, lines 31–32) · file SHA-256 23df6bb87ecfd344…
B-bit board: every heap is below 2^B.
Statement as elaborated and printed by Lean 4.26.0
ℕ → List ℕ → Prop
Exact source text, lines 31–32
31/-- B-bit board: every heap is below 2^B. -/32def Width (B : Nat) (p : List Nat) : Prop := ∀ x ∈ p, x < 2 ^ B
Project declarations in the statement: none
Project declarations used by the proof or definition body
none
inductive Game.Wins
Module NimGame
(lean/phase2/NimGame.lean, lines 125–132) · file SHA-256 23df6bb87ecfd344…
`Wins sel p`: the player to move at `p`, always playing the successor chosen by
`sel`, wins against EVERY legal opponent. The selected move is legal, and after
every legal opponent reply the player is again in a `Wins` position. Because
the predicate is inductive, every such play is finite and ends with the
opponent facing a terminal board (normal play: the opponent loses).
Statement as elaborated and printed by Lean 4.26.0
(List ℕ → Option (List ℕ)) → List ℕ → Prop
Exact source text, lines 125–132
125/-- `Wins sel p`: the player to move at `p`, always playing the successor chosen by126 `sel`, wins against EVERY legal opponent. The selected move is legal, and after127 every legal opponent reply the player is again in a `Wins` position. Because128 the predicate is inductive, every such play is finite and ends with the129 opponent facing a terminal board (normal play: the opponent loses). -/130inductive Wins (sel : List Nat → Option (List Nat)) : List Nat → Prop131 | intro (p q : List Nat) : sel p = some q → Move p q →132 (∀ r, Move q r → Wins sel r) → Wins sel p
Project declarations in the statement: none
Project declarations used by the proof or definition body
Game.Move
def RolloutExec.mhExecSel
Module RolloutExec
(lean/phase6/RolloutExec.lean, lines 501–501) · file SHA-256 c7b63a6e02d1d425…
Statement as elaborated and printed by Lean 4.26.0
ℕ → List ℕ → Option (List ℕ)
Exact source text, lines 501–501
501def mhExecSel (B : Nat) (P : List Nat) : Option (List Nat) := applyM P (mhExec B P)
Project declarations in the statement: none
Project declarations used by the proof or definition body
RolloutExec.mhExec, SelectCircuit.applyM
def Game.totalRolloutMoves
Module NimGame
(lean/phase2/NimGame.lean, lines 450–452) · file SHA-256 23df6bb87ecfd344…
Total simulated moves of the B root rollouts.
Statement as elaborated and printed by Lean 4.26.0
ℕ → List ℕ → ℕ
Exact source text, lines 450–452
450/-- Total simulated moves of the B root rollouts. -/451def totalRolloutMoves (B : Nat) (p : List Nat) : Nat :=452 ((List.range B).map (fun j => rolloutMoves j p)).sum
Project declarations in the statement: none
Project declarations used by the proof or definition body
Rollout.rolloutMoves
def Rollout.rolloutMoves
Module NimRollout
(lean/NimRollout.lean, lines 205–214) · file SHA-256 1a99428d71573d31…
The simulator: apply `policyStep` until no move is available, counting moves.
Termination is justified by `policyMove_count`.
Statement as elaborated and printed by Lean 4.26.0
ℕ → List ℕ → ℕ
Exact source text, lines 205–214
205/-- The simulator: apply `policyStep` until no move is available, counting moves.206 Termination is justified by `policyMove_count`. -/207def rolloutMoves (j : Nat) (p : List Nat) : Nat :=208 match h : policyStep j p with209 | none => 0210 | some q => rolloutMoves j q + 1211termination_by rolloutCount j p212decreasing_by213 have := policyMove_count (policyStep_some h)214 omega
Project declarations in the statement: none
Project declarations used by the proof or definition body
Rollout.policyMove_count, Rollout.policyStep, Rollout.policyStep_some, rolloutCount
def RolloutExec.clockBound
Module RolloutExec
(lean/phase6/RolloutExec.lean, lines 97–98) · file SHA-256 c7b63a6e02d1d425…
The fixed clock bound (a function of B and N only).
Statement as elaborated and printed by Lean 4.26.0
ℕ → ℕ → ℕ
Exact source text, lines 97–98
97/-- The fixed clock bound (a function of B and N only). -/98def clockBound (B N : Nat) : Nat := N * (2 ^ B - 1) + 1
Project declarations in the statement: none
Project declarations used by the proof or definition body
none
def RolloutExec.polEvals
Module RolloutExec
(lean/phase6/RolloutExec.lean, lines 492–493) · file SHA-256 c7b63a6e02d1d425…
Policy-network evaluations used by rollout j (clocked steps of the executor).
Statement as elaborated and printed by Lean 4.26.0
ℕ → ℕ → List ℕ → ℕ
Exact source text, lines 492–493
492/-- Policy-network evaluations used by rollout j (clocked steps of the executor). -/493def polEvals (B j : Nat) (P : List Nat) : Nat := (execRollN B j (fun _ => false) P).2
Project declarations in the statement: none
Project declarations used by the proof or definition body
RolloutExec.execRollN
inductive Rollout.Run
Module NimRollout
(lean/NimRollout.lean, lines 34–38) · file SHA-256 1a99428d71573d31…
`Run j p n`: following `pi_j` from board `p` reaches the all-zero board after
exactly `n` policy moves.
Statement as elaborated and printed by Lean 4.26.0
ℕ → List ℕ → ℕ → Prop
Exact source text, lines 34–38
34/-- `Run j p n`: following `pi_j` from board `p` reaches the all-zero board after35 exactly `n` policy moves. -/36inductive Run (j : Nat) : List Nat → Nat → Prop37 | done (p : List Nat) : (∀ x ∈ p, x = 0) → Run j p 038 | step (p q : List Nat) (n : Nat) : PolicyMove j p q → Run j q n → Run j p (n + 1)
Project declarations in the statement: none
Project declarations used by the proof or definition body
Rollout.PolicyMove
def rolloutCount
Module NimCore
(lean/NimCore.lean, lines 82–82) · file SHA-256 b07db6c505210d5a…
Statement as elaborated and printed by Lean 4.26.0
ℕ → List ℕ → ℕ
Exact source text, lines 82–82
82def rolloutCount (j : Nat) (rows : List Nat) : Nat := (rows.map (heapCount j)).sum
Project declarations in the statement: none
Project declarations used by the proof or definition body
heapCount
inductive Mastery.Role
Module WeakMastery
(lean/phase8/WeakMastery.lean, lines 37–40) · file SHA-256 4c83e573f527989c…
Statement as elaborated and printed by Lean 4.26.0
Type
Exact source text, lines 37–40
37inductive Role where38 | first39 | second40 deriving DecidableEq
Project declarations in the statement: none
Project declarations used by the proof or definition body
none
def Mastery.StrongMastery
Module WeakMastery
(lean/phase8/WeakMastery.lean, lines 812–817) · file SHA-256 4c83e573f527989c…
Strong mastery (Definition def:mastery, first clause) relative to F and r: at EVERY
legal history (arbitrary actions by both players) with the agent to move at an
N-position, σ plays a move to a P-position.
Statement as elaborated and printed by Lean 4.26.0
(List ℕ → Prop) → NimAudit.Mastery.Role → NimAudit.Mastery.Strat → Prop
Exact source text, lines 812–817
812/-- Strong mastery (Definition def:mastery, first clause) relative to F and r: at EVERY813 legal history (arbitrary actions by both players) with the agent to move at an814 N-position, σ plays a move to a P-position. -/815def StrongMastery (F : List Nat → Prop) (r : Role) (σ : Strat) : Prop :=816 ∀ P0, F P0 → ∀ h, Legal P0 h → mover h = r → nimSum (cur h) ≠ 0 →817 ∃ Q, σ h = some Q ∧ Move (cur h) Q ∧ nimSum Q = 0
Project declarations in the statement: Mastery.Role, Mastery.Strat
Project declarations used by the proof or definition body
Game.Move, Mastery.Hist, Mastery.Legal, Mastery.Role, Mastery.Strat, Mastery.cur, Mastery.mover, nimSum
def Mastery.ofSel
Module WeakMastery
(lean/phase8/WeakMastery.lean, lines 498–499) · file SHA-256 4c83e573f527989c…
The memoryless strategy defined by a board selector.
Statement as elaborated and printed by Lean 4.26.0
(List ℕ → Option (List ℕ)) → NimAudit.Mastery.Strat
Exact source text, lines 498–499
498/-- The memoryless strategy defined by a board selector. -/499def ofSel (sel : List Nat → Option (List Nat)) : Strat := fun h => sel (cur h)
Project declarations in the statement: Mastery.Strat
Project declarations used by the proof or definition body
Mastery.Hist, Mastery.cur
def WholeGame.mhSelect
Module WholeGame
(lean/phase5/WholeGame.lean, lines 159–163) · file SHA-256 809a74ad589db609…
The multi-head player: run the B network rollouts, feed their outcomes and the board
to the compiled multi-head network, decode its output wires and apply the move.
Statement as elaborated and printed by Lean 4.26.0
ℕ → List ℕ → Option (List ℕ)
Exact source text, lines 159–163
159/-- The multi-head player: run the B network rollouts, feed their outcomes and the board160 to the compiled multi-head network, decode its output wires and apply the move. -/161def mhSelect (B : Nat) (P : List Nat) : Option (List Nat) :=162 applyM P (netBinSem (mhNet B P.length (rIdx P.length)) P.length (rIdx P.length) B163 (obsIn B P.length P (fun j => rollOut B j P)))
Project declarations in the statement: none
Project declarations used by the proof or definition body
SelectCircuit.applyM, SelectCircuit.obsIn, ThresholdInst.mhNet, ThresholdInst.netBinSem, WholeGame.rIdx, WholeGame.rollOut
Full modules
Build evidence: fresh isolated rebuild of all 38 bundled modules with Lean (version 4.26.0, started 2026-10-10T15:21:56Z, finished 2026-10-10T15:27:00Z: 38/38 modules compiled, 1588 axiom reports, no errors. See Build for the commands and the independent audit of 2026-10-10 (dated evidence).