/machines/1RB0RE_1LC0RA_1LD0LB_1LA1LF_1LE1RA_0LC---/submission/proof.md · raw

1RB0RE_1LC0RA_1LD0LB_1LA1LF_1LE1RA_0LC---: never halts

This machine is another machine with its own write-up, called the parent below, seen in a mirror. Its table is the parent's table with left and right swapped and the states renamed. Started on a blank tape, it does step for step what the parent does when started in a different state, on the mirror-image tape.

The parent is a binary counter that counts down. Each macro step subtracts one from a number stored on the tape. When the number reaches zero, a few special steps re-pair the blocks that hold its digits.

Apart from its initial segment, the parent's proof never uses its run from the blank tape: from a starting configuration of the right shape on, the argument is general. This machine's run reaches such a configuration after 78,911 steps, so the same proof applies and the machine never halts.

The parent and the twin

This is a delta write-up against the write-up for 1RB0LD_1RC0RA_1RD1RF_1LA0LE_1RE1LD_0RB---. Below:

The twin's table is the parent's table mirrored (every L↔R), with its states renamed by φ (§0):

φ: A↦D, B↦A, C↦B, D↦C, E↦E, F↦F

So the twin from the blank tape is the parent started from 0^inf D> 0^inf instead of 0^inf A> 0^inf.

Summary

The parent is a binary down-counter (parent §1–§2). Its configurations are K(h; P; T), which consist of:

  1. a marker (10)^h 11001;
  2. then a list of pair blocks (10)^p (01)^q s(d), whose digits d form a binary number V;
  3. then a tail T.

Each macro step decrements V by touching the pairs up to the borrow. A block that runs out merges with its neighbour. Once V reaches 0, an End step and an overflow (Ov, or the X1/X2 detour) re-pair the list.

The parent's proof is an invariant INV+(e) at E-starts (parent §3.8.1) that one cycle pair preserves (the Theorem (cycle pair), parent §3.8). It is formalized as a per-step invariant J (Jstep).

The twin's table is the parent's, mirrored and renamed (§0). So the twin from the blank tape runs exactly as the parent from 0^inf D> 0^inf, on the mirror-image tape (Lemma C). That run is a different orbit of the same macro map.

From K0′ at step 1,021 on, every macro step is one of the rules, and the run reaches an E-start at step 78,911:

step  1,021   K0′ = K(2; (11,12,0); −)
step 78,911   K(2; (95,68,0),(34,33,1),(10,15,1),(1,25,1); −)     (the E-start)

This E-start is the parent's base except for the far pair's q (25 instead of 24). It satisfies INV+(e) and J with the parent's constants. So the parent's rules, invariant and Theorem apply unchanged, and only the initial segment and the base are new (§3.7).

Template and status

The template is the parent's .v. Its development (family, sweep and macro lemmas, invariant J, Jstep) is reused verbatim for the parent's table. The parent's own loose template is verify/SBCv6.v Module TM21 (parent §4).

The mirror and the renaming use two busycoq files:

Relative to the parent's .v, only three things differ:

Status: formalized in the accompanying verify/Skelet1LikeC2_1RB0RE.v (1,364 lines). It proves Lemma nonhalt : ~ halts tm c0. in Coq 8.20.1 against unmodified busycoq BB6 (commit 0940bb9c).

Print Assumptions nonhalt reports Closed under the global context. The file compiles in about 40 s with -native-compiler yes, and coqchk accepts it.

Where each section lives in the .v:

0. The map

twin 0 1 parent 0 1
A 1RB 0RE ↦ D 1LA 0LE
B 1LC 0RA ↦ A 1RB 0LD
C 1LD 0LB ↦ B 1RC 0RA
D 1LA 1LF ↦ C 1RD 1RF
E 1LE 1RA ↦ E 1RE 1LD
F 0LC --- ↦ F 0RB ---

The renaming is φ: A↦D, B↦A, C↦B, D↦C, E↦E, F↦F, and every direction flips (L↔R).

For every twin entry, the entry (write w, move d, go to q′) in row q becomes the parent's entry in row φ(q):

twin row q:  (w, d, q′)    ↦    parent row φ(q):  (w, flip(d), φ(q′))

This holds for 12 of 12 entries, including the undefined F1 ↦ F1.

