NIM paper · interactive edition Interactive edition · paper, explanations and Lean proofs.

Proposition 5.10One fixed structured head reveals only known affine functions of one linear functional of σ(P)

Checked theorem Lean checks a formal statement corresponding to this claim.

1 Paper text

Proposition 5.10 (Single-policy information bound) Fix jj and the rollout policy πj\pi_j from the proof outline of Proposition 5.9. For any position PP, the rollout outcome ROπj(P)\mathrm{RO}_{\pi_j}(P) is a fixed linear functional ℓj(σ(P))\ell_j(\sigma(P)) of the nim-sum bits (indeed, ℓ0(σ)=σ0\ell_0(\sigma)=\sigma_0 and ℓj(σ)=σj⊕σ0\ell_j(\sigma)=\sigma_j\oplus\sigma_0 for j≥1j\ge 1). Moreover, if PiP_i is obtained from PP by modifying one heap (as when evaluating candidate moves), then ROπj(Pi)=ℓj(σ(P))⊕ci,\mathrm{RO}_{\pi_j}(P_i)=\ell_j(\sigma(P))\oplus c_i, where the correction bit cic_i is computable from the known heap values and the chosen modification. Hence root and one-heap-modification queries to this fixed head reveal only known affine functions of ℓj(σ(P))\ell_j(\sigma(P)).

Generated from paper_jmlr.tex, lines 753–763.

2 Explain this

