Repository navigation
Expand file tree
/
Copy pathDispatcher.lean
More file actions
2721 lines (2578 loc) · 156 KB
/
Copy pathDispatcher.lean
File metadata and controls
2721 lines (2578 loc) · 156 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/-
Copyright (c) 2026 Google LLC. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
-/
module
public import Cryptids.Machines
public import Cryptids.Semantics.Zf.Gadgets
/-!
# Layer 2: Call-Stack Dispatcher & Abstract Machine Simulation for `zf_432_wade.tm`
This module formalizes the unary call-stack decision tree (`States 96..431`), stack-popping
continuations (`6.continue.0..3`, `6.break.0..2`), and two-pass register dispatch (`3.<reg>.inc`,
`3.<reg>.decnz`) of the 432-state Turing machine `ConjectureMachines.Semantics.Zf.Machines.zf432`
(`zf_432_wade.tm`), establishing the lockstep simulation and halting equivalence with the
11-register abstract machine `zfRegStep`.
-/
@[expose] public section
namespace ConjectureMachines.Semantics.Zf.Layer2
open Turing (Dir)
open StateTransition ConjectureMachines.Semantics.Zf
export ConjectureMachines.Semantics.Zf.Layer1
(refTrans refTrans_eq step_mk'_right step_mk'_left step_mkL_left step_mkL_right
nSteps_mkL_left_scan nSteps_mk'_right_scan rootLeft rootLeft_eq_append
stackLeft stackLeft_nil stackLeft_eq_append stackLeft_append stackLeft_append_singleton
regIncStage3 regDecnzStage3 zfRootCfg zfDispatchState zfDispatch_trans_zero
zfDispatch_trans_one step_zfDispatch zfDispatch_scan_list zfDispatch_bounce_default
root_scan_to_main dispatch_return_to_main continue0_return prep_pass1_eval)
open ConjectureMachines.Semantics.Riemann.Layer1
(nSteps nSteps_zero nSteps_succ nSteps_add nSteps_bind_eq step_nSteps step_one
nSteps_reaches nSteps_eval_dom nSteps_of_halt mem_eval_iff_nSteps
mk_append_replicate_zero default_eq_mk_nil
default_cons_zero append_replicate_zero_default fin2_cases
Tape.mkL Tape.mkL_cons Tape.mk'_cons Tape.mkL_default
append_replicate_cons append_cons_snoc append_reverse_cons
encodeReg encodeReg_length encodeReg_reverse append_encodeReg_reverse append_encodeReg
encodeRegs encodeRegs_nil encodeRegs_cons encodeRegs_append
regsTape regsTape_nil regsTape_cons regsTape_append
list_take_cons_drop list_take_set_drop)
set_option maxRecDepth 200000
/-!
## 1. Fast Transition Lookup, Multi-Step Execution, and Canonical Tape Configurations
-/
theorem step_mk'_none {q : Fin 432} {a : Fin 2}
(h : refTrans q a = none) (L R : ListBlank (Fin 2)) :
step Machines.zf432 ⟨q, Tape.mk' L (R.cons a)⟩ = none := by
simp [step, refTrans_eq, h, Tape.mk']
abbrev zfRootLeft : ListBlank (Fin 2) := rootLeft
/-- Canonical configuration at `main().0` (State `126`) with stack region of width `padTotal`
and arbitrary right-tape tail `R` starting at the `[1, 0]` `-2` marker. -/
def zfRootCfgR (padTotal : ℕ) (stack : List (Fin 2)) (R : ListBlank (Fin 2)) : Cfg 432 2 :=
⟨126, Tape.mk' rootLeft
(ListBlank.append (stack ++ List.replicate (padTotal - stack.length) 0) R)⟩
theorem zfRootCfg_eq_zfRootCfgR (padTotal : ℕ) (stack : List (Fin 2)) (regs : List ℕ)
(extra : ListBlank (Fin 2)) :
zfRootCfg padTotal stack regs extra =
zfRootCfgR padTotal stack (ListBlank.append [1,
0] (ListBlank.append (encodeRegs regs) extra)) := by
simp [zfRootCfg, zfRootCfgR, List.append_assoc, ListBlank.append_assoc]
theorem zfRootCfg_default_eq_zfRootCfgR (padTotal : ℕ) (stack : List (Fin 2))
(regs : List ℕ) :
zfRootCfg padTotal stack regs default =
zfRootCfgR padTotal stack (ListBlank.append [1, 0] (regsTape regs)) := by
rw [zfRootCfg_eq_zfRootCfgR]; rfl
/-- Canonical configuration at `main().0` (State `126`) with `extraRegs` zero-initialized dummy
registers following the 11 active registers. -/
def zfRootCfgExtra (padTotal : ℕ) (stack : List (Fin 2)) (regs : List ℕ)
(extraRegs : ℕ) : Cfg 432 2 :=
zfRootCfg padTotal stack (regs ++ List.replicate extraRegs 0) default
/-!
## 2. Call-Stack Bit Manipulation (`trimZeros`, `padTo`, `applyBreak`, `applyContinue`)
-/
/-- Removes leading `0`s from a bit list (used on reversed stacks to remove trailing `0`s). -/
def dropLeadingZeros : List (Fin 2) → List (Fin 2)
| [] => []
| b :: xs => if b == 0 then dropLeadingZeros xs else b :: xs
/-- Removes trailing `0`s from a call-stack bit list `bits`. -/
def trimZeros (bits : List (Fin 2)) : List (Fin 2) :=
(dropLeadingZeros bits.reverse).reverse
@[simp]
theorem dropLeadingZeros_nil : dropLeadingZeros [] = [] := rfl
@[simp]
theorem dropLeadingZeros_zero (xs : List (Fin 2)) :
dropLeadingZeros (0 :: xs) = dropLeadingZeros xs := rfl
@[simp]
theorem dropLeadingZeros_one (xs : List (Fin 2)) :
dropLeadingZeros (1 :: xs) = 1 :: xs := rfl
@[simp]
theorem trimZeros_nil : trimZeros [] = [] := rfl
theorem dropLeadingZeros_length_le (xs : List (Fin 2)) :
(dropLeadingZeros xs).length ≤ xs.length := by
induction xs with
| nil => simp
| cons b xs ih =>
rcases fin2_cases b with rfl | rfl
· simp; omega
· simp
theorem eq_replicate_append_dropLeadingZeros (xs : List (Fin 2)) :
xs = List.replicate (xs.length - (dropLeadingZeros xs).length) 0 ++ dropLeadingZeros xs := by
induction xs with
| nil => rfl
| cons b xs ih =>
rcases fin2_cases b with rfl | rfl
· have hle := dropLeadingZeros_length_le xs
have hsub : (0 :: xs).length - (dropLeadingZeros (0 :: xs)).length =
(xs.length - (dropLeadingZeros xs).length) + 1 := by
simp; omega
rw [hsub, List.replicate_succ, List.cons_append, dropLeadingZeros_zero]
exact congrArg (0 :: ·) ih
· simp [dropLeadingZeros_one]
theorem trimZeros_length_le (bits : List (Fin 2)) :
(trimZeros bits).length ≤ bits.length := by
simpa [trimZeros] using dropLeadingZeros_length_le bits.reverse
theorem eq_trimZeros_append_replicate (bits : List (Fin 2)) :
bits = trimZeros bits ++ List.replicate (bits.length - (trimZeros bits).length) 0 := by
have h := congrArg List.reverse (eq_replicate_append_dropLeadingZeros bits.reverse)
simpa [trimZeros, List.reverse_append, List.reverse_replicate] using h
theorem trimZeros_pad_eq (bits : List (Fin 2)) {padTotal : ℕ} (h : bits.length ≤ padTotal) :
trimZeros bits ++ List.replicate (padTotal - (trimZeros bits).length) 0 =
bits ++ List.replicate (padTotal - bits.length) 0 := by
have hle := trimZeros_length_le bits
have hsub : padTotal - (trimZeros bits).length =
(bits.length - (trimZeros bits).length) + (padTotal - bits.length) := by omega
rw [hsub, List.replicate_add, ← List.append_assoc, ← eq_trimZeros_append_replicate bits]
theorem zfRootCfgR_trimZeros (padTotal : ℕ) (bits : List (Fin 2)) (R : ListBlank (Fin 2))
(h : bits.length ≤ padTotal) :
zfRootCfgR padTotal (trimZeros bits) R = zfRootCfgR padTotal bits R := by
simp [zfRootCfgR, trimZeros_pad_eq bits h]
/-- Pads or truncates `bits` with trailing `0`s to exact length `pos`. -/
def padTo (bits : List (Fin 2)) (pos : ℕ) : List (Fin 2) :=
(bits ++ List.replicate (pos - bits.length) 0).take pos
@[simp]
theorem padTo_length (bits : List (Fin 2)) (pos : ℕ) :
(padTo bits pos).length = pos := by
simp [padTo]
omega
theorem padTo_of_le {bits : List (Fin 2)} {pos : ℕ} (h : bits.length ≤ pos) :
padTo bits pos = bits ++ List.replicate (pos - bits.length) 0 := by
unfold padTo
rw [List.take_of_length_le]
simp; omega
theorem padTo_of_ge {bits : List (Fin 2)} {pos : ℕ} (h : pos ≤ bits.length) :
padTo bits pos = bits.take pos := by
unfold padTo
have hsub : pos - bits.length = 0 := by omega
rw [hsub, List.replicate_zero, List.append_nil]
theorem take_append_replicate_eq_padTo (bits : List (Fin 2)) {pos n : ℕ}
(h : pos ≤ bits.length + n) :
(bits ++ List.replicate n 0).take pos = padTo bits pos := by
by_cases hle : pos ≤ bits.length
· simp [padTo, List.take_append_of_le_length hle]
· rw [padTo, List.take_append, List.take_append, List.take_replicate, List.take_replicate]
congr 2
omega
/-- Reversed-stack scanner for `6.break.k`: scans `rev` (from `pos - 1` down to `0`),
discarding `1`s and the first `k` `0`s, and replaces the `(k + 1)`-th `0` with `1`. -/
def popBreakRev : ℕ → List (Fin 2) → List (Fin 2)
| _, [] => []
| 0, b :: rest => if b == 0 then 1 :: rest else popBreakRev 0 rest
| k + 1, b :: rest => if b == 0 then popBreakRev k rest else popBreakRev (k + 1) rest
/-- Reversed-stack scanner for `6.continue.k`: scans `rev` (from `pos - 1` down to `0`),
discarding `0`s and the first `k` `1`s, and stops at the `(k + 1)`-th `1`. -/
def popContinueRev : ℕ → List (Fin 2) → List (Fin 2)
| _, [] => []
| 0, b :: rest => if b == 1 then 1 :: rest else popContinueRev 0 rest
| k + 1, b :: rest => if b == 1 then popContinueRev k rest else popContinueRev (k + 1) rest
@[simp]
theorem popBreakRev_nil (k : ℕ) : popBreakRev k [] = [] := by
cases k <;> rfl
@[simp]
theorem popBreakRev_one (k : ℕ) (rest : List (Fin 2)) :
popBreakRev k (1 :: rest) = popBreakRev k rest := by
cases k <;> rfl
@[simp]
theorem popBreakRev_zero_zero (rest : List (Fin 2)) :
popBreakRev 0 (0 :: rest) = 1 :: rest := rfl
@[simp]
theorem popBreakRev_succ_zero (k : ℕ) (rest : List (Fin 2)) :
popBreakRev (k + 1) (0 :: rest) = popBreakRev k rest := rfl
@[simp]
theorem popContinueRev_nil (k : ℕ) : popContinueRev k [] = [] := by
cases k <;> rfl
@[simp]
theorem popContinueRev_zero (k : ℕ) (rest : List (Fin 2)) :
popContinueRev k (0 :: rest) = popContinueRev k rest := by
cases k <;> rfl
@[simp]
theorem popContinueRev_zero_one (rest : List (Fin 2)) :
popContinueRev 0 (1 :: rest) = 1 :: rest := rfl
@[simp]
theorem popContinueRev_succ_one (k : ℕ) (rest : List (Fin 2)) :
popContinueRev (k + 1) (1 :: rest) = popContinueRev k rest := rfl
/-- Updates the call stack `bits` when `6.break.k` runs from index `pos` moving left. -/
def applyBreak (bits : List (Fin 2)) (pos : ℕ) (k : ℕ) : List (Fin 2) :=
(popBreakRev k (padTo bits pos).reverse).reverse
/-- Updates the call stack `bits` when `6.continue.k` runs from index `pos` moving left. -/
def applyContinue (bits : List (Fin 2)) (pos : ℕ) (k : ℕ) : List (Fin 2) :=
(popContinueRev k (padTo bits pos).reverse).reverse
theorem popBreakRev_suffix (k : ℕ) (rev : List (Fin 2)) :
popBreakRev k rev = [] ∨
∃ rest, popBreakRev k rev = 1 :: rest ∧
rest.length < rev.length ∧
rev.reverse.take rest.length = rest.reverse := by
induction rev generalizing k with
| nil => exact Or.inl (popBreakRev_nil k)
| cons b xs ih =>
cases k with
| zero =>
rcases fin2_cases b with rfl | rfl
· refine Or.inr ⟨xs, rfl, by simp, ?_⟩
have hlen : xs.length ≤ xs.reverse.length := by simp
rw [List.reverse_cons, List.take_append_of_le_length hlen]
simp
· rcases ih 0 with hnil | ⟨rest, h1, hlt, htake⟩
· exact Or.inl hnil
· refine Or.inr ⟨rest, h1, by simp; omega, ?_⟩
have hle : rest.length ≤ xs.reverse.length := by simp; omega
rw [List.reverse_cons, List.take_append_of_le_length hle, htake]
| succ k =>
rcases fin2_cases b with rfl | rfl
· rcases ih k with hnil | ⟨rest, h1, hlt, htake⟩
· exact Or.inl hnil
· refine Or.inr ⟨rest, h1, by simp; omega, ?_⟩
have hle : rest.length ≤ xs.reverse.length := by simp; omega
rw [List.reverse_cons, List.take_append_of_le_length hle, htake]
· rcases ih (k + 1) with hnil | ⟨rest, h1, hlt, htake⟩
· exact Or.inl hnil
· refine Or.inr ⟨rest, h1, by simp; omega, ?_⟩
have hle : rest.length ≤ xs.reverse.length := by simp; omega
rw [List.reverse_cons, List.take_append_of_le_length hle, htake]
theorem popContinueRev_suffix (k : ℕ) (rev : List (Fin 2)) :
popContinueRev k rev = [] ∨
∃ rest, popContinueRev k rev = 1 :: rest ∧
rest.length < rev.length ∧
rev.reverse.take rest.length = rest.reverse := by
induction rev generalizing k with
| nil => exact Or.inl (popContinueRev_nil k)
| cons b xs ih =>
cases k with
| zero =>
rcases fin2_cases b with rfl | rfl
· rcases ih 0 with hnil | ⟨rest, h1, hlt, htake⟩
· exact Or.inl hnil
· refine Or.inr ⟨rest, h1, by simp; omega, ?_⟩
have hle : rest.length ≤ xs.reverse.length := by simp; omega
rw [List.reverse_cons, List.take_append_of_le_length hle, htake]
· refine Or.inr ⟨xs, rfl, by simp, ?_⟩
have hlen : xs.length ≤ xs.reverse.length := by simp
rw [List.reverse_cons, List.take_append_of_le_length hlen]
simp
| succ k =>
rcases fin2_cases b with rfl | rfl
· rcases ih (k + 1) with hnil | ⟨rest, h1, hlt, htake⟩
· exact Or.inl hnil
· refine Or.inr ⟨rest, h1, by simp; omega, ?_⟩
have hle : rest.length ≤ xs.reverse.length := by simp; omega
rw [List.reverse_cons, List.take_append_of_le_length hle, htake]
· rcases ih k with hnil | ⟨rest, h1, hlt, htake⟩
· exact Or.inl hnil
· refine Or.inr ⟨rest, h1, by simp; omega, ?_⟩
have hle : rest.length ≤ xs.reverse.length := by simp; omega
rw [List.reverse_cons, List.take_append_of_le_length hle, htake]
theorem popBreakRev_length_le (k : ℕ) (rev : List (Fin 2)) :
(popBreakRev k rev).length ≤ rev.length := by
rcases popBreakRev_suffix k rev with hnil | ⟨rest, h1, hlt, _⟩
· simp [hnil]
· simp [h1]; omega
theorem popContinueRev_length_le (k : ℕ) (rev : List (Fin 2)) :
(popContinueRev k rev).length ≤ rev.length := by
rcases popContinueRev_suffix k rev with hnil | ⟨rest, h1, hlt, _⟩
· simp [hnil]
· simp [h1]; omega
theorem popBreakRev_count_zero_le (k : ℕ) (rev : List (Fin 2)) :
(popBreakRev k rev).reverse.count 0 ≤ rev.count 0 := by
rcases popBreakRev_suffix k rev with hnil | ⟨rest, h1, _, htake⟩
· simp [hnil]
· have hcnt : (rev.reverse.take rest.length).count 0 ≤ rev.reverse.count 0 := by
conv_rhs => rw [← List.take_append_drop rest.length rev.reverse, List.count_append]
omega
rw [htake] at hcnt
rw [h1, List.reverse_cons, List.count_append]
simp only [List.count_reverse] at hcnt ⊢
change rest.count 0 + 0 ≤ rev.count 0
omega
theorem popContinueRev_count_zero_le (k : ℕ) (rev : List (Fin 2)) :
(popContinueRev k rev).reverse.count 0 ≤ rev.count 0 := by
rcases popContinueRev_suffix k rev with hnil | ⟨rest, h1, _, htake⟩
· simp [hnil]
· have hcnt : (rev.reverse.take rest.length).count 0 ≤ rev.reverse.count 0 := by
conv_rhs => rw [← List.take_append_drop rest.length rev.reverse, List.count_append]
omega
rw [htake] at hcnt
rw [h1, List.reverse_cons, List.count_append]
simp only [List.count_reverse] at hcnt ⊢
change rest.count 0 + 0 ≤ rev.count 0
omega
@[simp]
theorem trimZeros_applyBreak (bits : List (Fin 2)) (pos k : ℕ) :
trimZeros (applyBreak bits pos k) = applyBreak bits pos k := by
unfold trimZeros applyBreak
rw [List.reverse_reverse]
rcases popBreakRev_suffix k (padTo bits pos).reverse with hnil | ⟨rest, h1, _, _⟩
· simp [hnil]
· simp [h1]
@[simp]
theorem trimZeros_applyContinue (bits : List (Fin 2)) (pos k : ℕ) :
trimZeros (applyContinue bits pos k) = applyContinue bits pos k := by
unfold trimZeros applyContinue
rw [List.reverse_reverse]
rcases popContinueRev_suffix k (padTo bits pos).reverse with hnil | ⟨rest, h1, _, _⟩
· simp [hnil]
· simp [h1]
/-!
## 3. Computable Call-Stack Dispatcher (`ZfInstr`, `walkTape`, `evalStack`)
-/
/-- Abstract instruction of the `zf_432_wade.tm` register machine at `main().0`. -/
inductive ZfInstr where
| halt
| jump (stack' : List (Fin 2))
| inc (r : ℕ) (stack_succ : List (Fin 2))
| decnz (r : ℕ) (stack_succ stack_fail : List (Fin 2))
deriving DecidableEq, Repr
/-- Register index `r ∈ {0..10}` associated with a leaf state `q ∈ {49..70}`. -/
def leafReg (q : Fin 432) : ℕ :=
match q.val with
| 49 | 50 => 4
| 51 | 52 => 1
| 53 | 54 => 5
| 55 | 56 => 6
| 57 | 58 => 7
| 59 | 60 => 0
| 61 | 62 => 8
| 63 | 64 => 9
| 65 | 66 => 10
| 67 | 68 => 2
| 69 | 70 => 3
| _ => 0
theorem leafReg_lt_11 (q : Fin 432) : leafReg q < 11 := by
revert q; decide
/-- Whether a leaf state `q ∈ {49..70}` is a register increment (`true`) or `decnz` (`false`). -/
def isLeafInc (q : Fin 432) : Bool :=
49 ≤ q.val && q.val ≤ 70 && q.val % 2 == 0
/-- Outcome of walking the call-stack decision tree (`States 96..431`) on a bit tape. -/
inductive TreeOutcome where
| halt (q : Fin 432) (walked rem : List (Fin 2))
| jumpLeft (q' : Fin 432) (walked rem' : List (Fin 2))
| regLeaf (q' : Fin 432) (walked rem' : List (Fin 2))
| outOfFuel
deriving DecidableEq, Repr
/-- Walks the decision tree starting at state `q` with already-traversed prefix `walked`
and remaining tape suffix `rem`. -/
def walkTape (q : Fin 432) (walked : List (Fin 2)) : List (Fin 2) → TreeOutcome
| [] => .outOfFuel
| b :: rem' =>
match refTrans q b with
| none => .halt q walked (b :: rem')
| some (w, d, q') =>
match d with
| .left =>
if w == 0 then .jumpLeft q' walked rem' else .outOfFuel
| .right =>
if w == b then
if 49 ≤ q'.val && q'.val ≤ 70 then
.regLeaf q' (walked ++ [b]) rem'
else
walkTape q' (walked ++ [b]) rem'
else
.outOfFuel
/-- Decodes a `TreeOutcome` into a `ZfInstr` for call stack `bits`. -/
def outcomeToInstr (bits : List (Fin 2)) : TreeOutcome → ZfInstr
| .halt _ _ _ => .halt
| .jumpLeft q' walked _ =>
if q'.val ≤ 91 then
.jump (applyBreak bits walked.length (q'.val - 89))
else
.jump (applyContinue bits walked.length (q'.val - 92))
| .regLeaf q' walked _ =>
if isLeafInc q' then
.inc (leafReg q') (applyBreak bits walked.length 0)
else
.decnz (leafReg q') (applyBreak bits walked.length 0) (applyBreak bits walked.length 1)
| .outOfFuel => .halt
/-- Computable call-stack dispatcher: evaluates `bits` from `main().0` (State `126`)
with 12 trailing zeros of padding. -/
def evalStack (bits : List (Fin 2)) : ZfInstr :=
outcomeToInstr bits (walkTape 126 [] (bits ++ List.replicate 12 0))
/-!
## 4. Universal Tree-Walk Soundness and DAG Invariant (`validStack`)
-/
theorem walkTape_append (q : Fin 432) (walked rem extra : List (Fin 2)) :
match walkTape q walked rem with
| .halt q_h w_h r_h => walkTape q walked (rem ++ extra) = .halt q_h w_h (r_h ++ extra)
| .jumpLeft q' w_j r' => walkTape q walked (rem ++ extra) = .jumpLeft q' w_j (r' ++ extra)
| .regLeaf q' w_l r' => walkTape q walked (rem ++ extra) = .regLeaf q' w_l (r' ++ extra)
| .outOfFuel => True := by
induction rem generalizing q walked with
| nil => trivial
| cons b rem' ih =>
simp only [walkTape, List.cons_append]
rcases htr : refTrans q b with _ | ⟨w, d, q'⟩
· rfl
· cases d with
| left =>
by_cases hw : (w == 0) = true <;> simp [hw]
| right =>
by_cases hw : (w == b) = true
· simp only [hw, ↓reduceIte]
by_cases hleaf : (49 ≤ q'.val && q'.val ≤ 70) = true
· simp [hleaf]
· simp only [hleaf, Bool.false_eq_true, ↓reduceIte]
exact ih q' (walked ++ [b])
· simp [hw]
/-- Configuration during the rightward decision-tree walk. -/
def treeWalkCfg (q : Fin 432) (walked rem : List (Fin 2)) (L₀ R_tail : ListBlank (Fin 2)) :
Cfg 432 2 :=
⟨q, Tape.mk' (ListBlank.append walked.reverse L₀) (ListBlank.append rem R_tail)⟩
/-- Universal Tree-Walk Soundness Theorem: for any `q`, `walked`, `rem`, `L₀`, and `R_tail`,
`nSteps Machines.zf432` executes `walkTape q walked rem` on the tape without touching `L₀` or
`R_tail`. -/
theorem walkTape_sound (q : Fin 432) (walked rem : List (Fin 2)) (L₀ R_tail : ListBlank (Fin 2)) :
match walkTape q walked rem with
| .halt q_h walked_h rem_h =>
walked_h ++ rem_h = walked ++ rem ∧
∃ s ch,
ch = treeWalkCfg q_h walked_h rem_h L₀ R_tail ∧
nSteps Machines.zf432 s (treeWalkCfg q walked rem L₀ R_tail) = some ch ∧
step Machines.zf432 ch = none
| .jumpLeft q' walked_j rem' =>
(∃ b, walked_j ++ (b :: rem') = walked ++ rem) ∧
∃ s, 1 ≤ s ∧ nSteps Machines.zf432 s (treeWalkCfg q walked rem L₀ R_tail) =
some ⟨q', Tape.mkL (ListBlank.append walked_j.reverse L₀) (ListBlank.append (0 :: rem')
R_tail)⟩
| .regLeaf q' walked_l rem' =>
walked_l ++ rem' = walked ++ rem ∧
49 ≤ q'.val ∧ q'.val ≤ 70 ∧
∃ s, 1 ≤ s ∧ nSteps Machines.zf432 s (treeWalkCfg q walked rem L₀ R_tail) =
some (treeWalkCfg q' walked_l rem' L₀ R_tail)
| .outOfFuel => True := by
induction rem generalizing q walked with
| nil => trivial
| cons b rem' ih =>
simp only [walkTape]
rcases htr : refTrans q b with _ | ⟨w, d, q'⟩
· refine ⟨rfl, 0, treeWalkCfg q walked (b :: rem') L₀ R_tail, rfl, rfl, ?_⟩
exact step_mk'_none htr (ListBlank.append walked.reverse L₀) (ListBlank.append rem' R_tail)
· cases d with
| left =>
by_cases hw : (w == 0) = true
· simp only [hw, ↓reduceIte]
have hw0 : w = 0 := beq_iff_eq.mp hw
subst hw0
refine ⟨⟨b, rfl⟩, 1, le_refl 1, ?_⟩
exact step_one (step_mk'_left htr (ListBlank.append walked.reverse L₀)
(ListBlank.append rem' R_tail))
· simp [hw]
| right =>
by_cases hw : (w == b) = true
· simp only [hw, ↓reduceIte]
have hwb : w = b := beq_iff_eq.mp hw
subst hwb
have hstep1 : step Machines.zf432 (treeWalkCfg q walked (w :: rem') L₀ R_tail) =
some (treeWalkCfg q' (walked ++ [w]) rem' L₀ R_tail) := by
simpa [treeWalkCfg, append_reverse_cons] using
step_mk'_right htr (ListBlank.append walked.reverse L₀) (ListBlank.append rem' R_tail)
by_cases hleaf : (49 ≤ q'.val && q'.val ≤ 70) = true
· simp only [hleaf, ↓reduceIte]
rw [Bool.and_eq_true, decide_eq_true_eq, decide_eq_true_eq] at hleaf
exact ⟨by simp, hleaf.1, hleaf.2, 1, le_refl 1, step_one hstep1⟩
· simp only [hleaf, Bool.false_eq_true, ↓reduceIte]
have hrec := ih q' (walked ++ [w])
rcases hout : walkTape q' (walked ++ [w]) rem' with
⟨q_h, w_h, r_h⟩ | ⟨q_j, w_j, r_j⟩ | ⟨q_l, w_l, r_l⟩ | _
· rw [hout] at hrec
obtain ⟨heq, s, ch, hch, hs, hnone⟩ := hrec
exact ⟨by simpa using heq, s + 1, ch, hch, step_nSteps hstep1 hs, hnone⟩
· rw [hout] at hrec
obtain ⟨⟨b', heq⟩, s, hs_pos, hs⟩ := hrec
exact ⟨⟨b', by simpa using heq⟩, s + 1, by omega, step_nSteps hstep1 hs⟩
· rw [hout] at hrec
obtain ⟨heq, h49, h70, s, hs_pos, hs⟩ := hrec
exact ⟨by simpa using heq, h49, h70, s + 1, by omega, step_nSteps hstep1 hs⟩
· trivial
· simp [hw]
/-- DAG topological height (max path length in `96..431` from `q`). -/
def nodeMaxLen (q : Fin 432) : ℕ :=
(if q.val < 216 then (if q.val < 108 then (if q.val < 54 then 0 else (if q.val < 81 then 0 else
(if q.val < 94 then 0 else (if q.val < 101 then (if q.val < 97 then (if q.val < 95 then 0 else
(if q.val < 96 then 0 else 7)) else (if q.val < 99 then (if q.val < 98 then 6 else 11) else
(if q.val < 100 then 10 else 9))) else (if q.val < 104 then (if q.val < 102 then 2 else (if
q.val < 103 then 1 else 0)) else (if q.val < 106 then (if q.val < 105 then 8 else 7) else
(if q.val < 107 then 12 else 2))))))) else (if q.val < 162 then (if q.val < 135 then
(if q.val < 121 then (if q.val < 114 then (if q.val < 111 then (if q.val < 109 then
12 else (if q.val < 110 then 2 else 3)) else (if q.val < 112 then 2 else (if q.val
< 113 then 4 else 3))) else (if q.val < 117 then (if q.val < 115 then 2 else (if
q.val < 116 then 0 else 1)) else (if q.val < 119 then (if q.val < 118 then 2
else 1) else (if q.val < 120 then 5 else 3)))) else (if q.val < 128 then (if
q.val < 124 then (if q.val < 122 then 5 else (if q.val < 123 then 4 else
0)) else (if q.val < 126 then (if q.val < 125 then 3 else 2) else (if
q.val < 127 then 147 else 146))) else (if q.val < 131 then (if q.val <
129 then 137 else (if q.val < 130 then 47 else 46)) else (if q.val <
133 then (if q.val < 132 then 45 else 44) else (if q.val < 134 then
43 else 42))))) else (if q.val < 148 then (if q.val < 141 then
(if q.val < 138 then (if q.val < 136 then 41 else (if q.val <
137 then 40 else 39)) else (if q.val < 139 then 38 else (if
q.val < 140 then 136 else 37))) else (if q.val < 144 then
(if q.val < 142 then 36 else (if q.val < 143 then 35 else
34)) else (if q.val < 146 then (if q.val < 145 then 33
else 32) else (if q.val < 147 then 31 else 30))))
else (if q.val < 155 then (if q.val < 151 then (if
q.val < 149 then 29 else (if q.val < 150 then 28
else 135)) else (if q.val < 153 then (if q.val
< 152 then 27 else 26) else (if q.val < 154
then 25 else 24))) else (if q.val < 158
then (if q.val < 156 then 23 else (if
q.val < 157 then 22 else 21)) else (if
q.val < 160 then (if q.val < 159 then
20 else 19) else (if q.val < 161
then 18 else 134)))))) else (if
q.val < 189 then (if q.val <
175 then (if q.val < 168 then
(if q.val < 165 then (if
q.val < 163 then 17 else
(if q.val < 164 then 16
else 8)) else (if
q.val < 166 then 4
else (if q.val <
167 then 3 else
2))) else (if
q.val < 171
then (if
q.val <
169
then
1
else (if q.val < 170 then 0 else 133)) else (if q.val < 173 then (if q.val < 172 then 132 else
131) else (if q.val < 174 then 130 else 129)))) else (if q.val < 182 then (if q.val < 178 then (if
q.val < 176 then 128 else (if q.val < 177 then 145 else 127)) else (if q.val < 180 then (if q.val
< 179 then 126 else 125) else (if q.val < 181 then 124 else 123))) else (if q.val < 185 then (if
q.val < 183 then 122 else (if q.val < 184 then 121 else 120)) else (if q.val < 187 then (if q.val
< 186 then 119 else 118) else (if q.val < 188 then 144 else 117))))) else (if q.val < 202 then (if
q.val < 195 then (if q.val < 192 then (if q.val < 190 then 116 else (if q.val < 191 then 115 else
114)) else (if q.val < 193 then 113 else (if q.val < 194 then 112 else 111))) else (if q.val < 198
then (if q.val < 196 then 110 else (if q.val < 197 then 109 else 108)) else (if q.val < 200 then
(if q.val < 199 then 143 else 107) else (if q.val < 201 then 106 else 105)))) else (if q.val < 209
then (if q.val < 205 then (if q.val < 203 then 104 else (if q.val < 204 then 103 else 102)) else
(if q.val < 207 then (if q.val < 206 then 101 else 100) else (if q.val < 208 then 99 else 98)))
else (if q.val < 212 then (if q.val < 210 then 142 else (if q.val < 211 then 97 else 96)) else (if
q.val < 214 then (if q.val < 213 then 95 else 94) else (if q.val < 215 then 93 else 92))))))))
else (if q.val < 324 then (if q.val < 270 then (if q.val < 243 then (if q.val < 229 then (if q.val
< 222 then (if q.val < 219 then (if q.val < 217 then 91 else (if q.val < 218 then 90 else 89))
else (if q.val < 220 then 88 else (if q.val < 221 then 141 else 87))) else (if q.val < 225 then
(if q.val < 223 then 86 else (if q.val < 224 then 85 else 84)) else (if q.val < 227 then (if q.val
< 226 then 83 else 82) else (if q.val < 228 then 81 else 80)))) else (if q.val < 236 then (if
q.val < 232 then (if q.val < 230 then 79 else (if q.val < 231 then 78 else 140)) else (if q.val <
234 then (if q.val < 233 then 77 else 76) else (if q.val < 235 then 75 else 74))) else (if q.val <
239 then (if q.val < 237 then 73 else (if q.val < 238 then 72 else 71)) else (if q.val < 241 then
(if q.val < 240 then 70 else 69) else (if q.val < 242 then 68 else 139))))) else (if q.val < 256
then (if q.val < 249 then (if q.val < 246 then (if q.val < 244 then 67 else (if q.val < 245 then
66 else 65)) else (if q.val < 247 then 64 else (if q.val < 248 then 63 else 62))) else (if q.val <
252 then (if q.val < 250 then 61 else (if q.val < 251 then 60 else 59)) else (if q.val < 254 then
(if q.val < 253 then 58 else 138) else (if q.val < 255 then 57 else 56)))) else (if q.val < 263
then (if q.val < 259 then (if q.val < 257 then 55 else (if q.val < 258 then 54 else 53)) else (if
q.val < 261 then (if q.val < 260 then 52 else 51) else (if q.val < 262 then 50 else 49))) else (if
q.val < 266 then (if q.val < 264 then 48 else (if q.val < 265 then 20 else 19)) else (if q.val <
268 then (if q.val < 267 then 18 else 17) else (if q.val < 269 then 16 else 15)))))) else (if
q.val < 297 then (if q.val < 283 then (if q.val < 276 then (if q.val < 273 then (if q.val < 271
then 10 else (if q.val < 272 then 8 else 19)) else (if q.val < 274 then 18 else (if q.val < 275
then 17 else 16))) else (if q.val < 279 then (if q.val < 277 then 15 else (if q.val < 278 then 18
else 17)) else (if q.val < 281 then (if q.val < 280 then 16 else 17) else (if q.val < 282 then 16
else 8)))) else (if q.val < 290 then (if q.val < 286 then (if q.val < 284 then 11 else (if q.val <
285 then 10 else 8)) else (if q.val < 288 then (if q.val < 287 then 13 else 14) else 12)) else (if
q.val < 293 then (if q.val < 291 then 12 else (if q.val < 292 then 15 else 14)) else (if q.val <
295 then (if q.val < 294 then 13 else 12) else (if q.val < 296 then 13 else 14))))) else (if q.val
< 310 then (if q.val < 303 then (if q.val < 300 then (if q.val < 298 then 10 else (if q.val < 299
then 7 else 6)) else (if q.val < 301 then 12 else 11)) else (if q.val < 306 then (if q.val < 304
then 10 else (if q.val < 305 then 11 else 12)) else (if q.val < 308 then (if q.val < 307 then 9
else 11) else (if q.val < 309 then 14 else 13)))) else (if q.val < 317 then (if q.val < 313 then
(if q.val < 311 then 6 else 11) else (if q.val < 315 then (if q.val < 314 then 13 else 9) else (if
q.val < 316 then 15 else 9))) else (if q.val < 320 then (if q.val < 318 then 10 else (if q.val <
319 then 15 else 13)) else (if q.val < 322 then (if q.val < 321 then 11 else 8) else (if q.val <
323 then 11 else 10))))))) else (if q.val < 378 then (if q.val < 351 then (if q.val < 337 then (if
q.val < 330 then (if q.val < 327 then (if q.val < 325 then 8 else (if q.val < 326 then 13 else 8))
else (if q.val < 328 then 10 else (if q.val < 329 then 6 else 5))) else (if q.val < 333 then (if
q.val < 331 then 4 else (if q.val < 332 then 3 else 2)) else (if q.val < 335 then (if q.val < 334
then 5 else 4) else (if q.val < 336 then 3 else 2)))) else (if q.val < 344 then (if q.val < 340
then (if q.val < 338 then 7 else (if q.val < 339 then 3 else 7)) else (if q.val < 342 then (if
q.val < 341 then 3 else 7) else (if q.val < 343 then 3 else 6))) else (if q.val < 347 then (if
q.val < 345 then 7 else (if q.val < 346 then 6 else 5)) else (if q.val < 349 then (if q.val < 348
then 4 else 0) else (if q.val < 350 then 4 else 3))))) else (if q.val < 364 then (if q.val < 357
then (if q.val < 354 then (if q.val < 352 then 2 else 5) else (if q.val < 355 then 5 else (if
q.val < 356 then 4 else 3))) else (if q.val < 360 then (if q.val < 358 then 2 else (if q.val < 359
then 7 else 8)) else (if q.val < 362 then (if q.val < 361 then 9 else 10) else (if q.val < 363
then 12 else 11)))) else (if q.val < 371 then (if q.val < 367 then (if q.val < 365 then 12 else
(if q.val < 366 then 11 else 9)) else (if q.val < 369 then (if q.val < 368 then 8 else 9) else (if
q.val < 370 then 8 else 14))) else (if q.val < 374 then (if q.val < 372 then 13 else (if q.val <
373 then 0 else 1)) else (if q.val < 376 then 0 else (if q.val < 377 then 1 else 0)))))) else (if
q.val < 405 then (if q.val < 391 then (if q.val < 384 then (if q.val < 381 then (if q.val < 379
then 0 else (if q.val < 380 then 1 else 0)) else (if q.val < 382 then 0 else (if q.val < 383 then
2 else 1))) else (if q.val < 387 then (if q.val < 385 then 0 else (if q.val < 386 then 0 else 2))
else (if q.val < 389 then 2 else (if q.val < 390 then 1 else 0)))) else (if q.val < 398 then (if
q.val < 394 then (if q.val < 392 then 0 else 2) else (if q.val < 396 then (if q.val < 395 then 2
else 0) else 2)) else (if q.val < 401 then (if q.val < 399 then 0 else (if q.val < 400 then 1 else
0)) else (if q.val < 403 then (if q.val < 402 then 1 else 0) else (if q.val < 404 then 1 else
0))))) else (if q.val < 418 then (if q.val < 411 then (if q.val < 408 then (if q.val < 406 then 1
else (if q.val < 407 then 0 else 1)) else (if q.val < 409 then 0 else 1)) else (if q.val < 414
then (if q.val < 412 then 1 else (if q.val < 413 then 2 else 1)) else (if q.val < 416 then 0 else
(if q.val < 417 then 1 else 0)))) else (if q.val < 425 then (if q.val < 421 then (if q.val < 419
then 1 else (if q.val < 420 then 1 else 0)) else (if q.val < 423 then (if q.val < 422 then 0 else
2) else (if q.val < 424 then 1 else 0))) else (if q.val < 428 then (if q.val < 426 then 1 else (if
q.val < 427 then 0 else 1)) else (if q.val < 430 then (if q.val < 429 then 1 else 10) else (if
q.val < 431 then 9 else 10)))))))))
/-- DAG zero-height (max `0`-transitions in `96..431` from `q`). -/
def nodeMax0 (q : Fin 432) : ℕ :=
(if q.val < 216 then (if q.val < 108 then (if q.val < 54 then 0 else (if q.val < 81 then 0 else
(if q.val < 94 then 0 else (if q.val < 101 then (if q.val < 97 then (if q.val < 95 then 0 else
(if q.val < 96 then 0 else 3)) else (if q.val < 99 then (if q.val < 98 then 3 else 4) else
3)) else (if q.val < 104 then (if q.val < 102 then 1 else (if q.val < 103 then 1 else 0))
else (if q.val < 106 then (if q.val < 105 then 3 else 2) else (if q.val < 107 then 5 else
1))))))) else (if q.val < 162 then (if q.val < 135 then (if q.val < 121 then (if q.val
< 114 then (if q.val < 111 then (if q.val < 109 then 5 else 1) else (if q.val < 112
then 1 else (if q.val < 113 then 2 else 1))) else (if q.val < 117 then (if q.val <
115 then 1 else (if q.val < 116 then 0 else 1)) else (if q.val < 119 then 1 else
(if q.val < 120 then 3 else 2)))) else (if q.val < 128 then (if q.val < 124
then (if q.val < 122 then 3 else (if q.val < 123 then 2 else 0)) else (if
q.val < 126 then (if q.val < 125 then 2 else 1) else 11)) else 11)) else
(if q.val < 148 then (if q.val < 141 then 11 else (if q.val < 144 then 11
else (if q.val < 146 then 11 else (if q.val < 147 then 11 else 10))))
else (if q.val < 155 then (if q.val < 151 then (if q.val < 149 then
10 else (if q.val < 150 then 10 else 11)) else 10) else (if q.val <
158 then 10 else (if q.val < 160 then 10 else (if q.val < 161
then 10 else 11)))))) else (if q.val < 189 then (if q.val < 175
then (if q.val < 168 then (if q.val < 165 then (if q.val <
163 then 10 else (if q.val < 164 then 10 else 3)) else (if
q.val < 166 then 2 else (if q.val < 167 then 2 else 1)))
else (if q.val < 171 then (if q.val < 169 then 1 else
(if q.val < 170 then 0 else 11)) else 11)) else 11)
else 11))) else (if q.val < 324 then (if q.val <
270 then (if q.val < 243 then 11 else (if q.val <
256 then 11 else (if q.val < 263 then 11 else
(if q.val < 266 then (if q.val < 264 then 11
else 10) else 10)))) else (if q.val < 297
then (if q.val < 283 then (if q.val < 276
then (if q.val < 273 then (if q.val <
271 then 5 else (if q.val < 272 then
5 else 9)) else 9) else (if q.val <
279 then 9 else (if q.val < 281
then (if q.val < 280 then 9
else 10) else (if q.val < 282
then 10 else 4)))) else (if
q.val < 290 then (if
q.val < 286 then (if
q.val < 284 then 6
else 5) else (if
q.val < 288 then
9 else 7)) else
(if q.val <
293 then (if
q.val <
291 then
6 else
9)
else (if q.val < 295 then (if q.val < 294 then 9 else 8) else 8)))) else (if q.val < 310 then (if
q.val < 303 then (if q.val < 300 then (if q.val < 298 then 6 else 3) else (if q.val < 301 then 6
else 5)) else (if q.val < 306 then (if q.val < 304 then 4 else (if q.val < 305 then 6 else 7))
else (if q.val < 308 then (if q.val < 307 then 5 else 7) else 8))) else (if q.val < 317 then (if
q.val < 313 then (if q.val < 311 then 2 else 6) else (if q.val < 315 then (if q.val < 314 then 9
else 6) else (if q.val < 316 then 9 else 5))) else (if q.val < 320 then (if q.val < 318 then 7
else (if q.val < 319 then 9 else 8)) else (if q.val < 322 then (if q.val < 321 then 7 else 5) else
(if q.val < 323 then 6 else 5))))))) else (if q.val < 378 then (if q.val < 351 then (if q.val <
337 then (if q.val < 330 then (if q.val < 327 then (if q.val < 325 then 5 else (if q.val < 326
then 8 else 5)) else (if q.val < 328 then 5 else 2)) else (if q.val < 333 then (if q.val < 331
then 1 else (if q.val < 332 then 1 else 0)) else (if q.val < 335 then (if q.val < 334 then 2 else
1) else (if q.val < 336 then 1 else 0)))) else (if q.val < 344 then (if q.val < 340 then (if q.val
< 338 then 4 else (if q.val < 339 then 2 else 4)) else (if q.val < 342 then (if q.val < 341 then 2
else 4) else (if q.val < 343 then 2 else 3))) else (if q.val < 347 then 2 else (if q.val < 349
then (if q.val < 348 then 2 else 0) else 1)))) else (if q.val < 364 then (if q.val < 357 then 1
else (if q.val < 360 then (if q.val < 358 then 1 else (if q.val < 359 then 4 else 5)) else (if
q.val < 362 then (if q.val < 361 then 6 else 7) else (if q.val < 363 then 8 else 7)))) else (if
q.val < 371 then (if q.val < 367 then (if q.val < 365 then 8 else (if q.val < 366 then 8 else 5))
else (if q.val < 369 then (if q.val < 368 then 5 else 4) else (if q.val < 370 then 4 else 9)))
else (if q.val < 374 then (if q.val < 372 then 9 else (if q.val < 373 then 0 else 1)) else (if
q.val < 376 then 0 else (if q.val < 377 then 1 else 0)))))) else (if q.val < 405 then (if q.val <
391 then (if q.val < 384 then (if q.val < 381 then (if q.val < 379 then 0 else (if q.val < 380
then 1 else 0)) else (if q.val < 382 then 0 else 1)) else (if q.val < 387 then (if q.val < 385
then 0 else (if q.val < 386 then 0 else 1)) else (if q.val < 389 then 1 else (if q.val < 390 then
1 else 0)))) else (if q.val < 398 then (if q.val < 394 then (if q.val < 392 then 0 else 1) else
(if q.val < 396 then (if q.val < 395 then 1 else 0) else 1)) else 0)) else (if q.val < 418 then
(if q.val < 411 then 0 else (if q.val < 414 then (if q.val < 412 then 0 else 1) else 0)) else (if
q.val < 425 then (if q.val < 421 then 0 else (if q.val < 423 then (if q.val < 422 then 0 else 1)
else (if q.val < 424 then 1 else 0))) else (if q.val < 428 then 0 else (if q.val < 430 then (if
q.val < 429 then 0 else 6) else (if q.val < 431 then 6 else 7)))))))))
/-- Minimum number of `1`-transitions on any path in `96..431` from `126` (`main().0`) to `q`. -/
def nodeMin1 (q : Fin 432) : ℕ :=
(if q.val < 216 then (if q.val < 108 then (if q.val < 54 then 0 else (if q.val < 81 then 0 else
(if q.val < 94 then 0 else (if q.val < 101 then (if q.val < 97 then (if q.val < 95 then 0 else
(if q.val < 96 then 0 else 18)) else (if q.val < 99 then (if q.val < 98 then 19 else 14) else
(if q.val < 100 then 14 else 15))) else (if q.val < 104 then (if q.val < 102 then 15 else
16) else (if q.val < 106 then 16 else (if q.val < 107 then 15 else 16))))))) else (if
q.val < 162 then (if q.val < 135 then (if q.val < 121 then (if q.val < 114 then (if
q.val < 111 then (if q.val < 109 then 14 else (if q.val < 110 then 15 else 25)) else
(if q.val < 112 then 26 else 21)) else (if q.val < 117 then (if q.val < 115 then 22
else (if q.val < 116 then 22 else 23)) else (if q.val < 119 then (if q.val < 118
then 22 else 23) else (if q.val < 120 then 21 else 22)))) else (if q.val < 128
then (if q.val < 124 then (if q.val < 122 then 60 else 0) else (if q.val <
126 then (if q.val < 125 then 1 else 2) else (if q.val < 127 then 0 else
1))) else (if q.val < 131 then (if q.val < 129 then 10 else (if q.val <
130 then 100 else 101)) else (if q.val < 133 then (if q.val < 132 then
102 else 103) else (if q.val < 134 then 104 else 105))))) else (if
q.val < 148 then (if q.val < 141 then (if q.val < 138 then (if
q.val < 136 then 106 else (if q.val < 137 then 107 else 108))
else (if q.val < 139 then 109 else (if q.val < 140 then 11 else
110))) else (if q.val < 144 then (if q.val < 142 then 111
else (if q.val < 143 then 112 else 113)) else (if q.val <
146 then (if q.val < 145 then 114 else 115) else (if
q.val < 147 then 116 else 117)))) else (if q.val < 155
then (if q.val < 151 then (if q.val < 149 then 118
else (if q.val < 150 then 119 else 12)) else (if
q.val < 153 then (if q.val < 152 then 120 else
121) else (if q.val < 154 then 122 else 123)))
else (if q.val < 158 then (if q.val < 156
then 124 else (if q.val < 157 then 125 else
126)) else (if q.val < 160 then (if q.val
< 159 then 127 else 128) else (if q.val
< 161 then 129 else 13)))))) else (if
q.val < 189 then (if q.val < 175
then (if q.val < 168 then (if
q.val < 165 then (if q.val <
163 then 130 else (if q.val <
164 then 131 else 132))
else (if q.val < 166 then
133 else 134)) else (if
q.val < 171 then (if
q.val < 169 then
135 else (if
q.val < 170
then 135 else
14)) else
(if q.val
< 173
then
(if
q.val < 172 then 15 else 16) else (if q.val < 174 then 17 else 18)))) else (if q.val < 182 then
(if q.val < 178 then (if q.val < 176 then 19 else (if q.val < 177 then 2 else 20)) else (if q.val
< 180 then (if q.val < 179 then 21 else 22) else (if q.val < 181 then 23 else 24))) else (if q.val
< 185 then (if q.val < 183 then 25 else (if q.val < 184 then 26 else 27)) else (if q.val < 187
then (if q.val < 186 then 28 else 29) else (if q.val < 188 then 3 else 30))))) else (if q.val <
202 then (if q.val < 195 then (if q.val < 192 then (if q.val < 190 then 31 else (if q.val < 191
then 32 else 33)) else (if q.val < 193 then 34 else (if q.val < 194 then 35 else 36))) else (if
q.val < 198 then (if q.val < 196 then 37 else (if q.val < 197 then 38 else 39)) else (if q.val <
200 then (if q.val < 199 then 4 else 40) else (if q.val < 201 then 41 else 42)))) else (if q.val <
209 then (if q.val < 205 then (if q.val < 203 then 43 else (if q.val < 204 then 44 else 45)) else
(if q.val < 207 then (if q.val < 206 then 46 else 47) else (if q.val < 208 then 48 else 49))) else
(if q.val < 212 then (if q.val < 210 then 5 else (if q.val < 211 then 50 else 51)) else (if q.val
< 214 then (if q.val < 213 then 52 else 53) else (if q.val < 215 then 54 else 55)))))))) else (if
q.val < 324 then (if q.val < 270 then (if q.val < 243 then (if q.val < 229 then (if q.val < 222
then (if q.val < 219 then (if q.val < 217 then 56 else (if q.val < 218 then 57 else 58)) else (if
q.val < 220 then 59 else (if q.val < 221 then 6 else 60))) else (if q.val < 225 then (if q.val <
223 then 61 else (if q.val < 224 then 62 else 63)) else (if q.val < 227 then (if q.val < 226 then
64 else 65) else (if q.val < 228 then 66 else 67)))) else (if q.val < 236 then (if q.val < 232
then (if q.val < 230 then 68 else (if q.val < 231 then 69 else 7)) else (if q.val < 234 then (if
q.val < 233 then 70 else 71) else (if q.val < 235 then 72 else 73))) else (if q.val < 239 then (if
q.val < 237 then 74 else (if q.val < 238 then 75 else 76)) else (if q.val < 241 then (if q.val <
240 then 77 else 78) else (if q.val < 242 then 79 else 8))))) else (if q.val < 256 then (if q.val
< 249 then (if q.val < 246 then (if q.val < 244 then 80 else (if q.val < 245 then 81 else 82))
else (if q.val < 247 then 83 else (if q.val < 248 then 84 else 85))) else (if q.val < 252 then (if
q.val < 250 then 86 else (if q.val < 251 then 87 else 88)) else (if q.val < 254 then (if q.val <
253 then 89 else 9) else (if q.val < 255 then 90 else 91)))) else (if q.val < 263 then (if q.val <
259 then (if q.val < 257 then 92 else (if q.val < 258 then 93 else 94)) else (if q.val < 261 then
(if q.val < 260 then 95 else 96) else (if q.val < 262 then 97 else 98))) else (if q.val < 266 then
(if q.val < 264 then 99 else (if q.val < 265 then 47 else 48)) else (if q.val < 268 then (if q.val
< 267 then 49 else 50) else (if q.val < 269 then 51 else 52)))))) else (if q.val < 297 then (if
q.val < 283 then (if q.val < 276 then (if q.val < 273 then (if q.val < 271 then 53 else (if q.val
< 272 then 54 else 46)) else (if q.val < 274 then 47 else (if q.val < 275 then 48 else 49))) else
(if q.val < 279 then (if q.val < 277 then 50 else (if q.val < 278 then 98 else 99)) else (if q.val
< 281 then (if q.val < 280 then 100 else 110) else (if q.val < 282 then 111 else 112)))) else (if
q.val < 290 then (if q.val < 286 then (if q.val < 284 then 48 else (if q.val < 285 then 49 else
50)) else (if q.val < 288 then (if q.val < 287 then 63 else 38) else (if q.val < 289 then 82 else
108))) else (if q.val < 293 then (if q.val < 291 then 97 else (if q.val < 292 then 85 else 86))
else (if q.val < 295 then (if q.val < 294 then 87 else 35) else (if q.val < 296 then 31 else
24))))) else (if q.val < 310 then (if q.val < 303 then (if q.val < 300 then (if q.val < 298 then
51 else (if q.val < 299 then 58 else 59)) else (if q.val < 301 then 87 else (if q.val < 302 then
117 else 124))) else (if q.val < 306 then (if q.val < 304 then 125 else (if q.val < 305 then 82
else 31)) else (if q.val < 308 then (if q.val < 307 then 25 else 99) else (if q.val < 309 then 91
else 92)))) else (if q.val < 317 then (if q.val < 313 then (if q.val < 311 then 5 else (if q.val <
312 then 28 else 17)) else (if q.val < 315 then (if q.val < 314 then 50 else 80) else (if q.val <
316 then 64 else 90))) else (if q.val < 320 then (if q.val < 318 then 107 else (if q.val < 319
then 101 else 109)) else (if q.val < 322 then (if q.val < 321 then 32 else 26) else (if q.val <
323 then 72 else 83))))))) else (if q.val < 378 then (if q.val < 351 then (if q.val < 337 then (if
q.val < 330 then (if q.val < 327 then (if q.val < 325 then 50 else (if q.val < 326 then 25 else
36)) else (if q.val < 328 then 100 else (if q.val < 329 then 17 else 13))) else (if q.val < 333
then (if q.val < 331 then 14 else 15) else (if q.val < 335 then (if q.val < 334 then 19 else 20)
else 21))) else (if q.val < 344 then (if q.val < 340 then (if q.val < 338 then 17 else (if q.val <
339 then 18 else 27)) else (if q.val < 342 then (if q.val < 341 then 28 else 16) else (if q.val <
343 then 17 else 13))) else (if q.val < 347 then (if q.val < 345 then 22 else (if q.val < 346 then
23 else 24)) else (if q.val < 349 then (if q.val < 348 then 25 else 7) else (if q.val < 350 then 6
else 7))))) else (if q.val < 364 then (if q.val < 357 then (if q.val < 354 then (if q.val < 352
then 8 else (if q.val < 353 then 5 else 17)) else (if q.val < 355 then 23 else (if q.val < 356
then 24 else 25))) else (if q.val < 360 then (if q.val < 358 then 26 else 19) else (if q.val < 362
then 27 else (if q.val < 363 then 55 else 56)))) else (if q.val < 371 then (if q.val < 367 then
(if q.val < 365 then 26 else (if q.val < 366 then 27 else 49)) else (if q.val < 369 then (if q.val
< 368 then 50 else 49) else (if q.val < 370 then 50 else 65))) else (if q.val < 374 then (if q.val
< 372 then 66 else (if q.val < 373 then 9 else 57)) else (if q.val < 376 then (if q.val < 375 then
57 else 17) else 18))))) else (if q.val < 405 then (if q.val < 391 then (if q.val < 384 then (if
q.val < 381 then (if q.val < 379 then 15 else 20) else (if q.val < 382 then 1 else (if q.val < 383
then 1 else 2))) else (if q.val < 387 then (if q.val < 385 then 2 else (if q.val < 386 then 2 else
56)) else (if q.val < 389 then (if q.val < 388 then 18 else 22) else 23))) else (if q.val < 398
then (if q.val < 394 then (if q.val < 392 then 3 else (if q.val < 393 then 59 else 28)) else (if
q.val < 396 then (if q.val < 395 then 19 else 4) else (if q.val < 397 then 17 else 58))) else (if
q.val < 401 then (if q.val < 399 then 26 else (if q.val < 400 then 6 else 7)) else (if q.val < 403
then (if q.val < 402 then 2 else 3) else (if q.val < 404 then 8 else 9))))) else (if q.val < 418
then (if q.val < 411 then (if q.val < 408 then (if q.val < 406 then 10 else (if q.val < 407 then
11 else 12)) else (if q.val < 409 then 13 else (if q.val < 410 then 8 else 27))) else (if q.val <
414 then (if q.val < 412 then 14 else (if q.val < 413 then 19 else 20)) else (if q.val < 416 then
(if q.val < 415 then 20 else 23) else (if q.val < 417 then 6 else 7)))) else (if q.val < 425 then
(if q.val < 421 then (if q.val < 419 then 20 else (if q.val < 420 then 18 else 23)) else (if q.val
< 423 then (if q.val < 422 then 26 else 13) else 14)) else (if q.val < 428 then (if q.val < 426
then 22 else (if q.val < 427 then 23 else 18)) else (if q.val < 430 then (if q.val < 429 then 16
else 18) else (if q.val < 431 then 19 else 32)))))))))
/-- Minimum number of `0`-transitions on any path in `96..431` from `126` (`main().0`) to `q`. -/
def nodeMin0 (q : Fin 432) : ℕ :=
(if q.val < 216 then (if q.val < 108 then (if q.val < 54 then 0 else (if q.val < 81 then 0 else
(if q.val < 94 then 0 else (if q.val < 101 then (if q.val < 97 then (if q.val < 95 then 0 else
(if q.val < 96 then 0 else 1)) else (if q.val < 99 then (if q.val < 98 then 1 else 2) else
3)) else (if q.val < 104 then (if q.val < 102 then 4 else (if q.val < 103 then 4 else 5))
else (if q.val < 106 then (if q.val < 105 then 3 else 4) else 1)))))) else (if q.val <
162 then (if q.val < 135 then (if q.val < 121 then (if q.val < 114 then (if q.val < 111
then (if q.val < 109 then 1 else (if q.val < 110 then 1 else 2)) else (if q.val < 112
then 2 else (if q.val < 113 then 2 else 3))) else (if q.val < 117 then (if q.val <
115 then 3 else (if q.val < 116 then 4 else 3)) else (if q.val < 119 then 2 else
1))) else (if q.val < 128 then (if q.val < 124 then (if q.val < 122 then 1 else
(if q.val < 123 then 1 else 2)) else (if q.val < 126 then 1 else 0)) else 0))
else 0) else (if q.val < 189 then (if q.val < 175 then (if q.val < 168 then
(if q.val < 165 then 0 else (if q.val < 166 then 0 else (if q.val < 167
then 0 else 1))) else (if q.val < 171 then (if q.val < 169 then 1 else
(if q.val < 170 then 2 else 0)) else 0)) else 0) else 0))) else (if
q.val < 324 then (if q.val < 270 then (if q.val < 243 then 0 else
(if q.val < 256 then 0 else (if q.val < 263 then 0 else (if q.val
< 266 then (if q.val < 264 then 0 else 1) else 1)))) else 1)
else (if q.val < 378 then (if q.val < 351 then (if q.val <
337 then (if q.val < 330 then (if q.val < 327 then 1 else
(if q.val < 328 then 1 else 2)) else (if q.val < 333 then
(if q.val < 331 then 2 else (if q.val < 332 then 2 else
3)) else (if q.val < 335 then 2 else (if q.val < 336
then 2 else 3)))) else (if q.val < 344 then 1 else
(if q.val < 347 then 1 else (if q.val < 349 then
(if q.val < 348 then 1 else 3) else 2)))) else
(if q.val < 364 then (if q.val < 357 then (if
q.val < 354 then (if q.val < 352 then 2
else (if q.val < 353 then 2 else 3)) else
2) else (if q.val < 360 then (if q.val
< 358 then 2 else 1) else (if q.val <
362 then (if q.val < 361 then 1
else 2) else 1))) else (if q.val
< 371 then 1 else (if q.val <
374 then 1 else (if q.val <
376 then (if q.val < 375
then 2 else 1) else (if
q.val < 377 then 2 else
3)))))) else (if
q.val < 405 then
(if q.val < 391
then (if q.val
< 384 then
(if q.val <
381 then
(if
q.val
<
379 then 1 else (if q.val < 380 then 1 else 2)) else (if q.val < 382 then 1 else 2)) else (if
q.val < 387 then (if q.val < 385 then 3 else 1) else (if q.val < 389 then 2 else (if q.val < 390
then 2 else 3)))) else (if q.val < 398 then (if q.val < 394 then (if q.val < 392 then 1 else (if
q.val < 393 then 1 else 2)) else (if q.val < 396 then 1 else 2)) else (if q.val < 401 then 1 else
(if q.val < 403 then 2 else 1)))) else (if q.val < 418 then (if q.val < 411 then (if q.val < 408
then 1 else (if q.val < 409 then 1 else (if q.val < 410 then 3 else 2))) else (if q.val < 414 then
(if q.val < 412 then 1 else 3) else (if q.val < 416 then 4 else 1))) else (if q.val < 425 then (if
q.val < 421 then (if q.val < 419 then 1 else (if q.val < 420 then 2 else 3)) else (if q.val < 423
then (if q.val < 422 then 1 else 3) else (if q.val < 424 then 3 else 4))) else (if q.val < 428
then (if q.val < 426 then 2 else (if q.val < 427 then 2 else 1)) else (if q.val < 430 then (if
q.val < 429 then 3 else 1) else 1))))))))
/-- Number of `0`-steps (`1..10`) from tree state `q ∈ {96..431}` to reach a leaf in `49..70`. -/
def zeroDepth (q : Fin 432) : ℕ :=
(if q.val < 216 then (if q.val < 108 then (if q.val < 54 then 0 else (if q.val < 81 then 0 else
(if q.val < 94 then 0 else (if q.val < 101 then (if q.val < 97 then (if q.val < 95 then 0 else
(if q.val < 96 then 0 else 3)) else (if q.val < 99 then (if q.val < 98 then 3 else 2) else
(if q.val < 100 then 1 else 2))) else (if q.val < 104 then (if q.val < 102 then 1 else (if
q.val < 103 then 2 else 1)) else (if q.val < 106 then (if q.val < 105 then 2 else 1) else
(if q.val < 107 then 3 else 2))))))) else (if q.val < 162 then (if q.val < 135 then (if
q.val < 121 then (if q.val < 114 then (if q.val < 111 then (if q.val < 109 then 3
else (if q.val < 110 then 2 else 1)) else (if q.val < 112 then 2 else (if q.val <
113 then 2 else 1))) else (if q.val < 117 then (if q.val < 115 then 2 else (if
q.val < 116 then 1 else 2)) else (if q.val < 119 then (if q.val < 118 then 1
else 2) else (if q.val < 120 then 3 else 2)))) else (if q.val < 128 then (if
q.val < 124 then (if q.val < 122 then 3 else (if q.val < 123 then 2 else
1)) else (if q.val < 126 then 2 else (if q.val < 127 then 3 else 2)))
else (if q.val < 131 then (if q.val < 129 then 2 else 8) else (if q.val
< 133 then (if q.val < 132 then 9 else 6) else 6)))) else (if q.val <
148 then (if q.val < 141 then (if q.val < 138 then (if q.val < 136
then 7 else (if q.val < 137 then 8 else 6)) else (if q.val < 139
then 6 else (if q.val < 140 then 3 else 9))) else (if q.val <
144 then (if q.val < 142 then 6 else (if q.val < 143 then 8
else 7)) else (if q.val < 146 then (if q.val < 145 then 6
else 10) else (if q.val < 147 then 9 else 5)))) else (if
q.val < 155 then (if q.val < 151 then (if q.val < 149
then 4 else (if q.val < 150 then 5 else 2)) else (if
q.val < 153 then (if q.val < 152 then 7 else 5)
else (if q.val < 154 then 6 else 5))) else (if
q.val < 158 then (if q.val < 156 then 6 else
(if q.val < 157 then 5 else 6)) else (if
q.val < 160 then 6 else (if q.val < 161
then 10 else 4)))))) else (if q.val < 189
then (if q.val < 175 then (if q.val <
168 then (if q.val < 165 then (if
q.val < 163 then 6 else (if q.val <
164 then 10 else 3)) else (if
q.val < 166 then 1 else (if
q.val < 167 then 2 else 1)))
else (if q.val < 171 then
(if q.val < 169 then 2
else (if q.val < 170
then 1 else 4)) else
(if q.val < 173
then (if q.val <
172 then 4 else
5) else (if
q.val < 174
then 6
else
2))))
else
(if q.val < 182 then (if q.val < 178 then 2 else (if q.val < 180 then (if q.val < 179 then 4 else