1RB0RF_1LC0RE_0LC0LD_1RD1LB_0RF1RA_0RB---: never halts
Submission copy of the working
proof.md, made 2026-10-10 after the kill. Only the formal-status lines were updated: header, §4, §5, §6, §7. Scripts and scratch files it cites (check_proof.py,check_rules.py, the Rocq scratch fileprobe_segments_2.v,notes.md) live in the working directory and are not in this folder.
- Machine:
1RB0RF_1LC0RE_0LC0LD_1RD1LB_0RF1RA_0RB---, viewer https://bbchallenge.org/1RB0RF_1LC0RE_0LC0LD_1RD1LB_0RF1RA_0RB--- - Holdout lists: on every holdout-list snapshot we have, 2024-06-14 (12,091) through 2026-10-07 (778). Sheet: Results row 1035, class "Bell eats counter"; Status, Notes, Sources and Done By are blank. No Discord thread.
- Written for: the string itself. There is no mirror or state permutation.
- Template:
verify/SOMDCv6.v,Module TM7(1RB0RC_1LC0RE_0LC0LD_1RD1LB_0RF1RA_0RB---). Our machine differs from it in one transition: A1 is0RFhere and0RCin TM7. - Status: fully formalized, killed.
1RB0RF_1LC0RE_0LC0LD_1RD1LB_0RF1RA_0RB---.v(599 lines) provesLemma nonhalt: ~halts tm c0.in Coq 8.20.1 against unmodified busycoq (commit0940bb9c).check_kill(our checker) PASS on 2026-10-10: compile 3.6 s,Print Assumptions nonhaltclosed, coqchk pass in 1.1 s (check_kill.txt). - Where each section lives in the .v: §3.1
Inc_spec,seg_hx_ld,seg_h1_ld,RIncs_spec; §3.2BigStep; §3.3Inc_total,Inc_fun,RIncs_Inc(Lemma A),RIncs_nxt_1(Total_1),End_1,End_x,Inv,key(RIncs_nxt'),domain; §4 and §5start,nonhalt.
Summary. The configuration at each sweep boundary is S(r) = 0^inf 11 D> <r> 0^inf, where r is a word over three 3-cell digits. TM7's proof carries over with three changes:
1. Where TM7's sweep enters an L digit, ours first runs one extra "+1 pass" over everything to the right. This adds an Inc premise to two clauses of TM7's RIncs.
2. RIncs gets two new end clauses, Z0 and Z1, that use zero passes. They describe no new machine behaviour (each is an identity between two ways of writing the same tape), but without them the sweep map's domain is not closed under the sweep map (§3.3).
3. TM7's domain lemma RIncs_nxt gets an extra parameter j, the number of pending +1 passes. Its condition Inv reduces to TM7's when j = 0.
1. Families and notation
- Digits:
L = 110,0 = 000,1 = 100(cells left to right). For a word r over {L,0,1},<r>is its cells in order. A word followed by0^infdenotes the same tape with or without trailing0digits. - Counter value:
inc(r), also writtenr+1, adds 1 to the little-endian binary number formed by the 0/1 digits of r. L digits are skipped; a carry out of the last digit appends a1digit. - Family:
S(r) := 0^inf 11 D> <r> 0^inf(busycoqS' r), for r in the domainPof §3.3. - Passes (busycoq
sideRLs). A pass runs over a right part X and never reads a cell left of where it exits, so it holds for every left part: h:B> X ->+ <C X'. The head exits one cell left of where it entered, and X' starts at the same cell as X.h':1 D> X ->+ <C X'. The1belongs to the pass, so X' starts at the cell that held the1.Inc(r, r'): the pass[h]turns<r>into<r'>.R(tp, k, r, r')(busycoqRIncs):R(hx, k, r, r'): the passes[h', h^k]turn<r>into<r'>.R(h1, k, r, r'): the passes[h^k]turn1 <r>into<r'>, where the extra1cell comes first.
So hx is "the eater pass plus k queued passes", and h1 is "k passes draining over a stray 1".
2. Rule table
1RB0RF_1LC0RE_0LC0LD_1RD1LB_0RF1RA_0RB--- (SOMDCv6 TM7 with A1 = 0RF instead of 0RC)
S(r) = 0^inf 11 D> <r> 0^inf L = 110, 0 = 000, 1 = 100
start: 0^inf A> 0^inf -(5)-> S(1)
sweep: S(r) -+-> S(r') if R(hx,0,r,r') (r' starts one cell further left)
domain P(r) := exists r', R(hx,0,r,r'); P(1); P(r) /\ R(hx,0,r,r') -> P(r')
Inc (one h pass = +1):
I1 Inc(1::r, 0::r') <- Inc(r,r') I3 Inc(L::r, L::r') <- Inc(r,r')
I2 Inc(0::r, 1::r) I4 Inc([], [1])
R (k >= 0); NEW = differs from TM7's RIncs:
X1 R(hx,k, L::r, L::r') <- Inc(r,r1), R(hx,k+1,r1,r') NEW (TM7: R(hx,k+1,r,r')) RIncs_hx_ld
X2 R(hx,k, 0::r, L::r') <- R(hx,k+1,r,r') RIncs_hx_d0
X3 R(hx,k, 1::r, L::r') <- R(h1,k,r,r') RIncs_hx_d1
C1 R(h1,k+1, L::r, L::r') <- Inc(r,r1), R(hx,k+1,r1,r') NEW (TM7: R(hx,k+1,r,r')) RIncs_h1_ld
C2 R(h1,k+1, 1::r, L::r') <- R(h1,k,r,r') RIncs_h1_d1
C3 R(h1,2k+1, 0::r, 0::r') <- R(h1,k,r,r') RIncs_h1_d0_0
C4 R(h1,2k+2, 0::r, 1::r') <- R(h1,k,r,r') RIncs_h1_d0_1
R0 R(h1,0, [], [1]) RIncs_h1_rh_0
R1 R(h1,2k+1, [], 0::r') <- R(h1,k,[],r') RIncs_h1_rh_1
R2 R(h1,2k+2, [], 1::r') <- R(h1,k,[],r') RIncs_h1_rh_2
Z1 R(h1,0, [1], [L]) NEW: 0 passes, 1 100 0^inf = 110 0^inf
Z0 R(h1,0, [0], [1]) NEW: 0 passes, 1 000 0^inf = 100 0^inf
(no clause: hx at the right end; h1 with 0 passes on a word other than [], [1], [0])
machine level (j = number of digits of X before its first 0 digit, or |X| if none):
B> 100 X -(3)-> 000 B> X B> 000 X -(1)-> <C 100 X B> 0^inf -(1)-> <C 100 0^inf
B> 110 X -(3)-> 011 B> X 011 <C -(3)-> <C 110 000 <C -(3)-> <C 000
=> B> <X> 0^inf -(6j+1)-> <C <X+1> 0^inf (Inc, no A1)
eater enters L: 1 D> 110 <X> -(6j+13)-> 1 111 D> <X+1> TM7: -(11)-> 1 111 D> <X>
drain enters L: B> 1 110 <X> -(6j+12)-> 1 111 D> <X+1> TM7: -(10)-> 1 111 D> <X>
wall: 0^inf 1 <C <r'> -(3)-> 0^inf 11 D> <r'> (C1, D0, D0)
In words:
- Eater (hx). The eater turns every digit it crosses into L. It gains one pass at each L or 0, and at each L the rest of the word gets +1 (X1, NEW). It switches to draining at the first 1 (X3).
- Drain (h1, k passes). Each 1 absorbs one pass and becomes L (C2). Each 0 keeps one bit of the count and halves it (C3, C4). At the right end the count is written in bijective binary (R0–R2). An L restarts the eater with the same count and adds +1 to the rest (C1, NEW; this is the "drain-enters-L restart"). With 0 passes left, the drain can only be at the last digit, and it leaves the stray 1 in place (Z0, Z1, NEW).
Worked example. This is the start of the Checkpoint A picture pair, S(L^4 1L1), and it is the extra 1 Dennis noticed there (checked in §7).
- First eat. Both machines eat the 4 L's (k = 4) and stop at the 1. Ours added +1 at each L, so its rest is 1L1 + 4 = 1L11, while TM7's is still 1L1. The extra 1 digit on the right is the extra bar after the first eat.
- Drain. The first drain pass enters the L.
- TM7 restarts the eater on 1.
- Ours first runs +1 pass number 5: 11 + 1 = 001. The extra 1 is not ignored: the carry turns both 1s into 0s and appends a new 1.
- Second eat. Ours also eats the two new 0s (k = 6). TM7 stops at once (k = 4).
- Right end. The count is written in bijective binary: 6 gives 111, 4 gives 101.
- Result. Ours reaches S(L^9 111) and TM7 reaches S(L^7 101). Ours has two more L's on the left, and the right end differs.
3. The argument
3.1 Every clause is an exact pass-level transition (RIncs_spec), Rocq-checked
Claim: R(hx,k,r,r') implies sideRLs ([h'] ++ h^k) <r> <r'>, and R(h1,k,r,r') implies sideRLs (h^k) (1 <r>) <r'>. Proof by induction on R, one clause at a time, as in TM7.
This section compiles. check_proof.py --rocq states Inc and all 12 clauses of R for the real machine string, then proves Inc_spec, seg_hx_ld, seg_h1_ld and RIncs_spec. Print Assumptions is closed. The two segment facts were first probed in probe_segments_2.v.
- X2, X3, C2, C3, C4, R0, R1, R2. Each clause's run never fires A1, the one transition where the two machines differ (§7 counts A1 firings). So the run is the same as TM7's, and TM7's tactic scripts for these 8 cases (cat3, tr1/tr2, wal, am) are reused verbatim.
- X1 (eater enters L).
- TM7: the eater reaches A1 at the middle cell of the 110 in 4 steps (D1, B1, E1, A1). TM7's A1 = 0RC writes 0 and steps right onto the last cell of the 110 in state C. C0 = 0LC then turns left.
- Ours: A1 = 0RF writes the same 0 and steps onto the same cell in state F. F0 = 0RB then puts B on the first cell of X. That is one h pass over X: B> <X> ->(6j+1) <C <X+1>. It returns with C on the last cell of the 110, which is exactly where TM7 is one step after its A1. From then on the two runs agree.
- So TM7's segment fact for the L digit, segRLs [h'] [h', h] 110 110, becomes segRLs [h'] [h, h', h] 110 110, followed by the wall for h^k (Rocq: seg_hx_ld). The passes reaching the rest are [h] ++ ([h'] ++ h^(k+1)). That is Inc(r, r1) (Inc_spec below), followed by R(hx, k+1, r1, r') (induction hypothesis), joined by sideRLs_trans.
- C1 (drain enters L). The same argument. The first pass of h^(k+1) meets 1 110 and reaches A1 in 3 steps (B1, E1, A1). TM7's segment fact segRLs [h] [h', h] 1110 110 becomes segRLs [h] [h, h', h] 1110 110 (Rocq: seg_h1_ld).
- Inc_spec (Inc(r,r') implies sideRLs [h] <r> <r'>). By induction on Inc, using the six machine-level h-pass rules of §2 for I1–I4.
- Z1 and Z0. These use zero passes, so they hold by sideRLseq_O (via applys_eq) and the stream identities 1 100 0^inf = 110 0^inf and 1 000 0^inf = 100 0^inf (const_unfold).
3.2 Sweep (BigStep)
Suppose R(hx,0,r,r'). The left part 0^inf 1 is never read by the pass, so:
S(r) = 0^inf 1 · 1 D> <r> -+-> 0^inf 1 <C <r'> -(3)-> 0^inf 11 D> <r'> = S(r')
The first arrow is the single pass h' (sideRLs_1); the second is the wall rule. This is TM7's BigStep, with the same proof. It compiles (§7).
3.3 The domain is closed (RIncs_nxt')
Let P(r) := exists r', R(hx,0,r,r'). We need R(hx,0,r,r') to imply P(r').
Why the extension is needed. Without Z0/Z1 this is false:
- r = LLLL10LL1L1 is in P, and its sweep is LLLLL1LLLLLLL111, which is not in P without Z0/Z1. Its second sweep needs Z1 and gives LLLLLLLLLLLLLL011L, which is also what the real machine produces.
- Up to 11 digits, 170 words fail this way.
Z0/Z1 are never used on the run from blank (§7), so they matter only to the domain lemma.
Auxiliary lemmas. All are stated as relations. The only functionality the proof uses is that of Inc.
| lemma | statement | proof |
|---|---|---|
| Inc total and functional | for every r there is exactly one r' with Inc(r,r') |
induction on r |
| A | R(tp,k,r,r') /\ Inc(r',r'') -> R(tp,k+1,r,r'') |
induction on R; each clause maps to the same clause with k+1, except C3 -> C4, C4 -> C3 (carry), R0 -> R1, R1 -> R2, R2 -> R1, Z1 -> C2, Z0 -> C3 |
| Total_1 | forall q, exists w, R(h1,q,[],w) |
TM7's RIncs_nxt_1, unchanged |
| End_1 | R(h1,m,[],w) /\ m <= q -> exists w', R(h1,q,w,w') |
induction on the derivation of R(h1,m,[],w), generalizing q. Only R0–R2 apply to []; write m0 for the premise's count. R0 (w = [1]): Z1 if q = 0, else C2 + Total_1. R1 (w = 0::w0, m = 2m0+1): C3 or C4 by q's parity, then IH at floor((q-1)/2) ≥ m0. R2 (w = 1::w0, m = 2m0+2): C2, then IH at q-1 ≥ m0 |
| End_x | R(h1,m,[],w) /\ m <= 2q+2 -> exists w', R(hx,q,w,w') |
induction on the same derivation, generalizing q. R0: X3 + Total_1. R1: X2, then IH at q+1 (m0 ≤ q). R2: X3, then End_1 (m0 ≤ q) |
Lemma A says one extra pass after the k passes is +1 on the result. It is what turns the second sweep's +1 passes into extra count for the first.
Key lemma (RIncs_nxt'). Two sweep processes run over the same digits:
- the first has R(tp,k,r,r1);
- the second reads the first's output after j pending +1s, R(tp,k+j,r,rK) (by Lemma A this is r1 + j), with count q.
Write K = k+j. The lemma:
R(tp,k,r,r1) /\ R(tp,K,r,rK) /\ Inv(tp,k,j,tq,q) -> exists r2, R(tq,q,rK,r2)
Inv(hx,k,j,hx,q) := k <= q /\ j <= q
Inv(h1,k,j,hx,q) := k+1 <= q /\ j <= q
Inv(h1,k,j,h1,q) := (j = 0 /\ 2k+1 <= q) \/ (j >= 1 /\ K <= q /\ 1 <= q) [both imply K <= q, 1 <= q]
Inv(hx,_,_,h1,_) := False
With j = 0 these are exactly TM7's conditions (k<=k', k+1<=k', k*2+1<=k'). The domain step is the instance tp = tq = hx, k = j = q = 0.
Proof. Induct on the derivation of R(tp,k,r,r1), generalizing j, rK, tq and q. The induction is on the derivation, not on r, because X1/C1 recurse on inc r. In each case, invert R(tp,K,r,rK); Inc is functional, so both derivations name the same incremented word. The second process reads the first digit of rK, and that leaves one IH obligation. Each obligation's count K' is supplied by Lemma A, since the second's +1 passes land on the first's rest.
Some shorthand for the table:
- t+ means Inc(t).
- In C3/C4, k1 = floor((k-1)/2) and K1 = floor((K-1)/2). Then j1 = K1 - k1 equals ceil(j/2) when K is odd and floor(j/2) when K is even.
| first | second reads | IH instance (tp,k,j -> tq,q) |
Inv holds since |
|---|---|---|---|
(hx,hx) X1/X2: rK = L::t, R(hx,K+1,_,t) |
X1: R(hx,q+1,t+,_); R(hx,K+2,_,t+) by A |
(hx,k+1,j+1 -> hx,q+1) | k+1 ≤ q+1, j+1 ≤ q+1 |
(hx,hx) X3: rK = L::t, R(h1,K,w,t) |
X1 | (h1,k,j+1 -> hx,q+1) | k+1 ≤ q+1, j+1 ≤ q+1 |
(h1,hx) C1: rK = L::t, R(hx,K,_,t) |
X1 | (hx,k,j+1 -> hx,q+1) | k ≤ q+1, j+1 ≤ q+1 |
(h1,hx) C2: rK = L::t, R(h1,K-1,w,t) |
X1 | (h1,k-1,j+1 -> hx,q+1) | k ≤ q+1, j+1 ≤ q+1 |
(h1,hx) C3/C4, K odd: rK = 0::t |
X2 | (h1,k1,j1 -> hx,q+1) | k1 < k, j1 ≤ j |
(h1,hx) C3/C4, K even: rK = 1::t |
X3 | (h1,k1,j1 -> h1,q) | j1 = 0 only if j ≤ 1, and then 2K1+1 = K-1 ≤ k ≤ q; otherwise K1 = (K-2)/2 < q, q ≥ 2 |
(h1,hx) R0-R2: the K-derivation is R(h1,K,[],rK) |
End_x on it | none | K = k+j ≤ 2q-1 |
| (h1,hx) Z1/Z0 (k = 0, so K = j ≤ q) | Invert the K-derivation. K = 0: Z1 gives [L] -> X1, X3, Total_1; Z0 gives [1] -> X3, Total_1. K ≥ 1: C2 gives L::t with R(h1,K-1,[],t) -> X1 on t+; Lemma A on that R0–R2 derivation gives R(h1,K,[],t+), then End_x. C3 gives 0::t with R(h1,(K-1)/2,[],t) -> X2, End_x. C4 gives 1::t with R(h1,(K-2)/2,[],t) -> X3, End_1 |
none | K ≤ 2(q+1)+2; (K-1)/2 ≤ 2(q+1)+2; (K-2)/2 ≤ q |
| (h1,h1) C1 (k ≥ 1) | C1 (q ≥ 1) | (hx,k,j+1 -> hx,q) | k ≤ K ≤ q; j+1 ≤ K ≤ q since k ≥ 1 |
| (h1,h1) C2 (k ≥ 1) | C1 | (h1,k-1,j+1 -> hx,q) | k ≤ q; j+1 ≤ K ≤ q |
(h1,h1) C3/C4, K odd: rK = 0::t |
C3/C4: q1 = floor((q-1)/2) |
(h1,k1,j1 -> h1,q1) | j = 0: K ≤ q1 since 2K+1 ≤ q. j ≥ 1: j1 ≥ 1, K1 ≤ q1, and q ≥ K ≥ 3 so q1 ≥ 1 |
(h1,h1) C3/C4, K even: rK = 1::t |
C2: q-1 | (h1,k1,j1 -> h1,q-1) | j ≤ 1: j1 = 0, 2K1+1 = K-1 ≤ q-1. j ≥ 2: K1 ≤ q-1, and K ≥ 4 so q-1 ≥ 1 |
| (h1,h1) R0-R2 | End_1 on the K-derivation | none | K ≤ q |
| (h1,h1) Z1/Z0 (k = 0; Inv gives q ≥ 1 and K ≤ q) | Invert the K-derivation. K = 0: [L] -> C1, X3, Total_1; [1] -> C2, Total_1. K ≥ 1: L::t with R(h1,K-1,[],t) -> C1 on t+; Lemma A gives R(h1,K,[],t+), then End_x. 0::t with R(h1,(K-1)/2,[],t) -> C3 or C4 by q's parity, End_1. 1::t with R(h1,(K-2)/2,[],t) -> C2, End_1 |
none | K ≤ 2q+2; (K-1)/2 ≤ floor((q-1)/2); (K-2)/2 ≤ q-1 |
No other case occurs:
- hx at the right end has no clause.
- h1 with 0 passes occurs only as Z0/Z1.
- Inv(hx,_,_,h1,_) is False.
∎
3.4 Progress
R is inductive, so every derivation is finite. Each clause is a finite run: its segment lemma, plus the finitely many passes of its premises (§3.1). So S(r) -+-> S(r') is a finite run of at least 4 steps: h' takes at least 1, and the wall takes 3. Example: S(1) to S(L1) takes 11 steps (steps 5 to 16).
3.5 The halting transition F1
Formally, every rule is a proved exact run, so no step on the way from c0 is the halting transition.
As a sanity check: F is entered only by A1 = 0RF and E0 = 0RF. In the machine-level rules of §2, F is entered on the last cell of a digit, and that cell is 0 for all three digits, so F0 = 0RB fires. In every simulated rule instance F read a 0; the count of F reading 1 is 0 (§7).
4. Initial segment
0^inf A> 0^inf reaches S(1) in 5 steps:
-A0-> 0^inf 1 B> 0^inf-B0-> 0^inf 1 <C 1 0^inf-C1-> 0^inf <D 0 1 0^inf-D0-> 0^inf 1 D> 0 1 0^inf-D0-> 0^inf 11 D> 100 0^inf = S(1)
S(1) is in the domain: R(hx,0,[1],[L,1]) by X3 and R0.
TM7's nonhalt uses the same start, S' [D1], by esx. Here too, init: c0 -[tm]->* S' [D1] compiles by esx (§7).
The .v file starts one sweep later: start : c0 -->* S' [LD;D1] (S(L1), step 16), also by esx. Its initial domain witness is R(hx,0,[L,1],[L,L,L,1,1]): X1 with Inc([1],[0,1]), then X2, X3, and R2 over R0.
5. Conclusion
Use multistep_nonhalt with c' = S(1) (§4), then progress_nonhalt_cond with P(r) := exists r', R(hx,0,r,r'):
- §3.2 gives S(r) -+-> S(r').
- §3.3 gives P(r').
- §3.4 shows each sweep is at least one step.
So the machine never halts. In Rocq this is TM7's nonhalt with RIncs replaced by R and with a different call to the domain lemma. TM7 calls RIncs_nxt with (tp':=hx) (k':=O) on one hypothesis. Here the call is RIncs_nxt' at tp = tq = hx and k = j = q = 0. Both R hypotheses are I1 (K = k+j = 0), and Inv(hx,0,0,hx,0) is discharged by lia.
In the .v file c' = S(L1) (see §4), RIncs_nxt' is named key, and the instance above is the lemma domain.
6. Mapping to SOMDCv6 TM7
TM7 (SOMDCv6.v) |
here | change |
|---|---|---|
S', lh |
S(r) | none |
ld/d0/d1, RD, toRC |
digits L/0/1 | none |
hR/hR'/hL, h/h', toH/toH' |
passes h, h' | none |
| none | Inc (I1–I4), Inc_spec |
new: sideRLs [h] (toRC r) (toRC r'); compiles |
RIncs (10 clauses) |
R (12 clauses) | RIncs_hx_ld/RIncs_h1_ld gain an Inc premise and recurse on inc r; new clauses Z1 R(h1,0,[D1],[LD]) and Z0 R(h1,0,[D0],[D1]) |
RIncs_spec |
§3.1 | 8 cases unchanged (X2, X3, C2–C4, R0–R2). The X1/C1 segment facts gain a leading h ([h'] -> [h;h';h] on 110, [h] -> [h;h';h] on 1110), followed by sideRLs_trans with Inc_spec. Z0/Z1 by sideRLseq_O and const_unfold. Compiles |
| none | Lemma A, End_1, End_x | new (TM7 handled r = [] inside RIncs_nxt by an inner induction on k) |
RIncs_nxt_1 |
Total_1 | unchanged |
RIncs_nxt |
RIncs_nxt' (§3.3) |
new parameter j (pending +1s) and Inv; j = 0 gives TM7's conditions; induction on the derivation instead of on r |
BigStep |
§3.2 | unchanged; compiles |
nonhalt |
§5 | P uses R; the domain call is RIncs_nxt' at k = j = q = 0 with I1 passed twice (§5); start S' [D1] compiles |
Formal status: all done. Every row above compiles in 1RB0RF_1LC0RE_0LC0LD_1RD1LB_0RF1RA_0RB---.v, and check_kill (our checker) passes (check_kill.txt).
- The X1/C1 segment lists are proved by seg_hx_ld and seg_h1_ld (esx, then TM7's wall tactic wal).
- §3.3 is the lemma key, proved by induction on the first derivation. The case table above matched the Coq cases one to one, and no case needed a change. Its two expected risks were handled with plain lia:
1. the floor/ceil arithmetic on j1, via mod2 case splits as in TM7's solve_v1;
2. the C3/C4 inversion of the K-derivation, which depends on K's parity rather than k's (inv_h1_d0, three alternatives).
7. Evidence
The checks are in check_proof.py, in this directory (reuses check_rules.l_entry). The numbers below are from python3 -B check_proof.py --full (36 s). That mode includes the Rocq check, which --rocq runs alone (4 s). The default run (8 s) gives the same verdicts on smaller samples, with the from-blank check to 1e8 steps. "Real machine" means simulation of the actual transition table: a pass stops the first time the head reaches its exit cell, so cells left of it are never read.
| claim | instances | result |
|---|---|---|
Inc: B> <r> -(6j+1)-> <C <r+1>, no A1 (all r ≤ 6 digits + random) |
13,093 | all pass |
§3.1 every clause: the pass list of R(tp,k,r,r') turns the input into <r'> on the real machine, with #A1 firings = #X1 + #C1 (exhaustive r ≤ 4 digits with k ≤ 8; k < 80 at the right end; random r up to 53 digits with k ≤ 200) |
8,477 derivations; clause uses X1 69,237, X2 15,894, X3 15,109, C1 10,450, C2 12,353, C3 4,215, C4 3,855, R0 8,031, R1 12,659, R2 9,742, Z0 58, Z1 388 | all pass |
| F never reads 1 in any of those runs | all | 0 occurrences |
| TM7's own RIncs on TM7 (template sanity, same A1 count) | 1,410 | all pass |
| L entry, ours vs TM7, eater and drain (every X ≤ 6 digits + 150 random) | 1,243 per case, 4 cases | all pass |
| Lemma A (all r ≤ 6 digits, k ≤ 12, both tp) | 21,347 | all pass |
Lemma A at the right end, as used by the Z rows of §3.3: inc(R(h1,m,[])) = R(h1,m+1,[]) (m < 2000) |
2,000 | all pass |
| End_1, End_x (m < 300, q < 160). End_1 is tight: m = q+1 fails for q = 0, 2, 6, 14, 30, ... | 38,679 | all pass |
RIncs_nxt' at the smallest q allowed by Inv (exhaustive r ≤ 5 digits with k, j ≤ 8; random up to k, j ≤ 60) |
83,794 | all pass |
| The case table of §3.3, run as an abstract transition system on (tp,k,K,tq,q): every Inv state closes under every digit, the end, and Z0/Z1 (k < 28, K, q < 56) | 100,744 states | all close |
Domain closed: sweep(r) defined implies sweep(sweep r) defined (all words ≤ 11 digits) |
76,738 | all pass; without Z0/Z1, 170 fail |
BigStep on the real machine: S(r) -+-> S(sweep r), one cell left |
5,843 (502 use Z0/Z1) | all pass |
Worked example (§2): S(L^4 1L1) gives S(L^9 111) on ours and S(L^7 101) on TM7, abstractly and on both real machines, with the intermediate words 1L11 and 001 |
4 | all pass |
Initial segment c0 -(5)-> S(1) |
1 | pass |
From blank to 2e9 steps: consecutive sweep boundaries follow sweep |
256 sweeps | 256/256; Z0/Z1 never used; last boundary at step 1,976,201,019 = S(L^2068 0000LLLLL00100001) |
| Abstract orbit from S(1) | 3,000 sweeps | stays in the domain; Z0/Z1 never used; ends at S(L^31762 0LLLL10111111101111) |
Rocq (not simulation): Inc_spec, seg_hx_ld, seg_h1_ld, RIncs_spec (all 12 clauses), BigStep, init compile with Coq 8.20.1 against unmodified busycoq; no Admitted/Axiom; Print Assumptions closed for RIncs_spec, BigStep, init |
1 file | compiles; 3/3 closed |
Rocq, full kill (not simulation): 1RB0RF_1LC0RE_0LC0LD_1RD1LB_0RF1RA_0RB---.v, all of §3–§5 ending in nonhalt, run through our checker, check_kill (check_kill.txt) |
1 file | PASS: 3.6 s compile, 0 assumptions, coqchk pass |
Gaps: none. The simulation rows are evidence only. The kill rests on the .v file alone, which passes our checker, check_kill.
AI assistance: this proof sketch, the scripts and the checks were produced with the help of Claude (Anthropic).
Review log
Independent skeptic review, 2026-10-10. Verdict: sound; 5 minor gaps, no fatal or major ones. All 5 were accepted and fixed.
| # | gap | resolution |
|---|---|---|
| 1 | §6 clause counts were wrong. TM7's RIncs has 10 constructors, not 12; R has 12 clauses, not 14; and §3.1 lists 8 unchanged cases, not 10. |
Fixed: RIncs (10 clauses), R (12 clauses), 8 cases unchanged (X2, X3, C2–C4, R0–R2). Checked against SOMDCv6.v lines 1663–1701. |
| 2 | Formal status was understated. The X1/C1 segment facts and all of §3.1, §3.2 and §4 already compile: probe_segments_2.v, plus the reviewer's RSpec2.v, which takes 3 s and has closed assumptions. |
Accepted. I recompiled RSpec2.v (3.3 s, 3/3 Print Assumptions closed). It is now embedded in check_proof.py as --rocq (also run by --full), so it can be rerun from this directory. Risk 1 is retired, and the header, §3.1, §3.2, §4, §6 and §7 now say what compiles. Remaining formal work: §3.3 and nonhalt. The reviewer's 2e9 from-blank figure was reproduced and now replaces the 1e9 row: 256/256, last boundary at step 1,976,201,019 = S(L^2068 0000LLLLL00100001). |
| 3 | §5 called the conclusion "TM7's nonhalt verbatim", but RIncs_nxt' has a different signature. |
Fixed: §5 now gives the call (RIncs_nxt' at tp = tq = hx, k = j = q = 0, I1 passed twice, Inv by lia). This matches §6. |
| 4 | §3.1 said TM7's A1 "turns straight back, 0RC". 0RC moves right; C0 = 0LC is the step that turns back. |
Fixed in §3.1. notes.md ("Where the +1 comes from") has the same wording and was not changed here, because it is outside this revision's files. |
| 5 | word(m) as a function relied on R(h1,m,[],·) being functional, and the Z rows also used inc(word(K-1)) = word(K); neither was listed as a lemma. |
Fixed: End_1 and End_x are now relational and proved by induction on the R0–R2 derivation. The Z rows get R(h1,K,[],t+) from Lemma A applied to that derivation. Only Inc's functionality is used. check_proof.py adds the right-end Lemma A instance (m < 2000, all pass). |
Also added, though the review did not ask for it: the worked example in §2, which explains Dennis's Checkpoint A observation (the extra 1 after the first eat is carried away by +1 pass 5), with a check in §7.