With a single fixed head, every allowed query returns the same unknown bit up to a known correction. At the root, the outcome is ℓj(σ)\ell_j(\sigma). If one heap changes from hh to h′h' (for example when evaluating a candidate move), the nim-sum changes by h⊕h′h\oplus h', and by linearity the outcome becomes ℓj(σ)⊕ℓj(h⊕h′)\ell_j(\sigma)\oplus\ell_j(h\oplus h'), where the correction is computable from the known heap values.

So one channel yields one unknown bit of the BB-bit invariant, however often it is queried in this way.

Caveat: this concerns one member of the structured family, not arbitrary rollout policies.

3 How this is formalised

  • Prob.rollout_outcome_linear: the executed outcome of πj\pi_j equals ⟨wj,σ(P)⟩\langle w_j,\sigma(P)\rangle.
  • Prob.single_policy_affine: if P′P' differs from PP in one heap h→h′h\to h', then ROπj(P′)=ROπj(P)⊕⟨wj,h⊕h′⟩\mathrm{RO}_{\pi_j}(P') = \mathrm{RO}_{\pi_j}(P)\oplus\langle w_j, h\oplus h'\rangle.
  • Misc.single_policy_correction: the same with the channel function.
Coverage record
Paper anchorprop:single-policy-bound (manuscript label)
Displayed asProposition 5.10
ClaimOne fixed structured head reveals only known affine functions of one linear functional of σ(P)
Coverage categoryChecked theorem
Statement sourcepaper_jmlr.tex lines 753–763; SHA-256 of the normalised block source 587bf4faeead2458…
Lean declarations
Assumptions and domain

The head is one fixed member πj\pi_j of the structured family; queries are the root and boards differing from it in one known heap.

Audited correspondence rowsprop:single-policy-bound
Explanationsexplain/prop:single-policy-bound, formal/prop:single-policy-bound
Build evidencefresh isolated rebuild, audit report

4 Lean statement and source

Principal declarations

theorem Prob.rollout_outcome_linear

Module NimProbability (lean/phase2/NimProbability.lean, lines 920–923) · file SHA-256 1d5d7977a43e854d… Axioms reported by the fresh build: propext, Quot.sound

RO_{pi_j}(P), the executed rollout outcome, is the linear functional <w_j, sigma(P)>.

Statement as elaborated and printed by Lean 4.26.0

∀ {B j : ℕ},
  j < B →
    ∀ (P : List ℕ),
      NimAudit.Game.rolloutWinner j P =
        NimAudit.Prob.dotB B (NimAudit.Prob.headVec j) (NimAudit.nimSum P)
Exact source text, lines 920–923
920/-- RO_{pi_j}(P), the executed rollout outcome, is the linear functional <w_j, sigma(P)>. -/921theorem rollout_outcome_linear {B j : Nat} (hj : j < B) (P : List Nat) :922    rolloutWinner j P = dotB B (headVec j) (nimSum P) := by923  rw [rolloutWinner_channel, head_linear hj]

Project declarations in the statement: Game.rolloutWinner, Prob.dotB, Prob.headVec, nimSum

Project declarations used by the proof or definition body

Game.rolloutWinner, Game.rolloutWinner_channel, Prob.dotB, Prob.headVec, Prob.head_linear, channel, nimSum

theorem Prob.single_policy_affine

Module NimProbability (lean/phase2/NimProbability.lean, lines 925–931) · file SHA-256 1d5d7977a43e854d… Axioms reported by the fresh build: propext, Quot.sound

SINGLE-POLICY INFORMATION BOUND (paper Prop. single-policy-bound): if P' differs from P in one heap h -> h', then RO_{pi_j}(P') = RO_{pi_j}(P) XOR <w_j, h XOR h'>, a correction bit computable from the known heap values.

Statement as elaborated and printed by Lean 4.26.0

∀ {B j : ℕ},
  j < B →
    ∀ (pre post : List ℕ) (h h' : ℕ),
      NimAudit.Game.rolloutWinner j (pre ++ h' :: post) =
        (NimAudit.Game.rolloutWinner j (pre ++ h :: post) ^^
          NimAudit.Prob.dotB B (NimAudit.Prob.headVec j) (h ^^^ h'))
Exact source text, lines 925–931
925/-- SINGLE-POLICY INFORMATION BOUND (paper Prop. single-policy-bound): if P' differs926    from P in one heap h -> h', then RO_{pi_j}(P') = RO_{pi_j}(P) XOR <w_j, h XOR h'>,927    a correction bit computable from the known heap values. -/928theorem single_policy_affine {B j : Nat} (hj : j < B) (pre post : List Nat) (h h' : Nat) :929    rolloutWinner j (pre ++ h' :: post) =930      xor (rolloutWinner j (pre ++ h :: post)) (dotB B (headVec j) (h ^^^ h')) := by931  rw [rollout_outcome_linear hj, rollout_outcome_linear hj, nimSum_move, dotB_xor_right]

Project declarations in the statement: Game.rolloutWinner, Prob.dotB, Prob.headVec

Project declarations used by the proof or definition body

Game.nimSum_move, Game.rolloutWinner, Prob.dotB, Prob.dotB_xor_right, Prob.headVec, Prob.rollout_outcome_linear, nimSum

theorem Misc.single_policy_correction

Module Misc (lean/phase6/Misc.lean, lines 718–720) · file SHA-256 07766c03566dbfca… Axioms reported by the fresh build: propext, Quot.sound

Statement as elaborated and printed by Lean 4.26.0

∀ (j : ℕ) (pre post : List ℕ) (h h' : ℕ),
  NimAudit.Game.rolloutWinner j (pre ++ h' :: post) =
    (NimAudit.Game.rolloutWinner j (pre ++ h :: post) ^^ NimAudit.channel j (h ^^^ h'))
Exact source text, lines 718–720
718theorem single_policy_correction (j : Nat) (pre post : List Nat) (h h' : Nat) :719    rolloutWinner j (pre ++ h' :: post) = xor (rolloutWinner j (pre ++ h :: post)) (channel j (h ^^^ h')) := by720  rw [rolloutWinner_channel, rolloutWinner_channel, one_heap_update pre post h h', Nat.xor_assoc, channel_xor]

Project declarations in the statement: Game.rolloutWinner, channel

Project declarations used by the proof or definition body

Game.rolloutWinner, Game.rolloutWinner_channel, channel, channel_xor, nimSum, one_heap_update

Definitions these statements use

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 Prob.dotB

Module NimProbability (lean/phase2/NimProbability.lean, lines 259–262) · file SHA-256 1d5d7977a43e854d…

The F_2 inner product of the first B bits of u and v.

Statement as elaborated and printed by Lean 4.26.0

ℕ → ℕ → ℕ → Bool
Exact source text, lines 259–262
259/-- The F_2 inner product of the first B bits of u and v. -/260def dotB : Nat → Nat → Nat → Bool261  | 0, _, _ => false262  | B + 1, u, v => xor (dotB B u v) (u.testBit B && v.testBit B)

Project declarations in the statement: none

Project declarations used by the proof or definition body

none

def Prob.headVec

Module NimProbability (lean/phase2/NimProbability.lean, lines 875–876) · file SHA-256 1d5d7977a43e854d…

The vector w_j with RO_{pi_j}(P) = <w_j, sigma(P)>: w_0 = 1, w_j = 2^j XOR 1.

Statement as elaborated and printed by Lean 4.26.0

ℕ → ℕ
Exact source text, lines 875–876
875/-- The vector w_j with RO_{pi_j}(P) = <w_j, sigma(P)>: w_0 = 1, w_j = 2^j XOR 1. -/876def headVec (j : Nat) : Nat := if j = 0 then 1 else 2 ^ j ^^^ 1

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 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

Full modules

ModuleFileLinesImports
Misclean/phase6/Misc.lean912Bypass
NimCorelean/NimCore.lean139Std
NimGamelean/phase2/NimGame.lean634NimRollout
NimProbabilitylean/phase2/NimProbability.lean1074NimGame

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).