Among all 2 × 720 candidates (720 renamings, with or without the mirror) this is the only one that fits. In particular, no renaming without the mirror fits.

Lemma C (conjugacy)

Let μ be the map that swaps the two sides of the tape and renames the state:

μ(q, (l, s, r)) := (φ(q), (r, s, l))

Mirroring the tape turns move_left into move_right and back. So for single steps and for halting:

c -[twin]-> c'          iff   μ c -[parent]-> μ c'
c halted for the twin   iff   μ c halted for the parent

By induction on the number of steps, the twin halts from c0 iff the parent halts from μ(c0) = (D, tape0), after the same number of steps.

In the .v, the direction that is needed (twin halts ⇒ parent halts from (D, tape0)) is perm_twin plus busycoq's flip_halts and perm_halts (§4).

Why this is not "identical up to renaming"

μ(c0) is (D, tape0), not the parent's c0 = (A, tape0). The twin is the parent run from a different start, and its orbit is a different orbit of the same family.

K0′ below is not the parent's K0. No canonical configuration of the twin occurs among the parent's in the first 3·10⁵ steps.

In lockstep, the two abstract orbits differ at every macro step, by one unit (§3.9).

Halting transition

Only D1 (1LF) enters F, and only C0 (1LD) enters D. So the twin halts exactly when it reaches

1 1 0 <C

the mirror image of the parent's B> 0 1 1.

1. Family (parent §1, mirrored)

In the twin's orientation, the parent's family reads:

[p,q,d]^R := s^R(d) (10)^q (01)^p        s^R(1) := 1000,  s^R(0) := 0100
K'(h; P; T) := 0^inf  T^R  [p_L,q_L,d_L]^R ... [p_1,q_1,d_1]^R  10011 (01)^h  B> 0^inf
T^R in { - ,  T1^R(t) := 1 (01)^t ,  T2^R(k) := (10)^k 101101 }

K′(h; P; T) is exactly μ⁻¹(K(h; P; T)). It is the parent's word, reversed, with the head in state B (the twin's name for the parent's A) on the blank cell to its right.

The parameters (h, P, T), V, touches, goodness and depth are all as in parent §1, §3.2 and §3.3.

The twin's tape grows to the right where the parent's grows to the left. At 10⁹ steps the twin spans cells −182..67,162 and the parent −67,161..181.

2. Rules: unchanged

Every rule of parent §2 (Dec_k, DecMerge_k, DecMergeTail, DecMergeEmpty, End, EndLast, Ov, X1, X2) holds for K′ on the twin (Lemma C), with:

The domain D and the outside cases (o1)–(o7) are the same sets of parameters.

For reference, here is the abstract form both machines share. In it:

Dec            (h; Z ++ (p,q+2,1) :: R; T)          -> (h+4; touch Z ++ (p+1,q+1,0) :: R; T)
DecMerge       (h; Z ++ (p,1,1) :: (p',q',d') :: R; T) -> (h+4; touch Z ++ (p+p'+3,q',d') :: R; T)
DecMergeTail   (h; Z ++ [(p,1,1)]; T1(t))           -> (h+4; touch Z; T1(p+t+3))
DecMergeEmpty  (h; Z ++ [(p,1,1)]; -)               -> (h+4; touch Z; T1(p+2))
End            (h; Z ++ [(p,q+2,0)]; -), V=0        -> (h+4; touch Z ++ [(p+1,q+1,0)]; T1(1))
EndLast        (h; Z ++ [(p,1,0)]; -), V=0          -> (h+4; touch Z; T1(p+4))
Ov             (h; (p1,q1,0) :: Z; T1(t)), V=0, p1>=2 -> (2; (h+5,p1-1,0) :: ovp q1 Z t; -)
X1             (h; (p1,q1,0) :: Z ++ [(pa,1,0);(pb,1,0)]; -), V=0, p1>=2 -> (2; (h+5,p1-1,0) :: ovpX q1 Z pa; T2(pb+3))
X2             (h; Z ++ [(p,q+2,0)]; T2(k)), V=0    -> (h+4; touch Z ++ [(p+1,q+1,0); (3,k,1)]; -)

As a check that does not go through Lemma C, 405 random rule instances (45 per rule, all h mod 4, sizes 2–300) were run on the twin's own table from mirrored words. They reach the predicted K′ exactly (§5).

3. Argument: what changes

