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

Example 1Pairing strategy: a constant-depth mirror selector wins as second player on paired boards

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

1 Paper text

Example 1 (Pairing strategy) Consider positions (a,a,b,b,c,c,… )(a,a,b,b,c,c,\dots) consisting of pairs of equal heaps. The second player can mirror the first player’s move on the matching heap, maintaining the paired structure until termination, hence winning. The checked binary selector finds the first unequal pair and reduces its larger heap to match its partner. It has constant depth and polynomial size, and wins against every legal opponent from the paired family when playing second. For the first-player role every paired initial board is losing, so weak mastery there would be vacuous.

Generated from paper_jmlr.tex, lines 1562–1564.

2 Explain this

On boards made of equal pairs, (a,a,b,b,c,c,… )(a,a,b,b,c,c,\dots), the second player can copy every move on the partner heap. The pairing is restored after each reply, so the second player always has a move and makes the last one.

The checked selector finds the first unequal pair and reduces its larger heap to match its partner; it has constant depth and polynomial size and uses no nim-sum. For the first-player role every paired board is losing, so weak mastery there would be vacuous.

3 How this is formalised

  • Misc.pairing_wins: from every paired board (Misc.Paired) of width BB, the reply rule computed by the local binary mirror circuit wins as second player against every legal opponent.
  • Misc.pairR_correct: after a legal move from a paired board, the mirror circuit outputs the copying reply.
  • Misc.pairBin_bound: constant depth (at most 10) and polynomial size.
  • Mastery.pairing_net_weak: the compiled network's strategy is weakly masterful for the second player on the paired families, in the general history model.
  • Mastery.pairing_first_vacuous: for the first player the paired family is losing, so weak mastery there is vacuous.
Coverage record
Paper anchorx-example-pairing-strategy (website anchor; the manuscript has no label here)
Displayed asExample 1
ClaimPairing strategy: a constant-depth mirror selector wins as second player on paired boards
Coverage categoryChecked theorem
Statement sourcepaper_jmlr.tex lines 1562–1564; SHA-256 of the normalised block source ae050acb1c51530d…
Lean declarations
Audited correspondence rowsapp:weak
Explanationsexplain/x-example-pairing-strategy, formal/x-example-pairing-strategy
Build evidencefresh isolated rebuild, audit report

4 Lean statement and source

Principal declarations

theorem Misc.pairing_wins

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

PAIRING STRATEGY (weak mastery for the second player): from every paired board of width B, the reply rule computed by the local binary mirror circuit wins against every legal opponent.

Statement as elaborated and printed by Lean 4.26.0

∀ {B : ℕ} (P : List ℕ),
  NimAudit.Misc.Paired P →
    NimAudit.Game.Width B P → NimAudit.Misc.SecondWins (NimAudit.Misc.pairSel B) P
Exact source text, lines 209–230
209/-- PAIRING STRATEGY (weak mastery for the second player): from every paired board of210    width B, the reply rule computed by the local binary mirror circuit wins against every211    legal opponent. -/212theorem pairing_wins {B : Nat} : ∀ P : List Nat, Paired P → Width B P → SecondWins (pairSel B) P := by213  intro P214  induction P using (measure List.sum).wf.induction with215  | h P ih =>216    intro hp hw217    have key : ∀ Q, Move P Q → ∃ i y, pairSel B Q = some (Q.set (partner i) y) ∧218        Paired (Q.set (partner i) y) ∧ Move Q (Q.set (partner i) y) := by219      intro Q hm220      obtain ⟨i, y, _, hsel, hpair, hmv⟩ := pairR_correct hp hw hm221      refine ⟨i, y, ?_, hpair, hmv⟩222      unfold pairSel223      rw [pairBin, encode_correct _ Q.length _ (by simp [pairR]) (rIdx_width _), hsel]; rfl224    refine SecondWins.intro P (fun Q hm => ?_) (fun Q R hm hR => ?_) (fun Q R hm hR => ?_)225    · obtain ⟨i, y, h1, _⟩ := key Q hm; rw [h1]; rfl226    · obtain ⟨i, y, h1, _, h3⟩ := key Q hm; rw [h1] at hR; cases hR; exact h3227    · obtain ⟨i, y, h1, h2, h3⟩ := key Q hm228      rw [h1] at hR; cases hR229      have e1 := move_sum_lt hm; have e2 := move_sum_lt h3230      exact ih _ (by show (Q.set (partner i) y).sum < P.sum; omega) h2 (width_move (width_move hw hm) h3)

