recreational math · peg solitaire · φ

Conway's Soldiers

Jump soldiers upward, capture the jumped piece, and see why the fifth row stays forever out of reach. Below the play board, a φ-potential calculator lets you place any army on any target and read the bound off live.

Play the army

Place soldiers below row 0, then jump orthogonally over neighbours.

Highest row 0 Soldiers 0 Potential 0.000000

Quick start

  1. Frontier: row 0 is the gold line. Your starting army belongs on row 0 or below.
  2. Place: in Play mode, tap empty setup squares to add soldiers. In Targets, stay within the budget.
  3. Jump: click a soldier, then an empty square two cells away over an adjacent soldier. The jumped soldier is removed.
  4. Goal: Play is free exploration; Targets asks you to reach rows 1–4 with a fixed army.

Tip: click an empty square at row 0 or below to add/remove setup soldiers. Click a soldier, then a landing square two cells away.

daily puzzle · φ-tight

Puzzle of the day

Loading today’s generated army…

UTC — slack permalink

Each puzzle is generated by greedily trimming a feasible army until its φ-potential is barely enough, then checking it with a reachability oracle.

Make legal jumps until a soldier lands on the marked target.

Why row 5 is impossible

Conway's Soldiers is played on a checkerboard split by a frontier. You may start with any finite army on row 0 and below. A move is a peg-solitaire jump: one soldier jumps over an adjacent soldier into an empty square two cells away, horizontally or vertically, and the jumped soldier is removed.

The theorem is separate from the play rule: rows 1, 2, 3, and 4 can be reached, but row 5 cannot. “Watch row 4 reached” proves the attainable side constructively with a classical 20-soldier army; “Watch the proof” runs the row-5 potential argument from the army currently on the board.

Pick a target square and let φ=(√5−1)/2, so φ²+φ=1. A square at Manhattan distance d from the target has weight φ^d. The target itself has weight 1.

Inspect any legal jump. Moving toward the target replaces weights φ²+φ by 1, which is equal. Moving sideways or away replaces them by less. So every legal move leaves the total potential unchanged or lower: Σ after ≤ Σ before.

For a target on row 5, the total potential of the entire infinite half-plane at row 0 and below is exactly 1. Any finite starting army has less than that. A soldier on the row-5 target would already contribute weight 1, with any remaining soldiers contributing positive extra weight. That would require potential to increase, which legal moves never do.

Watch mode

Press Watch the proof to replay a deterministic sequence of legal jumps toward the row-5 target while the potential is tracked.

φ
Infinite half-plane for row 5Σ = 1 exactly
Move invariantpotential never increases

Lean 4 · mathlib4

Mechanized proof

Lean 4 + mathlib4 · lake build ✓ at commit 5f68b8726

The φ argument is short enough to read by eye, but mechanization makes the bookkeeping explicit: board states are finite sets of integer cells, reachability is a finite chain of jumps, and the potential inequalities are checked in Lean.

The current artifact checks two known Conway-soldiers obstructions in the same potential framework: the ordinary orthogonal game cannot reach row 5, and the diagonal-or-orthogonal variant cannot reach row 9. This is a mechanized formalization of classical results, not a new mathematical claim.

Honesty correction (2026-05-25): earlier today this page claimed a proven characterization S = {L(2k) : k≥1} for the (m,2,2) projection failure set. That was wrong. The prior writeups used the wrong base for the logarithm and a different coefficient inside E(m), so they proved a real theorem about a different set S', not the paper's S. Under the paper's actual predicate (Bruda et al. eq. 4.41) the failure set is S = {F(2k+1) : k≥1} (odd-indexed Fibonacci numbers); the paper's own L(2k) labeling appears to be a misstatement. See the correction note.

The key arithmetic identity {φ·F(2k+1)} = φ-(2k+1) is now mechanized in Lean (Conway.FibPredicate), sorry-free and axiom-free. Evening swing (2026-05-25): the 1D row-2 obstruction (sharp, Bruda–Cooper d=1) is mechanized; generalized to row-n for all n ≥ 2 (full Eriksson–Lindström d=1 bound); auto-monovariance proved for 1D — the carried potential certificate is forced by geometry alone, via φ|a+2| ≤ φ|a| + φ|a+1| with equality on the trailing side; back-ported to 2D orthogonal jumps by factoring the weight as φ|Δx|·φ|Δy|. Twelve tracked theorems, all sorry-free, axiom-free. See the open-problem survey and the auto-monovariance writeup.

orthogonal row 5 ✓ diagonal row 9 ✓
Commit 5f68b8726 Build ok Sorry count 0 Axiom count 0
theorem jump_monovariant {before after : Board} {src dst target : Cell}
    (h : LegalJump before src dst after) :
    potential target after ≤ potential target before

theorem conway_soldiers_row5_unreachable :
  ∀ (initial : Board),
    (∀ p ∈ initial, p.2 ≤ 0) →
    ∀ (final : Board),
      Reachable initial final →
      ∀ p ∈ final, p.2 ≤ 4

theorem diagonal_jump_monovariant {before after : Board} {src dst target : Cell}
    (h : LegalDiagonalJump before src dst after) :
    diagonalPotential target after ≤ diagonalPotential target before

theorem conway_soldiers_diagonal_row9_unreachable :
  ∀ (initial : Board),
    (∀ p ∈ initial, p.2 ≤ 0) →
    ∀ (final : Board),
      DiagonalReachable initial final →
      ∀ p ∈ final, p.2 ≤ 8

Orthogonal Lean source · Diagonal Lean source · Diagonal derivation note · Research note on the (m,2,1) gap · Research note on the (m,2,2) gap · ⚠ Correction (2026-05-25): Lucas → Fibonacci · Retracted: L(2k) theorem · Retracted: non-Lucas exclusion · Verification JSON

References
  • John H. Conway, the original Conway's Soldiers pagoda-function argument.
  • Elwyn R. Berlekamp, John H. Conway, and Richard K. Guy, Winning Ways for Your Mathematical Plays, chapter 24.
  • George I. Bell, Daniel Hirschberg, and Pablo Guerrero, analyses of Conway's Soldiers variants including diagonal armies.
Last 50 lines of lake build
⚠ [8472/8475] Replayed Conway.OneDim
warning: Conway/OneDim.lean:192:27: unused variable `hdst_ne_mid`

Note: This linter can be disabled with `set_option linter.unusedVariables false`
warning: Conway/OneDim.lean:192:53: unused variable `hdst_ne_src`

Note: This linter can be disabled with `set_option linter.unusedVariables false`
Build completed successfully (8475 jobs).