3.1–3.6 and 3.8: unchanged

Parent §3.1–3.6 and §3.8 use only the rules of §2 and the invariant INV+(e) at an E-start. They never use the orbit from the blank tape. Parent §3.1's reduction is applied here from K0′, and in the .v from the base (§3.7).

In particular, the parent's Theorem (cycle pair) (parent §3.8.1) is a statement about every E-start K that satisfies INV+(e):

Its proof (parent §3.8.2–3.8.4: L1–L6, L5', the S2 table, the survival of pairs 1 and 2) applies word for word.

So does the Rocq form of the same step, the parent's

Jstep : forall s, J s -> exists s', Cf s -->+ Cf s' /\ J s'

which is proved for all states.

No invariant needs adjusting. The base, below, satisfies INV+(e) (and J) with the same constants as the parent's base.

3.7 Initial segment and base (changed)

The twin's initial segment, next to the parent's:

parent (parent §3.7) twin
canonical configs before K0 step 8 K(0;−;−); 275 K(2;(7,1,0);−); 451 K(6;−;T1(11)) step 13 K′(1;−;−); 316 K′(2;(8,1,0);−); 500 K′(6;−;T1(12))
K0 K(2; (11,11,0); −) at step 956 K′(2; (11,12,0); −) at step 1021
overflows 1–6 (step of the post-Ov config) 1845, 4610, 8319, 19436, 34137, 78710 1926, 4715, 8448, 19589, 34314, 78911
transitions to 3·10⁷, all predicted by the abstract map 1,534 (Dec 1,496, End 9, EndLast 9, Ov 18, DecMerge 1, DecMergeTail 1) 1,534, with the same counts
base E-start (after overflow 6) K(2; (95,68,0),(34,33,1),(10,15,1),(1,24,1); −) at step 78,710 K′(2; (95,68,0),(34,33,1),(10,15,1),(1,25,1); −) at step 78,911

As in the parent, the twin passes through L = 0 before K0′:

So the argument starts at K0′. From K0′ the rules apply at once (End at step 1313, Ov at step 1926).

INV+(e) at the twin's base, in the form of parent §3.8.1 (L* = 4, regular start):

These are the parent's numbers, except that the far q is one larger. INV+(e) asks only q_L ≥ 6 of it.

The same goes for the Rocq invariant J (phase E1). The only clause that involves the far pair's q is

q >= tv + 2^0 + 1

with tv = d_L = 1, so it reads q ≥ 3 (here q = 25). Every other clause has the parent's values. So J_base has the parent's proof (repeat split; lia).

Conclusion. The argument has three steps.

  1. The twin's run from the blank tape reaches the base after 78,911 steps by exact computation, so it does not halt before the base (init, through Lemma C).
  2. The base satisfies INV+(e), so by the Theorem every configuration after it is in D.
  3. The twin therefore never halts (parent §3.1, applied to K′ through Lemma C).

The rules also predict every transition from K0′ to the base, so every configuration from K0′ to the base is in D as well. The formal proof does not need this, since init reaches the base by direct execution.

3.9 Why the two orbits look alike (not used in the proof)

Run in lockstep, the two abstract orbits apply the same rule at every macro step, and their states differ by exactly +1 on one far-end block. This holds on the abstract orbits up to L = 120, about 2^124 macro steps (§5).

The extra unit moves around a fixed loop:

On an X1 detour it rides T2(k) and then X2's new pair (3, k, 1). It is never on x or on an interior block, which is why the rule sequence cannot differ.

It also explains the 67,345 vs 67,343 cells at 10⁹: one extra 2-cell block, on the mirrored side.

4. Formalization

The .v does not mirror the parent's development. Mirroring a busycoq tape term swaps the arguments of *> and <* (and {{X}}> with <{{X}}), which is not a textual renaming.

Instead the file keeps every parent lemma about the parent's table and transfers the result to the twin through Lemma C. It does so in four parts.

  1. Two tables. The top-level definition is the twin:

Definition tm := TM_from_str "1RB0RE_1LC0RA_1LD0LB_1LA1LF_1LE1RA_0LC---"

The parent is

tm3 := TM_from_str "1RB0LD_1RC0RA_1RD1RF_1LA0LE_1RE1LD_0RB---"

The local notations -->*/-->+ are bound to tm3, and everything up to nonhalt_D is about tm3.

Apart from the start (item 2), that part is the text of the parent's .v: the family K, the 14 sweep lemmas, the 9 macro rules, J and Jstep.

  1. Start. Two lemmas, both by direct execution with solve_initD:

init : D;; tape0 -->* K 2 base TN (78,911 steps) init0 : D;; tape0 -->* K 2 [(11,12,false)] TN (K0′, 1,021 steps)

Here base is the list of §3.7 (far pair (1,25,true)). nonhalt does not use init0.

busycoq's esx takes its fast vm_compute path (solve_init) only for goals that start at c0. From (D, tape0) it falls back to symbolic es, which is far too slow for 78,911 steps.

solve_initD is busycoq's solve_init with its first rewrite replaced by

change (D, tape0) with (cconfig_to_config (nil,nil,0,D))

  1. The parent from D. Two lemmas:

J_base : J (mkst 2 base TN E1 false) nonhalt_D : ~ halts tm3 (D;; tape0)

J_base has the parent's proof.

nonhalt_D follows from multistep_nonhalt with init and progress_nonhalt_cond with P := J and Jstep.

  1. Lemma C, the direction used. busycoq already contains both halves, so no simulation lemma for μ is written.

Mirror. Flip.flip_halts does the mirror:

Flip.flip_halts : halts tm c -> halts (flip tm) (flip_conf c)

flip_conf c0 is A;; tape0 by conversion, because the blank tape is symmetric.

Renaming. Permute.perm_halts does the renaming, with φ(A) = D:

Permute.perm_halts : Perm tm tm' f -> halts tm (q;; t) -> halts tm' (f q;; t)

New obligation. The one new obligation is

perm_twin : Perm (flip tm) tm3 phi

It covers the halting entry and all 11 transitions, closed case by case (cbn, then discriminate/reflexivity or inversion). This is §0's 12/12 table identity, checked in the kernel.

Assembly. nonhalt : ~ halts tm c0 applies flip_halts, then perm_halts with perm_twin, and refutes the result with nonhalt_D.

What differs from the parent's .v

Compared with the parent's .v, the file changes or adds only:

Where each item lives:

write-up .v
§0 Lemma C (direction used) phi, perm_twin; flip_halts and perm_halts inside nonhalt
§1 family (parent §1, for tm3) sd, RP, Tl (TN, TA t, TB k), RT, K
§2 rules (stated for the parent's table) the 14 sweep lemmas Start, PassR, Borrow, PassL, EndPh, EndT, EndLastT, MergeB, MergeE, OvT, OvL, OvEnd, X1Sw, X2T (each by es); PassesR, PassesL, OvPasses; the macro lemmas Dec, DecMerge, DecMergeTail, DecMergeEmpty, EndR, EndLast, X2, Ov, X1, all about tm3
§3.7 K0′ (step 1,021) init0 (solve_initD)
§3.7 base (step 78,911) base with far pair (1,25,true); init (solve_initD); J_base
§3.1–3.8 (parent; the Theorem) J (with phase, PN, PI, PC, PCx, AllI, TC, st, Cf) and Jstep
§3.7 conclusion nonhalt_D (multistep_nonhalt + progress_nonhalt_cond with P := J), then nonhalt

What the .v proves

Like the parent's .v, this file proves the parent's per-step invariant J, not the per-cycle Theorem. J contains INV+(e) in projected form at every E-start (parent §4).

So the result rests on the .v alone, and the prose here and in parent §3 is the explanation.

5. Numerical sanity checks

None of these is used by the proof.

K′(2; (47,32,0),(16,15,1),(4,21,1); −)

It also satisfies INV+(e) (L* = 3: 33 ≥ 20, 15 ≥ 10; 47 and 17 odd; 48 ≥ 32, 16 ≥ 8) and J. - Cycle pairs on the twin's orbit. Every identity and inequality of parent §3.8 holds from the base to L* > 300: - 542 cycle pairs (539 EndLast slots, 3 X1 slots); - 245 L-slot merges; - x = 3, 4, 5 and ≥ 6 all occur; - the two ratio minima are

```
min p_1′/(2^(L*′+2)−1) = 1.000
min p_2′/2^(L*′)       = 2.234
```

AI assistance: this proof sketch, the scripts and the checks were produced with the help of Claude (Anthropic).