Project declarations in the statement: Game.Width, Misc.Paired, Misc.SecondWins, Misc.pairSel

Project declarations used by the proof or definition body

AC0.Circ, BinReadout.BCirc, CorrBridge.boardBits, Family.rIdx_width, Game.Move, Game.Width, Game.move_sum_lt, Game.width_move, Misc.Paired, Misc.SecondWins, Misc.SecondWins.intro, Misc.flagC, Misc.pairBin, Misc.pairR, Misc.pairR_correct, Misc.pairSel, Misc.partner, PriorityEncoder.binSem, PriorityEncoder.encode, PriorityEncoder.encode_correct, SelectCircuit.applyM, SelectCircuit.selReadout, WholeGame.rIdx

theorem Misc.pairR_correct

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

MIRROR CIRCUIT CORRECTNESS: after a legal move from a paired board, the selector outputs (partner of the changed heap, new value).

Statement as elaborated and printed by Lean 4.26.0

∀ {B : ℕ} {P Q : List ℕ},
  NimAudit.Misc.Paired P →
    NimAudit.Game.Width B P →
      NimAudit.Game.Move P Q →
        ∃ i y,
          Q = P.set i y ∧
            NimAudit.SelectCircuit.selReadout (NimAudit.Misc.pairR B Q.length)
                  (NimAudit.CorrBridge.boardBits B Q) =
                some (NimAudit.Misc.partner i, y) ∧
              NimAudit.Misc.Paired (Q.set (NimAudit.Misc.partner i) y) ∧
                NimAudit.Game.Move Q (Q.set (NimAudit.Misc.partner i) y)
