BB(6) hunt
Machines / #12b

1RB1LA_1LC0RA_0LD1RC_---0LE_0LF1LE_1RF1LB

#12blocal proof 6Claimed by someone elseCounter Class 4bbchallenge ↗Explorerparent: #12

How we proved it never halts

#12's proof with a smaller budget and zero slack

#12 works like a recursive call stack written in runs of 1s. Each round starts at the left end with a bottom call that can pay for three calls, the machine halts only if a round needs a fourth, and an exact law shows that every round costs exactly 2. #12b, once its states are renamed, is #12's table with one transition changed, started in the state that is #12's B instead of A; no renaming or mirror makes it exactly #12.

The changed transition is used only at the start of a round, when the bottom call is created at the left end. There it takes a 6-step detour to the same tape that #12 reaches in 2 steps. So the call-stack picture, the replay of rounds one level down and the cost law all carry over unchanged.

What is new is the budget. After a 48-step opening, every round starts with the left end reading 11 00 instead of 111 00, so the bottom call is three 1s long and can pay for only two calls. A single round needing three would halt the machine. But #12's law counts the calls exactly, not just as a bound: every round needs exactly 2, the budget is always just enough, and the missing transition never fires.

The Rocq proof is #12's file with the start-of-round move re-proved by running it, detour included, plus the new 48-step opening and one added lemma for a round that starts with the smaller bottom call.

#6local proof number
896lines of Rocq
4 sto compile
6/6automatic checks
space-time diagram, first 10,000 steps from blank
The first 10,000 steps from a blank tape. Time runs down; white is 1.
About this picture

