A dart landed on the most famous cellular automaton ever written — a grid where every cell lives or dies by counting its eight neighbours, and from two rules emerge gliders, guns, and a proven universal computer. We run it live, credit who actually made it, and ask what a deliberately bounded machine like I-13 should learn from a machine with no bound at all.
THE TECHNIQUE count neighbours · born on 3 · survive on 2 or 3
Each cell looks at its 8 neighbours and applies one law: a dead cell with exactly 3 live neighbours is born; a live cell with 2 or 3 survives; anything else dies. No cell knows the whole board — the pattern is not steered, it emerges. Seed a shape and press run. live demo
next(cell) = 1 if neighbours==3 // birth
= cell if neighbours==2 // survive
= 0 otherwise // death / overcrowding
rule B3/S23
generation0
population0
grid—
statepaused
Click any cell to toggle it. The grid wraps at its edges (a torus). The glider gun fires an endless stream of gliders — the discovery that first proved a Life pattern can grow forever.
HISTORY & CREDIT credit where it is due
It is not mis-credited — the name says it plainly — but almost everything famous inside it was found by someone else, and that part gets forgotten. cited
1970 · John Horton Conway (Univ. of Cambridge) devises the rule B3/S23, tuning it by hand so growth is neither trivially bounded nor trivially explosive. Oct 1970 · Martin Gardner publishes it in his “Mathematical Games” column in Scientific American — the article that made it a phenomenon. 1970 · the glider is spotted by Richard K. Guy in Conway’s group — not by Conway himself. Nov 1970 · Bill Gosper’s team at MIT builds the glider gun, winning Conway’s $50 prize by proving a pattern can grow without bound. 2000–2010 · Paul Rendell constructs an explicit Turing machine inside Life; Paul Chapman (2002) builds a universal register machine — Life is Turing-complete.
What is settled: the automaton is universal — gliders carry signals, collisions make AND/OR/NOT gates. What stays open: no small finite bound governs it — whether an arbitrary pattern ever dies out is undecidable, a direct corollary of that same universality. open
RECOMMEND FOR I-13 what the bounded machine should learn
Life’s whole state is a 2-D grid — an array. Every step reads and rewrites that aggregate in place. I asked the real I-13 compiler to hold one. It cannot — there is no array, no subscript, not even the characters for them. Proven, not asserted:
$ i13 check grid.i13 // I row <- [0, 1, 0]
grid.i13:1:10 E0001 unexpected character `[`
grid.i13:1:18 E0001 unexpected character `]`
$ i13 check index.i13 // I c <- g[1]
index.i13:2:9 E0001 unexpected character `[`
index.i13:2:11 E0001 unexpected character `]`
$ i13 run scalar.i13 // I c <- a + b (control: scalars DO work)
RUN OK · 8 step(s) · peak stack 2 · call depth 0
c = 5
Even I-13’s own core.i13 hits this wall: to route 8 channels it must pass eight separate scalar parameters, with the comment “No arrays/records are assumed.” A grid of thousands of cells has no such workaround.
Recommend — ADD a grid/array aggregate value. This is the honest ask: not a new operator but a genuinely new kind of value, standing against I-13’s f64-only scalar identity. It is the single largest capability Life demands and I-13 lacks — a mutable aggregate with indexed read/write. Do it as a boxed handle so the counted 13-symbol alphabet is untouched: Const a length, one new BinOp discriminant for index (zero new alphabet symbols, the language’s standard move), one for store. The deeper lesson — and why you might REFUSE. Life is Turing-complete: two local rules with no ceiling compute anything, and pay for it with undecidability — you cannot prove a pattern halts. I-13 is the opposite design stance: 4096 frames, 8,000,000 steps, depth-indexed control, deterministic. Those ceilings are the point — they are what make single-pass validation total. Adding unbounded mutable memory buys Life’s power at the cost of Life’s unanalysability. The honest recommendation is therefore bounded: add a fixed-length array (a `Const` size, no growth), keeping the aggregate but not the infinity. Tradeoff (honest): a fixed grid still breaks the pure f64-scalar identity and adds a heap-ish value the abstract machine currently refuses. Worth it only if aggregate data — images, grids, tables — is in scope. If I-13 is to stay a scalar governor, the right answer is to keep saying no, and to say why in the spec: no arrays, by choice.