Exact source text, lines 155–207
155/-- MIRROR CIRCUIT CORRECTNESS: after a legal move from a paired board, the selector156    outputs (partner of the changed heap, new value). -/157theorem pairR_correct {B : Nat} {P Q : List Nat} (hp : Paired P) (hw : Width B P) (hm : Move P Q) :158    ∃ i y, Q = P.set i y ∧ selReadout (pairR B Q.length) (boardBits B Q) = some (partner i, y) ∧159      Paired (Q.set (partner i) y) ∧ Move Q (Q.set (partner i) y) := by160  obtain ⟨i, y, hi, hQ, hy, hQl, hflag, hpair, hmv⟩ := paired_move hp hm161  refine ⟨i, y, hQ, ?_, hpair, hmv⟩162  have hN : Q.length % 2 = 0 := by rw [hQl]; exact hp.1163  have hwQ : Width B Q := width_move hw (by164    obtain ⟨pre, x, post, z, h1, h2, h3⟩ := hm; exact ⟨pre, x, post, z, h1, h2, h3⟩)165  have hj : partner i < Q.length := by rw [hQl]; exact partner_lt hi hp.1166  have hfl : ∀ k, k < Q.length → eval (boardBits B Q) (flagC B k) = decide (k = partner i) := by167    intro k hk; rw [flagC_eval rfl hwQ hN hk]; exact decide_eq_decide.mpr (hflag k hk)168  unfold selReadout pairR169  simp only170  have hvalid : eval (boardBits B Q) (or ((List.range Q.length).map (flagC B))) = true := by171    rw [eval_or, List.any_eq_true]172    exact ⟨flagC B (partner i), List.mem_map.mpr ⟨_, List.mem_range.mpr hj, rfl⟩, by rw [hfl _ hj]; simp⟩173  rw [if_pos hvalid]174  have hft : firstTrue (((List.range Q.length).map (flagC B)).map (eval (boardBits B Q))) = some (partner i) := by175    rw [firstTrue_some_iff]176    simp only [List.map_map, List.length_map, List.length_range]177    refine ⟨hj, ?_, fun i' hi' => ?_⟩178    · rw [List.getD_eq_getElem?_getD, List.getElem?_map, List.getElem?_range hj]179      simp [hfl _ hj]180    · rw [List.getD_eq_getElem?_getD, List.getElem?_map, List.getElem?_range (by omega)]181      simp [hfl _ (by omega : i' < Q.length)]; omega182  rw [hft]183  simp only [Option.some.injEq, Prod.mk.injEq, true_and]184  -- the value bits are the bits of heap i (the flagged heap's partner)185  have hval : ((List.range B).map (fun p => or ((List.range Q.length).map186      (fun k => and [flagC B k, heapC B (partner k) p])))).map (eval (boardBits B Q)) =187      (List.range B).map (fun p => boardBits B Q (B * i + p)) := by188    simp only [List.map_map]189    apply List.map_congr_left190    intro p hp191    simp only [Function.comp_apply, eval_or, List.any_map]192    apply Bool.eq_iff_iff.mpr193    rw [List.any_eq_true]194    constructor195    · rintro ⟨k, hk, he⟩196      have hk' := List.mem_range.mp hk197      simp only [Function.comp_apply, eval_and, List.all_cons, List.all_nil, Bool.and_true, Bool.and_eq_true,198        hfl k hk', decide_eq_true_eq, heapC, eval_input] at he199      obtain ⟨rfl, h2⟩ := he200      rw [partner_partner] at h2; exact h2201    · intro h202      refine ⟨partner i, List.mem_range.mpr hj, ?_⟩203      simp only [Function.comp_apply, eval_and, List.all_cons, List.all_nil, Bool.and_true, hfl _ hj, decide_true,204        Bool.true_and, heapC, eval_input, partner_partner]205      exact h206  rw [hval, toNatBE_heap rfl hwQ (by omega)]207  rw [hQ, getD_set_eq' P y hi]

Project declarations in the statement: CorrBridge.boardBits, Game.Move, Game.Width, Misc.Paired, Misc.pairR, Misc.partner, SelectCircuit.selReadout

Project declarations used by the proof or definition body

AC0.Circ, AC0.Circ.and, AC0.Circ.eval, AC0.Circ.eval_and, AC0.Circ.eval_input, AC0.Circ.eval_or, AC0.Circ.input, AC0.Circ.or, Bridge.toNatBE, CorrBridge.RCirc.mk, CorrBridge.RCirc.sel, CorrBridge.RCirc.val, CorrBridge.RCirc.valid, CorrBridge.boardBits, CorrBridge.firstTrue, CorrBridge.firstTrue_some_iff, CorrBridge.heapC, Game.Move, Game.Width, Game.width_move, Misc.Paired, Misc.flagC, Misc.flagC_eval, Misc.getD_set_eq', Misc.pairR, Misc.paired_move, Misc.partner, Misc.partner_lt, Misc.partner_partner, Misc.toNatBE_heap, SelectCircuit.selReadout

theorem Misc.pairBin_bound

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

The binary mirror selector is a constant-depth (≤ 10), polynomial-size formula family reading only the B·N board bits.

Statement as elaborated and printed by Lean 4.26.0

∀ (B N r : ℕ),
  N ≤ 2 ^ r →
    N % 2 = 0 →
      NimAudit.PriorityEncoder.BinBound (NimAudit.Misc.pairBin B N r) N B r 10
        (4 * ((N + 2) * (N * (2 * NimAudit.Misc.pairF B + 1) + 1 + 2)) ^ 3) (B * N)
Exact source text, lines 353–358
353/-- The binary mirror selector is a constant-depth (≤ 10), polynomial-size formula family354    reading only the B·N board bits. -/355theorem pairBin_bound (B N r : Nat) (hr : N ≤ 2 ^ r) (hN : N % 2 = 0) :356    BinBound (pairBin B N r) N B r 10 (4 * ((N + 2) * (N * (2 * pairF B + 1) + 1 + 2)) ^ 3) (B * N) :=357  encode_bound (pairR B N) (by simp [pairR]) (by simp [pairR]) hr358    (fun c hc => ⟨(pairR_res B N c hc).1, (pairR_res B N c hc).2, pairR_reads B N hN c hc⟩)

Project declarations in the statement: Misc.pairBin, Misc.pairF, PriorityEncoder.BinBound

Project declarations used by the proof or definition body

AC0.Circ, AC0.Circ.and, AC0.Circ.depth, AC0.Circ.maxInput, AC0.Circ.or, AC0.Circ.size, CorrBridge.RCirc.sel, CorrBridge.RCirc.val, CorrBridge.RCirc.valid, CorrBridge.heapC, Misc.flagC, Misc.pairF, Misc.pairR, Misc.pairR_reads, Misc.pairR_res, Misc.partner, PriorityEncoder.encode_bound

theorem Mastery.pairing_net_weak

Module WeakMastery (lean/phase8/WeakMastery.lean, lines 690–694) · file SHA-256 4c83e573f527989c… Axioms reported by the fresh build: propext, Classical.choice, Quot.sound

Statement as elaborated and printed by Lean 4.26.0

NimAudit.Mastery.WeakMasteryFam (fun B P => NimAudit.Misc.Paired P ∧ NimAudit.Game.Width B P)
  NimAudit.Mastery.Role.second fun B => NimAudit.Mastery.ofSel (NimAudit.Mastery.pairNetSel B)
Exact source text, lines 690–694
690theorem pairing_net_weak :691    WeakMasteryFam (fun B P => Paired P ∧ Width B P) .second (fun B => ofSel (pairNetSel B)) := by692  intro B693  show WeakMastery _ _ (ofSel (pairNetSel B))694  rw [pairNetSel_eq]; exact pairing_weak B

Project declarations in the statement: Game.Width, Mastery.Role.second, Mastery.WeakMasteryFam, Mastery.ofSel, Mastery.pairNetSel, Misc.Paired

Project declarations used by the proof or definition body

Game.Width, Mastery.Role.second, Mastery.WeakMastery, Mastery.ofSel, Mastery.pairNetSel, Mastery.pairNetSel_eq, Mastery.pairing_weak, Misc.Paired, Misc.pairSel

theorem Mastery.pairing_first_vacuous

Module WeakMastery (lean/phase8/WeakMastery.lean, lines 673–675) · file SHA-256 4c83e573f527989c… Axioms reported by the fresh build: propext, Classical.choice, Quot.sound

For the first role the paired family is losing, so weak mastery there is vacuous.

Statement as elaborated and printed by Lean 4.26.0

∀ (B : ℕ) (σ : NimAudit.Mastery.Strat),
  NimAudit.Mastery.WeakMastery (fun P => NimAudit.Misc.Paired P ∧ NimAudit.Game.Width B P)
    NimAudit.Mastery.Role.first σ
Exact source text, lines 673–675
673/-- For the first role the paired family is losing, so weak mastery there is vacuous. -/674theorem pairing_first_vacuous (B : Nat) (σ : Strat) : WeakMastery (fun P => Paired P ∧ Width B P) .first σ :=675  weakMastery_vacuous (fun P0 hF hw => (roleWinnable_first P0).1 hw (paired_lose hF.1 hF.2).2) σ

Project declarations in the statement: Game.Width, Mastery.Role.first, Mastery.Strat, Mastery.WeakMastery, Misc.Paired

Project declarations used by the proof or definition body

Game.Lose, Game.Width, Mastery.Role.first, Mastery.RoleWinnable, Mastery.Strat, Mastery.roleWinnable_first, Mastery.weakMastery_vacuous, Misc.Paired, Misc.paired_lose, nimSum

Definitions these statements use

def Misc.Paired

Module Misc (lean/phase6/Misc.lean, lines 50–51) · file SHA-256 07766c03566dbfca…

Paired boards (a, a, b, b, …).

Statement as elaborated and printed by Lean 4.26.0

List ℕ → Prop
Exact source text, lines 50–51
50/-- Paired boards (a, a, b, b, …). -/51def Paired (P : List Nat) : Prop := P.length % 2 = 0 ∧ ∀ k, k < P.length → P.getD k 0 = P.getD (partner k) 0

Project declarations in the statement: none

Project declarations used by the proof or definition body

Misc.partner

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 Misc.SecondWins

Module Misc (lean/phase6/Misc.lean, lines 53–59) · file SHA-256 07766c03566dbfca…

Second-player guarantee for a reply rule: every legal opponent move is answered legally and the guarantee persists (weak mastery for the second-player role).

Statement as elaborated and printed by Lean 4.26.0

(List ℕ → Option (List ℕ)) → List ℕ → Prop
Exact source text, lines 53–59
53/-- Second-player guarantee for a reply rule: every legal opponent move is answered54    legally and the guarantee persists (weak mastery for the second-player role). -/55inductive SecondWins (sel : List Nat → Option (List Nat)) : List Nat → Prop56  | intro (P : List Nat) :57      (∀ Q, Move P Q → (sel Q).isSome = true) →58      (∀ Q R, Move P Q → sel Q = some R → Move Q R) →59      (∀ Q R, Move P Q → sel Q = some R → SecondWins sel R) → SecondWins sel P

Project declarations in the statement: none

Project declarations used by the proof or definition body

Game.Move

def Misc.pairSel

Module Misc (lean/phase6/Misc.lean, lines 133–134) · file SHA-256 07766c03566dbfca…

Statement as elaborated and printed by Lean 4.26.0

ℕ → List ℕ → Option (List ℕ)
Exact source text, lines 133–134
133def pairSel (B : Nat) (Q : List Nat) : Option (List Nat) :=134  applyM Q (binSem (pairBin B Q.length (rIdx Q.length)) Q.length (boardBits B Q))

Project declarations in the statement: none

Project declarations used by the proof or definition body

CorrBridge.boardBits, Misc.pairBin, PriorityEncoder.binSem, SelectCircuit.applyM, WholeGame.rIdx

def CorrBridge.boardBits

Module NimCorrBridge (lean/phase3/NimCorrBridge.lean, lines 39–41) · file SHA-256 d3fb2e4a64db3e92…

Input bits of a board: heap i, big-endian position p (bit B-1-p) at index B·i + p.

Statement as elaborated and printed by Lean 4.26.0

ℕ → List ℕ → ℕ → Bool
Exact source text, lines 39–41
39/-- Input bits of a board: heap i, big-endian position p (bit B-1-p) at index B·i + p. -/40def boardBits (B : Nat) (P : List Nat) : Nat → Bool := fun j =>41  if j < B * P.length then (P.getD (j / B) 0).testBit (B - 1 - j % B) else false

Project declarations in the statement: none

Project declarations used by the proof or definition body

none

def Game.Move

Module NimGame (lean/phase2/NimGame.lean, lines 24–26) · file SHA-256 23df6bb87ecfd344…

An ordinary legal Nim move: exactly one heap strictly decreases.

Statement as elaborated and printed by Lean 4.26.0

List ℕ → List ℕ → Prop
Exact source text, lines 24–26
24/-- An ordinary legal Nim move: exactly one heap strictly decreases. -/25def Move (p q : List Nat) : Prop :=26  ∃ pre x post y, p = pre ++ x :: post ∧ q = pre ++ y :: post ∧ y < x

Project declarations in the statement: none

Project declarations used by the proof or definition body

none

def Misc.pairR

Module Misc (lean/phase6/Misc.lean, lines 126–129) · file SHA-256 07766c03566dbfca…

The mirror selector: flag k = (partner k < k); the value is the flagged heap's partner.

Statement as elaborated and printed by Lean 4.26.0

ℕ → ℕ → NimAudit.CorrBridge.RCirc
Exact source text, lines 126–129
126/-- The mirror selector: flag k = (partner k < k); the value is the flagged heap's partner. -/127def pairR (B N : Nat) : RCirc :=128  ⟨or ((List.range N).map (flagC B)), (List.range N).map (flagC B),129   (List.range B).map (fun p => or ((List.range N).map (fun k => and [flagC B k, heapC B (partner k) p])))⟩

Project declarations in the statement: CorrBridge.RCirc

Project declarations used by the proof or definition body

AC0.Circ, AC0.Circ.and, AC0.Circ.or, CorrBridge.RCirc.mk, CorrBridge.heapC, Misc.flagC, Misc.partner

def Misc.partner

Module Misc (lean/phase6/Misc.lean, lines 43–44) · file SHA-256 07766c03566dbfca…

Partner of heap k in the pairs (0,1), (2,3), …

Statement as elaborated and printed by Lean 4.26.0

ℕ → ℕ
Exact source text, lines 43–44
43/-- Partner of heap k in the pairs (0,1), (2,3), … -/44def partner (k : Nat) : Nat := if k % 2 = 0 then k + 1 else k - 1

Project declarations in the statement: none

Project declarations used by the proof or definition body

none

def SelectCircuit.selReadout

Module SelectCircuit (lean/phase4/SelectCircuit.lean, lines 26–32) · file SHA-256 922ee44ce0ababa9…

Evaluation of a move readout on an arbitrary input vector.

Statement as elaborated and printed by Lean 4.26.0

NimAudit.CorrBridge.RCirc → (ℕ → Bool) → Option (ℕ × ℕ)
Exact source text, lines 26–32
26/-- Evaluation of a move readout on an arbitrary input vector. -/27def selReadout (R : RCirc) (z : Nat → Bool) : Option (Nat × Nat) :=28  if eval z R.valid then29    match firstTrue (R.sel.map (eval z)) with30    | some i => some (i, toNatBE (R.val.map (eval z)))31    | none => none32  else none

Project declarations in the statement: CorrBridge.RCirc

Project declarations used by the proof or definition body

AC0.Circ, AC0.Circ.eval, Bridge.toNatBE, CorrBridge.RCirc, CorrBridge.RCirc.sel, CorrBridge.RCirc.val, CorrBridge.RCirc.valid, CorrBridge.firstTrue

def Misc.pairBin

Module Misc (lean/phase6/Misc.lean, lines 131–132) · file SHA-256 07766c03566dbfca…

The binary mirror selector and the reply rule it defines.

Statement as elaborated and printed by Lean 4.26.0

ℕ → ℕ → ℕ → NimAudit.BinReadout.BCirc
Exact source text, lines 131–132
131/-- The binary mirror selector and the reply rule it defines. -/132def pairBin (B N r : Nat) : BCirc := encode (pairR B N) N r

Project declarations in the statement: BinReadout.BCirc

Project declarations used by the proof or definition body

Misc.pairR, PriorityEncoder.encode

def Misc.pairF

Module Misc (lean/phase6/Misc.lean, lines 276–277) · file SHA-256 07766c03566dbfca…

Size bound for one mirror flag (a B-bit comparison of a heap with its partner).

Statement as elaborated and printed by Lean 4.26.0

ℕ → ℕ
Exact source text, lines 276–277
276/-- Size bound for one mirror flag (a B-bit comparison of a heap with its partner). -/277def pairF (B : Nat) : Nat := B * ((2 + B) * 9 + 1) + 1

Project declarations in the statement: none

Project declarations used by the proof or definition body

none

inductive PriorityEncoder.BinBound

Module PriorityEncoder (lean/phase5/PriorityEncoder.lean, lines 111–116) · file SHA-256 1be04943f5455fc1…

Resource bounds for binary readout formulas on an arbitrary input support M.

Statement as elaborated and printed by Lean 4.26.0

NimAudit.BinReadout.BCirc → ℕ → ℕ → ℕ → ℕ → ℕ → ℕ → Prop
Exact source text, lines 111–116
111/-- Resource bounds for binary readout formulas on an arbitrary input support M. -/112structure BinBound (S : BCirc) (N B r D Sz M : Nat) : Prop where113  idx_len : S.idx.length = r114  val_len : S.val.length = B115  width : N ≤ 2 ^ r116  all : ∀ c ∈ S.valid :: (S.idx ++ S.val), depth c ≤ D ∧ size c ≤ Sz ∧ maxInput c ≤ M

Project declarations in the statement: BinReadout.BCirc

Project declarations used by the proof or definition body

AC0.Circ, AC0.Circ.depth, AC0.Circ.maxInput, AC0.Circ.size, BinReadout.BCirc, BinReadout.BCirc.idx, BinReadout.BCirc.val, BinReadout.BCirc.valid

def Mastery.WeakMasteryFam

Module WeakMastery (lean/phase8/WeakMastery.lean, lines 620–622) · file SHA-256 4c83e573f527989c…

Indexed families (e.g. by bit width B), with an index-dependent policy.

Statement as elaborated and printed by Lean 4.26.0

{ι : Type} → (ι → List ℕ → Prop) → NimAudit.Mastery.Role → (ι → NimAudit.Mastery.Strat) → Prop
Exact source text, lines 620–622
620/-- Indexed families (e.g. by bit width B), with an index-dependent policy. -/621def WeakMasteryFam {ι : Type} (F : ι → List Nat → Prop) (r : Role) (σ : ι → Strat) : Prop :=622  ∀ i, WeakMastery (F i) r (σ i)

Project declarations in the statement: Mastery.Role, Mastery.Strat

Project declarations used by the proof or definition body

Mastery.Role, Mastery.Strat, Mastery.WeakMastery

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 Mastery.pairNetSel

Module WeakMastery (lean/phase8/WeakMastery.lean, lines 679–681) · file SHA-256 4c83e573f527989c…

Statement as elaborated and printed by Lean 4.26.0

ℕ → List ℕ → Option (List ℕ)
Exact source text, lines 679–681
679def pairNetSel (B : Nat) (Q : List Nat) : Option (List Nat) :=680  SelectCircuit.applyM Q (ThresholdInst.netBinSem (pairNet B Q.length (rIdx Q.length)) Q.length (rIdx Q.length) B681    (CorrBridge.boardBits B Q))

Project declarations in the statement: none

Project declarations used by the proof or definition body

CorrBridge.boardBits, Mastery.pairNet, SelectCircuit.applyM, ThresholdInst.netBinSem, WholeGame.rIdx

def Mastery.Strat

Module WeakMastery (lean/phase8/WeakMastery.lean, lines 54–55) · file SHA-256 4c83e573f527989c…

A (history-dependent) strategy proposes the next board; `none` means no action.

Statement as elaborated and printed by Lean 4.26.0

Type
Exact source text, lines 54–55
54/-- A (history-dependent) strategy proposes the next board; `none` means no action. -/55abbrev Strat := Hist → Option (List Nat)

Project declarations in the statement: none

Project declarations used by the proof or definition body

Mastery.Hist

def Mastery.WeakMastery

Module WeakMastery (lean/phase8/WeakMastery.lean, lines 614–618) · file SHA-256 4c83e573f527989c…

WEAK MASTERY of policy σ for the family F of initial boards and the designated role r: from every initial board of the family from which the role has SOME winning strategy, σ itself wins against every legal opponent strategy.

Statement as elaborated and printed by Lean 4.26.0

(List ℕ → Prop) → NimAudit.Mastery.Role → NimAudit.Mastery.Strat → Prop
Exact source text, lines 614–618
614/-- WEAK MASTERY of policy σ for the family F of initial boards and the designated role r:615    from every initial board of the family from which the role has SOME winning strategy,616    σ itself wins against every legal opponent strategy. -/617def WeakMastery (F : List Nat → Prop) (r : Role) (σ : Strat) : Prop :=618  ∀ P0, F P0 → RoleWinnable r P0 → Guarantee r σ P0

Project declarations in the statement: Mastery.Role, Mastery.Strat

Project declarations used by the proof or definition body

Mastery.Guarantee, Mastery.Role, Mastery.RoleWinnable, Mastery.Strat

Full modules

ModuleFileLinesImports
Misclean/phase6/Misc.lean912Bypass
NimCorrBridgelean/phase3/NimCorrBridge.lean922BitBridge
NimGamelean/phase2/NimGame.lean634NimRollout
PriorityEncoderlean/phase5/PriorityEncoder.lean430LocalRestore, BinaryReadout
SelectCircuitlean/phase4/SelectCircuit.lean1064ControllerBits
WeakMasterylean/phase8/WeakMastery.lean959Misc

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