The standard picture (bbchallenge.org's Default view): each row is the whole tape at one step, time runs downward, and the head's path draws the pattern.

bbchallenge-defaultStart blankRows steps 0 → 10,000, top to bottomWindow cells −200..199, left to rightColors 1 0 or unvisited

Claimed by someone else

We proved this machine locally, but our proof was still unsubmitted when we found it already covered upstream.

Submit completed proofs early. A local proof does not secure an upstream claim.

Upstream proof ↗ · Recorded timeline

What the timing evidence establishes

This describes upstream credit, not who first discovered the mathematics. The records do not establish adoption of our proof, first public push time, or whether an earlier submission would have secured credit.

Overview

In one sentence

Rename the twin's states A..F to B,C,D,E,F,A. The result is #12 with one transition changed (A0 = 1RA instead of 1RB; in twin names F0 = 1RF), started in #12's state B. It is not #12 up to renaming or mirroring (all 1,440 relabelings checked). F0 is read only at the first step of the left-edge push R3, where it takes a 6-step detour (F0 F0 F1 B1 A1 A0) to the configuration #12 reaches in 2 steps. The tape effect is the same; it costs 4 more steps. (submission/README.md, Mechanism)

Upstream
The blank-start machine never halts: CounterClass4.v.TM1 ↗. We also have a local proof. This upstream addition is separate from our merged submissions; adoption credit is not established. Recorded commit time: 2026-10-14T06:19:56Z. First public push time is not established.
Rocq proof
check_kill PASS · first Oct 10 09:52
896 lines · 40 KB .v · compile 4.2 s · coqchk pass · 0 axioms · PASS Oct 10 09:52 (re-run Oct 10 11:54)
· the .v file
Automatic review
6 of 6 checks passtemplate: #12's kill file (kill 5) (twin: parent kill's .v) · details in Proof →
Class
Counter Class 4
On the list
not on BB6_holdouts_663.txt (line 640 of the previous list) · historical 740 line 640
eqv ×2sim 1e13
Derived from
1RB1LC_1RC1LB_1LD0RB_0LE1RD_---0LF_0LA1LF#12 Claimed by someone else

Mechanism

What to check here: the pictures show the mechanism that the rule table describes.

No observation of its own: neighbour of #12: one transition away from #12's table (after renaming); its run is nearly identical (134 vs 133 cells at 1e9), so a look-alike, not a sibling. Below are #12's figures, rules and history. #12's Checkpoint A questions (3) are on its page.

Figures

Fig 1 · Blaze view, 10 million stepsQ1

Blaze view, time runs down. Find each row where the left edge steps out, and compare the gaps between them.

Blaze view, 10 million steps
bbchallenge-blazeStart blankRows Blaze time blocks of 16,384 stepsWindow cells -58..33, 1 px = 0.115 cellsColors 0 1 a cell that is 1 for part of its time block
Rows: (611 rows, each averaged), stretched to 500 px (1 px ~ 20,000 steps); epochs start near y = 32, 64, 129, 258 px · Window: 1 cell = 8.7 px
Fig 2 · Zoom: one long epoch (k = 8)Q2

One long epoch (k = 8), time runs down. Find each step where the long left block (run 1) shrinks.

Zoom: one long epoch (k = 8)
bbchallenge-blazeStart mid-run: step 320,794Rows Blaze time blocks of 512 stepsWindow cells -43..27, 1 px = 0.089 cellsColors 0 1 a cell that is 1 for part of its time block
Start: Fl(8,10) = 0∞ <A 0 13 02 117 02 119 02 1 010 1 06 1 0∞ (head at cell -42) · Rows: (629 rows, each averaged), steps 320,794..642,526 (ends at Fs(9,4)), stretched to 500 px; r1 loses cells near y = 31, 62, 125, 250, 499 px · Window: 1 cell = 11.3 px
Fig 3 · Edge records to 1 billion stepsQ3

Edge records to 1e9 (only 134 rows). Look at the two thin white lines in the black right half.

Edge records to 1 billion steps
bbchallenge-defaultStart blankRows the start, then one per new leftmost or rightmost cellWindow cells -86..47, 1 px = 0.25 cellsColors 1 0 head at a new left/right edge
Rows: (134 rows, steps 0..660,597,554; no new cell from there to 1e9); not evenly spaced in time · Window: 1 cell = 4 px · Colors: right-edge rows catch the tape mid-epoch (the long white bars)
More figures (1)Fig 4: bbchallenge Default view, first 10,000 steps
Fig 4 · bbchallenge Default view, first 10,000 stepsviewer ↗

For orientation: zig-zag sweeps over runs of 1s, as bbchallenge.org shows them.

bbchallenge Default view, first 10,000 steps
bbchallenge-defaultStart blankRows 10,000 steps squeezed into 500 px rowsWindow cells -200..199, 1 px = 1 cellColors 1 0 or never visited head after a right/left move
Rows: 1 px row = 20 steps; the site blends steps 20y+9 and 20y+10
Rules (9/9 validated)exact tape rewrites the proof will formalize, each re-checked by simulation
rulefrom ⟶ tocasesstepschecked
R1 pointer right
1n+2 <A 0 1m+1 02 1x 0
⟶ 1n+1 0 1m+1 <A 0 1x+1 02
n,m,x>=0; x=0 covers 0^3 and 0^inf after the 003m+2x+15✓60/60
R2 lone 1 merges, jump back
1j+1 0 1k+1 0 1 <A 0
⟶ 1j+1 <A 0 1k+2 02
j,k>=0k+10✓60/60
R2e jump to edge
0∞ 1k+1 0 1 <A 0
⟶ 0∞ <A 0 1k+2 02
k>=0k+10✓60/60
R3 edge refill
0∞ <A 0 1k+1 02 1m 0
⟶ 0∞ 1k+2 <A 0 1m+1 02
k,m>=03k+2m+11✓60/60
HALT
03 1 <A 0
⟶ halt
only halting route; needs a lone 1 at the far left4 (incl. halting transition)✓40/40
short epoch
Fs(k,P) = 0∞ <A 0 13 02 12 02 12k 02 12k+1 0P 1 0Q 1 0∞, P+Q=2k
⟶ Fl(k,P) = 0∞ <A 0 13 02 12k+1 02 12k+3 02 1 0P 1 0Q 1 0∞
P,Q even >=2 (k up to 200 tested)40k+288✓24/24
long epoch
Fl(k,P)
⟶ Fs(k+1,P') with P' even, 2<=P'<=2k; or D(k+1)
P' irregular in (k,P), e.g. k=11: P 2,4,6,8,10,12 -> 6,8,10,16,D,4. Macro model: every even P for k<=13 closes with no halt~1260*2k (+-200, depends on P)✓22/22
degenerate D
D(k) = 0∞ <A 0 13 02 12 02 12k+2 02 12k+1 0∞
⟶ E(k) = 0∞ <A 0 13 02 12k+3 02 12k+3 02 1 0∞
k>=340k+312✓8/8
E back to family
E(k)
⟶ Fs(k+1,2)
k=3..10; the real orbit takes D at k=25 (step 4.2e10), then E, then Fs(26,2)~1260*2k✓8/8
Compressed historythe tape as 0∞ <A 0 13 02 12 02 12k 02 12k+1 0P 1 0Q 1 0∞ at 26 moments: where the rules are read off
0∞ <A 0 13 02 12 02 12k 02 12k+1 0P 1 0Q 1 0∞
stepkPQ
1,5901DD
4,090222
8,8063DD
18,826426
38,730564
78,838648
159,2307410
320,1868106
642,5269414
1,287,31010812
2,577,198111210
5,157,43012420
10,317,966131214
20,639,44614208
41,282,87015246
82,570,218161814
165,145,05017304
330,295,486181620
660,596,506191424
1,321,198,810202614
2,642,404,258211032
5,284,815,110222816
10,569,637,54623388
21,139,283,246242424
42,278,575,03825DD
84,557,158,85826250
klast 26
2611,5908.5e10log xstep 1590: k = 1step 4090: k = 2step 8806: k = 3step 18826: k = 4step 38730: k = 5step 78838: k = 6step 159230: k = 7step 320186: k = 8step 642526: k = 9step 1287310: k = 10step 2577198: k = 11step 5157430: k = 12step 10317966: k = 13step 20639446: k = 14step 41282870: k = 15step 82570218: k = 16step 165145050: k = 17step 330295486: k = 18step 660596506: k = 19step 1321198810: k = 20step 2642404258: k = 21step 5284815110: k = 22step 10569637546: k = 23step 21139283246: k = 24step 42278575038: k = 25step 84557158858: k = 26
Plast 2
3824,0908.5e10log xstep 4090: P = 2step 18826: P = 2step 38730: P = 6step 78838: P = 4step 159230: P = 4step 320186: P = 10step 642526: P = 4step 1287310: P = 8step 2577198: P = 12step 5157430: P = 4step 10317966: P = 12step 20639446: P = 20step 41282870: P = 24step 82570218: P = 18step 165145050: P = 30step 330295486: P = 16step 660596506: P = 14step 1321198810: P = 26step 2642404258: P = 10step 5284815110: P = 28step 10569637546: P = 38step 21139283246: P = 24step 84557158858: P = 2
Qlast 50
5024,0908.5e10log xstep 4090: Q = 2step 18826: Q = 6step 38730: Q = 4step 78838: Q = 8step 159230: Q = 10step 320186: Q = 6step 642526: Q = 14step 1287310: Q = 12step 2577198: Q = 10step 5157430: Q = 20step 10317966: Q = 14step 20639446: Q = 8step 41282870: Q = 6step 82570218: Q = 14step 165145050: Q = 4step 330295486: Q = 20step 660596506: Q = 24step 1321198810: Q = 14step 2642404258: Q = 32step 5284815110: Q = 16step 10569637546: Q = 8step 21139283246: Q = 24step 84557158858: Q = 50
Template comparisonCounterClass2v1.v: does not apply · the nearest solved proof, what carries over, and the transitions that differ
01
A1RB1LC
B1RC1LB
C1LD0RB
D0LE1RD
E---0LF
F0LA1LF
file
CounterClass2v1.v
module
—
machine
1RB1RD_1LC---_1LE0LD_0RE1LC_1RA1RF_1RE0LF (11 transitions apart)
diff
10/12 transitions differ (best renaming+mirror); CounterClass3v2 8/12, closest CounterClass1 machine 8/12
note
No rules or shapes carry over: 7 of 16 CC2v1 starting shapes (SkelE/Be) halt on this machine. What does carry over is the proof skeleton: an Inductive Side type, a Good invariant and progress_nonhalt_cond.

Proof & checks

6/6 automatic checks pass

Kill 6 · Counter Class 4 · the kill file 1RB1LA_1LC0RA_0LD1RC_---0LE_0LF1LE_1RF1LB.v: 896 lines, 106 items · the package submission/

✓ 6/6 automatic checks pass · Checkpoint B: no note from Dennis yet · template (twin: parent kill's .v): #12's kill file (kill 5) · 95% of our lines identical · vs #12: table differs in 1 transition(s); trajectory twin
1What is provedCheck: the string, the theorem and every check_kill line are green, and the .v on disk is the one that was checked (same sha256).
Machine
1RB1LA_1LC0RA_0LD1RC_---0LE_0LF1LE_1RF1LB
vs holdout list
✓ byte-exact: the .v literal (L26) == 2026-10-07_778.txt line 676 (41 bytes, via tools/holdouts.py)
Theorem
✓ Lemma nonhalt: ~halts tm c0. L847
check_kill
✓ PASS · 17/17 checks pass · compile 4.18 s · coqchk pass (1.3 s) · assumptions: 0 (closed) · 2026-10-10 18:54:14 UTC · submission/check_kill.txt
Checked .v
sha256 81348b14976e863f…
✓1RB1LA_1LC0RA_0LD1RC_---0LE_0LF1LE_1RF1LB.v81348b14976e863f… = checked
✓submission/1RB1LA_1LC0RA_0LD1RC_---0LE_0LF1LE_1RF1LB.v81348b14976e863f… = checked
Status
✓Killed: never halts updated 2026-10-10
✓ args✓ input✓ framework✓ framework_build✓ forbidden✓ structure✓ tm_text✓ theorem_text✓ coq✓ names✓ compile✓ tm_rocq✓ theorem_rocq✓ isolation✓ assumptions✓ coqchk✓ integrity
All 17 check_kill checks with their one-line results
✓args6x2 machine, framework module Individual62, mode nonhalt
✓input41142 bytes, 896 lines, 980 sentences
✓frameworkHEAD 0940bb9cf434ba68f0c025dabfde45a219999973 == pin; no tracked changes under verify/
✓framework_build13 needed framework .vo files present and fresh, with native code no older than the .vo
✓forbiddennone of 30 forbidden patterns occur (ground rule 1's words: anywhere; command words: outside comments and strings; comments never split a token)
✓structure5 Require name(s) allowed; no top-level Variable/Context; no shadowing; Module/Section balanced
✓tm_textline 26: TM_from_str "1RB1LA_1LC0RA_0LD1RC_---0LE_0LF1LE_1RF1LB" == <tm> (41 bytes)
✓theorem_textline 847: nonhalt : ~halts tm c0
✓coqcoqc 8.20.1 ([local working file]
✓nameshalts, c0, TM_from_str resolved inside Individual62
✓compilecompiled in 4.2s with all appended checks
✓tm_rocqBB6Kill.Candidate.tm = BusyCoq.Individual62.TM_from_str "1RB1LA_1LC0RA_0LD1RC_---0LE_0LF1LE_1RF1LB" by eq_refl (in-file and isolated)
✓theorem_rocqnonhalt : ~ halts (TM_from_str "1RB1LA_1LC0RA_0LD1RC_---0LE_0LF1LE_1RF1LB") c0 with absolute names (in-file and isolated)
✓isolationonly stock proof plugins loaded; guard/positivity/universe checking on, definitional UIP off
✓assumptions0 assumption(s), all in the baseline
✓coqchkcoqchk -norec BB6Kill.Candidate ok (1.3s); its context summary lists nothing of the file's own
✓integrityinput sha256 and framework HEAD/cleanliness identical before and after
2Same machine as #12?Check: every row of the table is ✓ under the computed renaming (or the listed differences are what status.json's relation says), the two pictures show the same bands, and the trajectory numbers agree with the claimed relation (a twin keeps a fixed small offset; a sibling's gap grows).

status.json names #12 as the parent (1RB1LC_1RC1LB_1LD0RB_0LE1RD_---0LF_0LA1LF); label: “#12b”; relation: “neighbour of #12: one transition away from #12's table (after renaming); its run is nearly identical (134 vs 133 cells at 1e9), so a look-alike, not a sibling”. Everything below is computed from the two machine strings, not read from notes.

✗ Not the same table. No renaming of #12's states, with or without mirroring, gives this machine's table. Closest: A→F, B→A, C→B, D→C, E→D, F→E (#12's state → this machine's), no mirror, where 1 of 12 transitions differ:

  • #12's A0 = 1RB predicts this machine's F0 = 1RA; it is 1RF.

Under that map: This machine starts in #12's state B (#12 itself starts in A).

#12#12's row (read 0, read 1)σpredicted row: renamed by σthis machine's actual row
A1RB 1LC→ F1RA 1LB1RF 1LB✗start of #12
B1RC 1LB→ A1RB 1LA1RB 1LA✓start of this machine
C1LD 0RB→ B1LC 0RA1LC 0RA✓
D0LE 1RD→ C0LD 1RC0LD 1RC✓
E--- 0LF→ D--- 0LE--- 0LE✓
F0LA 1LF→ E0LF 1LE0LF 1LE✓

Rows aligned by σ: each of #12's states X sits next to this machine's state σ(X). ✓ = the actual row equals #12's row with every target state renamed by σ; --- (halt) must stay ---. Searched: all 720 renamings × with/without mirror.

Fig P1 · bbchallenge default view: #12 and this machine, first 10,000 steps

Same view, same settings on both sides. Look for the same band structure: the tables differ in 1 transition(s) (listed above); it starts in #12's state B, not A, so the first steps differ; the numbers below read: trajectory twin, so after the start the bands should match line for line.

#12 (parent), from blank in its A
default view of 1RB1LC_1RC1LB_1LD0RB_0LE1RD_---0LF_0LA1LF
this machine (#12b), from blank in its A = #12's B
default view of 1RB1LA_1LC0RA_0LD1RC_---0LE_0LF1LE_1RF1LB
bbchallenge-defaultStart blankRows steps 0 → 10,000, top to bottomWindow cells −200..199, left to rightColors 1 0 or unvisited
tools/diagram.py <tm> --as-site (the site's 400×500 canvas)
Fig P2 · Long run, Blaze (speed): #12 and this machine, 100 million steps

The macro behaviour, identical settings on both sides: each picture is its machine's own visited span stretched to 800 px, so compare the shape and order of the bands, not their absolute width. Speed mode samples one cell per column, so a one-cell shift can swap orange and white inside a band; compare band edges, not colours.

#12 (parent), from blank in its A
blaze view of 1RB1LC_1RC1LB_1LD0RB_0LE1RD_---0LF_0LA1LF
763 rows of 131,072 steps · 116 columns, every cell · nonzeros 76 at 1e8
this machine (#12b), from blank in its A = #12's B
blaze view of 1RB1LA_1LC0RA_0LD1RC_---0LE_0LF1LE_1RF1LB
763 rows of 131,072 steps · 115 columns, every cell · nonzeros 75 at 1e8
bbchallenge-blazeStart blankRows steps 0 → 1e8Window the visited spanColors 1 0 at the sampled cell
Rows: one snapshot per row (Blaze time blocks), stretched to 500 px · Window: every k-th cell sampled, stretched to 800 px
tools/diagram.py <tm> --mode blaze --speed --as-site --steps 1e8

Trajectory numbers, from blank (C core)

✓ trajectory twin: within 2.2% at 1e9 (cells -1, nonzeros -2); the offset stays within 2 at every checkpoint instead of growing

stepscells visited (hi − lo + 1)nonzeros
#12thisratio (Δ)#12thisratio (Δ)
1e556550.9821 (-1)35351.0000 (+0)
1e674730.9865 (-1)48460.9583 (-2)
1e792910.9891 (-1)61590.9672 (-2)
1e81161150.9914 (-1)76750.9868 (-1)
1e91341330.9925 (-1)89870.9775 (-2)

Each machine from blank in its own start state, sim.py C core. Trajectory twin = cells and nonzeros stay within 16 of the parent's at every checkpoint (a fixed offset from a different start, not a growing gap). Cached in img/vs-parent.json (2026-10-16 10:29 PDT); --force recomputes.

3Where it came fromCheck: the template is the one you expect, and the measured reuse (tiles, the reuse figure, diff) agrees with what the README says was kept and changed (quoted).
twin: parent kill's .v #12's kill file (kill 5) machines/1RB1LC_1RC1LB_1LD0RB_0LE1RD_---0LF_0LA1LF/1RB1LC_1RC1LB_1LD0RB_0LE1RD_---0LF_0LA1LF.v · detected from status.json
95%of our lines identical to the template
18changed lines
19added lines (ours only)
4template lines dropped
98 / 7 / 1items identical / adapted / new
What the package README says it reused and changed (submission/README.md line 17, Template and what changed), quoted:

This extends kill #12's .v (876 lines; in #12's own package). The changes:

  • the tm string;
  • the head state <{{A}} becomes <{{F}} (9 places: tR1, tR3, tR2, tR3c and conf);
  • the new Ep_tm2;
  • init's target, and nonhalt's C and top step;
  • the comments.

The proof text differs in 4 lines plus the one new lemma, and the file compiled on the first try. It is a direct proof on the holdout string and does not use TM113.eqv. The file is 896 lines and imports only Individual62 from busycoq.

Fig P3 · Reuse of the template, line by line and by name

Top two bars: non-blank lines after the TM string is replaced by <TM> and whitespace is collapsed. Bottom bar: our Definitions/Lemmas/… by name.

ours 766 lines
95% identical · 18 changed · 19 added
template 751 lines
97% kept verbatim · 4 not in ours
our items 106
98 identical · 7 adapted · 1 new · 0 template-only
identicalchanged / adaptedours only (new)template only
Template part: whole file, lines 15–876 (leading comment left out). Ours: lines 19–896 (header comment 1–18 left out). Line diff: Python difflib SequenceMatcher; inside a replaced block, line pairs at least 75% alike count as changed, the rest as removed + added.
Side-by-side diff: template (751 lines) vs ours (766 lines), 41 lines differ; runs of identical lines and long template-only runs folded
identicalequal once each TM string is <TM>changedours onlytemplate only
templateours
16From BusyCoq Require Import Individual62.20From BusyCoq Require Import Individual62.
17Require Import Lia.21Require Import Lia.
⋯ 6 identical lines (template 18–25, ours 22–29)
26Notation "c -->+ c'" := (c -[ tm ]->+ c') (at level 40).30Notation "c -->+ c'" := (c -[ tm ]->+ c') (at level 40).
28Open Scope list.32Open Scope list.
30(* R1: l 1^(n+2) <A 0 1^(m+1) 0 0 1^x 0 r --> l 1^(n+1) 0 1^(m+1) <A 0 1^(x+1) 0 0 r *)34(* R1: l 1^(n+2) <F 0 1^(m+1) 0 0 1^x 0 r --> l 1^(n+1) 0 1^(m+1) <F 0 1^(x+1) 0 0 r *)
31Lemma tR1 n m x l r :35Lemma tR1 n m x l r :
32 l <* [1]^^(S (S n)) <{{A}} [0] *> [1]^^(S m) *> [0;0] *> [1]^^x *> [0] *> r -->+36 l <* [1]^^(S (S n)) <{{F}} [0] *> [1]^^(S m) *> [0;0] *> [1]^^x *> [0] *> r -->+
33 l <* [1]^^(S n) <* [0] <* [1]^^(S m) <{{A}} [0] *> [1]^^(S x) *> [0;0] *> r.37 l <* [1]^^(S n) <* [0] <* [1]^^(S m) <{{F}} [0] *> [1]^^(S x) *> [0;0] *> r.
34Proof. es. Qed.38Proof. es. Qed.
36(* R3: l 0 <A 0 1^(k+1) 0 0 1^m 0 r --> l 1^(k+2) <A 0 1^(m+1) 0 0 r *)40(* R3': l 0 <F 0 1^(k+1) 0 0 1^m 0 r --> l 1^(k+2) <F 0 1^(m+1) 0 0 r
41 (detour F0 F0 F1 B1 A1 A0, then #12's R3 tail; 4 more steps than #12) *)
37Lemma tR3 k m l r :42Lemma tR3 k m l r :
38 l <* [0] <{{A}} [0] *> [1]^^(S k) *> [0;0] *> [1]^^m *> [0] *> r -->+43 l <* [0] <{{F}} [0] *> [1]^^(S k) *> [0;0] *> [1]^^m *> [0] *> r -->+
39 l <* [1]^^(S (S k)) <{{A}} [0] *> [1]^^(S m) *> [0;0] *> r.44 l <* [1]^^(S (S k)) <{{F}} [0] *> [1]^^(S m) *> [0;0] *> r.
40Proof. es. Qed.45Proof. es. Qed.
42(* R2: l 0 1^(k+1) 0 1 <A 0 r --> l <A 0 1^(k+2) 0 0 r *)47(* R2: l 0 1^(k+1) 0 1 <F 0 r --> l <F 0 1^(k+2) 0 0 r *)
43Lemma tR2 k l r :48Lemma tR2 k l r :
44 l <* [0] <* [1]^^(S k) <* [0] <* [1] <{{A}} [0] *> r -->+49 l <* [0] <* [1]^^(S k) <* [0] <* [1] <{{F}} [0] *> r -->+
45 l <{{A}} [0] *> [1]^^(S (S k)) *> [0;0] *> r.50 l <{{F}} [0] *> [1]^^(S (S k)) *> [0;0] *> r.
46Proof. es. Qed.51Proof. es. Qed.
48Lemma tR3c k m r :53Lemma tR3c k m r :
49 const 0 <{{A}} [0] *> [1]^^(S k) *> [0;0] *> [1]^^m *> [0] *> r -->+54 const 0 <{{F}} [0] *> [1]^^(S k) *> [0;0] *> [1]^^m *> [0] *> r -->+
50 const 0 <* [1]^^(S (S k)) <{{A}} [0] *> [1]^^(S m) *> [0;0] *> r.55 const 0 <* [1]^^(S (S k)) <{{F}} [0] *> [1]^^(S m) *> [0;0] *> r.
51Proof. rewrite (const_unfold _ S0) at 1. es. Qed.56Proof. rewrite (const_unfold _ S0) at 1. es. Qed.
53(* ---------- tape encoding of the run model ---------- *)58(* ---------- tape encoding of the run model ---------- *)
⋯ 14 identical lines (template 54–69, ours 59–74)
70 | c :: g :: R' => [1]^^c *> [0]^^g *> rside R'75 | c :: g :: R' => [1]^^c *> [0]^^g *> rside R'
71 end.76 end.
73Definition conf (L R : list nat) : Q * tape := lside L <{{A}} [0] *> rside R.78Definition conf (L R : list nat) : Q * tape := lside L <{{F}} [0] *> rside R.
75Lemma c0_1 : 0 >> const 0 = const 0.80Lemma c0_1 : 0 >> const 0 = const 0.
76Proof. symmetry. apply const_unfold. Qed.81Proof. symmetry. apply const_unfold. Qed.
⋯ 119 identical lines (template 78–209, ours 83–214)
210 intros z Hz. destruct z as [|z]; [lia|].215 intros z Hz. destruct z as [|z]; [lia|].
211 replace (S z - S c + 1) with (z - c + 1) by lia. eapply L_cpp; eauto; [lia | apply Hm; lia].216 replace (S z - S c + 1) with (z - c + 1) by lia. eapply L_cpp; eauto; [lia | apply Hm; lia].
217Qed.
219(* the twin's edge frame has value 3 (budget 2): an epoch of cost 2 runs at z = 3
220 (proof.md section 5, budget-2 edge lemma) *)
221Lemma Ep_tm2 W W' : Ep W 2 W' -> conf [] (2 :: 2 :: W) -->+ conf [] (2 :: 2 :: W').
222Proof.
223 intros (R0 & Hu & HL).
224 destruct (Life_shape _ _ _ HL 2 _ eq_refl) as (W'' & E & Hc & Hm).
225 inversion E; subst.
226 eapply progress_trans. { apply push0_ok; [exact Hu | lia]. }
227 exact (Life_tm _ _ _ (Hm 3 ltac:(lia)) []).
212Qed.228Qed.
214Definition bump (o : outcome) : outcome :=230Definition bump (o : outcome) : outcome :=
⋯ 533 identical lines (template 215–824, ours 231–840)
825Qed.841Qed.
827(* ---------- top level ---------- *)843(* ---------- top level ---------- *)
828Lemma init : c0 -->* conf [] [3; 2; 1].844Lemma init : c0 -->* conf [] [2; 2; 1].
829Proof. unfold conf, lside, rside. cbn [lpow app]. solve_init. Qed.845Proof. unfold conf, lside, rside. cbn [lpow app]. solve_init. Qed.
831Lemma nonhalt: ~halts tm c0.847Lemma nonhalt: ~halts tm c0.
832Proof.848Proof.
833 eapply multistep_nonhalt; [apply init |].849 eapply multistep_nonhalt; [apply init |].
834 apply (progress_nonhalt_cond tm (nat * list nat) (0, [1]) (fun i => conf [] (3 :: 2 :: snd i))850 apply (progress_nonhalt_cond tm (nat * list nat) (0, [1]) (fun i => conf [] (2 :: 2 :: snd i))
835 (fun i => Orb [] (fst i) (snd i) /\ (1 <= fst i -> Inv [] (fst i) (snd i)))).851 (fun i => Orb [] (fst i) (snd i) /\ (1 <= fst i -> Inv [] (fst i) (snd i)))).
836 - intros [n W] [HO HI]. cbn [fst snd] in *.852 - intros [n W] [HO HI]. cbn [fst snd] in *.
837 destruct (step_lemma n (main n) [] n W ltac:(cbn; lia) I HO HI) as (W' & HE & HI').853 destruct (step_lemma n (main n) [] n W ltac:(cbn; lia) I HO HI) as (W' & HE & HI').
838 exists (S n, W'). cbn [fst snd]. split.854 exists (S n, W'). cbn [fst snd]. split.
839 + apply Ep_tm in HE. replace (cost [] n) with 2 in HE by reflexivity. exact HE.855 + replace (cost [] n) with 2 in HE by reflexivity. exact (Ep_tm2 _ _ HE).
840 + split; [econstructor; eauto | intros; exact HI'].856 + split; [econstructor; eauto | intros; exact HI'].
841 - cbn [fst snd]. split; [exact (O0 []) | lia].857 - cbn [fst snd]. split; [exact (O0 []) | lia].
⋯ 2 identical lines (template 842–845, ours 858–861)
846```862```
8471RB1LC_1RC1LB_1LD0RB_0LE1RD_---0LF_0LA1LF8631RB1LA_1LC0RA_0LD1RC_---0LE_0LF1LE_1RF1LB
849conf L R := 0^inf 1^a_1 0 1^a_2 0 .. 0 1^a_p <A 0 1^c_1 0^g_1 1^c_2 .. 1^c_r 0^inf865conf L R := 0^inf 1^a_1 0 1^a_2 0 .. 0 1^a_p <F 0 1^c_1 0^g_1 1^c_2 .. 1^c_r 0^inf
850 (L = [a_p; ..; a_1] top first, R = [c_1; g_1; c_2; ..; c_r])866 (L = [a_p; ..; a_1] top first, R = [c_1; g_1; c_2; ..; c_r])
851tR1 l 1^(n+2) <A 0 1^(m+1) 0 0 1^x 0 r -->+ l 1^(n+1) 0 1^(m+1) <A 0 1^(x+1) 0 0 r867tR1 l 1^(n+2) <F 0 1^(m+1) 0 0 1^x 0 r -->+ l 1^(n+1) 0 1^(m+1) <F 0 1^(x+1) 0 0 r
852tR3 l 0 <A 0 1^(k+1) 0 0 1^m 0 r -->+ l 1^(k+2) <A 0 1^(m+1) 0 0 r868tR3 l 0 <F 0 1^(k+1) 0 0 1^m 0 r -->+ l 1^(k+2) <F 0 1^(m+1) 0 0 r (3k+2m+15 steps:
853tR2 l 0 1^(k+1) 0 1 <A 0 r -->+ l <A 0 1^(k+2) 0 0 r
869 detour F0 F0 F1 B1 A1 A0, then #12's R3 tail)
870tR2 l 0 1^(k+1) 0 1 <F 0 r -->+ l <F 0 1^(k+2) 0 0 r
854push conf (x::L) (h::R') -->+ conf (h::x-1::L) (updt R') x >= 2 (tR1)871push conf (x::L) (h::R') -->+ conf (h::x-1::L) (updt R') x >= 2 (tR1)
855push0 conf [] (h::R') -->+ conf [h+1] (updt R') (tR3)872push0 conf [] (h::R') -->+ conf [h+1] (updt R') (tR3)
856pop conf (1::y::L) R -->+ conf L (y+1::2::R) y >= 1 (tR2)873pop conf (1::y::L) R -->+ conf L (y+1::2::R) y >= 1 (tR2)
857updt [] = [1], updt [2;c] = [c+1], updt (2::c::g::R) = c+1::g+1::R, updt (g::R) = 1::g-1::R (g >= 3)874updt [] = [1], updt [2;c] = [c+1], updt (2::c::g::R) = c+1::g+1::R, updt (g::R) = 1::g-1::R (g >= 3)
859Edge W := conf [] (3::2::W); Ep W c W' : Edge W -->+ conf [] (5-c::2::W')
876Ep W c W' : conf [] (3::2::W) -->+ conf [] (5-c::2::W') (edge frame of value 4, as in #12)
877Ep_tm2 : Ep W 2 W' -> conf [] (2::2::W) -->+ conf [] (2::2::W')
878 (edge frame of value 3: Life_shape at z = 3, push0 at h = 2, Life_tm at L = [])
860U0 Ep [1] = (2, [2;2;1])879U0 Ep [1] = (2, [2;2;1])
861U1 Ep (1::g::rest) = (2, 2::2::1::g-2::rest) g >= 4880U1 Ep (1::g::rest) = (2, 2::2::1::g-2::rest) g >= 4
⋯ 9 identical lines (template 862–870, ours 881–889)
871 Q = Qi ++ Qe, |Qi| = b+1-a+[k in P], every q in Qi <= a-2-[k in P],890 Q = Qi ++ Qe, |Qi| = b+1-a+[k in P], every q in Qi <= a-2-[k in P],
872 Qe = the indices of P above k, each shifted by a-k-3891 Qe = the indices of P above k, each shifted by a-k-3
873start: c0 -->* Edge [1] = Edge (O_0([])) (50 steps)
892start: c0 -->* conf [] [2;2;1] = conf [] (2::2::O_0([])) (48 steps)
874top: O_n([]) has no markers, so Edge (O_n([])) -->+ Edge (O_(n+1)([])) for every n
893top: O_n([]) has no markers, so every epoch costs exactly 2 and
894 conf [] (2::2::O_n([])) -->+ conf [] (2::2::O_(n+1)([])) for every n
875```895```
876*)896*)
4Proof outlineCheck: the new items (green) carry the argument; the names read like the proof.md rules.

106 items in 1RB1LA_1LC0RA_0LD1RC_---0LE_0LF1LE_1RF1LB.v (896 lines): 81 Lemma, 16 Definition, 5 Fixpoint, 3 Inductive, 1 Theorem. Tags against the template: identical = same name and same text once each file's own TM string is <TM> (marked "except the TM string" when that is the only difference); adapted = same name, different text; new = no item of that name in the template part.

#kindnamestatement (no proof body)linevs template
1Definitiontm
Definition tm := Eval compute in (TM_from_str "1RB1LA_1LC0RA_0LD1RC_---0LE_0LF1LE_1RF1LB").
L26identicalexcept the TM string
2LemmatR1
Lemma tR1 n m x l r :
l <* [1]^^(S (S n)) <{{F}} [0] *> [1]^^(S m) *> [0;0] *> [1]^^x *> [0] *> r -->+
l <* [1]^^(S n) <* [0] <* [1]^^(S m) <{{F}} [0] *> [1]^^(S x) *> [0;0] *> r.
L35adapted
3LemmatR3
Lemma tR3 k m l r :
l <* [0] <{{F}} [0] *> [1]^^(S k) *> [0;0] *> [1]^^m *> [0] *> r -->+
l <* [1]^^(S (S k)) <{{F}} [0] *> [1]^^(S m) *> [0;0] *> r.
L42adapted
4LemmatR2
Lemma tR2 k l r :
l <* [0] <* [1]^^(S k) <* [0] <* [1] <{{F}} [0] *> r -->+
l <{{F}} [0] *> [1]^^(S (S k)) *> [0;0] *> r.
L48adapted
5LemmatR3c
Lemma tR3c k m r :
const 0 <{{F}} [0] *> [1]^^(S k) *> [0;0] *> [1]^^m *> [0] *> r -->+
const 0 <* [1]^^(S (S k)) <{{F}} [0] *> [1]^^(S m) *> [0;0] *> r.
L53adapted
6Fixpointlsep
Fixpoint lsep (L : list nat) : side :=
match L with
| [] => const 0
| y :: L' => lsep L' <* [1]^^y <* [0]
end.
L59identical
7Definitionlside
Definition lside (L : list nat) : side :=
match L with
| [] => const 0
| x :: L' => lsep L' <* [1]^^x
end.
L65identical
8Fixpointrside
Fixpoint rside (R : list nat) : side :=
match R with
| [] => const 0
| [c] => [1]^^c *> const 0
| c :: g :: R' => [1]^^c *> [0]^^g *> rside R'
end.
L71identical
9Definitionconf
Definition conf (L R : list nat) : Q * tape := lside L <{{F}} [0] *> rside R.
L78adapted
10Lemmac0_1
Lemma c0_1 : 0 >> const 0 = const 0.
L80identical
11Lemmalsep_eq
Lemma lsep_eq L : lsep L = lside L <* [0].
L83identical
12Definitionupdt
Definition updt (R' : list nat) : option (list nat) :=
match R' with
| [] => Some [1]
| g :: R'' =>
  match g with
  | 0 | 1 => None
… +11 lines
L91identical
13Lemmaupdt_shape
Lemma updt_shape m R' R1 : updt R' = Some R1 ->
exists x r, rside (S m :: R') = [S1]^^(S m) *> [S0;S0] *> [S1]^^x *> [S0] *> r /\
            rside R1 = [S1]^^(S x) *> [S0;S0] *> r.
L109identical
14Lemmapush_ok
Lemma push_ok y h R' R1 L : updt R' = Some R1 -> 1 <= y -> 1 <= h ->
conf (S y :: L) (h :: R') -->+ conf (h :: y :: L) R1.
L123identical
15Lemmapush0_ok
Lemma push0_ok h R' R1 : updt R' = Some R1 -> 1 <= h ->
conf [] (h :: R') -->+ conf [S h] R1.
L133identical
16Lemmapop_ok
Lemma pop_ok y L R : 1 <= y -> conf (1 :: y :: L) R -->+ conf L (S y :: 2 :: R).
L143identical
17Inductiveoutcome
Inductive outcome := Fin (R : list nat) | Pop (c : nat) (R : list nat).
L153identical
18InductiveLife
Inductive Life : nat -> list nat -> outcome -> Prop :=
| L_fin R : Life 1 R (Fin R)
| L_cf y h R' R1 Rc : 1 <= y -> updt R' = Some R1 -> Life h R1 (Fin Rc) ->
    Life (S y) (h :: R') (Pop 1 (S y :: 2 :: Rc))
| L_cpf y h R' R1 c' R2 Rf : 1 <= y -> updt R' = Some R1 -> Life h R1 (Pop c' R2) ->
    Life y R2 (Fin Rf) -> Life (S y) (h :: R') (Fin Rf)
… +2 lines
L159identical
19LemmaLife_pos
Lemma Life_pos x R o : Life x R o -> 1 <= x.
L168identical
20LemmaLife_tm
Lemma Life_tm x R o : Life x R o -> forall L,
match o with
| Fin Rf => conf (x :: L) R -->* conf (1 :: L) Rf
| Pop _ Rf => conf (x :: L) R -->+ conf L Rf
end.
L171identical
21DefinitionEp
Definition Ep (W : list nat) (c : nat) (W' : list nat) : Prop :=
exists R0, updt (2 :: W) = Some R0 /\ Life 4 R0 (Pop c ((5 - c) :: 2 :: W')).
L194identical
22LemmaEp_tm
Lemma Ep_tm W c W' : Ep W c W' -> conf [] (3 :: 2 :: W) -->+ conf [] ((5 - c) :: 2 :: W').
L197identical
23LemmaLife_shape
Lemma Life_shape x R o : Life x R o -> forall c Rf, o = Pop c Rf ->
exists W', Rf = (x - c + 1) :: 2 :: W' /\ c + 1 <= x /\
  forall z, c + 1 <= z -> Life z R (Pop c ((z - c + 1) :: 2 :: W')).
L204identical
24LemmaEp_tm2
Lemma Ep_tm2 W W' : Ep W 2 W' -> conf [] (2 :: 2 :: W) -->+ conf [] (2 :: 2 :: W').
L221new
25Definitionbump
Definition bump (o : outcome) : outcome :=
match o with Fin W => Fin W | Pop c W => Pop (S c) W end.
L230identical
26LemmaL_cp
Lemma L_cp y h R' R1 c' R2 o : 1 <= y -> updt R' = Some R1 -> Life h R1 (Pop c' R2) ->
Life y R2 o -> Life (S y) (h :: R') (bump o).
L233identical
27Lemmaupdt_cons2
Lemma updt_cons2 W R0 : updt (2 :: W) = Some R0 -> exists c2 W1, W = c2 :: W1.
L237identical
28Lemmaframe_step
Lemma frame_step y z W c W' o y' z' : Ep W c W' -> 2 <= y -> c + 1 <= z ->
y' = y - 1 -> z' = z - c + 1 ->
Life y' (z' :: 2 :: W') o -> Life y (z :: 2 :: W) (bump o).
L241identical
29Definitiontail_ok
Definition tail_ok (N : list nat) : Prop := N = [] \/ exists g rest, N = S (S g) :: rest.
L264identical
30LemmaU0
Lemma U0 : Ep [1] 2 [2;2;1].
L266identical
31LemmaU1
Lemma U1 g rest : Ep (1 :: S (S (S (S g))) :: rest) 2 (2 :: 2 :: 1 :: S (S g) :: rest).
L269identical
32LemmaU2
Lemma U2 b N : tail_ok N -> Ep (1 :: 2 :: S b :: N) 2 (S (S (S b)) :: 2 :: 1 :: N).
L272identical
33LemmaruleS
Lemma ruleS a b N : tail_ok N ->
Ep (2 :: 2 :: S a :: 2 :: S b :: N) 2 (S (S a) :: 2 :: S (S (S b)) :: 2 :: 1 :: N).
L275identical
34LemmaTRF
Lemma TRF a b N Rc : tail_ok N -> 2 <= a ->
Life a (S (S (S b)) :: 2 :: 1 :: N) (Fin Rc) -> Ep (a :: 2 :: S b :: N) 2 Rc.
L279identical
35LemmaXin0
Lemma Xin0 a'' b'' : 1 <= a'' ->
Life 2 [2; 2; a''; 2; b''] (Pop 1 [2; 2; S a''; 2; S b'']).
L283identical
36LemmaXin1
Lemma Xin1 a'' b'' g rest : 1 <= a'' ->
Life 2 (2 :: 2 :: a'' :: 2 :: b'' :: S g :: rest) (Pop 1 (2 :: 2 :: S a'' :: 2 :: S b'' :: S (S g) :: rest)).
L287identical
37LemmaTRX0
Lemma TRX0 a b N c a'' b'' : tail_ok N -> 2 <= a ->
Life a (S (S (S b)) :: 2 :: 1 :: N) (Pop c [2; 2; S a''; 2; S b'']) ->
Ep (a :: 2 :: S b :: N) 3 [S (S a''); 2; S (S b'')].
L291identical
38LemmaTRX1
Lemma TRX1 a b N c a'' b'' g rest : tail_ok N -> 2 <= a ->
Life a (S (S (S b)) :: 2 :: 1 :: N) (Pop c (2 :: 2 :: S a'' :: 2 :: S b'' :: S g :: rest)) ->
Ep (a :: 2 :: S b :: N) 3 (S (S a'') :: 2 :: S (S b'') :: S (S g) :: rest).
L296identical
39Fixpointmwf
Fixpoint mwf (s : nat) (P : list nat) : list nat :=
match P with
| [] => []
| p :: P' => (p - s + 1) :: 1 :: mwf p P'
end.
L304identical
40Definitionmw
Definition mw (P : list nat) : list nat := mwf 0 P.
L309identical
41Fixpointvalid_from
Fixpoint valid_from (s : nat) (P : list nat) : Prop :=
match P with
| [] => True
| p :: P' => (exists t, p = s + 2 * t + 1) /\ valid_from p P'
end.
L312identical
42Definitionvalid
Definition valid (P : list nat) : Prop := valid_from 0 P.
L317identical
43Definitioncnt
Definition cnt (Q : list nat) (n : nat) : nat := length (filter (fun q => q <? n) Q).
L319identical
44Definitionind
Definition ind (Q : list nat) (n : nat) : nat := cnt Q (S n) - cnt Q n.
L320identical
45Definitioncost
Definition cost (Q : list nat) (n : nat) : nat := 2 + ind Q n.
L321identical
46InductiveOrb
Inductive Orb (Q : list nat) : nat -> list nat -> Prop :=
| O0 : Orb Q 0 (1 :: mw Q)
| OS n W W' : Orb Q n W -> Ep W (cost Q n) W' -> Orb Q (S n) W'.
L323identical
47Fixpointbumpn
Fixpoint bumpn (k : nat) (o : outcome) : outcome :=
match k with 0 => o | S k => bumpn k (bump o) end.
L327identical
48Lemmabumpn_fin
Lemma bumpn_fin k W : bumpn k (Fin W) = Fin W.
L330identical
49Lemmabumpn_pop
Lemma bumpn_pop k c W : bumpn k (Pop c W) = Pop (k + c) W.
L333identical
50Lemmacnt_0
Lemma cnt_0 Q : cnt Q 0 = 0.
L336identical
51Lemmacnt_mono
Lemma cnt_mono Q n : cnt Q n <= cnt Q (S n).
L339identical
52Lemmacnt_mono'
Lemma cnt_mono' Q n m : n <= m -> cnt Q n <= cnt Q m.
L345identical
53Lemmareplay
Lemma replay Q k Wk : Orb Q k Wk -> forall y z o, k + 1 <= y -> (k = 0 \/ k + 2 + cnt Q k <= z) ->
Life (y - k) ((z - k - cnt Q k) :: 2 :: Wk) o -> Life y (z :: 2 :: 1 :: mw Q) (bumpn k o).
L348identical
54Lemmamw_tail_ok
Lemma mw_tail_ok Q : valid Q -> tail_ok (mw Q).
L358identical
55LemmaruleT
Lemma ruleT a b Q W' : Orb Q (a - 1) W' -> 2 <= a -> 1 <= b -> valid Q ->
a - 1 + cnt Q (a - 1) <= b ->
Ep (a :: 2 :: b :: mw Q) 2 ((b + 3 - a - cnt Q (a - 1)) :: 2 :: W').
L364identical
56Lemmamwf_shift
Lemma mwf_shift s k P : mwf (s + k) (map (fun p => p + k) P) = mwf s P.
L377identical
57LemmaruleX
Lemma ruleX a b Q a'' Q'' : Orb Q (a - 2) (a'' :: 2 :: b :: mw Q'') -> 3 <= a -> 1 <= b ->
1 <= a'' -> valid Q -> valid Q'' -> b = a - 2 + cnt Q (a - 2) ->
Ep (a :: 2 :: b :: mw Q) 3 (S (S a'') :: 2 :: S (S b) :: mw (map (fun q => q + 2) Q'')).
L383identical
58Lemmavalid_gt
Lemma valid_gt s P : valid_from s P -> Forall (fun p => s < p) P.
L406identical
59Lemmacnt_cons_lt
Lemma cnt_cons_lt q Q n : q < n -> cnt (q :: Q) n = S (cnt Q n).
L413identical
60Lemmacnt_cons_ge
Lemma cnt_cons_ge q Q n : n <= q -> cnt (q :: Q) n = cnt Q n.
L416identical
61Lemmacnt_app
Lemma cnt_app X Y n : cnt (X ++ Y) n = cnt X n + cnt Y n.
L419identical
62Lemmacnt_all_lt
Lemma cnt_all_lt X n : Forall (fun q => q < n) X -> cnt X n = length X.
L422identical
63Lemmacnt_all_ge
Lemma cnt_all_ge X n : Forall (fun q => n <= q) X -> cnt X n = 0.
L428identical
64Lemmacnt_S_nin
Lemma cnt_S_nin Q n : ~ In n Q -> cnt Q (S n) = cnt Q n.
L434identical
65Lemmacnt_S_in
Lemma cnt_S_in s Q n : valid_from s Q -> In n Q -> cnt Q (S n) = S (cnt Q n).
L444identical
66Lemmaind_in
Lemma ind_in Q n : valid Q -> In n Q -> ind Q n = 1.
L454identical
67Lemmaind_nin
Lemma ind_nin Q n : ~ In n Q -> ind Q n = 0.
L457identical
68Lemmaind_iff
Lemma ind_iff P Q k k' : valid P -> valid Q -> (In k P <-> In k' Q) -> ind P k = ind Q k'.
L460identical
69Lemmaparity_in
Lemma parity_in s P n : valid_from s P -> In n P -> exists u, n + cnt P n + s = 2 * u + 1.
L467identical
70Lemmafilter_lt_app
Lemma filter_lt_app X Y k : Forall (fun q => q <= k) X ->
filter (fun q => k <? q) (X ++ Y) = filter (fun q => k <? q) Y.
L479identical
71Lemmafilter_filter_lt
Lemma filter_filter_lt P k k' : k <= k' ->
filter (fun p => k' <? p) (filter (fun p => k <? p) P) = filter (fun p => k' <? p) P.
L487identical
72Lemmafilter_all
Lemma filter_all P k : Forall (fun p => k < p) P -> filter (fun p => k <? p) P = P.
L494identical
73Lemmafilter_gt
Lemma filter_gt P k p : In p (filter (fun p => k <? p) P) -> k < p.
L500identical
74Lemmafilter_in
Lemma filter_in P k p : k < p -> (In p (filter (fun p => k <? p) P) <-> In p P).
L503identical
75Lemmafilter_cnt_len
Lemma filter_cnt_len P n : length (filter (fun p => n <? p) P) + cnt P (S n) = length P.
L508identical
76DefinitionSh
Definition Sh (u v : nat) (Q P : list nat) : Prop := Forall2 (fun q p => q + u = p + v) Q P.
L517identical
77LemmaSh_len
Lemma Sh_len u v Q P : Sh u v Q P -> length Q = length P.
L519identical
78LemmaSh_eq
Lemma Sh_eq u v u' v' Q P : Sh u v Q P -> u = u' -> v = v' -> Sh u' v' Q P.
L522identical
79LemmaSh_filter
Lemma Sh_filter u v Q P k k' : Sh u v Q P -> k + u = k' + v ->
Sh u v (filter (fun q => k <? q) Q) (filter (fun p => k' <? p) P).
L525identical
80LemmaSh_in
Lemma Sh_in u v Q P k k' : Sh u v Q P -> k + u = k' + v -> (In k Q <-> In k' P).
L534identical
81LemmaSh_trans
Lemma Sh_trans u1 v1 u2 v2 u v w X Y Z : Sh u1 v1 X Y -> Sh u2 v2 Y Z ->
u1 + u2 = u + w -> v1 + v2 = v + w -> Sh u v X Z.
L540identical
82LemmaSh_map
Lemma Sh_map u v d Q P : Sh u v Q P -> Sh u (v + d) (map (fun q => q + d) Q) P.
L547identical
83LemmaSh_unmap
Lemma Sh_unmap v k P : Forall (fun p => k <= p) P -> Sh (v + k) v (map (fun p => p - k) P) P.
L550identical
84LemmaSh_ge
Lemma Sh_ge u v Q P k k' : Sh u v Q P -> (forall p, In p P -> k' <= p) -> k + u <= k' + v ->
Forall (fun q => k <= q) Q.
L553identical
85Lemmavalid_shift
Lemma valid_shift s k P : valid_from s P -> valid_from (s + k) (map (fun p => p + k) P).
L561identical
86Lemmavalid_map2
Lemma valid_map2 s P : valid_from s P -> valid_from s (map (fun p => p + 2) P).
L567identical
87Lemmavalid_cons1
Lemma valid_cons1 Q : valid Q -> valid (1 :: map (fun q => q + 1) Q).
L573identical
88Lemmavalid_unshift
Lemma valid_unshift s k P : valid_from (s + k) P -> valid_from s (map (fun p => p - k) P).
L576identical
89Lemmavalid_app_l
Lemma valid_app_l X Y : valid (X ++ Y) -> Forall (fun q => 1 <= q) X.
L583identical
90Lemmamwf_unshift
Lemma mwf_unshift s k P : k <= s -> Forall (fun p => k <= p) P ->
mwf (s - k) (map (fun p => p - k) P) = mwf s P.
L589identical
91Lemmamw_cons1
Lemma mw_cons1 Q : 2 :: 1 :: mw Q = mw (1 :: map (fun q => q + 1) Q).
L596identical
92Lemmavalid_tail_ok
Lemma valid_tail_ok s P : valid_from s P -> tail_ok (mwf s P).
L599identical
93Lemmacnt1_valid
Lemma cnt1_valid P : valid P -> cnt P 1 = 0.
L605identical
94Lemmain_transfer
Lemma in_transfer Qi Qe P k k' u v kf : Forall (fun q => q < k) Qi ->
Sh u v Qe (filter (fun p => kf <? p) P) -> k + u = k' + v -> kf < k' ->
(In k (Qi ++ Qe) <-> In k' P).
L610identical
95Lemmash_compose
Lemma sh_compose Qi Qe Qe' P n a a' k k' : Forall (fun q => q <= k) Qi -> n <= k' ->
k + (n + 3) = k' + a ->
Sh (k + 3) a' Qe' (filter (fun q => k <? q) (Qi ++ Qe)) ->
Sh (n + 3) a Qe (filter (fun p => n <? p) P) ->
Sh (k' + 3) a' Qe' (filter (fun p => k' <? p) P).
L619identical
96DefinitionCore
Definition Core (P : list nat) (k a b : nat) (Q : list nat) : Prop :=
valid Q /\ 2 <= a /\ exists Qi Qe, Q = Qi ++ Qe /\ length Qi + a = b + 1 + ind P k /\
  Forall (fun q => q + 2 + ind P k <= a) Qi /\ Sh (k + 3) a Qe (filter (fun p => k <? p) P).
L634identical
97DefinitionInv
Definition Inv (P : list nat) (n : nat) (W : list nat) : Prop :=
(Nat.Odd (n + cnt P n) /\ exists a Q, W = a :: 2 :: (n + cnt P n) :: mw Q /\
   Core P n a (n + cnt P n) Q) \/
(Nat.Even (n + cnt P n) /\ exists a Q, W = 2 :: 2 :: a :: 2 :: (n + cnt P n - 1) :: mw Q /\
   Core P (S n) a (n + cnt P n - 1) Q).
L639identical
98DefinitionClaim
Definition Claim (Lm : nat) : Prop :=
forall Q k, k + length Q <= Lm -> valid Q -> exists W, Orb Q k W /\ (1 <= k -> Inv Q k W).
L645identical
99LemmastepU
Lemma stepU P : valid P -> exists W', Ep (1 :: mw P) (cost P 0) W' /\ Inv P 1 W'.
L648identical
100LemmastepS
Lemma stepS P n a Q : valid P -> 1 <= n -> Nat.Even (n + cnt P n) ->
Core P (S n) a (n + cnt P n - 1) Q ->
exists W', Ep (2 :: 2 :: a :: 2 :: (n + cnt P n - 1) :: mw Q) (cost P n) W' /\ Inv P (S n) W'.
L694identical
101LemmastepT_nabs
Lemma stepT_nabs Lm P n a Q : Claim Lm -> valid P -> 1 <= n -> n + length P <= Lm ->
Nat.Odd (n + cnt P n) -> ~ In n P -> Core P n a (n + cnt P n) Q ->
exists W', Ep (a :: 2 :: (n + cnt P n) :: mw Q) (cost P n) W' /\ Inv P (S n) W'.
L725identical
102LemmastepT_abs
Lemma stepT_abs Lm P n a Q : Claim Lm -> valid P -> 1 <= n -> n + length P <= Lm ->
Nat.Odd (n + cnt P n) -> In n P -> Core P n a (n + cnt P n) Q ->
exists W', Ep (a :: 2 :: (n + cnt P n) :: mw Q) (cost P n) W' /\ Inv P (S n) W'.
L770identical
103Lemmastep_lemma
Lemma step_lemma Lm : Claim Lm -> forall P n W, n + length P <= Lm -> valid P -> Orb P n W ->
(1 <= n -> Inv P n W) -> exists W', Ep W (cost P n) W' /\ Inv P (S n) W'.
L819identical
104Theoremmain
Theorem main Lm : Claim Lm.
L832identical
105Lemmainit
Lemma init : c0 -->* conf [] [2; 2; 1].
L844adapted
106Lemmanonhalt
Lemma nonhalt: ~halts tm c0.
L847adapted
5What a maintainer readsCheck: the rule table below is what the .v proves, and proof.md / README read cleanly for a maintainer.
submission/proof.md line 38: 2. Changed rule: R3 becomes R3' (the only TM-level change)

Where A0 is read. By Lemma RM (P§1.1) and the initial segment (§4, whose first 8 steps use no A0), the whole run splits into the macro rules of P§1. Each of them is a fixed transition sequence, listed in P§1. A0 occurs in exactly one of these sequences: as the first transition of R3. R1, R2 and R2e start with A1, and so does HALT. CW, DW and FW use C1/B1/B0, D1 and F1. Every other transition is the same in both machines under σ. So changing A0 changes R3 and nothing else.

Why this is so: in the parent, A is entered only by F0 = 0LA [twin E0 = 0LF], the last transition of every macro rule. A then reads the last cell of lside L. That cell is a 1 when L ≠ [] (the top run), and the edge 0 when L = [], which is the p = 0 case of RM, R3. In the twin, A [twin F] is also entered by the changed transition itself (A0 = 1RA, twin F0 = 1RF), but only inside the R3' detour below.

R3   (parent)  0^inf <A 0 1^(k+1) 0 0 1^m 0 r  -->  0^inf 1^(k+2) <A 0 1^(m+1) 0 0 r     3k+2m+11
               = A0 B0 · CW(k) · C1 B0 C0 · DW(m+2) · D0 E1 · FW(m+1) · F0
R3'  (twin)    0^inf <A 0 1^(k+1) 0 0 1^m 0 r  -->  0^inf 1^(k+2) <A 0 1^(m+1) 0 0 r     3k+2m+15
               = A0 A0 A1 C1 B1 B0 · CW(k) · C1 B0 C0 · DW(m+2) · D0 E1 · FW(m+1) · F0
                 [twin names: F0 F0 F1 B1 A1 A0 · CW(k) · ...]

The detour. Call the head cell e, the next cell z (the 0), and the first cell of 1^(k+1) u.

step transition (parent name, twin name) effect
1 A0 = 1RA (twin F0 = 1RF) e := 1, move right, stay in A
2 A0 z := 1, move right
3 A1 = 1LC (twin F1 = 1LB) reads u = 1, moves left to z, state C
4 C1 = 0RB z := 0, move right to u, state B
5 B1 = 1LB u stays 1, move left to z
6 B0 = 1RC z := 1, move right to u, state C

The result is e = 1, z = 1, with C reading u. The parent reaches this same configuration after A0 = 1RB, B0 = 1RC. From here both machines run the identical sequence CW(k) · C1 B0 C0 · ..., which uses no A0. The detour touches only e, z and u. It needs u = 1, which holds because c_1 >= 1 in the domain, and the cells left of e play no part. So R3' also holds with an arbitrary left side l 0 <A 0 1^(k+1) ..., which is the form of tR3; tR3c is its instance at the left edge.

Unchanged rules. CW, DW, FW, R1, R2, R2e and HALT (P§1) are unchanged: they use the same transitions in the same order and take the same number of steps. HALT is 0^inf 1 <A 0 r, then A1 C0 D0, and E reads 0 [twin: F1 B0 C0, then D reads 0 at ---]. The twin's macro rules, in parent names, with l and r arbitrary and all parameters >= 0:

R1   l 1^(n+2) <A 0 1^(m+1) 0 0 1^x 0 r  -->  l 1^(n+1) 0 1^(m+1) <A 0 1^(x+1) 0 0 r      3m+2x+15   (tR1)
R3'  l 0 <A 0 1^(k+1) 0 0 1^m 0 r        -->  l 1^(k+2) <A 0 1^(m+1) 0 0 r                3k+2m+15   (tR3, tR3c)
R2   l 1^(j+1) 0 1^(k+1) 0 1 <A 0 r       -->  l 1^(j+1) <A 0 1^(k+2) 0 0 r               k+10       (tR2)
R2e  0^inf 1^(k+1) 0 1 <A 0 r             -->  0^inf <A 0 1^(k+2) 0 0 r                   k+10       (tR2, l = 0^inf)
HALT 0^inf 1 <A 0 r                       -->  A1 C0 D0, then E reads 0: halt             3
6FamilyCheck: related machines are killed together or have a reason to be left open.

2 machines, 2 killed, 0 not. Family links: status.json parent, same transition table with another start (tools/dashboard.py), targeting.md follow-on rows, ledger "= twin" notes. A machine string named in a .v header / proof.md / notes.md is listed but does not make a family.

whomachinestatusrelation to this kill
#12 kill 51RB1LC_1RC1LB_1LD0RB_0LE1RD_---0LF_0LA1LF✓Killed: never haltsparent link; named in #12's proof.md; named in #12's notes.md; named in #12b's .v header; named in #12b's proof.md; named in #12b's notes.md · review · compared side by side above · mechanism
#12b kill 61RB1LA_1LC0RA_0LD1RC_---0LE_0LF1LE_1RF1LB✓Killed: never haltsthis kill
7ChecklistCheck: every ✓ is computed; the two ○ are yours to decide; an amber ! is an optional check that did not finish.
  • ✓
    Machine string exact
    the .v literal == holdout list line 676 byte for byte
  • ✓
    Statement is ~halts tm c0
    parsed from the .v and confirmed by check_kill (theorem_text, theorem_rocq)
  • ✓
    No axioms beyond baseline
    0 assumption(s); tools/assumptions_baseline.txt allows only functional_extensionality_dep
  • ✓
    coqchk finished (optional)
    coqchk pass in 1.3 s
  • ✓
    .v hash matches the checked hash
    .v = checked sha256 81348b14976e…; submission/ copy = checked sha256 81348b14976e…
  • ✓
    No repo-local paths in the .v
    comments name no path of ours (vendor/, machines/, tools/, rocq/, scripts/, reports/, atlas/, data/, journal/, /home/); busycoq's own verify/X.v is fine: none in the .v or the submission/ copy
  • ✓
    Public write-up is clean
    tools/writeup_lint.py on submission/proof.md: 0 error(s)
  • ○
    proof.md reviewed by Dennis (Checkpoint B)
    no Checkpoint B note from Dennis found
    • notes.md L61: - No Checkpoint A or B notes from Dennis were on file when this was packaged. If he adds any, fold them into proof.md and the submission copy first.
    • proof.md L6: - Status: delta proof, written 2026-10-10 (overnight, unattended). Every claim is checked by simulation in `check_proof.py` (labels R, A, C, B, T, H, F, G). Not formalized yet. Checkpoint B (Dennis) is pending.
  • ○
    Family posted together?
    1 other kill(s) in the family: #12; the Discord draft names 1 of them

Generated by tools/killreview.py at 2026-10-16 13:29 PDT in 0.0 s from the files linked above; nothing in this review is hand-written except the box “How we proved it never halts” (above), which quotes how_proved.md. Re-run: python3 -B tools/killreview.py 1RB1LA_1LC0RA_0LD1RC_---0LE_0LF1LE_1RF1LB

Files

machines/<tm>/: 11 entries · raw notes, status, scripts, images

namesizechanged
notes.md ↓6.4 KB2026-10-10 09:56
proof.md ↓17 KB2026-10-10 09:46
how_proved.md ↓1.4 KB2026-10-14 10:51
status.json ↓434 B2026-10-10 16:07
1RB1LA_1LC0RA_0LD1RC_---0LE_0LF1LE_1RF1LB.v ↓40 KB2026-10-10 11:50
img/5 items2026-10-16 10:29
rocq/5 items2026-10-10 09:54
scripts/2 items2026-10-10 09:46
submission/6 items2026-10-14 09:18
work/1 item2026-10-10 15:58
check_proof.py ↓23 KB2026-10-10 09:41
status.json in full
{
 "tm": "1RB1LA_1LC0RA_0LD1RC_---0LE_0LF1LE_1RF1LB",
 "status": "KILLED_NONHALT",
 "stage": "done",
 "updated": "2026-10-10",
 "reason": "check_kill PASS, independently re-verified",
 "parent": "1RB1LC_1RC1LB_1LD0RB_0LE1RD_---0LF_0LA1LF",
 "label": "#12b",
 "relation": "neighbour of #12: one transition away from #12's table (after renaming); its run is nearly identical (134 vs 133 cells at 1e9), so a look-alike, not a sibling"
}