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