/machines/1RB0RF_1RC0RB_1LD0RA_1LE0LD_1RB0LC_1LA---/rocq/log.md · raw

W4-3 formalization log

Machine 1RB0RF_1RC0RB_1LD0RA_1LE0LD_1RB0LC_1LA--- (740 line 341). Kill file: machines/1RB0RF_1RC0RB_1LD0RA_1LE0LD_1RB0LC_1LA---/1RB0RF_1RC0RB_1LD0RA_1LE0LD_1RB0LC_1LA---.v.

Round 1 (2026-10-12)

Architecture chosen

proof.md section 10 recommends a verified interpreter. Built a symbolic run-length simulator (ssim) instead of a defect-model interpreter: it runs the machine itself, so the soundness proof is generic (it calls tm for single steps) and only the two sweep cycles are machine-specific.

Proved (rocq/ssim.v, 1.5 s; kill file compiles, see below)

Validated by dev runs (rocq/dev_*.v, not in the kill file)

Conventions for the next rounds (decided in round 1)

Plan for rounds 2-4

  1. Generate (script) the 18 single-block runs of proof.md 4.1 / Appendix D as ssim lemmas with symbolic a, s, t, lp and abstract sides; case-split tight gaps (a = 1 vs 5+4x, s,t = 4 vs 8+4x, lp = 2 vs 6+4x) where ssim fails. Then Lemma C / C' by induction on the block list (LSB first, like #11's LbS/RbS), with relations Visit c c' p := forall r, side c <{{D}} r -->+ side c' {{st p}}> r.
  2. Left word: episodes 1-80 as one forallb over i of an ssim check (head enters at A-1, abstract right side); L81 as one ssim run with block 1 in D0.
  3. Right region: Ep p R R' := forall l, l {{st p}}> R -->* l <{{D}} R'; singles of Appendix B as ssim runs in t (u = 1 + 8t); 4-cycles as one ssim run on fresh variables (composite f(h) = h + d) plus an induction on the cycle count.
  4. Interleaving: Visits c c' ps -> EpSeq ps R R' -> cfg(c,R) -->* cfg(c',R'); Lemma T gives ps = 2^T 0^(N-T).
  5. Record visit, regrouping (tape equality), window closing (lia in t), INV, nonhalt.

Added at the end of round 1

Next round, first steps

  1. A script rocq/gen_blocks.py that emits the 18 runs of proof.md Appendix D as reach lemmas, using the block-runs convention above (m = 3 and m = 1, the 8 / 5 states), entry states Lc D (right, phase c), Lc C (right, c+2), Rc A/Rc B (left entries); fall back to destruct on tight gaps where reach fails. Check each event count against Appendix D.
  2. The chain word as a list (LSB = block K first) and Visit by induction, as in #11's LbS/RbS.
  3. Left episodes: one forallb over i in 1..80 of a reach check (left word W_i, head entering at A-1).

Round 2 (2026-10-12)

Dev files (this folder): chain.v (blocks, chain visit, left word), count.v (Lemma T), right.v (right-region executor and the six interval programs), regroup.v (6.2 regrouping), step.v (Lemma S, class r5), rec2.v/rec3.v (record-exit episode experiments). All merged into the kill file, which compiles (native) in about 37 s.

Proved (all Qed, no Admitted)

Tactic notes (also in atlas/rocq-notes.md)

Next steps (round 3)

  1. Take-in record steps (r0->r1, r2->r3, r4->r5): split the 4th run of Re_r (x3 -> x4) as (b,3)(sneg b, n-3) by alt_add, run part (a) with the rest of the right side abstract (TV 1): Rc B ([(S0,1);(S0,L2)], TV 0) (first3 ++ [(b4, cn 3)], TV 1) -> Rc A (comp_runs sigma (blk U0), TV 0) ([], TV 1), then part (b) ep_run true Re' = Some Rs_next. For r2, r4 the free xt_K is variable 1 (LF 2 [0;4]), sigma's 4th entry LF 0 [0;1]. New nus = q_new :: rshift nus 0.
  2. Drop classes r1->r2 (block K' also dropped: left part = [(S0,1);(S0,673558+..)] ++ comp_runs sigma (blk U0)) and r3->r4: same as step_r5. Then S_r for all six (the S_r5 proof is the template; K0 = 3 or 4).
  3. Invariant: Inv r e t nus with the window shapes (r5: [W5t;W5s;W5a;f] :: deep; r0: [W0t;W0s;f;f'] :: deep; r1: [all four] :: [W1t';f;f';f''] :: deep; r3: [W3t;f;f';f''] :: deep; r2, r4: any), length nus = K0 + 2e - 1, 1 + 8t = 9^(e-2). r4 -> r5: e+1, t' = 1 + 9t (sub9).
  4. Base case: from cfg28 reach Gc (U0^6, P0, 0) nus28 (evR [0] Rs_r5) (concrete target; use a conc lemma ev_runs nu rs X = ev_runs [] (conc nu rs) X to compare by cfg_eqb). nus28 from cfg28's chain (block 7: [18701; 6227; 2069; 683]).
  5. nonhalt via progress_nonhalt with P c := exists r e t nus, Inv /\ c = Gc ...; then check_kill.

Round 2, later the same session: the proof is complete

After the checkpoint above, the remaining steps were all done in this round:

check_kill, round 2

State after round 2

The kill file is complete and passes check_kill. Rounds 3-4 are free for: a coqchk that finishes (it would need a cheaper base case, e.g. starting the induction at an earlier record exit), clean-up of the file (dead helper lemmas such as sum_false_true), and the public write-up.