tools/rebuild_pages.sh rebuilds the site within 5 minutes of a change; by hand: python3 -B tools/site.py.1RB0RE_1LC0RE_1LD0LD_1RA0LC_1RA1RF_1RA---
How we proved it never halts
#11's proof in a mirror, from a different start
#11 is a binary counter whose digits burn a unit of fuel each time a carry touches them, and its proof is an invariant showing that a digit only ever runs dry where that is harmless. This machine is #11's table seen in a mirror, with left and right swapped and the state letters renamed, started in the state that is #11's D. So the same kind of counter runs with the head at the left end of the tape and a fixed marker, 1001, at the right.
The invariant talks only about the digits' lengths and values, never about direction, so it and its proof carry over word for word. Only the small tape lemmas that the two moves (add 1, and overflow) are built from had to be mirrored.
What is new is a 215-step opening. At step 82 the counter has no digits; an overflow of that empty counter creates the first one, and at step 215 the tape is a one-digit counter with fuel to spare, a state the invariant covers. From then on #11's argument applies, so this machine never halts.
The Rocq file re-proves #11's tape lemmas in mirror image and keeps #11's moves, invariant and closure proof word for word. It replays the 215 steps, checks the invariant there, and proves the result for this table directly.

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.
Overview
In one sentence
Kill #11's table mirrored, started in D: same binary counter; a 215-step init lands in #11's proved invariant
Submitted mechanism The head works at the left edge. At each visit the tape is K = 0^inf <C (01)^b 000 (01)^a d~_m .. d~_1 1001 0^inf. Each digit is (10)^v 00 (01)^u (bit 0) or (10)^v (01)^u (bit 1), and d_m, next to the block, is the least significant bit. (submission/README.md, Mechanism)
- Upstream
- Kill claimed · PR #16merged 2026-10-13 12:26 UTC by ccz181078 ·
Sk1Class2_v2.v · TM9· on Submissions → - Rocq proof
- check_kill PASS · first Oct 10 10:49671 lines · 30 KB .v · compile 8.5 s · coqchk pass · 0 axioms · PASS Oct 10 10:49 (re-run Oct 12 18:16)· the .v file
- Automatic review
- 6 of 6 checks passtemplate: #11's kill file (kill 3) (twin: parent kill's .v) · details in Proof →
- Class
- Skelet 1-like Class 2ours: sheet Skelet 1-like Class 2 ≠ ours Binary counter with re-pairing overflow: kill #11's table, mirrored and started in #11's D · high confidence
- On the list
- not on
BB6_holdouts_663.txt(line 31 of the previous list) · historical 740 line 31
Mechanism
What to check here: the pictures show the mechanism that the rule table describes.
How it works: 3 notes
- Same table as our kill #11
1RB0LE_1RC0RC_1LD0RB_1LA0LE_1LD1LF_1LD---: mirror it and rename A,B,C,D -> B,C,D,A (E, F fixed). This machine starts in #11's D. - Tape K =
0^inf <C (01)^b 000 (01)^a+ digits(10)^v [00] (01)^u+1001: a binary counter. M_k carries to the last 0-bit (ruler depths); O re-pairs every digit when all bits are 1. - From blank, 215 steps reach K((1,1,3); 4, 1), class A of #11's invariant. The real run equals M_k/O exactly for all 18,976 macro steps to 1e9, every K in INV.
Figures for Checkpoint A
The site's own picture. The tape grows to the left; the right end barely moves.
Rows every 20 steps; each phase-shift diagonal is one head sweep. Compare how far right each sweep gets.
Each row is the whole tape at a new left-edge cell. Watch the vertical walls and where they jump.
More figures (1)Fig 4: Ten million steps (Blaze)
Shape over a long run: left edge on a square-root curve, fixed right end, wall lines between.
Rules (4/4 validated)exact tape rewrites the proof will formalize, each re-checked by simulation
| rule | from ⟶ to | cases | steps | checked |
|---|---|---|---|---|
| init (blank -> first INV state) | 0∞ A> 0∞ ⟶ 0∞ <C 01 000 (01)4 (10)3 01 1001 0∞ | = K((1,1,3); a=4, b=1), class A. Passes K(; 3, 1) at step 82 (no digits, not in INV). Exact on #33 by direct simulation | 215 | ✓2/2 |
| M_k carry (k = trailing 1-bits) | 0∞ <C (01)b 000 (01)a [(10)v_j (01)u_j]_{j=m..j*+1} (10)v 00 (01)u P 1001 0∞ ⟶ 0∞ <C (01)b+2 000 (01)a+1 [(10)v_j-1 00 (01)u_j]_{j=m..j*+1} (10)v-1 (01)u+1 P 1001 0∞ | j* = last bit-0 digit, k = m - j*; k = 0..5 tested, 61 of them with v = 1 (the digit drops: same string, re-read). Needs v >= 1, u_j, v_j >= 1 for j > j*, a, b >= 0 | 32 + 8a + 8b + 4v + sum_{j>j*} (8u_j + 4v_j) | ✓240/240 |
| O overflow (all bits 1) | 0∞ <C (01)b 000 (01)a [(10)v_j (01)u_j]_{j=m..1} 1001 0∞ ⟶ 0∞ <C 01 000 (01)b+3 (10)a (01)v_m [(10)u_j 00 (01)v_(j-1)-1]_{j=m..2} (10)u_1 00 1001 0∞ | m = 1..7 tested; needs m >= 1, all u_j, v_j >= 1, a >= 1. New digits (#11 notation): (0,0,u_1), (v_(j-1)-1, 0, u_j), (v_m, 1, a) | 89 - 4m + 8a + 20b + 4 sum u_j + 8 sum v_j | ✓120/120 |
| window lemmas (#11's S1-S6, T1-T14, mirrored) | 20 windows, e.g. S1m 10 <C, S3m A> 10, T9m E> 1001000, T12m 00011 <D ⟶ S1m <C 01, S3m 01 A>, T9m <C 0001001, T12m 10110 E> (full list in notes.md) | Exact window check on #33's table (head never reads outside the window); F entered only in T4m, T9m, T13m, always reading 0. M and O are #11's chains of these, mirrored | 2-13 each | ✓20/20 |
Compressed historythe tape as 0∞ <C (01)b 000 (01)a [(10)v_j (01)u_j]_{j=m..1} 1001 0∞ (all bits 1: the K just before each overflow) at 36 moments: where the rules are read off
| step | m | u_1..u_m | v_1..v_m | a | b | INV class |
|---|---|---|---|---|---|---|
| 215 | 1 | 1 | 3 | 4 | 1 | A |
| 604 | 1 | 5 | 2 | 6 | 5 | C |
| 1,185 | 2 | 13 | 44 | 10 | 5 | A |
| 2,870 | 1 | 13 | 4 | 14 | 13 | C |
| 3,963 | 2 | 15 | 1,212 | 18 | 5 | A |
| 6,320 | 2 | 1,415 | 212 | 14 | 13 | C |
| 9,197 | 3 | 1,315 | 13,128 | 22 | 13 | A |
| 16,850 | 2 | 3,015 | 88 | 30 | 29 | C |
| 21,423 | 3 | 1,911 | 291,224 | 38 | 13 | A |
| 31,348 | 3 | 311,531 | 6,424 | 30 | 29 | C |
| 43,225 | 4 | 17,731 | 30,122,416 | 46 | 29 | A |
| 74,638 | 3 | 324,631 | 41,616 | 62 | 61 | C |
| 93,131 | 4 | 151,923 | 31,432,448 | 78 | 29 | A |
| 133,584 | 4 | 33,463,163 | 212,848 | 62 | 61 | C |
| 181,685 | 5 | 13,151,563 | 3,243,244,832 | 94 | 61 | A |
| 308,778 | 3 | 809,463 | 83,232 | 126 | 125 | C |
| 343,591 | 4 | 193,539 | 799,156,112 | 142 | 29 | A |
| 406,380 | 4 | 819,463,127 | 62,824,112 | 62 | 61 | C |
| 470,545 | 5 | 173,131,127 | 80,915,611,232 | 94 | 61 | A |
| 619,974 | 5 | 82,946,312,763 | 424,169,632 | 126 | 125 | C |
| 803,667 | 6 | 15,272,311,163 | 8.19·1012 | 190 | 125 | A |
| 1,301,112 | 5 | 839,463,127,190 | 22,088,064 | 254 | 253 | C |
| 1,605,357 | 6 | 1,323,159,595 | 8.29·1014 | 318 | 125 | A |
| 2,271,874 | 4 | 178,190,190,255 | 166,432,192 | 254 | 253 | C |
| 2,437,167 | 5 | 1,176,739,207 | 1.77·1014 | 286 | 61 | A |
| 2,726,100 | 5 | 1.79·1014 | 146,024,176,224 | 126 | 125 | C |
| 3,010,153 | 6 | 1.15·1012 | 1.78·1016 | 190 | 125 | A |
| 3,647,102 | 6 | 1.8·1017 | 1.25·1013 | 254 | 253 | C |
| 4,410,491 | 7 | 1.13·1015 | 1.79·1019 | 382 | 253 | A |
| 6,442,496 | 6 | 1.81·1017 | 1.05·1013 | 510 | 509 | C |
| 421,432,981 | 10 | 1.27·1025 | 3.78·1033 | 5,118 | 2,045 | A |
| 592,819,210 | 8 | 3.8·1027 | 2.48·1022 | 4,094 | 4,093 | C |
| 635,100,567 | 9 | 1.25·1023 | 3.79·1031 | 4,606 | 1,021 | A |
| 709,411,452 | 9 | 3.81·1031 | 2.27·1025 | 2,046 | 2,045 | C |
| 782,428,529 | 10 | 1.23·1027 | 3.8·1035 | 3,070 | 2,045 | A |
| 946,193,350 | 10 | 3.82·1035 | 2.07·1028 | 4,094 | 4,093 | C |
mlast 10u_1..u_mlast 3.82·1035v_1..v_mlast 2.07·1028alast 4,094blast 4,093INV classlast CTemplate comparisonour: applies · the nearest solved proof, what carries over, and the transitions that differ
| 0 | 1 | |
|---|---|---|
| A | 1RB | 0RE |
| B | 1LC | 0RE |
| C | 1LD | 0LD |
| D | 1RA | 0LC |
| E | 1RA | 1RF |
| F | 1RA | --- |
- file
- —
- module
our kill #11 (machines/1RB0LE_1RC0RC_1LD0RB_1LA0LE_1LD1LF_1LD---/, check_kill PASS)- machine
1RB0LE_1RC0RC_1LD0RB_1LA0LE_1LD1LF_1LD---(9 transitions apart)- diff
0 transitions after mirroring + renaming (#11's A,B,C,D,E,F = this machine's B,C,D,A,E,F); only the start state differs (#11's D)- note
- Same table, so #11's rules (M, O, the 20 window lemmas) and its Rocq-checked invariant INV = Common and (A or B or C) carry over unchanged. Only the init is new: 215 steps to K((1,1,3);4,1), class A. SBCv6 TM21 / TCv3 (targeting.md) are only loose relatives.
Proof strategy & riskshow the formal proof will go · 3 risks to watch
Reuse kill #11 wholesale: copy its .v and mirror it (states A,B,C,D -> B,C,D,A; tape sides swapped). Replace init (483 steps to K [d1 1 2] 8 5) with 215 steps to K [d1 1 3] 4 1, check INV there by computation, keep the closure proof verbatim. Alternative: keep tm11's lemmas and transport with busycoq's Flip.v + Permute.v.
- ▲Mirroring 692 lines by hand is error-prone; script it (swap <*/*>, {{X}}>/<{{X}}, rename states) and let Rocq check. Flip/Permute route adds a second TM_from_str (check_kill warns).
- ▲Duplicate work: hipparcos's Level-1 machine is the B-start of this table (same open question as #11).
- ▲Proof size is small (init + INV check on top of #11), so the main cost is the mechanical port.
Stats & provenance109 steps simulated · 76,245 cells · the status in full · files
- simulated
- 109 steps
- tape
- 76,245 cells · 38,119 nonzeros
- growth
- left edge ~2.4 t^0.5 (76,078 cells left of the start by 1e9); right edge +3 cells per overflow (52 overflows by 1e9; rules-only model: 103 by 2.4e13)
- status now
- check_kill PASS, independently re-verified (status.json, 2026-10-10)
- observer's note
- Same table as kill #11 (mirror, D-start). M_k/O 360/360 random instances; real run = rules for all 18,976 macro steps to 1e9; INV holds from step 215. Not a cryptid.
- files
- observe.json · notes.md · proof.md · how_proved.md · status.json · 1RB0RE_1LC0RE_1LD0LD_1RA0LC_1RA1RF_1RA---.v
Proof & checks
Kill 9 · Skelet 1-like Class 2 · the kill file 1RB0RE_1LC0RE_1LD0LD_1RA0LC_1RA1RF_1RA---.v: 671 lines, 102 items · the package submission/
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).
1RB0RE_1LC0RE_1LD0LD_1RA0LC_1RA1RF_1RA---sha256 2dfa4337b76b3b5e…
| ✓ | 1RB0RE_1LC0RE_1LD0LD_1RA0LC_1RA1RF_1RA---.v | 2dfa4337b76b3b5e… = checked |
| ✓ | submission/1RB0RE_1LC0RE_1LD0LD_1RA0LC_1RA1RF_1RA---.v | 2dfa4337b76b3b5e… = checked |
All 17 check_kill checks with their one-line results
| ✓ | args | 6x2 machine, framework module Individual62, mode nonhalt |
| ✓ | input | 30232 bytes, 671 lines, 744 sentences |
| ✓ | framework | HEAD 0940bb9cf434ba68f0c025dabfde45a219999973 == pin; no tracked changes under verify/ |
| ✓ | framework_build | 13 needed framework .vo files present and fresh, with native code no older than the .vo |
| ✓ | forbidden | none of 30 forbidden patterns occur (ground rule 1's words: anywhere; command words: outside comments and strings; comments never split a token) |
| ✓ | structure | 6 Require name(s) allowed; no top-level Variable/Context; no shadowing; Module/Section balanced |
| ✓ | tm_text | line 22: TM_from_str "1RB0RE_1LC0RE_1LD0LD_1RA0LC_1RA1RF_1RA---" == <tm> (41 bytes) |
| ✓ | theorem_text | line 639: nonhalt : ~halts tm c0 |
| ✓ | coq | coqc 8.20.1 ([local working file] |
| ✓ | names | halts, c0, TM_from_str resolved inside Individual62 |
| ✓ | compile | compiled in 8.5s with all appended checks |
| ✓ | tm_rocq | BB6Kill.Candidate.tm = BusyCoq.Individual62.TM_from_str "1RB0RE_1LC0RE_1LD0LD_1RA0LC_1RA1RF_1RA---" by eq_refl (in-file and isolated) |
| ✓ | theorem_rocq | nonhalt : ~ halts (TM_from_str "1RB0RE_1LC0RE_1LD0LD_1RA0LC_1RA1RF_1RA---") c0 with absolute names (in-file and isolated) |
| ✓ | isolation | only stock proof plugins loaded; guard/positivity/universe checking on, definitional UIP off |
| ✓ | assumptions | 0 assumption(s), all in the baseline |
| ✓ | coqchk | coqchk -norec BB6Kill.Candidate ok (1.8s); its context summary lists nothing of the file's own |
| ✓ | integrity | input sha256 and framework HEAD/cleanliness identical before and after |
2Where 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).
It extends our kill #11's .v, verify/Skelet1LikeC2_1RB0LE_1RC0RC.v (694 lines), which follows the architecture of SBCv6.v Module TM21 (carries plus a re-pairing overflow). TCv3.v is only a loose relative.
- Machine part, mirrored by hand. The dictionary is
l {{q}}> r->r <{{pi q}} l,l <* xs->xs *> l,shift_rule_R<->_L, with list literals unchanged. #11's rule-spec statements are kept word for word. Beyond the dictionary, the only edits weredl->dr,L0->R0, oneunfold R0and one explicitS6instance. Therw/ro_outaccumulators change side. - Abstract part (INV, F1-F3, closure, about 390 lines): #11's text byte for byte, except that
stepis renamedmacro_stepso it does not shadow the framework'sstep. - New:
init(215 steps toK [d1 1 3] 4 1, against #11's 483 toK [d1 1 2] 8 5) and the base ofnonhalt. Everything compiled on the first try.
The file is 671 lines, imports only Individual62 from busycoq, and has one TM_from_str. proof.md is the informal proof; its §6 maps sections to lemma names.
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.
Template-only names: lshift, p01, p10, dl, L0, step
Other references found:
- mechanism reference (not named as a code template) vendor/busycoq/verify/SBCv6.v Module TM21 (named in 1RB0RE_1LC0RE_1LD0LD_1RA0LC_1RA1RF_1RA---.v line 5)
Side-by-side diff: template (595 lines) vs ours (574 lines), 205 lines differ; runs of identical lines and long template-only runs folded
| template | ours | ||
|---|---|---|---|
| 12 | From BusyCoq Require Import Individual62. | 16 | From BusyCoq Require Import Individual62. |
| 13 | Require Import ZifyNat Lia. | 17 | Require Import ZifyNat Lia. |
| ⋯ 6 identical lines (template 14–21, ours 18–25) | |||
| 22 | Notation "c -->+ c'" := (c -[ tm ]->+ c') (at level 40). | 26 | Notation "c -->+ c'" := (c -[ tm ]->+ c') (at level 40). |
| 24 | Open Scope list. | 28 | Open Scope list. |
| 26 | (* rotation of a power by one cell *) | ||
| 30 | (* ---------- shift lemmas (one block, then shift_rule_L/R) ---------- *) | ||
| 27 | Lemma rot01 n (Y : side) : [0;1]^^n *> (0 >> Y) = 0 >> ([1;0]^^n *> Y). | ||
| 31 | Lemma S1_1 l r: l <* [0;1] <{{C}} [] *> r -->* l <{{C}} [] *> [0;1] *> r. Proof. es. Qed. | ||
| 28 | Proof. | ||
| 32 | Lemma S2_1 l r: l <* [1;0] <{{D}} [] *> r -->* l <{{D}} [] *> [1;0] *> r. Proof. es. Qed. | ||
| 29 | induction n; cbn; [reflexivity|]. | ||
| 33 | Lemma S3_1 l r: l <* [] {{A}}> [1;0] *> r -->* l <* [1;0] <* [] {{A}}> r. Proof. es. Qed. | ||
| 30 | rewrite IHn. reflexivity. | ||
| 34 | Lemma S4_1 l r: l <* [] {{E}}> [0;1] *> r -->* l <* [0;1] <* [] {{E}}> r. Proof. es. Qed. | ||
| 31 | Qed. | ||
| 35 | Lemma S6_1 l r: l <* [1;0] <{{C}} [0] *> r -->* l <{{C}} [0] *> [0;1] *> r. Proof. es. Qed. | ||
| 33 | Lemma lshift (xs : list sym) n (l : side) : l <* xs <* xs^^n = l <* xs^^(S n). | ||
| 36 | Lemma S5_1 l r: l <* [0;1] <* [1;1] <{{D}} r -->* l <* [1;1] <{{D}} [0;1] *> r. Proof. es. Qed. | ||
| 34 | Proof. | ||
| 38 | Definition S1 := shift_rule_L _ _ _ _ _ S1_1. | ||
| 35 | cbn. rewrite <-Str_app_assoc, lpow_shift. reflexivity. | ||
| 39 | Definition S2 := shift_rule_L _ _ _ _ _ S2_1. | ||
| 36 | Qed. | ||
| 40 | Definition S3 := shift_rule_R _ _ _ _ _ S3_1. | ||
| 38 | (* ---------- one-block lemmas ---------- *) | ||
| 41 | Definition S4 := shift_rule_R _ _ _ _ _ S4_1. | ||
| 39 | Lemma S1_1 l r: l <* [] {{B}}> [0;1] *> r -->* l <* [0;1] <* [] {{B}}> r. Proof. es. Qed. | ||
| 42 | Definition S6 := shift_rule_L _ _ _ _ _ S6_1. | ||
| 40 | Lemma S2_1 l r: l <* [] {{C}}> [1;0] *> r -->* l <* [1;0] <* [] {{C}}> r. Proof. es. Qed. | ||
| 44 | Lemma S5 n: forall l r, l <* [0;1]^^n <* [1;1] <{{D}} r -->* l <* [1;1] <{{D}} [0;1]^^n *> r. | ||
| 41 | Lemma S3_1 l r: l <* [1;0] <{{D}} [] *> r -->* l <{{D}} [] *> [1;0] *> r. Proof. es. Qed. | ||
| 42 | Lemma S4_1 l r: l <* [0;1] <{{E}} [] *> r -->* l <{{E}} [] *> [0;1] *> r. Proof. es. Qed. | ||
| ⋯ 6 template-only lines (template 43–49), not in ours | |||
| 50 | Definition S6 := shift_rule_R _ _ _ _ _ S6_1. | ||
| 52 | Lemma S5 n: forall l r, l {{C}}> [1;1] *> [0;1]^^n *> r -->* l <* [0;1]^^n {{C}}> [1;1] *> r. | ||
| 53 | Proof. | 45 | Proof. |
| 54 | induction n; intros. | 46 | induction n; intros. |
| 55 | - finish. | 47 | - finish. |
| 56 | - follow S5_1. follow IHn. rewrite lshift. finish. | 48 | - simpl_tape. follow S5_1. follow IHn. rewrite lpow_shift'. finish. |
| 57 | Qed. | 49 | Qed. |
| 59 | (* ---------- finite turns ---------- *) | 51 | (* ---------- finite turns ---------- *) |
| 60 | Lemma T1 l: l {{B}}> 0inf -->* l <{{E}} [0;1] *> 0inf. Proof. es. Qed. | ||
| 52 | Lemma T1 r: 0inf <{{C}} r -->* 0inf <* [0;1] {{E}}> r. Proof. es. Qed. | ||
| 61 | Lemma T2 l r: l <* [0;0;0] <{{E}} r -->* l <* [0;0;1] {{B}}> r. Proof. es. Qed. | 53 | Lemma T2 l r: l {{E}}> [0;0;0] *> r -->* l <{{C}} [0;0;1] *> r. Proof. es. Qed. |
| 62 | Lemma T3 l r: l <* [0;0;1] <{{E}} r -->* l <{{E}} [0;1;1] *> r. Proof. es. Qed. | 54 | Lemma T3 l r: l {{E}}> [0;0;1] *> r -->* l <* [0;1;1] {{E}}> r. Proof. es. Qed. |
| 63 | Lemma T4 l r: l <* [1;0] <{{E}} r -->* l <{{D}} [1;1] *> r. Proof. es. Qed. | 55 | Lemma T4 l r: l {{E}}> [1;0] *> r -->* l <* [1;1] {{A}}> r. Proof. es. Qed. |
| 64 | Lemma T5 l r: l <* [0;1] <{{D}} r -->* l <{{E}} [0;1] *> r. Proof. es. Qed. | 56 | Lemma T5 l r: l {{A}}> [0;1] *> r -->* l <* [0;1] {{E}}> r. Proof. es. Qed. |
| 65 | Lemma T6 l r: l <* [0;0] <{{D}} r -->* l <* [0;1] {{C}}> r. Proof. es. Qed. | 57 | Lemma T6 l r: l {{A}}> [0;0] *> r -->* l <{{D}} [0;1] *> r. Proof. es. Qed. |
| 66 | Lemma T7 l r: l {{C}}> [1;1] *> r -->* l <* [0;0] {{C}}> r. Proof. es. Qed. | 58 | Lemma T7 l r: l <* [1;1] <{{D}} r -->* l <{{D}} [0;0] *> r. Proof. es. Qed. |
| 67 | Lemma T8 l r: l {{C}}> [1;1;0;1;1] *> r -->* l <* [0;0;0;0;1] {{B}}> r. Proof. es. Qed. | 59 | Lemma T8 l r: l <* [1;1;0;1;1] <{{D}} r -->* l <{{C}} [0;0;0;0;1] *> r. Proof. es. Qed. |
| 68 | Lemma T9 r: 0inf <* [1;0;0;1] <{{E}} r -->* 0inf <* [1;0;0;1] <* [0;0;0] {{B}}> r. Proof. es. Qed. | ||
| 60 | Lemma T9 l: l {{E}}> [1;0;0;1] *> 0inf -->* l <{{C}} [0;0;0] *> [1;0;0;1] *> 0inf. Proof. es. Qed. | ||
| 69 | Lemma T10 l r: l {{B}}> [1;1] *> r -->* l <* [0;0] {{B}}> r. Proof. es. Qed. | 61 | Lemma T10 l r: l <* [1;1] <{{C}} r -->* l <{{C}} [0;0] *> r. Proof. es. Qed. |
| 70 | Lemma T11 l r: l {{B}}> [0] *> r -->* l <* [1] {{C}}> r. Proof. es. Qed. | 62 | Lemma T11 l r: l <* [0] <{{C}} r -->* l <{{D}} [1] *> r. Proof. es. Qed. |
| 71 | Lemma T12 l: l {{C}}> [1;1] *> 0inf -->* l <{{E}} [0;1;1;0;1] *> 0inf. Proof. es. Qed. | ||
| 63 | Lemma T12 r: 0inf <* [1;1] <{{D}} r -->* 0inf <* [0;1;1;0;1] {{E}}> r. Proof. es. Qed. | ||
| 72 | Lemma T13 l r: l <* [1;0;1] <{{E}} r -->* l <{{E}} [0;1;1] *> r. Proof. es. Qed. | 64 | Lemma T13 l r: l {{E}}> [1;0;1] *> r -->* l <* [0;1;1] {{E}}> r. Proof. es. Qed. |
| 73 | Lemma T14 l r: l {{B}}> [1;1;0;1] *> r -->* l <* [0;1;0;0] {{B}}> r. Proof. es. Qed. | 65 | Lemma T14 l r: l <* [1;1;0;1] <{{C}} r -->* l <{{C}} [0;1;0;0] *> r. Proof. es. Qed. |
| 76 | Lemma p01 n (Y : side) : [0;1]^^n *> 0 >> 1 >> Y = 0 >> 1 >> [0;1]^^n *> Y. | ||
| 67 | (* ---------- digit lemmas (write-up section 2.1), mirrored from the parent ---------- *) | ||
| 77 | Proof. exact (lpow_shift' _ n [0;1] Y). Qed. | ||
| 68 | Lemma rot01 n (Y : side) : [0;1]^^n *> (0 >> Y) = 0 >> ([1;0]^^n *> Y). | ||
| 78 | Lemma p10 n (Y : side) : [1;0]^^n *> 1 >> 0 >> Y = 1 >> 0 >> [1;0]^^n *> Y. | ||
| 69 | Proof. induction n; cbn; [reflexivity|]. rewrite IHn. reflexivity. Qed. | ||
| 79 | Proof. exact (lpow_shift' _ n [1;0] Y). Qed. | ||
| 81 | Lemma rot10 n (Y : side) : [1;0]^^n *> (1 >> Y) = 1 >> ([0;1]^^n *> Y). | 70 | Lemma rot10 n (Y : side) : [1;0]^^n *> (1 >> Y) = 1 >> ([0;1]^^n *> Y). |
| 82 | Proof. | ||
| 71 | Proof. induction n; cbn; [reflexivity|]. rewrite IHn. reflexivity. Qed. | ||
| 83 | induction n; cbn; [reflexivity|]. | ||
| 84 | rewrite IHn. reflexivity. | ||
| 85 | Qed. | ||
| 86 | Ltac fin := apply evstep_refl'; simpl_tape; repeat (rewrite rot01 || rewrite rot10); try reflexivity. | 72 | Ltac fin := apply evstep_refl'; simpl_tape; repeat (rewrite rot01 || rewrite rot10); try reflexivity. |
| 88 | (* ---------- digit lemmas ---------- *) | ||
| 89 | Lemma Lb u v l r: | 74 | Lemma Lb u v l r: |
| 90 | l <* [0;1]^^(S u) <* [1;0]^^(S v) <{{E}} r -->* | ||
| 75 | l {{E}}> [1;0]^^(S v) *> [0;1]^^(S u) *> r -->* | ||
| 91 | l <{{E}} [0;1]^^(S u) *> [1;0]^^v *> [1;1] *> r. | ||
| 76 | l <* [1;1] <* [1;0]^^v <* [0;1]^^(S u) {{E}}> r. | ||
| 92 | Proof. | ||
| 77 | Proof. follow T4. follow S3. follow T5. follow S4. fin. Qed. | ||
| 93 | follow T4. follow S3. follow T5. follow S4. fin. | ||
| 94 | Qed. | ||
| 96 | Lemma Lf u v l r: | 79 | Lemma Lf u v l r: |
| 97 | l <* [0;1]^^u <* [0;0] <* [1;0]^^(S v) <{{E}} r -->* | ||
| 80 | l {{E}}> [1;0]^^(S v) *> [0;0] *> [0;1]^^u *> r -->* | ||
| 98 | l <* [0;1]^^(S u) <* [1;0]^^v {{C}}> [1;1] *> r. | ||
| 81 | l <* [1;1] <{{D}} [1;0]^^v *> [0;1]^^(S u) *> r. | ||
| 99 | Proof. | ||
| 82 | Proof. follow T4. follow S3. follow T6. follow S2. fin. Qed. | ||
| 100 | follow T4. follow S3. follow T6. follow S2. fin. | ||
| 101 | Qed. | ||
| 103 | Lemma Rb u v l r: | 84 | Lemma Rb u v l r: |
| 104 | l {{C}}> [1;1] *> [0;1]^^u *> [1;0]^^v *> [1;1] *> r -->* | ||
| 85 | l <* [1;1] <* [1;0]^^v <* [0;1]^^u <* [1;1] <{{D}} r -->* | ||
| 105 | l <* [0;1]^^u <* [0;0] <* [1;0]^^v {{C}}> [1;1] *> r. | ||
| 86 | l <* [1;1] <{{D}} [1;0]^^v *> [0;0] *> [0;1]^^u *> r. | ||
| 106 | Proof. | ||
| 87 | Proof. follow S5. follow T7. follow S2. fin. Qed. | ||
| 107 | follow S5. follow T7. follow S2. fin. | ||
| 108 | Qed. | ||
| 110 | Lemma Ro u v l r: | 89 | Lemma Ro u v l r: |
| 111 | l <* [0;0;0] {{B}}> [0;1]^^(S u) *> [1;0]^^v *> [1;1] *> r -->* | ||
| 90 | l <* [1;1] <* [1;0]^^v <* [0;1]^^(S u) <{{C}} [0;0;0] *> r -->* | ||
| 112 | l <* [0;0] <* [1;0]^^(S u) <* [0;1]^^v <* [0;0;0] {{B}}> r. | ||
| 91 | l <{{C}} [0;0;0] *> [0;1]^^v *> [1;0]^^(S u) *> [0;0] *> r. | ||
| 113 | Proof. | ||
| 92 | Proof. follow S1. follow S6. follow T10. fin. Qed. | ||
| 114 | follow S1. | ||
| 94 | (* ---------- the family K and the initial segment (write-up sections 1, 4) ---------- *) | ||
| 115 | follow (S6 (l <* [0;0;0] <* [0;1]^^u <* [1])). | ||
| 116 | follow T10. | ||
| ⋯ 23 template-only lines (template 117–142), not in ours | |||
| 143 | Qed. | ||
| 145 | (* ---------- the digit list ---------- *) | ||
| 146 | Inductive dg := d0 (u v : nat) | d1 (u v : nat). | 95 | Inductive dg := d0 (u v : nat) | d1 (u v : nat). |
| 148 | (* left-side lists are written nearest-cell first: (10)^u is [0;1]^^u, (01)^v is [1;0]^^v *) | ||
| 97 | (* right-side lists are nearest-cell first: d0 u v reads (10)^v 00 (01)^u from the head side *) | ||
| 149 | Definition dl (d : dg) (l : side) : side := | 98 | Definition dr (d : dg) (r : side) : side := |
| 150 | match d with | 99 | match d with |
| 151 | | d0 u v => l <* [0;1]^^u <* [0;0] <* [1;0]^^v | ||
| 100 | | d0 u v => [1;0]^^v *> [0;0] *> [0;1]^^u *> r | ||
| 152 | | d1 u v => l <* [0;1]^^u <* [1;0]^^v | ||
| 101 | | d1 u v => [1;0]^^v *> [0;1]^^u *> r | ||
| 153 | end. | 102 | end. |
| 155 | (* digit lists are least significant digit first *) | 104 | (* digit lists are least significant digit first, as in the parent *) |
| 156 | Fixpoint app_ds (l : side) (ds : list dg) : side := | 105 | Fixpoint app_ds (r : side) (ds : list dg) : side := |
| 157 | match ds with | 106 | match ds with |
| 158 | | [] => l | 107 | | [] => r |
| 159 | | d :: t => dl d (app_ds l t) | 108 | | d :: t => dr d (app_ds r t) |
| 160 | end. | 109 | end. |
| 162 | Definition L0 : side := 0inf <* [1;0;0;1]. | 111 | Definition R0 : side := [1;0;0;1] *> 0inf. |
| 164 | Definition K (ds : list dg) (a b : nat) : Q * tape := | 113 | Definition K (ds : list dg) (a b : nat) : Q * tape := |
| 165 | app_ds L0 ds <* [0;1]^^a <* [0;0;0] <* [0;1]^^b {{B}}> 0inf. | ||
| 114 | 0inf <{{C}} [0;1]^^b *> [0;0;0] *> [0;1]^^a *> app_ds R0 ds. | ||
| 116 | Lemma init: c0 -->* K [d1 1 3] 4 1. | ||
| 117 | Proof. unfold K, R0. cbn. solve_init. Qed. | ||
| 119 | (* ---------- the parent's orientation-free list definitions, verbatim ---------- *) | ||
| 167 | Definition map1 (os : list (nat*nat)) := map (fun '(u,v) => d1 (S u) (S v)) os. | 120 | Definition map1 (os : list (nat*nat)) := map (fun '(u,v) => d1 (S u) (S v)) os. |
| 168 | Definition map0 (os : list (nat*nat)) := map (fun '(u,v) => d0 (S u) v) os. | 121 | Definition map0 (os : list (nat*nat)) := map (fun '(u,v) => d0 (S u) v) os. |
| 170 | Fixpoint rw (os : list (nat*nat)) (r : side) : side := | ||
| 123 | (* ---------- the list sweeps (mirrors of the parent's LbS, RbS, RoS) ---------- *) | ||
| 124 | (* left-side accumulator: what Lb leaves behind for each all-ones digit (u+1,1,v+1) *) | ||
| 125 | Fixpoint rw (os : list (nat*nat)) (l : side) : side := | ||
| 171 | match os with | 126 | match os with |
| 172 | | [] => r | 127 | | [] => l |
| 173 | | (u,v) :: t => rw t ([0;1]^^(S u) *> [1;0]^^v *> [1;1] *> r) | ||
| 128 | | (u,v) :: t => rw t (l <* [1;1] <* [1;0]^^v <* [0;1]^^(S u)) | ||
| 174 | end. | 129 | end. |
| 176 | Lemma app_ds_app l xs ys : app_ds l (xs ++ ys) = app_ds (app_ds l ys) xs. | 131 | Lemma app_ds_app r xs ys : app_ds r (xs ++ ys) = app_ds (app_ds r ys) xs. |
| 177 | Proof. induction xs; cbn; congruence. Qed. | 132 | Proof. induction xs; cbn; congruence. Qed. |
| 179 | Lemma LbS os: forall l r, app_ds l (map1 os) <{{E}} r -->* l <{{E}} rw os r. | 134 | Lemma LbS os: forall l r, l {{E}}> app_ds r (map1 os) -->* rw os l {{E}}> r. |
| 180 | Proof. | 135 | Proof. |
| 181 | induction os as [|[u v] t IH]; intros. | 136 | induction os as [|[u v] t IH]; intros. |
| 182 | - finish. | 137 | - finish. |
| 183 | - cbn [map1 map app_ds dl rw]. follow Lb. apply IH. | 138 | - cbn [map1 map app_ds dr rw]. follow Lb. apply IH. |
| 184 | Qed. | 139 | Qed. |
| 186 | Lemma RbS os: forall l r, l {{C}}> [1;1] *> rw os r -->* app_ds l (map0 os) {{C}}> [1;1] *> r. | ||
| 141 | Lemma RbS os: forall l r, rw os l <* [1;1] <{{D}} r -->* l <* [1;1] <{{D}} app_ds r (map0 os). | ||
| 187 | Proof. | 142 | Proof. |
| 188 | induction os as [|[u v] t IH]; intros. | 143 | induction os as [|[u v] t IH]; intros. |
| 189 | - finish. | 144 | - finish. |
| 190 | - cbn [map0 map app_ds dl rw]. follow IH. apply Rb. | 145 | - cbn [map0 map app_ds dr rw]. follow IH. apply Rb. |
| 191 | Qed. | 146 | Qed. |
| 193 | Fixpoint ro_out (os : list (nat*nat)) (l : side) : side := | 148 | Fixpoint ro_out (os : list (nat*nat)) (r : side) : side := |
| 194 | match os with | 149 | match os with |
| 195 | | [] => l | 150 | | [] => r |
| 196 | | (u,v) :: t => ro_out t l <* [0;0] <* [1;0]^^(S u) <* [0;1]^^v | ||
| 151 | | (u,v) :: t => [0;1]^^v *> [1;0]^^(S u) *> [0;0] *> ro_out t r | ||
| 197 | end. | 152 | end. |
| 199 | Lemma RoS os: forall l r, l <* [0;0;0] {{B}}> rw os r -->* ro_out os l <* [0;0;0] {{B}}> r. | ||
| 154 | Lemma RoS os: forall l r, rw os l <{{C}} [0;0;0] *> r -->* l <{{C}} [0;0;0] *> ro_out os r. | ||
| 200 | Proof. | 155 | Proof. |
| 201 | induction os as [|[u v] t IH]; intros. | 156 | induction os as [|[u v] t IH]; intros. |
| ⋯ 11 identical lines (template 202–214, ours 157–169) | |||
| 215 | | (u, v) :: t => d1 (S v) A :: Oz t (S u) | 170 | | (u, v) :: t => d1 (S v) A :: Oz t (S u) |
| 216 | end. | 171 | end. |
| 218 | Lemma Ozeq t: forall u l, ro_out t l <* [0;0] <* [1;0]^^u = app_ds l (Oz t u). | ||
| 173 | Lemma Ozeq t: forall u r, [1;0]^^u *> [0;0] *> ro_out t r = app_ds r (Oz t u). | ||
| 219 | Proof. | 174 | Proof. |
| 220 | induction t as [|[a b] t IH]; intros. | 175 | induction t as [|[a b] t IH]; intros. |
| 221 | - reflexivity. | 176 | - reflexivity. |
| 222 | - cbn [ro_out Oz app_ds dl]. rewrite <- IH. reflexivity. | 177 | - cbn [ro_out Oz app_ds dr]. rewrite <- IH. reflexivity. |
| 223 | Qed. | 178 | Qed. |
| 180 | (* ---------- edge chunks (mirrors of the parent's chunkA, chunkC, chunkO) ---------- *) | ||
| 181 | (* left-edge chunk shared by M and O: <C (01)^b 000 (01)^a -> (10)^(b+2) 110 (10)^a E> *) | ||
| 182 | Lemma chunkA a b r: | ||
| 183 | 0inf <{{C}} [0;1]^^b *> [0;0;0] *> [0;1]^^a *> r -->+ | ||
| 184 | 0inf <* [0;1]^^(S (S b)) <* [0;1;1] <* [0;1]^^a {{E}}> r. | ||
| 185 | Proof. es. Qed. | ||
| 187 | (* end of M: (10)^(b+2) 110 (10)^a 11 <D -> <C (01)^(b+2) 000 (01)^(a+1) *) | ||
| 188 | Lemma chunkC a b r: | ||
| 189 | 0inf <* [0;1]^^(S (S b)) <* [0;1;1] <* [0;1]^^a <* [1;1] <{{D}} r -->* | ||
| 190 | 0inf <{{C}} [0;1]^^(S (S b)) *> [0;0;0] *> [0;1]^^(S a) *> r. | ||
| 191 | Proof. | ||
| 192 | follow S5. follow T8. follow S1. fin. | ||
| 193 | Qed. | ||
| 195 | (* end of O: (10)^(b+2) 110 (10)^(a+1) <C 000 -> <C 01 000 (01)^(b+3) (10)^(a+1) 01 *) | ||
| 196 | Lemma chunkO a b r: | ||
| 197 | 0inf <* [0;1]^^(S (S b)) <* [0;1;1] <* [0;1]^^(S a) <{{C}} [0;0;0] *> r -->* | ||
| 198 | 0inf <{{C}} [0;1] *> [0;0;0] *> [0;1]^^(S (S (S b))) *> [1;0]^^(S a) *> [0;1] *> r. | ||
| 199 | Proof. | ||
| 200 | follow S1. follow T11. follow S5. follow T12. follow S4. follow T13. follow S4. follow T2. follow S1. follow S1_1. | ||
| 201 | rewrite (rot01 (S (S b))). | ||
| 202 | follow (S6 (0inf <* [1;1;0;1]) ([1] *> [0;1]^^a *> [0;0;1] *> r) (S (S (S b)))). | ||
| 203 | follow T14. fin. | ||
| 204 | Qed. | ||
| 206 | (* ---------- the three rules, statements verbatim from the parent ---------- *) | ||
| 225 | (* M: carry *) | 207 | (* M: carry *) |
| 226 | Lemma M_spec os u v rest a b: | 208 | Lemma M_spec os u v rest a b: |
| ⋯ 4 identical lines (template 227–230, ours 209–212) | |||
| 231 | follow10 chunkA. | 213 | follow10 chunkA. |
| 232 | follow LbS. | 214 | follow LbS. |
| 233 | cbn [app_ds dl]. | 215 | cbn [app_ds dr]. |
| 234 | follow Lf. | 216 | follow Lf. |
| 235 | follow RbS. | 217 | follow RbS. |
| ⋯ 6 identical lines (template 236–242, ours 218–224) | |||
| 243 | Proof. | 225 | Proof. |
| 244 | follow10 (M_spec (os ++ [(u2,v2)]) u 0 rest a b). | 226 | follow10 (M_spec (os ++ [(u2,v2)]) u 0 rest a b). |
| 245 | assert (E: app_ds L0 (map0 (os ++ [(u2,v2)]) ++ d1 (S u) 0 :: rest) = | 227 | assert (E: app_ds R0 (map0 (os ++ [(u2,v2)]) ++ d1 (S u) 0 :: rest) = |
| 246 | app_ds L0 (map0 os ++ d0 (S u2 + S u) v2 :: rest)). | 228 | app_ds R0 (map0 os ++ d0 (S u2 + S u) v2 :: rest)). |
| 247 | { unfold map0. rewrite map_app, <- app_assoc. cbn [map app]. | 229 | { unfold map0. rewrite map_app, <- app_assoc. cbn [map app]. |
| 248 | rewrite !app_ds_app. f_equal. cbn [app_ds dl]. | 230 | rewrite !app_ds_app. f_equal. cbn [app_ds dr]. |
| 249 | rewrite (lpow_add _ (S u2) (S u)), Str_app_assoc. reflexivity. } | 231 | rewrite (lpow_add _ (S u2) (S u)), Str_app_assoc. reflexivity. } |
| 250 | unfold K. rewrite E. finish. | 232 | unfold K. rewrite E. finish. |
| ⋯ 7 identical lines (template 251–258, ours 233–240) | |||
| 259 | follow10 chunkA. | 241 | follow10 chunkA. |
| 260 | follow LbS. | 242 | follow LbS. |
| 261 | follow T9. | ||
| 243 | unfold R0. follow T9. | ||
| 262 | follow RoS. | 244 | follow RoS. |
| 263 | follow chunkO. | 245 | follow chunkO. |
| 264 | apply evstep_refl'. cbn [Oout app_ds dl ro_out]. rewrite <- Ozeq. reflexivity. | 246 | apply evstep_refl'. cbn [Oout app_ds dr ro_out]. rewrite <- Ozeq. reflexivity. |
| 265 | Qed. | 247 | Qed. |
| 267 | Lemma init: c0 -->* K [d1 1 2] 8 5. | ||
| 268 | Proof. unfold K, L0. cbn. solve_init. Qed. | ||
| 270 | (* ================= abstract invariant (write-up section 3) ================= *) | 249 | (* ================= abstract invariant (write-up section 3) ================= *) |
| 271 | Open Scope nat_scope. | 250 | Open Scope nat_scope. |
| ⋯ 235 identical lines (template 273–545, ours 252–524) | |||
| 547 | Ltac pw := repeat (rewrite pow2S in *). | 526 | Ltac pw := repeat (rewrite pow2S in *). |
| 549 | (* ---------- closure: every INV state takes a macro step into INV ---------- *) | 528 | (* ---------- closure: every INV state takes a macro step into INV ---------- *) |
| 550 | Lemma step s : INV s -> exists s', Kc s -->+ Kc s' /\ INV s'. | 529 | Lemma macro_step s : INV s -> exists s', Kc s -->+ Kc s' /\ INV s'. |
| 551 | Proof. | 530 | Proof. |
| 552 | destruct s as [[ds a] b]. unfold INV. | 531 | destruct s as [[ds a] b]. unfold INV. |
| ⋯ 107 identical lines (template 553–662, ours 532–639) | |||
| 663 | Proof. | 640 | Proof. |
| 664 | eapply multistep_nonhalt; [apply init|]. | 641 | eapply multistep_nonhalt; [apply init|]. |
| 665 | change (K [d1 1 2] 8 5) with (Kc ([d1 1 2], 8, 5)). | 642 | change (K [d1 1 3] 4 1) with (Kc ([d1 1 3], 4, 1)). |
| 666 | apply progress_nonhalt_cond with (P := INV). | 643 | apply progress_nonhalt_cond with (P := INV). |
| 667 | - exact step. | 644 | - exact macro_step. |
| 668 | - unfold INV. cbn. repeat split; try lia; try discriminate. | 645 | - unfold INV. cbn. repeat split; try lia; try discriminate. |
| 669 | left. unfold PA, canon, Rd, ub, vof. cbn. repeat split; lia. | 646 | left. unfold PA, canon, Rd, ub, vof. cbn. repeat split; lia. |
| ⋯ 2 identical lines (template 670–673, ours 647–650) | |||
| 674 | ``` | 651 | ``` |
| 675 | 1RB0LE_1RC0RC_1LD0RB_1LA0LE_1LD1LF_1LD--- | 652 | 1RB0RE_1LC0RE_1LD0LD_1RA0LC_1RA1RF_1RA--- |
| 677 | K(d_1 .. d_m; a, b) := 0^inf 10 01 d_1 .. d_m (10)^a 000 (10)^b B> 0^inf | ||
| 654 | K(d_1 .. d_m; a, b) := 0^inf <C (01)^b 000 (01)^a d~_m .. d~_1 1001 0^inf | ||
| 678 | digit (u,0,v) := (10)^u 00 (01)^v, (u,1,v) := (10)^u (01)^v (d_m least significant) | 655 | digit (u,0,v) := (10)^v 00 (01)^u, (u,1,v) := (10)^v (01)^u (d_m least significant) |
| 679 | start: 0^inf A> 0^inf -->* K((1,1,2); 8, 5) (step 483) | 656 | start: 0^inf A> 0^inf -->* K((1,1,3); 4, 1) (step 215) |
| 681 | M (j* = last bit-0 digit): | 658 | M (j* = last bit-0 digit): |
| 682 | K(.., (u,0,v), (u_j,1,v_j)_{j>j*}; a, b) -->+ K(.., (u+1,1,v-1), (u_j,0,v_j-1)_{j>j*}; a+1, b+2) | 659 | K(.., (u,0,v), (u_j,1,v_j)_{j>j*}; a, b) -->+ K(.., (u+1,1,v-1), (u_j,0,v_j-1)_{j>j*}; a+1, b+2) |
| ⋯ 9 identical lines (template 683–692, ours 660–669) | |||
| 693 | ``` | 670 | ``` |
| 694 | *) | 671 | *) |
3Proof outlineCheck: the new items (green) carry the argument; the names read like the proof.md rules.
102 items in 1RB0RE_1LC0RE_1LD0LD_1RA0LC_1RA1RF_1RA---.v (671 lines): 72 Lemma, 23 Definition, 6 Fixpoint, 1 Inductive. 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.
| # | kind | name | statement (no proof body) | line | vs template |
|---|---|---|---|---|---|
| 1 | Definition | tm | Definition tm := Eval compute in (TM_from_str "1RB0RE_1LC0RE_1LD0LD_1RA0LC_1RA1RF_1RA---"). | L22 | identicalexcept the TM string |
| 2 | Lemma | S1_1 | Lemma S1_1 l r: l <* [0;1] <{{C}} [] *> r -->* l <{{C}} [] *> [0;1] *> r. | L31 | adapted |
| 3 | Lemma | S2_1 | Lemma S2_1 l r: l <* [1;0] <{{D}} [] *> r -->* l <{{D}} [] *> [1;0] *> r. | L32 | adapted |
| 4 | Lemma | S3_1 | Lemma S3_1 l r: l <* [] {{A}}> [1;0] *> r -->* l <* [1;0] <* [] {{A}}> r. | L33 | adapted |
| 5 | Lemma | S4_1 | Lemma S4_1 l r: l <* [] {{E}}> [0;1] *> r -->* l <* [0;1] <* [] {{E}}> r. | L34 | adapted |
| 6 | Lemma | S6_1 | Lemma S6_1 l r: l <* [1;0] <{{C}} [0] *> r -->* l <{{C}} [0] *> [0;1] *> r. | L35 | adapted |
| 7 | Lemma | S5_1 | Lemma S5_1 l r: l <* [0;1] <* [1;1] <{{D}} r -->* l <* [1;1] <{{D}} [0;1] *> r. | L36 | adapted |
| 8 | Definition | S1 | Definition S1 := shift_rule_L _ _ _ _ _ S1_1. | L38 | adapted |
| 9 | Definition | S2 | Definition S2 := shift_rule_L _ _ _ _ _ S2_1. | L39 | adapted |
| 10 | Definition | S3 | Definition S3 := shift_rule_R _ _ _ _ _ S3_1. | L40 | adapted |
| 11 | Definition | S4 | Definition S4 := shift_rule_R _ _ _ _ _ S4_1. | L41 | adapted |
| 12 | Definition | S6 | Definition S6 := shift_rule_L _ _ _ _ _ S6_1. | L42 | adapted |
| 13 | Lemma | S5 | Lemma S5 n: forall l r, l <* [0;1]^^n <* [1;1] <{{D}} r -->* l <* [1;1] <{{D}} [0;1]^^n *> r. | L44 | adapted |
| 14 | Lemma | T1 | Lemma T1 r: 0inf <{{C}} r -->* 0inf <* [0;1] {{E}}> r. | L52 | adapted |
| 15 | Lemma | T2 | Lemma T2 l r: l {{E}}> [0;0;0] *> r -->* l <{{C}} [0;0;1] *> r. | L53 | adapted |
| 16 | Lemma | T3 | Lemma T3 l r: l {{E}}> [0;0;1] *> r -->* l <* [0;1;1] {{E}}> r. | L54 | adapted |
| 17 | Lemma | T4 | Lemma T4 l r: l {{E}}> [1;0] *> r -->* l <* [1;1] {{A}}> r. | L55 | adapted |
| 18 | Lemma | T5 | Lemma T5 l r: l {{A}}> [0;1] *> r -->* l <* [0;1] {{E}}> r. | L56 | adapted |
| 19 | Lemma | T6 | Lemma T6 l r: l {{A}}> [0;0] *> r -->* l <{{D}} [0;1] *> r. | L57 | adapted |
| 20 | Lemma | T7 | Lemma T7 l r: l <* [1;1] <{{D}} r -->* l <{{D}} [0;0] *> r. | L58 | adapted |
| 21 | Lemma | T8 | Lemma T8 l r: l <* [1;1;0;1;1] <{{D}} r -->* l <{{C}} [0;0;0;0;1] *> r. | L59 | adapted |
| 22 | Lemma | T9 | Lemma T9 l: l {{E}}> [1;0;0;1] *> 0inf -->* l <{{C}} [0;0;0] *> [1;0;0;1] *> 0inf. | L60 | adapted |
| 23 | Lemma | T10 | Lemma T10 l r: l <* [1;1] <{{C}} r -->* l <{{C}} [0;0] *> r. | L61 | adapted |
| 24 | Lemma | T11 | Lemma T11 l r: l <* [0] <{{C}} r -->* l <{{D}} [1] *> r. | L62 | adapted |
| 25 | Lemma | T12 | Lemma T12 r: 0inf <* [1;1] <{{D}} r -->* 0inf <* [0;1;1;0;1] {{E}}> r. | L63 | adapted |
| 26 | Lemma | T13 | Lemma T13 l r: l {{E}}> [1;0;1] *> r -->* l <* [0;1;1] {{E}}> r. | L64 | adapted |
| 27 | Lemma | T14 | Lemma T14 l r: l <* [1;1;0;1] <{{C}} r -->* l <{{C}} [0;1;0;0] *> r. | L65 | adapted |
| 28 | Lemma | rot01 | Lemma rot01 n (Y : side) : [0;1]^^n *> (0 >> Y) = 0 >> ([1;0]^^n *> Y). | L68 | identical |
| 29 | Lemma | rot10 | Lemma rot10 n (Y : side) : [1;0]^^n *> (1 >> Y) = 1 >> ([0;1]^^n *> Y). | L70 | identical |
| 30 | Lemma | Lb | Lemma Lb u v l r:
l {{E}}> [1;0]^^(S v) *> [0;1]^^(S u) *> r -->*
l <* [1;1] <* [1;0]^^v <* [0;1]^^(S u) {{E}}> r. | L74 | adapted |
| 31 | Lemma | Lf | Lemma Lf u v l r:
l {{E}}> [1;0]^^(S v) *> [0;0] *> [0;1]^^u *> r -->*
l <* [1;1] <{{D}} [1;0]^^v *> [0;1]^^(S u) *> r. | L79 | adapted |
| 32 | Lemma | Rb | Lemma Rb u v l r:
l <* [1;1] <* [1;0]^^v <* [0;1]^^u <* [1;1] <{{D}} r -->*
l <* [1;1] <{{D}} [1;0]^^v *> [0;0] *> [0;1]^^u *> r. | L84 | adapted |
| 33 | Lemma | Ro | Lemma Ro u v l r:
l <* [1;1] <* [1;0]^^v <* [0;1]^^(S u) <{{C}} [0;0;0] *> r -->*
l <{{C}} [0;0;0] *> [0;1]^^v *> [1;0]^^(S u) *> [0;0] *> r. | L89 | adapted |
| 34 | Inductive | dg | Inductive dg := d0 (u v : nat) | d1 (u v : nat). | L95 | identical |
| 35 | Definition | dr | Definition dr (d : dg) (r : side) : side := match d with | d0 u v => [1;0]^^v *> [0;0] *> [0;1]^^u *> r | d1 u v => [1;0]^^v *> [0;1]^^u *> r end. | L98 | new |
| 36 | Fixpoint | app_ds | Fixpoint app_ds (r : side) (ds : list dg) : side := match ds with | [] => r | d :: t => dr d (app_ds r t) end. | L105 | adapted |
| 37 | Definition | R0 | Definition R0 : side := [1;0;0;1] *> 0inf. | L111 | new |
| 38 | Definition | K | Definition K (ds : list dg) (a b : nat) : Q * tape :=
0inf <{{C}} [0;1]^^b *> [0;0;0] *> [0;1]^^a *> app_ds R0 ds. | L113 | adapted |
| 39 | Lemma | init | Lemma init: c0 -->* K [d1 1 3] 4 1. | L116 | adapted |
| 40 | Definition | map1 | Definition map1 (os : list (nat*nat)) := map (fun '(u,v) => d1 (S u) (S v)) os. | L120 | identical |
| 41 | Definition | map0 | Definition map0 (os : list (nat*nat)) := map (fun '(u,v) => d0 (S u) v) os. | L121 | identical |
| 42 | Fixpoint | rw | Fixpoint rw (os : list (nat*nat)) (l : side) : side := match os with | [] => l | (u,v) :: t => rw t (l <* [1;1] <* [1;0]^^v <* [0;1]^^(S u)) end. | L125 | adapted |
| 43 | Lemma | app_ds_app | Lemma app_ds_app r xs ys : app_ds r (xs ++ ys) = app_ds (app_ds r ys) xs. | L131 | adapted |
| 44 | Lemma | LbS | Lemma LbS os: forall l r, l {{E}}> app_ds r (map1 os) -->* rw os l {{E}}> r. | L134 | adapted |
| 45 | Lemma | RbS | Lemma RbS os: forall l r, rw os l <* [1;1] <{{D}} r -->* l <* [1;1] <{{D}} app_ds r (map0 os). | L141 | adapted |
| 46 | Fixpoint | ro_out | Fixpoint ro_out (os : list (nat*nat)) (r : side) : side := match os with | [] => r | (u,v) :: t => [0;1]^^v *> [1;0]^^(S u) *> [0;0] *> ro_out t r end. | L148 | adapted |
| 47 | Lemma | RoS | Lemma RoS os: forall l r, rw os l <{{C}} [0;0;0] *> r -->* l <{{C}} [0;0;0] *> ro_out os r. | L154 | adapted |
| 48 | Fixpoint | Oz | Fixpoint Oz (t : list (nat*nat)) (u : nat) : list dg := match t with | [] => [d0 0 u] | (a, b) :: t' => d0 b u :: Oz t' (S a) end. | L161 | identical |
| 49 | Definition | Oout | Definition Oout (os : list (nat*nat)) (A : nat) : list dg := match os with | [] => [] | (u, v) :: t => d1 (S v) A :: Oz t (S u) end. | L167 | identical |
| 50 | Lemma | Ozeq | Lemma Ozeq t: forall u r, [1;0]^^u *> [0;0] *> ro_out t r = app_ds r (Oz t u). | L173 | adapted |
| 51 | Lemma | chunkA | Lemma chunkA a b r:
0inf <{{C}} [0;1]^^b *> [0;0;0] *> [0;1]^^a *> r -->+
0inf <* [0;1]^^(S (S b)) <* [0;1;1] <* [0;1]^^a {{E}}> r. | L182 | adapted |
| 52 | Lemma | chunkC | Lemma chunkC a b r:
0inf <* [0;1]^^(S (S b)) <* [0;1;1] <* [0;1]^^a <* [1;1] <{{D}} r -->*
0inf <{{C}} [0;1]^^(S (S b)) *> [0;0;0] *> [0;1]^^(S a) *> r. | L188 | adapted |
| 53 | Lemma | chunkO | Lemma chunkO a b r:
0inf <* [0;1]^^(S (S b)) <* [0;1;1] <* [0;1]^^(S a) <{{C}} [0;0;0] *> r -->*
0inf <{{C}} [0;1] *> [0;0;0] *> [0;1]^^(S (S (S b))) *> [1;0]^^(S a) *> [0;1] *> r. | L196 | adapted |
| 54 | Lemma | M_spec | Lemma M_spec os u v rest a b: K (map1 os ++ d0 u (S v) :: rest) a b -->+ K (map0 os ++ d1 (S u) v :: rest) (S a) (S (S b)). | L208 | adapted |
| 55 | Lemma | Mdrop_spec | Lemma Mdrop_spec os u2 v2 u rest a b: K (map1 (os ++ [(u2,v2)]) ++ d0 u 1 :: rest) a b -->+ K (map0 os ++ d0 (S u2 + S u) v2 :: rest) (S a) (S (S b)). | L222 | adapted |
| 56 | Lemma | O_spec | Lemma O_spec os a b: os <> [] -> K (map1 os) (S a) b -->+ K (Oout os (S a)) (S (S (S b))) 1. | L236 | adapted |
| 57 | Definition | bof | Definition bof d := match d with d0 _ _ => 0 | d1 _ _ => 1 end. | L252 | identical |
| 58 | Definition | vof | Definition vof d := match d with d0 _ v => v | d1 _ v => v end. | L253 | identical |
| 59 | Fixpoint | Rof | Fixpoint Rof (ds : list dg) : nat := match ds with | [] => 0 | d0 _ _ :: t => 2 * Rof t + 1 | d1 _ _ :: t => 2 * Rof t end. | L256 | identical |
| 60 | Definition | Rd | Definition Rd d r := match d with d0 _ _ => 2*r+1 | d1 _ _ => 2*r end. | L264 | identical |
| 61 | Definition | ub | Definition ub d r := match d with d0 u _ => u + r + 1 | d1 u _ => u + r end. | L265 | identical |
| 62 | Fixpoint | AllD | Fixpoint AllD (P : dg -> nat -> nat -> Prop) (ds : list dg) : Prop := match ds with | [] => True | d :: t => AllD P t /\ P d (Rof t) (length t) end. | L267 | identical |
| 63 | Definition | canon | Definition canon d := match d with d0 _ v => v >= 1 | d1 u v => u >= 1 /\ v >= 1 end. | L273 | identical |
| 64 | Definition | PA | Definition PA d r p := canon d /\ vof d >= Rd d r + 1 /\ ub d r mod 2 = 1 /\ (p = 0 -> ub d r = 1). | L275 | identical |
| 65 | Definition | PB | Definition PB k d r p := canon d /\ (vof d + bof d) mod 2 = 1 /\ ub d r >= 2^(p+k) /\ (k = 0 -> p = 0 -> d = d0 0 1). | L277 | identical |
| 66 | Definition | LSBok | Definition LSBok ds := match ds with [] => False | d :: _ => vof d >= Rof ds + 1 end. | L280 | identical |
| 67 | Definition | INV | Definition INV (s : list dg * nat * nat) : Prop := let '(ds, a, b) := s in ds <> [] /\ a >= 1 /\ b mod 2 = 1 /\ (a + Rof ds) mod 2 = 0 /\ a + Rof ds + 2 >= 2^(S (length ds)) /\ b + 3 + 2 * Rof ds >= 2^(S (length ds)) /\ LSBok ds /\ ( (AllD PA ds /\ a + Rof ds + 1 >= 2^(S (length ds))) \/ AllD (PB 0) ds … +1 lines | L282 | identical |
| 68 | Definition | Kc | Definition Kc (s : list dg * nat * nat) : Q * tape := let '(ds, a, b) := s in K ds a b. | L290 | identical |
| 69 | Lemma | pow2S | Lemma pow2S n : 2^(S n) = 2 * 2^n. | L293 | identical |
| 70 | Lemma | pow2pos | Lemma pow2pos n : 2^n >= 1. | L295 | identical |
| 71 | Lemma | Rof_bound | Lemma Rof_bound ds : Rof ds + 1 <= 2^(length ds). | L298 | identical |
| 72 | Lemma | Rof_map1 | Lemma Rof_map1 os X : Rof (map1 os ++ X) = 2^(length os) * Rof X. | L303 | identical |
| 73 | Lemma | Rof_map1' | Lemma Rof_map1' os : Rof (map1 os) = 0. | L310 | identical |
| 74 | Lemma | len_map1 | Lemma len_map1 os : length (map1 os) = length os. | L313 | identical |
| 75 | Lemma | len_map0 | Lemma len_map0 os : length (map0 os) = length os. | L315 | identical |
| 76 | Lemma | AllD_app | Lemma AllD_app P xs ys : AllD P (xs ++ ys) -> AllD P ys. | L318 | identical |
| 77 | Lemma | AllD_last | Lemma AllD_last P xs d : AllD P (xs ++ [d]) -> P d 0 0. | L321 | identical |
| 78 | Lemma | AllD_canon | Lemma AllD_canon (P : dg -> nat -> nat -> Prop) ds : (forall d r p, P d r p -> canon d) -> AllD P ds -> Forall canon ds. | L324 | identical |
| 79 | Lemma | decomp | Lemma decomp ds : Forall canon ds -> (exists os, ds = map1 os) \/ (exists os u v rest, ds = map1 os ++ d0 u (S v) :: rest). | L330 | identical |
| 80 | Lemma | F1 | Lemma F1 (P : dg -> nat -> nat -> Prop) os u v rest: (forall u v r p, P (d0 u (S (S v))) r p -> P (d1 (S u) (S v)) r p) -> (forall u v r p, P (d1 (S u) (S v)) (S r) p -> P (d0 (S u) v) r p) -> AllD P (map1 os ++ d0 u (S (S v)) :: rest) -> AllD P (map0 os ++ d1 (S u) (S v) :: rest) /\ Rof (map1 os ++ d0 u (S (S v)) :: rest) = S (Rof (map0 os ++ d1 (S u) (S v) :: rest)) /\ … +1 lines | L344 | identical |
| 81 | Lemma | PA_touch0 | Lemma PA_touch0 u v r p : PA (d0 u (S (S v))) r p -> PA (d1 (S u) (S v)) r p. | L360 | identical |
| 82 | Lemma | PA_touch1 | Lemma PA_touch1 u v r p : PA (d1 (S u) (S v)) (S r) p -> PA (d0 (S u) v) r p. | L364 | identical |
| 83 | Lemma | PB_touch0 | Lemma PB_touch0 k u v r p : PB k (d0 u (S (S v))) r p -> PB k (d1 (S u) (S v)) r p. | L368 | identical |
| 84 | Lemma | PB_touch1 | Lemma PB_touch1 k u v r p : PB k (d1 (S u) (S v)) (S r) p -> PB k (d0 (S u) v) r p. | L372 | identical |
| 85 | Definition | Rel | Definition Rel r ro rn := rn + 1 <= ro /\ ro <= 2 * (rn + 1) /\ (r = 0 -> ro = rn + 1). | L377 | identical |
| 86 | Lemma | PB_chain | Lemma PB_chain k k' r u v ro rn p : (k' = k \/ (k = 0 /\ k' = 1 /\ r = 0)) -> Rel r ro rn -> p >= 1 -> PB k (d1 (S u) (S v)) ro (S p) -> PB k' (d0 (S u) v) rn p. | L379 | identical |
| 87 | Lemma | PB_abs | Lemma PB_abs k k' r p u2 v2 u : ((k' = k /\ (k = 0 -> p >= 1)) \/ (k = 0 /\ k' = 1 /\ p = 0 /\ r = 0)) -> PB k (d0 u 1) r p -> PB k (d1 (S u2) (S v2)) (2*r+1) (S p) -> PB k' (d0 (S u2 + S u) v2) r p. | L391 | identical |
| 88 | Lemma | F2chain | Lemma F2chain k k' r os X X' : (k' = k \/ (k = 0 /\ k' = 1 /\ r = 0)) -> X' <> [] -> AllD (PB k) (map1 os ++ X) -> AllD (PB k') X' -> Rel r (Rof X) (Rof X') -> length X = S (length X') -> AllD (PB k') (map0 os ++ X') /\ Rel r (Rof (map1 os ++ X)) (Rof (map0 os ++ X')) /\ length (map1 os ++ X) = S (length (map0 os ++ X')). | L401 | identical |
| 89 | Lemma | F2 | Lemma F2 k k' os u2 v2 u rest:
((k' = k /\ (k = 0 -> rest <> [])) \/ (k = 0 /\ k' = 1 /\ rest = [])) ->
AllD (PB k) (map1 (os ++ [(u2,v2)]) ++ d0 u 1 :: rest) ->
AllD (PB k') (map0 os ++ d0 (S u2 + S u) v2 :: rest) /\
Rel (Rof rest) (Rof (map1 (os ++ [(u2,v2)]) ++ d0 u 1 :: rest))
(Rof (map0 os ++ d0 (S u2 + S u) v2 :: rest)) /\
… +1 lines | L421 | identical |
| 90 | Lemma | Oz_len | Lemma Oz_len t u : length (Oz t u) = S (length t). | L450 | identical |
| 91 | Lemma | Oz_R | Lemma Oz_R t u : Rof (Oz t u) + 1 = 2^(S (length t)). | L453 | identical |
| 92 | Lemma | Oz_AB | Lemma Oz_AB t : forall u, AllD PA (map1 t) -> u mod 2 = 1 -> (t = [] -> u = 1) -> AllD (PB 0) (Oz t u). | L460 | identical |
| 93 | Lemma | Oz_CA | Lemma Oz_CA t : forall u, AllD (PB 1) (map1 t) -> u >= 2^(S (length t)) -> AllD PA (Oz t u). | L474 | identical |
| 94 | Lemma | Rof_M | Lemma Rof_M os u v rest : Rof (map1 os ++ d0 u (S v) :: rest) = S (Rof (map0 os ++ d1 (S u) v :: rest)). | L489 | identical |
| 95 | Lemma | len_M | Lemma len_M os u v w x rest : length (map0 os ++ d1 w x :: rest) = length (map1 os ++ d0 u v :: rest). | L495 | identical |
| 96 | Lemma | LSB_M | Lemma LSB_M os u v rest : LSBok (map1 os ++ d0 u (S (S v)) :: rest) -> LSBok (map0 os ++ d1 (S u) (S v) :: rest). | L499 | identical |
| 97 | Lemma | Rof_head1 | Lemma Rof_head1 os X : os <> [] -> Rof (map1 os ++ X) mod 2 = 0. | L506 | identical |
| 98 | Lemma | Rof_head0 | Lemma Rof_head0 os x y rest : Rof (map0 os ++ d0 x y :: rest) mod 2 = 1. | L511 | identical |
| 99 | Lemma | LSB_drop | Lemma LSB_drop os u2 v2 u rest r : LSBok (map1 (os ++ [(u2,v2)]) ++ d0 u 1 :: rest) -> Rel r (Rof (map1 (os ++ [(u2,v2)]) ++ d0 u 1 :: rest)) (Rof (map0 os ++ d0 (S u2 + S u) v2 :: rest)) -> LSBok (map0 os ++ d0 (S u2 + S u) v2 :: rest). | L514 | identical |
| 100 | Lemma | app_cons_ne | Lemma app_cons_ne {A} (xs : list A) y ys : xs ++ y :: ys <> []. | L523 | identical |
| 101 | Lemma | macro_step | Lemma macro_step s : INV s -> exists s', Kc s -->+ Kc s' /\ INV s'. | L529 | new |
| 102 | Lemma | nonhalt | Lemma nonhalt: ~halts tm c0. | L639 | adapted |
4What a maintainer readsCheck: the rule table below is what the .v proves, and proof.md / README read cleanly for a maintainer.
- submission/proof.md · informal proof (submitted copy)
- submission/README.md · the package README
- submission/discord.md · Discord draft (not posted)
- proof.md (working copy) · differs from the submitted copy
In busycoq comment-block style:
1RB0RE_1LC0RE_1LD0LD_1RA0LC_1RA1RF_1RA---
K(d_1 .. d_m; a, b) := 0^inf <C (01)^b 000 (01)^a d~_m .. d~_1 1001 0^inf
d~(u,0,v) := (10)^v 00 (01)^u, d~(u,1,v) := (10)^v (01)^u (d_m least significant)
start from K((1,1,3); 4, 1) (step 215, §4)
M (carry; some bit is 0; j* = index of the LAST bit-0 digit, k = m - j*):
K(.., (u,0,v), (u_j,1,v_j)_{j*<j<=m}; a, b)
--> K(.., (u+1,1,v-1), (u_j,0,v_j-1)_{j*<j<=m}; a+1, b+2)
steps 32 + 8a + 8b + 4v + sum_{j>j*} (8 u_j + 4 v_j)
needs v >= 1 (u >= 0), u_j >= 1 and v_j >= 1 for j > j*, a >= 0, b >= 0
if v = 1, the digit (u+1,1,0) drops (re-reading, §1)
O (overflow; all bits 1):
K((u_1,1,v_1) .. (u_m,1,v_m); a, b)
--> K((0,0,u_1), (v_1-1,0,u_2), .., (v_{m-1}-1,0,u_m), (v_m,1,a); b+3, 1)
steps 89 - 4m + 8a + 20b + 4 sum u_j + 8 sum v_j
needs m >= 1, all u_j, v_j >= 1, a >= 1, b >= 0
On the tape:
M: 0^inf <C (01)^b 000 (01)^a [(10)^v_j (01)^u_j]_{j=m..j*+1} (10)^v 00 (01)^u X
--> 0^inf <C (01)^(b+2) 000 (01)^(a+1) [(10)^(v_j-1) 00 (01)^u_j]_{j=m..j*+1} (10)^(v-1) (01)^(u+1) X
O: 0^inf <C (01)^b 000 (01)^a [(10)^v_j (01)^u_j]_{j=m..1} 1001 0^inf
--> 0^inf <C 01 000 (01)^(b+3) (10)^a (01)^v_m [(10)^u_j 00 (01)^(v_(j-1)-1)]_{j=m..2} (10)^u_1 00 1001 0^inf
Here X is everything right of d_{j*}, and M never reads it.
The M and O rules are not taken from simulation. §2.1 lists 20 window lemmas, and §2.2–2.3 derive M and O from them as chains of intermediate configurations. Each step count is the sum along its chain.
The same O chain with no digits (m = 0) gives
K(; a, b) --> K((1,1,a); b+3, 1) in 89 + 8a + 20b steps (a ≥ 1)
It occurs once, inside the initial segment (§4), and the invariant argument does not use it.
2.1 Building blocks
A window lemma w → w' says: started on the cells of w, the machine runs the stated number of steps without reading a cell outside w, and leaves w'. The last step may move the head onto a neighbouring cell. Such a lemma holds in every tape context.
- T1–T14 are exact finite runs on this table.
- For S1–S6, one block is a finite run, and induction on
ngives everyn.
For example, S5 is (one block, then the IH):
(10)^(n+1) 11 <D = (10)^n 1011 <D → (10)^n 11 <D 01 → 11 <D (01)^n 01
Each lemma is the reflection of the parent's lemma of the same name, so the names match the parent's .v (§6.1).
Shift lemmas
| lemma | steps | one block | transitions | |
|---|---|---|---|---|
| S1 | (10)^n <C → <C (01)^n |
2n | 10<C → <C01 |
C0 D1 |
| S2 | (01)^n <D → <D (10)^n |
2n | 01<D → <D10 |
D1 C0 |
| S3 | A> (10)^n → (01)^n A> |
2n | A>10 → 01A> |
A1 E0 |
| S4 | E> (01)^n → (10)^n E> |
2n | E>01 → 10E> |
E0 A1 |
| S5 | (10)^n 11 <D → 11 <D (01)^n |
6n | 1011<D → 11<D01 |
D1 C1 D0 A0 B0 C1 |
| S6 | (01)^n <C 0 → <C 0 (01)^n |
6n | 01<C0 → <C001 |
C1 D0 A0 B0 C1 D1 |
S5 and S6 are the back-bounces. Each block costs 6 steps for a 2-cell advance, because the head doubles back over cells it has just written (S5 moves L L R R L L, S6 moves L R R L L L).
Finite lemmas
| lemma | steps | transitions | where | |
|---|---|---|---|---|
| T1 | 00 <C → 10 E> |
3 | C0 D0 A1 | left-edge turn (on 0^inf) |
| T2 | E> 000 → <C 001 |
5 | E0 A0 B0 C1 D1 | turn inside a 000 gap |
| T3 | E> 001 → 110 E> |
3 | E0 A0 B1 | |
| T4 | E> 10 → 11 A> |
2 | E1 F0 | start of a digit's (10)^v |
| T5 | A> 01 → 10 E> |
2 | A0 B1 | end of a bit-1 digit's (10)^v |
| T6 | A> 00 → <D 01 |
3 | A0 B0 C1 | flips the 00 of a bit-0 digit |
| T7 | 11 <D → <D 00 |
2 | D1 C1 | |
| T8 | 11011 <D → <C 00001 |
9 | D1 C1 D0 A0 B0 C1 D1 C1 D1 | |
| T9 | E> 1001 0^inf → <C 000 1001 0^inf |
13 | E1 F0 A0 B1 E0 A0 B0 C1 D1 C0 D1 C1 D1 | far-right turn (window 1001000) |
| T10 | 11 <C → <C 00 |
2 | C1 D1 | |
| T11 | 0 <C → <D 1 |
1 | C0 | |
| T12 | 0^inf 11 <D → 0^inf 10110 E> |
13 | D1 C1 D0 A0 B0 C1 D1 C0 D0 A1 E0 A0 B1 | left-edge turn in O (window 00011) |
| T13 | E> 101 → 110 E> |
3 | E1 F0 A1 | |
| T14 | 1011 <C → <C 0100 |
4 | C1 D1 C0 D1 |
Digit lemmas
These are compositions; u, v are those of one digit.
| lemma | steps | made of | needs | |
|---|---|---|---|---|
| Lb | E> (10)^v (01)^u → 11 (01)^(v−1) (10)^u E> |
2u+2v | T4, S3(v−1), T5, S4(u−1) | u, v ≥ 1 |
| Lf | E> (10)^v 00 (01)^u → 11 <D (10)^(v−1) (01)^(u+1) |
4v+1 | T4, S3(v−1), T6, S2(v−1) | v ≥ 1 |
| Rb | 11 (01)^(v−1) (10)^u 11 <D → 11 <D (10)^(v−1) 00 (01)^u |
6u+2v | S5(u), T7, S2(v−1) | v ≥ 1 |
| Ro | 11 (01)^(v−1) (10)^u <C → <C 000 (01)^(v−1) 1 (01)^(u−1) |
2u+6v−4 | S1(u), S6(v−1), T10 | u, v ≥ 1 |
In Ro, S6 starts on the first 0 of (01)^u = 0 1 (01)^(u−1).
What each digit lemma does:
- Lb sweeps a bit-1 digit rightward.
- Lf flips the bit-0 digit.
- Rb restores a swept digit as bit 0 on M's way back.
- Ro does the same in O.
2.2 Derivation of M
Notation:
Xis everything right ofd_{j*}. It is never read.(u*, v*)isd_{j*} = (u*,0,v*).Y = Π_{i=k..1} (10)^v_i (01)^u_iis the trailing bit-1 digits, written left to right.i = kisd_m, andi = 1isd_{j*+1}.
The chain:
steps
0^inf <C (01)^b 000 (01)^a Y (10)^v* 00 (01)^u* X
Phase 1: left-edge preamble with a dip into the 000 gap 4b+10
T1 0^inf 10 E> (01)^b 000 (01)^a Y .. 3
S4 0^inf (10)^(b+1) E> 000 (01)^a Y .. 2b
T2 0^inf (10)^(b+1) <C 001 (01)^a Y .. 5
S1 0^inf <C (01)^(b+1) 0 (01)^(a+1) Y .. 2b+2
Phase 2: one long right sweep, up to the 00 of d_{j*} 2a+2b+9+4v*+Σ(2u_i+2v_i)
T1 0^inf 10 E> (01)^(b+1) 0 (01)^(a+1) Y .. 3
S4 0^inf (10)^(b+2) E> 0 (01)^(a+1) Y .. 2b+2
T3 0^inf (10)^(b+2) 110 E> (01)^a Y .. 3
S4 0^inf (10)^(b+2) 110 (10)^a E> Y (10)^v* 00 (01)^u* X 2a
Lb 0^inf (10)^(b+2) 110 (10)^a Y' E> (10)^v* 00 (01)^u* X (i = k down to 1) Σ(2u_i+2v_i)
Y' = Π_{i=k..1} 11 (01)^(v_i−1) (10)^u_i
Lf 0^inf (10)^(b+2) 110 (10)^a Y' 11 <D (10)^(v*−1) (01)^(u*+1) X 4v*+1
Phase 3: leftward pass with 2-cell back-bounces, then a plain run to the edge 6a+2b+13+Σ(6u_i+2v_i)
Rb 0^inf (10)^(b+2) 110 (10)^a 11 <D Y'' (10)^(v*−1) (01)^(u*+1) X (i = 1 up to k) Σ(6u_i+2v_i)
Y'' = Π_{i=k..1} (10)^(v_i−1) 00 (01)^u_i
S5 0^inf (10)^(b+2) 110 11 <D (01)^a Y'' .. 6a
T8 0^inf (10)^(b+2) <C 00001 (01)^a Y'' .. 9
S1 0^inf <C (01)^(b+2) 000 (01)^(a+1) Y'' (10)^(v*−1) (01)^(u*+1) X 2b+4
The last line is
K(.., (u*+1,1,v*−1), (u_i,0,v_i−1)_i; a+1, b+2)
The sum is
(4b+10) + (2a+2b+9+4v*) + (6a+2b+13) + Σ(8u_i+4v_i) = 32 + 8a + 8b + 4v* + Σ(8u_i+4v_i)
Head path
- Phase 1 runs right only as far as the
000gap, turns (T2) and returns to the edge. - Phase 2 is the only long rightward leg. Its rightmost read is the right
0ofd_{j*}'s00: T6 reads both cells, then moves left. So M is a side rule, and the tapeXright of that00is never read. - Phase 3 moves left. It doubles back once per
10block (S5, on the swept digits'(10)^u_iand on(10)^a). It crosses the(01)^(v−1)blocks and the final(10)^(b+2)with plain sweeps (S2, S1).
Drops
When v* = 1, the flipped digit (u*+1,1,0) = (01)^(u*+1) drops (§1).
When some v_i = 1, the result has (u_i,0,0). That can happen only outside INV (§3.3).
2.3 Derivation of O
Let Y = Π_{i=m..1} (10)^v_i (01)^u_i, with all digits bit 1. The chain:
steps
0^inf <C (01)^b 000 (01)^a Y 1001 0^inf
Phases 1–2 as in M, with Lb on all m digits and no Lf (4b+10)+(2a+2b+8)+Σ(2u_i+2v_i)
0^inf (10)^(b+2) 110 (10)^a Y' E> 1001 0^inf Y' = Π_{i=m..1} 11 (01)^(v_i−1) (10)^u_i
Phase 3: turn at the far right
T9 0^inf (10)^(b+2) 110 (10)^a Y' <C 000 1001 0^inf 13
Phase 4: leftward pass
Ro 0^inf (10)^(b+2) 110 (10)^a <C Y''' 000 1001 0^inf (i = 1 up to m) Σ(2u_i+6v_i−4)
Y''' = Π_{i=m..1} 000 (01)^(v_i−1) 1 (01)^(u_i−1)
Phase 5: left end 2a+8b+30
S1 0^inf (10)^(b+2) 110 <C (01)^a Y''' .. 2a
T11 0^inf (10)^(b+2) 11 <D 1 (01)^a Y''' .. 1
S5 0^inf 11 <D (01)^(b+2) 1 (01)^a Y''' .. 6b+12
T12 0^inf 10110 E> (01)^(b+2) 1 (01)^a Y''' .. 13
S4 0^inf 10110 (10)^(b+2) E> 1 (01)^a Y''' .. 2b+4
Phase 6: short right sweep over the a block, to the 000 that Ro left before d_m 2a+1
T13 0^inf 10110 (10)^(b+2) 110 E> (01)^(a−1) Y''' .. 3
S4 0^inf 10110 (10)^(b+2) 1 (10)^a E> 000 (01)^(v_m−1) .. 2a−2
Phase 7: turn in that 000, final run to the edge 2a+6b+27
T2 0^inf 1011 (01)^(b+3) (10)^a <C 001 (01)^(v_m−1) .. (0 (10)^(b+2) 1 = (01)^(b+3)) 5
S1 0^inf 1011 (01)^(b+3) <C (01)^a 001 (01)^(v_m−1) .. 2a
S6 0^inf 1011 <C 0 (01)^(b+3) 1 (01)^(a−1) 001 (01)^(v_m−1) .. 6b+18
T14 0^inf <C 0100 0 (01)^(b+3) 1 (01)^(a−1) 001 (01)^(v_m−1) .. 4
Re-read the final tape with the two identities
1 (01)^(n−1) 0 = (10)^n 01 (01)^(n−1) = (01)^n
splitting each 000 of Y''' as 0 | 00:
0^inf <C 0100 0 (01)^(b+3) 1 (01)^(a−1) 001 (01)^(v_m−1) 1 (01)^(u_m−1) [000 (01)^(v_i−1) 1 (01)^(u_i−1)]_{i=m−1..1} 000 1001 0^inf
= 0^inf <C 01 000 (01)^(b+3) (10)^a (01)^v_m [(10)^u_(i+1) 00 (01)^(v_i−1)]_{i=m−1..1} (10)^u_1 00 1001 0^inf
= K((0,0,u_1), (v_1−1,0,u_2), .., (v_{m−1}−1,0,u_m), (v_m,1,a); b+3, 1)
The sum is
(4b+10) + (2a+2b+8) + 13 + (2a+8b+30) + (2a+1) + (2a+6b+27) + Σ(4u_i+8v_i−4) = 89 − 4m + 8a + 20b + 4Σu_i + 8Σv_i
Domain
- Lb and Ro need
u_i, v_i ≥ 1. - T13 and the S6 of phase 7 use the first
0 1of(01)^a, soa ≥ 1. - T9 needs
0^infon the right. It reads the three blank cells right of1001and moves the marker three cells right, so the rightmost cell visited moves 3 cells per overflow.
O has two long rightward legs: phase 2, and the short phase 6.
O at m = 0 (the init, §4)
The same chain with no digits works: phase 4 is empty, and phase 6 ends on T9's 000. The final tape is
0^inf <C 01 000 (01)^(b+3) 1 (01)^(a−1) 001 1001 0^inf
= 0^inf <C 01 000 (01)^(b+3) (10)^a 01 1001 0^inf
= K((1,1,a); b+3, 1)
The step count is 89 + 8a + 20b.
2.4 What the rules do, in words
The digits form a binary counter, and each M is one increment.
- M flips the trailing 1s to 0 and the last 0 to 1. Every digit it touches pays one
10from itsv, and a digit flipping 0→1 also gains a01. - When all bits are 1, O swaps the two halves of every digit. Each
(01)^ubecomes the(10)^ufuel of a new bit-0 digit, and each(10)^vbecomes the next digit's(01)^(v−1). The counter restarts at value 1 with one more digit. - When a digit flipping 0→1 has spent its last
10(v = 1), it drops: its01s merge into the next digit, and the counter loses that digit.
The only way the rules can fail is the failure mode: a carry reaches a bit-0 digit with v = 0, where Lf's first lemma T4 has no 10 to read. That happens if a carry flips a bit-1 digit with v = 1 to 0.
Every macro step is an exact run of at least 32 steps, so every macro step makes progress.
5FamilyCheck: related machines are killed together or have a reason to be left open.
6 machines, 4 killed, 2 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.
6ChecklistCheck: every ✓ is computed; the two ○ are yours to decide; an amber ! is an optional check that did not finish.
- ✓Machine string exactthe .v literal == holdout list line 34 byte for byte
- ✓Statement is
~halts tm c0parsed from the .v and confirmed by check_kill (theorem_text, theorem_rocq) - ✓No axioms beyond baseline0 assumption(s); tools/assumptions_baseline.txt allows only functional_extensionality_dep
- ✓coqchk finished (optional)coqchk pass in 1.75 s
- ✓.v hash matches the checked hash.v = checked sha256 2dfa4337b76b…; submission/ copy = checked sha256 2dfa4337b76b…
- ✓No repo-local paths in the .vcomments name no path of ours (vendor/, machines/, tools/, rocq/, scripts/, reports/, atlas/, data/, journal/, /home/); busycoq's own
verify/X.vis fine: none in the .v or the submission/ copy - ✓Public write-up is cleantools/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 L89: 2026-10-10: `proof.md` written (stage informal_proof, status OPEN; Checkpoint B pending, non-blocking).
- notes.md L143: - 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 L7: - Status: informal proof, revised after the skeptic review (Review log at the end). Stage `informal_proof`; Checkpoint B pending (non-blocking). Not a kill: only `tools/check_kill.sh` PASS counts. Evidence: `check_proof.
- proof.md L520: It found 0 failures. Dennis's Checkpoint B notes (pending, non-blocking) go into this file before any submission.
- proof.md L534: | 2 (minor) | §7 Gaps, last bullet | "The skeptic review of this file has not been done" was out of date. | **Fixed.** The bullet now records the review and its independent checks. The reviewer used its own C simulator a
- ○Family posted together?3 other kill(s) in the family: #11, #33b, #11b; the Discord draft names 3 of them; 2 member(s) not killed: #32, R4
Generated by tools/killreview.py at 2026-10-16 13:29 PDT in 0.1 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 1RB0RE_1LC0RE_1LD0LD_1RA0LC_1RA1RF_1RA---
Files
machines/<tm>/: 16 entries · raw notes, status, scripts, images
| name | size | changed |
|---|---|---|
| notes.md ↓ | 15 KB | 2026-10-10 10:53 |
| proof.md ↓ | 47 KB | 2026-10-10 10:40 |
| how_proved.md ↓ | 1.2 KB | 2026-10-14 10:51 |
| status.json ↓ | 353 B | 2026-10-13 06:44 |
| observe.json ↓ | 14 KB | 2026-10-10 09:54 |
| 1RB0RE_1LC0RE_1LD0LD_1RA0LC_1RA1RF_1RA---.v ↓ | 30 KB | 2026-10-12 18:16 |
| img/ | 6 items | 2026-10-10 09:49 |
| rocq/ | 8 items | 2026-10-10 10:46 |
| scripts/ | 11 items | 2026-10-10 10:36 |
| submission/ | 5 items | 2026-10-12 17:49 |
| work/ | 2 items | 2026-10-12 17:33 |
| check_proof.out ↓ | 3.6 KB | 2026-10-10 10:38 |
| check_proof.py ↓ | 50 KB | 2026-10-10 10:37 |
| check_proof_long.out ↓ | 3.6 KB | 2026-10-10 10:40 |
| qsim.jsonl ↓ | 978 B | 2026-10-10 09:46 |
| sim_records_1e9.jsonl ↓ | 5.4 GB | 2026-10-10 09:37 |
status.json in full
{
"tm": "1RB0RE_1LC0RE_1LD0LD_1RA0LC_1RA1RF_1RA---",
"status": "KILLED_NONHALT",
"stage": "done",
"updated": "2026-10-10",
"reason": "check_kill PASS, independently re-verified",
"pr": "https://github.com/ccz181078/busycoq/pull/16",
"pr_state": "merged",
"pr_comments": 0,
"pr_merged_at": "2026-10-13T12:26:07Z",
"pr_merged_by": "ccz181078"
}


