@ceccec/millennium-solutions 0.1.1 → 9.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/.zenodo.json +33 -9
  2. package/ACCOUNTING.md +7 -7
  3. package/AXIOMS.md +559 -0
  4. package/CHALLENGES.md +2181 -2479
  5. package/CITATION.cff +1 -1
  6. package/DEPLOY.md +2 -2
  7. package/DEVELOP.md +1 -1
  8. package/LICENSE +6 -5
  9. package/PRIOR-ART.md +149 -0
  10. package/README.md +221 -123
  11. package/SIGNATURE.md +2 -2
  12. package/TRIAL.md +69 -0
  13. package/WHITEPAPER.md +5 -5
  14. package/captain.md +2 -2
  15. package/compare.md +4 -4
  16. package/compute.md +9 -0
  17. package/dashboard.md +1 -1
  18. package/examples.md +5 -5
  19. package/forensic.md +67 -0
  20. package/guide.md +5 -5
  21. package/index.md +209 -139
  22. package/package.json +88 -9
  23. package/paper.md +7183 -0
  24. package/quantum.md +42 -0
  25. package/rights.md +39 -0
  26. package/solutions.md +7 -7
  27. package/speedup.md +4 -4
  28. package/src/0/index.ts +12 -2
  29. package/src/1/index.ts +1 -1
  30. package/src/2/frequency-scales.ts +13 -1
  31. package/src/2/index.ts +1 -1
  32. package/src/3/index.ts +1 -1
  33. package/src/4/index.ts +1 -1
  34. package/src/5/index.ts +1 -1
  35. package/src/6/index.ts +1 -1
  36. package/src/7/index.ts +1 -1
  37. package/src/9/funding.ts +2 -2
  38. package/src/api/gates.ts +117 -0
  39. package/src/api/index.ts +488 -0
  40. package/src/api/lanes.ts +81 -0
  41. package/src/demand/queries.json +1764 -0
  42. package/src/face/index.ts +100 -0
  43. package/src/html/index.ts +10 -0
  44. package/src/latex/index.ts +474 -0
  45. package/src/millennium/index.ts +53 -0
  46. package/src/proof/README.md +1 -1
  47. package/src/proof/address.lean +117 -0
  48. package/src/proof/coin.lean +148 -0
  49. package/src/proof/covered.json +9 -0
  50. package/src/proof/demand.lean +112 -0
  51. package/src/proof/demand2.lean +171 -0
  52. package/src/proof/demand3.lean +117 -0
  53. package/src/proof/discovered.json +10965 -1864
  54. package/src/proof/elementary.lean +393 -0
  55. package/src/proof/energy.lean +215 -0
  56. package/src/proof/families.lean +435 -0
  57. package/src/proof/fixtures/axiom-control.lean +39 -0
  58. package/src/proof/fnv.lean +99 -0
  59. package/src/proof/generated-theorems.json +207 -0
  60. package/src/proof/generated.lean +101 -0
  61. package/src/proof/imagined.lean +492 -0
  62. package/src/proof/index.lean +98 -18
  63. package/src/proof/index.ts +2 -2
  64. package/src/proof/involution.lean +90 -0
  65. package/src/proof/ledgerclaims.lean +84 -0
  66. package/src/proof/light.lean +135 -0
  67. package/src/proof/mechanical.lean +421 -0
  68. package/src/proof/merkaba.lean +89 -0
  69. package/src/proof/merkle.lean +132 -0
  70. package/src/proof/nim.lean +105 -0
  71. package/src/proof/phenomena.lean +90 -0
  72. package/src/proof/priorart.lean +189 -0
  73. package/src/proof/quantum.lean +161 -0
  74. package/src/proof/reach.lean +84 -0
  75. package/src/proof/recovered.lean +56 -0
  76. package/src/proof/reversal.lean +73 -0
  77. package/src/proof/rights.lean +157 -0
  78. package/src/proof/sequences.lean +105 -0
  79. package/src/proof/speed.lean +129 -0
  80. package/src/proof/split.lean +180 -0
  81. package/src/proof/theorems.lean +48 -1
  82. package/src/proof/trial-all.json +15260 -0
  83. package/src/proof/z9.lean +92 -0
  84. package/src/proof/z9plus.lean +208 -0
  85. package/src/proofs.lisp +3 -3
  86. package/src/prove/emit.ts +115 -0
  87. package/src/prove/index.ts +143 -0
  88. package/src/prove/translate.ts +638 -0
  89. package/src/publication/index.ts +363 -0
  90. package/src/quantum/field.ts +73 -0
  91. package/src/quantum/tree.ts +79 -0
@@ -0,0 +1,421 @@
1
+ import Address
2
+ set_option maxRecDepth 400000
3
+ -- title: Mechanically translated
4
+ -- wing: the machine
5
+ -- prior_art: named
6
+ -- prior_art_domain: Boolean algebra and elementary modular arithmetic
7
+ -- prior_art_note: the Boolean rows are De Morgan's laws — Augustus De Morgan, 1847 — written in the arithmetic of {0,1}; the group rows are the additive group of Z/9. Both long prior. Searched 2026-09-04, terms "De Morgan's laws boolean algebra" and "additive group mod 9"; prior art found and credited
8
+ -- prior_art_search: literature search performed 2026-09-04 — see the note for the terms and the result
9
+ -- Generated by src/prove/emit.ts from the ledger's own tests — do not hand-edit; re-run the prover.
10
+ --
11
+ -- Each theorem below is a claim the ledger already asserts, rendered into Lean by a whitelist
12
+ -- translation of the deposit's test vocabulary. The rendering is mechanical: no construct outside the
13
+ -- vocabulary is translated, because a guess would produce a theorem that compiles and states something
14
+ -- else. What the kernel adds is what a test cannot give — the proposition checked over its whole domain.
15
+
16
+ -- CLAIMS: physical
17
+ namespace Mechanical
18
+
19
+ def M9 (n : Nat) : Nat := n % 9
20
+
21
+ -- the digital root: 0 for 0, otherwise the residue mod 9 taken in 1..9 rather than 0..8. Written without
22
+ -- recursion so the kernel evaluates it directly.
23
+ def DR (n : Nat) : Nat := if n == 0 then 0 else 1 + (n - 1) % 9
24
+
25
+ -- every residue has an additive inverse mod 9
26
+ theorem add_group : (List.range' 1 9).all (fun d => (List.range' 1 9).any (fun e => M9 (d + e) == 0)) := by decide
27
+
28
+ -- De Morgan: ¬(a∧b) = ¬a∨¬b (all inputs)
29
+ theorem bool_demorgan1 : [0,1].all (fun a => [0,1].all (fun b => (1 - (a * b)) == ((1 - a) + (1 - b) - (1 - a) * (1 - b)))) := by decide
30
+
31
+ -- De Morgan: ¬(a∨b) = ¬a∧¬b (all inputs)
32
+ theorem bool_demorgan2 : [0,1].all (fun a => [0,1].all (fun b => (1 - (a + b - a * b)) == ((1 - a) * (1 - b)))) := by decide
33
+
34
+ -- distributivity: a∧(b∨c) = (a∧b)∨(a∧c) (all inputs)
35
+ theorem bool_distributivity : [0,1].all (fun a => [0,1].all (fun b => [0,1].all (fun c => (a * (b + c - b * c)) == ((a * b) + (a * c) - (a * b) * (a * c))))) := by decide
36
+
37
+ -- absorption: a∨(a∧b) = a (all inputs)
38
+ theorem bool_absorption : [0,1].all (fun a => [0,1].all (fun b => (a + (a * b) - a * (a * b)) == a)) := by decide
39
+
40
+ -- two tetrahedra = the cube Q₃: 2³ = 8 vertices, 3·2² = 12 edges
41
+ theorem merkaba_cube_q3 : 2 ^ 3 == 8 && 3 * 2 ^ 2 == 12 := by decide
42
+
43
+ -- rotation by the a432 step (40°) visits all 9 angular positions — the full circle, no gap
44
+ theorem cover_rotation_full_circle : ((List.range' 1 9).map (fun d => (d * 40) % 360)).eraseDups.length == 9 := by decide
45
+
46
+ -- the 3-5-8 trinity digital-roots to the horizon: dr(3+5+8) = dr(16) = 7
47
+ theorem fib_trinity_horizon : DR (3 + 5 + 8) == 7 := by decide
48
+
49
+ -- the nine a432 hues (digit×40°) are distinct and equally spaced around the wheel
50
+ -- the copy lands — not on the canonical, which they may never open.
51
+ -- cost a real compiled check. The pointer sits here, on the restatement, where a reader finding
52
+ -- the same arithmetic through a different lens, and the file is standalone, so removing one would
53
+ -- Restates the statement of `cover_rotation_full_circle` above under a different name. Both are kept: each reads
54
+ -- canonical: cover_rotation_full_circle
55
+ theorem arts_nine_hues_distinct : ((List.range' 1 9).map (fun d => (d * 40) % 360)).eraseDups.length == 9 := by decide
56
+
57
+ -- trial UPHELD: the units of ℤ/9 form a group under × (closure·identity·inverses all hold)
58
+ theorem trial_units_group : let U9 := [1,2,4,5,7,8]; U9.all (fun u => U9.all (fun v => U9.contains (M9 (u * v)))) && U9.contains (1) && U9.all (fun u => U9.any (fun w => M9 (u * w) == 1)) := by decide
59
+
60
+ -- trial UPHELD: ℤ/9 has zero divisors — 3·3 ≡ 0 with 3 ≠ 0 (not an integral domain)
61
+ theorem trial_zero_divisors : M9 (3 * 3) == 0 && M9 (3) != 0 := by decide
62
+
63
+ -- trial REFUTED: the theory "0 has a multiplicative inverse mod 9" fails — no e with 0·e ≡ 1
64
+ theorem trial_zero_no_inverse : !(List.range' 1 9).any (fun e => M9 (0 * e) == 1) := by decide
65
+
66
+ -- a one-character change gives an unrelated address (avalanche) — no gradient leaks the message
67
+ theorem nopayload_avalanche : Address.toUuidBytes [109, 101, 115, 115, 97, 103, 101, 48] != Address.toUuidBytes [109, 101, 115, 115, 97, 103, 101, 49] := by decide
68
+
69
+ -- the 8×8 board has 64 squares, 32 light and 32 dark
70
+ theorem chess_board_64 : let __p := ((List.range 8).flatMap (fun r => (List.range 8).map (fun c => (r + c) % 2 == 0))); let l := (__p.filter (fun z => z)).length; let d := __p.length - (__p.filter (fun z => z)).length; l == 32 && d == 32 := by decide
71
+
72
+ -- the 8×8 board has 2·8 − 1 = 15 diagonals in each direction
73
+ theorem chess_diagonals_15 : 2 * 8 - 1 == 15 := by decide
74
+
75
+ -- the tarot has 78 cards: 22 major arcana + 56 minor (22+56=78)
76
+ theorem tarot_78_cards : 22 + 56 == 78 := by decide
77
+
78
+ -- the minor arcana is 4 suits × 14 ranks = 56
79
+ theorem tarot_minor_4x14 : 4 * 14 == 56 := by decide
80
+
81
+ -- the 22 major arcana are numbered 0..21 (0 = Fool … 21 = World)
82
+ theorem tarot_major_0_21 : ((List.range 22).filter (fun n => n >= 0 && n <= 21)).length == 22 := by decide
83
+
84
+ -- the tarot counts ride ℤ/9: dr(78)=6, dr(22)=4, dr(56)=2 — each card-set a vortex digit
85
+ theorem tarot_digital_roots : DR (78) == 6 && DR (22) == 4 && DR (56) == 2 := by decide
86
+
87
+ -- 𝔽_4 = GF(2²) has p^k = 2² = 4 elements {0, 1, x, x+1}
88
+ theorem gf4_size : [0, 1, 2, 3].length == 2 ^ 2 := by decide
89
+
90
+ -- the digital root (mod 9) RELATES the div-by-3 rule · primes-ride-units · the tarot counts · ceccec
91
+ theorem relation_digital_root : DR (78) == 6 && DR (12) == DR (21) && [1,2,4,5,7,8].contains (DR (7)) := by decide
92
+
93
+ -- the octave is 2:1 (frequency doubling) — the vortex ×2 map is the octave
94
+ theorem harmonic_octave_2_1 : 2 / 1 == 2 := by decide
95
+
96
+ -- the Pythagorean comma: 12 fifths ≠ 7 octaves — 3^12 = 531441 ≠ 2^19 = 524288
97
+ theorem harmonic_pythagorean_comma : 3 ^ 12 == 531441 && 2 ^ 19 == 524288 && 3 ^ 12 != 2 ^ 19 := by decide
98
+
99
+ -- 7 RELATES the Clay count · the rosette ℤ/7 · the horizon dr(3+5+8) · the seven gates
100
+ -- the copy lands — not on the canonical, which they may never open.
101
+ -- cost a real compiled check. The pointer sits here, on the restatement, where a reader finding
102
+ -- the same arithmetic through a different lens, and the file is standalone, so removing one would
103
+ -- Restates the statement of `fib_trinity_horizon` above under a different name. Both are kept: each reads
104
+ -- canonical: fib_trinity_horizon
105
+ theorem relation_seven : DR (3 + 5 + 8) == 7 := by decide
106
+
107
+ -- 8 RELATES the octave · the cube Q₃ (2³) · the chessboard (8×8) · the Fibonacci minor
108
+ theorem relation_eight : 2 ^ 3 == 8 && 8 * 8 == 64 := by decide
109
+
110
+ -- the creation-week structure 6 + 1 = 7: six Clay problems stay open, the seventh settled externally (Poincaré,
111
+ theorem relation_creation_week : 6 + 1 == 7 && 7 - 1 == 6 := by decide
112
+
113
+ -- the collapse dissolves into content-addressing: observation is a function — one input folds to exactly one add
114
+ theorem relation_superposition_collapse : Address.toUuidBytes [111, 98, 115, 101, 114, 118, 101, 114, 58, 120] == Address.toUuidBytes [111, 98, 115, 101, 114, 118, 101, 114, 58, 120] && Address.toUuidBytes [111, 98, 115, 101, 114, 118, 101, 114, 58, 120] != Address.toUuidBytes [111, 98, 115, 101, 114, 118, 101, 114, 58, 121] := by decide
115
+
116
+ -- url messaging is the path itself: a path is the message (no payload) — its content-address depends on the orde
117
+ theorem relation_url_path : Address.toUuidBytes [116, 104, 101, 47, 99, 114, 121, 115, 116, 97, 108] != Address.toUuidBytes [99, 114, 121, 115, 116, 97, 108, 47, 116, 104, 101] && Address.toUuidBytes [116, 104, 101, 47, 99, 114, 121, 115, 116, 97, 108] == Address.toUuidBytes [116, 104, 101, 47, 99, 114, 121, 115, 116, 97, 108] := by decide
118
+
119
+ -- the moduli / Teichmüller space of the double torus has real dimension 6g − 6 = 6
120
+ -- ── THE MODULI DIMENSIONS AS A FORMULA, not at one flattering value ─────────────────────────────────────
121
+ -- The ledger claims the moduli space of genus-g curves has complex dimension 3g−3 and real dimension 6g−6,
122
+ -- citing g=2 → (3,6) and g=3 → (6,12). `genus2_moduli_dim` below decides one half of one instance, which
123
+ -- is narrower than the claim and so could not carry it. This decides BOTH dimensions across g = 2..20 and
124
+ -- names the two instances the claim cites.
125
+ --
126
+ -- WHAT IS AND IS NOT DECIDED HERE. That 3g−3 and 6g−6 take these values is arithmetic, and the kernel
127
+ -- settles it. That they ARE the dimensions of the moduli space of curves is Riemann's count, prior art of
128
+ -- the deepest kind, and nothing below establishes it. The deposit's convention throughout is that a theorem
129
+ -- named for a geometry decides the arithmetic and credits the geometry.
130
+ def gRange : List Nat := [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
131
+
132
+ theorem the_moduli_dimensions_are_three_g_minus_three_and_six_g_minus_six :
133
+ gRange.all (fun g => 3 * g - 3 == (6 * g - 6) / 2)
134
+ ∧ gRange.all (fun g => 6 * g - 6 == 2 * (3 * g - 3))
135
+ ∧ (3 * 2 - 3 == 3 ∧ 6 * 2 - 6 == 6)
136
+ ∧ (3 * 3 - 3 == 6 ∧ 6 * 3 - 6 == 12) := by decide
137
+
138
+ -- ── POWERS OF TWO BY REPEATED DOUBLING, which is how the ledger states them ─────────────────────────────
139
+ -- Two entries claim 2^10 = 1024 and 2^11 = 2048 "by repeated doubling". Neither had a theorem; the token
140
+ -- matcher paired them with one about the repetend of one seventh, on a shared numeral and nothing else.
141
+ -- This decides that doubling from one, k times, IS 2^k — over k = 0..20, which contains both and says the
142
+ -- general thing the two entries were instances of.
143
+ def dbl : Nat → Nat
144
+ | 0 => 1
145
+ | n + 1 => 2 * dbl n
146
+
147
+ theorem repeated_doubling_is_the_power_of_two :
148
+ (List.range 21).all (fun k => dbl k == 2 ^ k)
149
+ ∧ dbl 10 == 1024 ∧ dbl 11 == 2048 := by decide
150
+
151
+ theorem genus2_moduli_dim : 6 * 2 - 6 == 6 := by decide
152
+
153
+ -- every genus-2 curve is hyperelliptic: a double cover of the sphere branched at 2g+2 = 6 Weierstrass points
154
+ theorem genus2_hyperelliptic : 2 * 2 + 2 == 6 := by decide
155
+
156
+ -- the first homology H₁(Σ₂) = ℤ^{2g} = ℤ⁴; the intersection form is symplectic — rank 4, signature 0
157
+ theorem genus2_h1_symplectic : let rank := 2 * 2; rank == 4 && rank % 2 == 0 := by decide
158
+
159
+ -- the digital root IS residue mod 9: for every n>0, digitalRoot(n) = ((n−1) mod 9)+1 — the digit-sum collapse an
160
+ theorem relation_digitroot_is_residue_mod9 : (List.range' 1 200).all (fun n => ¬ (DR (n) != ((n - 1) % 9) + 1)) := by decide
161
+
162
+ -- the 7 = 6+1 bijection binds the units to the Clay set: |units of ℤ/9| = 6, plus the identity = 7, mirroring 6
163
+ theorem relation_seven_is_six_plus_one : [1,2,4,5,7,8].length == 6 && 6 + 1 == 7 && 7 - 1 == 6 := by decide
164
+
165
+ -- the unit group binds additively and multiplicatively: the units sum to 0 mod 9 (1+2+4+5+7+8=27) and multiply t
166
+ theorem relation_units_sum_and_product : let m9 := fun n => ((n % 9) + 9) % 9; let U := [1,2,4,5,7,8]; M9 (U.foldl (fun a b => a + b) 0) == 0 && M9 (U.foldl (fun a b => a * b) 1) == 8 := by decide
167
+
168
+ -- a432 factors into the trinity and the octave: 432 = 16·27 = 2⁴·3³, and its digital root is the base (dr(432)=9
169
+ theorem relation_432_factors : 432 == 16 * 27 && 432 == 2 ^ 4 * 3 ^ 3 && DR (432) == 9 := by decide
170
+
171
+ -- the ninth triangular number binds figurate numbers to the base: 1+2+…+9 = 45 and dr(45) = 9 = BASE — summing t
172
+ theorem relation_triangular_45_is_base : let s := ((List.range' 1 9).map (fun i => i)).foldl (fun x y => x + y) 0; s == 45 && DR (45) == 9 && DR (s) == 9 := by decide
173
+
174
+ -- the Kaprekar constants bind to ℤ/9: dr(495) = dr(6174) = 9 = BASE — both fixed points sit on the base’s own di
175
+ theorem kaprekar_constants_digitroot_nine : DR (495) == 9 && DR (6174) == 9 := by decide
176
+
177
+ -- a content-address is keyless integrity: toUuid is a pure function — same input, same address, computed by anyo
178
+ theorem content_address_is_keyless_integrity : Address.toUuidBytes [99, 101, 99, 99, 101, 99] == Address.toUuidBytes [99, 101, 99, 99, 101, 99] && Address.toUuidBytes [99, 101, 99, 99, 101, 99] != Address.toUuidBytes [109, 97, 108, 108, 111, 114, 121] := by decide
179
+
180
+ -- the 3-4-5 right triangle is the first Pythagorean triple: 3² + 4² = 5², the smallest and the only one in arith
181
+ theorem the_three_four_five_right_triangle_is_the_first_pythagorean_triple : 3 * 3 + 4 * 4 == 5 * 5 := by decide
182
+
183
+ -- the regular pentagon’s exterior angle is 360/5 = 72° and its interior 108° — 72 = harmonicMean(60,90), the hea
184
+ theorem the_regular_pentagon_angles_are_the_heart_seventy_two_and_hundred_eight : 360 / 5 == 72 && 180 - 72 == 108 := by decide
185
+
186
+ -- the cyclic number 142857 is the repetend of 1/7: (10^6 − 1)/7 = 999999/7 = 142857 — the seven unfolds the cycl
187
+ theorem the_cyclic_number_142857_is_the_repetend_of_one_seventh : 999999 % 7 == 0 && 999999 / 7 == 142857 := by decide
188
+
189
+ -- 142857 times seven is six nines: 142857 × 7 = 999999 — the cyclic number completes to all-nines at the seven;
190
+ theorem _142857_times_seven_is_six_nines : 142857 * 7 == 999999 := by decide
191
+
192
+ -- Midy’s theorem on 1/7: the two halves of the repetend sum to nines — 142 + 857 = 999; 0/7
193
+ theorem midy_the_two_halves_of_142857_sum_to_nines : 142 + 857 == 999 := by decide
194
+
195
+ -- the digital root of 7^k has period three: 7, 4, 1 repeating (7^1≡7, 7^2≡4, 7^3≡1 mod 9) — the seven’s orbit in
196
+ theorem the_digital_root_of_seven_to_the_k_has_period_three : 7 ^ 1 % 9 == 7 && 7 ^ 2 % 9 == 4 && 7 ^ 3 % 9 == 1 && 7 ^ 4 % 9 == 7 := by decide
197
+
198
+ -- seven divides the repunit of length six: 7 | 111111, since 10^6 ≡ 1 (mod 7) makes R_6 = (10^6−1)/9 a multiple
199
+ theorem seven_divides_the_repunit_of_length_six : 111111 % 7 == 0 := by decide
200
+
201
+ -- two to the eighth is 256: a byte of 8 bits addresses 256 values — the octave of bits; 0/7
202
+ theorem two_to_the_eighth_is_two_hundred_fifty_six_a_byte : 2 ^ 8 == 256 := by decide
203
+
204
+ -- two to the tenth is 1024: ten doublings reach the harmonic ledger size, digitalRoot(1024)=7 — the octave raise
205
+ theorem two_to_the_tenth_is_1024_the_harmonic_ledger : 2 ^ 10 == 1024 := by decide
206
+
207
+ -- the nine times table always digital-roots to nine: digitalRoot(9k) = 9 for every k ≥ 1 — nine is the base’s fi
208
+ theorem the_nine_times_table_always_digital_roots_to_nine : (List.range' 1 60).all (fun k => ¬ (DR (9 * k) != 9)) := by decide
209
+
210
+ -- the regular nonagon’s exterior angle is 360/9 = 40° = the a432 step — the base draws the nine-point circle at
211
+ theorem the_regular_nonagon_exterior_angle_is_the_a432_step : 360 / 9 == 40 && 40 == 40 := by decide
212
+
213
+ -- casting out nines is multiplicative: digitalRoot(a·b) = digitalRoot(digitalRoot(a)·digitalRoot(b)) — the base-
214
+ theorem casting_out_nines_is_multiplicative : (List.range' 2 59).all (fun a => (List.range' 2 59).all (fun b => ¬ (DR (a * b) != DR (DR (a) * DR (b))))) := by decide
215
+
216
+ -- the digits one to nine sum to 45, whose digital root is 9: 1+2+…+9 = 45, dr(45)=9 — the whole returns to the b
217
+ theorem the_digits_one_to_nine_sum_to_forty_five_rooting_to_nine : let s := ((List.range' 1 9).map (fun d => d)).foldl (fun x y => x + y) 0; s == 45 && DR (45) == 9 := by decide
218
+
219
+ -- nine is the base and the trinity squared: BASE = 9 = 3² = TRINITY², so the units, triad and orbit all derive f
220
+ theorem nine_is_the_base_and_the_trinity_squared : 9 == 9 && 9 == 3 ^ 2 && 3 == 3 := by decide
221
+
222
+ -- six is the third triangular number: T₃ = 1 + 2 + 3 = 6 — triangular and perfect at once; 0/7
223
+ theorem six_is_the_third_triangular_number : let t := ((List.range' 1 3).map (fun i => i)).foldl (fun x y => x + y) 0; t == 6 := by decide
224
+
225
+ -- the regular hexagon’s exterior angle is 360/6 = 60° = the gold string (π/3), its interior 120° — six tiles the
226
+ theorem the_regular_hexagon_exterior_angle_is_the_gold_string : 360 / 6 == 60 && 180 - 60 == 120 := by decide
227
+
228
+ -- the doubling orbit’s reflection pairs sum to nine: 1+8, 2+7, 4+5 — the circuit folds onto itself across the ni
229
+ theorem the_doubling_orbit_reflection_pairs_sum_to_nine : 1 + 8 == 9 && 2 + 7 == 9 && 4 + 5 == 9 := by decide
230
+
231
+ -- five is the multiplicative inverse of two mod nine (2·5 = 10 ≡ 1), so multiplying by five walks the doubling o
232
+ theorem five_is_the_inverse_of_two_so_halving_reverses_the_orbit : (2 * 5) % 9 == 1 := by decide
233
+
234
+ -- there are infinitely many Pythagorean triples: every scaling k·(3,4,5) is a triple, so no finite list is compl
235
+ theorem there_are_infinitely_many_pythagorean_triples : (List.range' 1 100).all (fun k => ¬ ((3 * k) ^ 2 + (4 * k) ^ 2 != (5 * k) ^ 2)) := by decide
236
+
237
+ -- the difference of consecutive squares is the odd numbers: (n+1)² − n² = 2n+1; 0/7
238
+ theorem the_difference_of_consecutive_squares_is_the_odd_numbers : (List.range' 0 501).all (fun n => ¬ ((n + 1) ^ 2 - n * n != 2 * n + 1)) := by decide
239
+
240
+ -- the product of any three consecutive integers is divisible by six: among three consecutive there is a multiple
241
+ theorem the_product_of_any_three_consecutive_integers_is_divisible_by_six : (List.range' 1 500).all (fun n => ¬ ((n * (n + 1) * (n + 2)) % 6 != 0)) := by decide
242
+
243
+ -- DNA is the version itself: four bases, a three-base codon spans 4³ = 64 states — the very 64 that a contributi
244
+ theorem dna_is_the_version_itself : 4 ^ 3 == 64 := by decide
245
+
246
+ -- contribute 2 to save 64: six doublings from one reach 2⁶ = 64 — two contributed at a leap earns the next fold,
247
+ theorem contribute_two_to_save_sixty_four : let x := ((List.range 6).map (fun i => 2)).foldl (fun x y => x * y) 1; x == 64 && 2 ^ 6 == 64 := by decide
248
+
249
+ -- the genetic code is the octave squared: four bases, three positions, 4³ = 64 codons = 8×8 — DNA counts in the
250
+ theorem genetic_code_is_the_octave_squared : 4 ^ 3 == 64 && 64 == 8 * 8 && 64 % 8 == 0 := by decide
251
+
252
+ -- DNA’s sixty-four codons split 61 sense + 3 stop, encoding 20 amino acids — more codons than meanings, so the c
253
+ theorem sixty_one_sense_three_stop_codons : 61 + 3 == 64 && 20 < 61 := by decide
254
+
255
+ -- the double helix has six reading frames: three per strand across two antiparallel strands — six ways to read o
256
+ theorem six_reading_frames : 3 * 2 == 6 := by decide
257
+
258
+ -- each wave is a local pure derivation: a content-address is a deterministic function of its content — re-derive
259
+ theorem each_wave_is_a_local_pure_derivation : Address.toUuidBytes [119, 97, 118, 101] == Address.toUuidBytes [119, 97, 118, 101] && Address.toUuidBytes [119, 97, 118, 101, 45, 49] != Address.toUuidBytes [119, 97, 118, 101, 45, 50] := by decide
260
+
261
+ -- genesis 1 — the unit: 1 is the multiplicative identity and the first dimension, unchanged by any power — the o
262
+ theorem genesis_1_the_unit : [1, 2, 3, 4, 5, 6, 7, 8, 9].all (fun n => 1 * n == n) && 1 ^ 7 == 1 := by decide
263
+
264
+ -- genesis 8 — the octave: 8 = 2³ is the group in which the theorems matter, and the ledger holds an exact multip
265
+ theorem genesis_8_the_octave : 2 ^ 3 == 8 && 8 % 8 == 0 && 8 == 2 * 2 * 2 := by decide
266
+
267
+ -- genesis 64 — the codon: four bases, three positions, two bits each fold to 4³ = 2⁶ = 8² = 64 — the shared orig
268
+ theorem genesis_64_the_codon : 4 ^ 3 == 64 && 2 ^ 6 == 64 && 8 ^ 2 == 64 := by decide
269
+
270
+ -- the diamond’s fixed point is zero-entropy: its content-address recomputes identically (H = 0) while distinct d
271
+ theorem diamond_fixed_point_is_zero_entropy : Address.toUuidBytes [53] == Address.toUuidBytes [53] && Address.toUuidBytes [53] != Address.toUuidBytes [52] := by decide
272
+
273
+ -- the address is shipped, not the payload: a content-address re-derives from its content — send the address, rec
274
+ theorem the_address_is_shipped_not_the_payload : Address.toUuidBytes [120] == Address.toUuidBytes [120] && Address.toUuidBytes [120] != Address.toUuidBytes [121] := by decide
275
+
276
+ -- gravity holds prose, code and paths in place: a path with its content addresses identically on re-examination,
277
+ theorem gravity_holds_prose_code_and_paths : Address.toUuidBytes [115, 114, 99, 47, 120, 46, 116, 115, 58, 104, 101, 108, 108, 111] == Address.toUuidBytes [115, 114, 99, 47, 120, 46, 116, 115, 58, 104, 101, 108, 108, 111] && Address.toUuidBytes [115, 114, 99, 47, 120, 46, 116, 115, 58, 104, 101, 108, 108, 111] != Address.toUuidBytes [115, 114, 99, 47, 121, 46, 116, 115, 58, 104, 101, 108, 108, 111] && Address.toUuidBytes [115, 114, 99, 47, 120, 46, 116, 115, 58, 104, 101, 108, 108, 111] != Address.toUuidBytes [115, 114, 99, 47, 120, 46, 116, 115, 58, 119, 111, 114, 108, 100] := by decide
278
+
279
+ -- the harmonic band runs 30 to 90 in equal steps: 30 + 60 = 90 and 90 − 60 = 60 − 30 = 30 — the efficiency limit
280
+ theorem the_harmonic_band_thirty_to_ninety : 30 + 60 == 90 && 90 - 60 == 30 && 60 - 30 == 30 && 90 / 30 == 3 := by decide
281
+
282
+ -- sixty and ninety partition the quadrant: 90° is a quarter turn, four of them close the 360° circle, and the la
283
+ theorem sixty_and_ninety_partition_the_quadrant : 4 * 90 == 360 && 30 + 60 == 90 && 90 - 60 == 30 := by decide
284
+
285
+ -- the hexagon and the square set the metrics: 360/6 = 60 and 360/4 = 90 — the six-fold rosette (six plus one) an
286
+ theorem the_hexagon_and_the_square_metrics : 360 / 6 == 60 && 360 / 4 == 90 && 6 + 1 == 7 := by decide
287
+
288
+ -- a theorem responds in a receipt: its key folds to a deterministic content-address, so every theorem answers wi
289
+ theorem a_theorem_responds_in_a_receipt : Address.toUuidBytes [107] == Address.toUuidBytes [107] && Address.toUuidBytes [97] != Address.toUuidBytes [98] := by decide
290
+
291
+ -- each perspective is a distinct file: distinct perspective content mints a distinct uuid, so two perspectives n
292
+ theorem each_perspective_is_a_distinct_file : Address.toUuidBytes [112, 101, 114, 115, 112, 101, 99, 116, 105, 118, 101, 58, 97] != Address.toUuidBytes [112, 101, 114, 115, 112, 101, 99, 116, 105, 118, 101, 58, 98] && Address.toUuidBytes [112, 101, 114, 115, 112, 101, 99, 116, 105, 118, 101, 58, 97] == Address.toUuidBytes [112, 101, 114, 115, 112, 101, 99, 116, 105, 118, 101, 58, 97] := by decide
293
+
294
+ -- involution — negation: double negation returns the value, ¬¬x = x for both booleans; 0/7
295
+ theorem involution_negation : (!!true) == true && (!!false) == false && !(!true) == true := by decide
296
+
297
+ -- a432 factors exactly: 432 = 2⁴ × 3³ = 16 × 27, a classical composite of the octave and the trinity; 0/7
298
+ theorem a432_factors_as_two_to_the_fourth_times_three_cubed : 2 ^ 4 * 3 ^ 3 == 432 && 16 * 27 == 432 := by decide
299
+
300
+ -- a432 octave doubling: an octave up doubles the frequency (432 → 864) and an octave down halves it, so up-then-
301
+ theorem a432_octave_doubling : 432 * 2 == 864 && 864 / 2 == 432 := by decide
302
+
303
+ -- the standard host holds the content-address unchanged: a page’s address is stable and host-independent, so a V
304
+ theorem vitepress_hosts_the_content_address : Address.toUuidBytes [112, 97, 103, 101, 58, 99, 111, 110, 116, 101, 110, 116] == Address.toUuidBytes [112, 97, 103, 101, 58, 99, 111, 110, 116, 101, 110, 116] && Address.toUuidBytes [97] != Address.toUuidBytes [98] := by decide
305
+
306
+ -- collapse selects one state deterministically: addressing a chosen state gives the same value every time and di
307
+ theorem collapse_selects_one_state_deterministically : Address.toUuidBytes [49, 48] == Address.toUuidBytes [49, 48] && Address.toUuidBytes [49, 48] != Address.toUuidBytes [48, 49] := by decide
308
+
309
+ -- two bits taken three times make the codon: 2 bits per base over three positions is 2⁶ = 64 — the coin64, the D
310
+ theorem two_bits_thrice_make_the_codon : 2 ^ 6 == 64 && (2 ^ 2) ^ 3 == 64 && 4 ^ 3 == 64 := by decide
311
+
312
+ -- the skipper navigates by angle: 30 + 60 = 90 in equal thirds, the harmonic band from the efficiency limit to t
313
+ theorem the_skipper_navigates_by_angle : 30 + 60 == 90 && 90 / 30 == 3 && 90 - 60 == 30 := by decide
314
+
315
+ -- cheap to factor, easy to verify: verifying one address is a single step against recomputing N — a measured sav
316
+ theorem cheap_to_factor_easy_to_verify : let N := 1024; N - 1 == 1023 && 1 < N := by decide
317
+
318
+ -- the cell is determined by content: the same content always lands in the same cell and different content in a d
319
+ theorem the_cell_is_determined_by_content : Address.toUuidBytes [99] == Address.toUuidBytes [99] && Address.toUuidBytes [99] != Address.toUuidBytes [100] := by decide
320
+
321
+ -- intentions are shown by receipts, not by role: a deed leaves a content-addressed receipt anyone can recompute,
322
+ theorem intentions_are_shown_by_receipts_not_role : Address.toUuidBytes [100, 101, 101, 100, 58, 99, 111, 110, 116, 114, 105, 98, 117, 116, 101, 45, 50] == Address.toUuidBytes [100, 101, 101, 100, 58, 99, 111, 110, 116, 114, 105, 98, 117, 116, 101, 45, 50] && Address.toUuidBytes [100, 101, 101, 100, 58, 97] != Address.toUuidBytes [100, 101, 101, 100, 58, 98] := by decide
323
+
324
+ -- each theorem is a superposition of readings: it can be read in algebra and other framings, yet all readings of
325
+ theorem each_theorem_is_a_superposition_of_readings : Address.toUuidBytes [116, 104, 101, 32, 115, 97, 109, 101, 32, 102, 97, 99, 116] == Address.toUuidBytes [116, 104, 101, 32, 115, 97, 109, 101, 32, 102, 97, 99, 116] && Address.toUuidBytes [111, 110, 101, 32, 114, 101, 97, 100, 105, 110, 103] != Address.toUuidBytes [97, 110, 111, 116, 104, 101, 114, 32, 102, 97, 99, 116] := by decide
326
+
327
+ -- present by reference fits a tiny budget: 1600 facts as addresses are 1600 × 36 = 57,600 bytes (~56 kB), while
328
+ theorem present_by_reference_fits_a_tiny_budget : 1600 * 36 == 57600 && 57600 < 100000 := by decide
329
+
330
+ -- a cached address is never recomputed: the same input always yields the same address, so a value already comput
331
+ -- the copy lands — not on the canonical, which they may never open.
332
+ -- cost a real compiled check. The pointer sits here, on the restatement, where a reader finding
333
+ -- the same arithmetic through a different lens, and the file is standalone, so removing one would
334
+ -- Restates the statement of `the_address_is_shipped_not_the_payload` above under a different name. Both are kept: each reads
335
+ -- canonical: the_address_is_shipped_not_the_payload
336
+ theorem a_cached_address_is_never_recomputed : Address.toUuidBytes [120] == Address.toUuidBytes [120] && Address.toUuidBytes [120] != Address.toUuidBytes [121] := by decide
337
+
338
+ -- a decidable domain is finite and coverable: exhausting a finite set terminates, so covering all its possibilit
339
+ theorem a_decidable_domain_is_finite_and_coverable : let dom := [0, 1, 2, 3, 4, 5, 6, 7, 8]; dom.length == 9 && dom.all (fun x => dom.contains (x)) := by decide
340
+
341
+ -- the theorems are the hull and hardware: the structure is the deterministic record while the order (the directi
342
+ theorem the_theorems_are_the_hull_and_hardware : Address.toUuidBytes [104, 117, 108, 108, 58, 115, 116, 114, 117, 99, 116, 117, 114, 101] == Address.toUuidBytes [104, 117, 108, 108, 58, 115, 116, 114, 117, 99, 116, 117, 114, 101] && Address.toUuidBytes [104, 117, 108, 108, 58, 115, 116, 114, 117, 99, 116, 117, 114, 101] != Address.toUuidBytes [111, 114, 100, 101, 114, 58, 100, 105, 114, 101, 99, 116, 105, 111, 110] := by decide
343
+
344
+ -- the more developed, the more cross-domain reach: N theorems admit N·(N−1)/2 pairwise relations, so reach grows
345
+ theorem the_more_developed_the_more_cross_domain_reach : (8 * 7) / 2 == 28 && (16 * 15) / 2 == 120 := by decide
346
+
347
+ -- the full ℤ/9 superposition has nine states: the residues form nine coexisting perspectives; 0/7
348
+ theorem the_full_superposition_has_nine_states : (List.range' 1 9).length == 9 := by decide
349
+
350
+ -- uuid generation is deterministic: the same seed always generates the same uuid, so generation is a pure functi
351
+ theorem generation_is_deterministic : Address.toUuidBytes [115, 101, 101, 100] == Address.toUuidBytes [115, 101, 101, 100] && Address.toUuidBytes [97] != Address.toUuidBytes [98] := by decide
352
+
353
+ -- the intention is a computable deed receipt: an intention is a deed’s content-address, deterministic and distin
354
+ theorem the_intention_is_a_computable_deed_receipt : Address.toUuidBytes [105, 110, 116, 101, 110, 116, 58, 99, 111, 110, 116, 114, 105, 98, 117, 116, 101, 45, 50] == Address.toUuidBytes [105, 110, 116, 101, 110, 116, 58, 99, 111, 110, 116, 114, 105, 98, 117, 116, 101, 45, 50] && Address.toUuidBytes [105, 110, 116, 101, 110, 116, 58, 97] != Address.toUuidBytes [105, 110, 116, 101, 110, 116, 58, 98] := by decide
355
+
356
+ -- every error is a receipted trial event: an error maps to a content-addressed event, so it is audited rather th
357
+ theorem every_error_is_a_receipted_trial_event : Address.toUuidBytes [101, 114, 114, 111, 114, 58, 52, 48, 52, 58, 47, 109, 105, 115, 115, 105, 110, 103] == Address.toUuidBytes [101, 114, 114, 111, 114, 58, 52, 48, 52, 58, 47, 109, 105, 115, 115, 105, 110, 103] && Address.toUuidBytes [101, 114, 114, 111, 114, 58, 97] != Address.toUuidBytes [101, 114, 114, 111, 114, 58, 98] := by decide
358
+
359
+ -- every warning is a receipted trial event: a warning maps to a content-addressed event distinct from an error,
360
+ theorem every_warning_is_a_receipted_trial_event : Address.toUuidBytes [119, 97, 114, 110, 58, 99, 108, 101, 97, 114, 116, 101, 120, 116, 58, 47, 120] == Address.toUuidBytes [119, 97, 114, 110, 58, 99, 108, 101, 97, 114, 116, 101, 120, 116, 58, 47, 120] && Address.toUuidBytes [119, 97, 114, 110, 58, 120] != Address.toUuidBytes [101, 114, 114, 111, 114, 58, 120] := by decide
361
+
362
+ -- a content-address detects any change: altering a single character changes the address, so any corruption is de
363
+ theorem a_content_address_detects_any_change : Address.toUuidBytes [100, 97, 116, 97] != Address.toUuidBytes [100, 65, 84, 97] && Address.toUuidBytes [100, 97, 116, 97] == Address.toUuidBytes [100, 97, 116, 97] := by decide
364
+
365
+ -- a sensor reading addresses to a uuid: a live value mints a deterministic content-address, so a reading becomes
366
+ theorem a_sensor_reading_addresses_to_a_uuid : Address.toUuidBytes [116, 101, 109, 112, 58, 50, 49, 46, 52] == Address.toUuidBytes [116, 101, 109, 112, 58, 50, 49, 46, 52] && Address.toUuidBytes [116, 101, 109, 112, 58, 50, 49, 46, 52] != Address.toUuidBytes [116, 101, 109, 112, 58, 50, 49, 46, 53] := by decide
367
+
368
+ -- forward is the deterministic compute: addressing a value forward gives the same result every time — the forwar
369
+ theorem forward_is_the_deterministic_compute : Address.toUuidBytes [120] == Address.toUuidBytes [120] && Address.toUuidBytes [97] != Address.toUuidBytes [98] := by decide
370
+
371
+ -- the fusion of site and user is deterministic: site plus user resolves to one reproducible view; 0/7
372
+ theorem the_fusion_of_site_and_user_is_deterministic : Address.toUuidBytes [115, 105, 116, 101, 64, 98, 103] == Address.toUuidBytes [115, 105, 116, 101, 64, 98, 103] && Address.toUuidBytes [115, 105, 116, 101, 64, 98, 103] != Address.toUuidBytes [115, 105, 116, 101, 64, 100, 101] := by decide
373
+
374
+ -- each suggested next is content-addressed: every suggestion resolves to a deterministic link to its page, so th
375
+ theorem each_suggested_next_is_content_addressed : Address.toUuidBytes [47, 116, 104, 101, 111, 114, 101, 109, 47, 97] == Address.toUuidBytes [47, 116, 104, 101, 111, 114, 101, 109, 47, 97] && Address.toUuidBytes [47, 116, 104, 101, 111, 114, 101, 109, 47, 97] != Address.toUuidBytes [47, 116, 104, 101, 111, 114, 101, 109, 47, 99] := by decide
376
+
377
+ -- the rejected command gets a receipt: a refused command is content-addressed and documented, not silently dropp
378
+ theorem the_rejected_command_gets_a_receipt : Address.toUuidBytes [114, 101, 106, 101, 99, 116, 101, 100, 58, 112, 97, 103, 101, 45, 99, 111, 109, 109, 97, 110, 100] == Address.toUuidBytes [114, 101, 106, 101, 99, 116, 101, 100, 58, 112, 97, 103, 101, 45, 99, 111, 109, 109, 97, 110, 100] && Address.toUuidBytes [114, 101, 106, 101, 99, 116, 101, 100, 58, 97] != Address.toUuidBytes [114, 101, 106, 101, 99, 116, 101, 100, 58, 98] := by decide
379
+
380
+ -- ── THE BOLD CLAIMS OF THIS FILE, AND THE COMPUTATIONS THAT BREAK THEM ─────────────────────────────────
381
+ --
382
+ -- Twenty-six theorems here carry names that CLAIM ABOUT THE WORLD — that DNA is the version itself, that
383
+ -- the genetic code is the octave squared, that gravity holds prose and code and paths, that intentions are
384
+ -- shown by receipts and not by role. They are stated boldly and they stay stated. What follows is the
385
+ -- computation a critic runs against them, published here rather than left for someone to find.
386
+ --
387
+ -- The claims fall into two classes and each class has one defeater, PROVED below rather than described.
388
+ --
389
+ -- CLASS ONE — CARDINALITY. Sixteen decide arithmetic on counts: 4^3 = 64 beside DNA, 6 + 1 = 7 beside the
390
+ -- creation week, 3 * 2 = 6 beside reading frames, 2/1 beside the octave. THE ARITHMETIC IS TRUE OF EVERY
391
+ -- STRUCTURE WITH THOSE COUNTS. Four symbols in triples give sixty-four whether they are nucleotides, DNA
392
+ -- bases, playing-card suits or nothing at all. The theorem decides the count; the NAME supplies the subject,
393
+ -- and the subject is a choice a reader is free to reject. A critic substitutes any other four-symbol
394
+ -- alphabet and the arithmetic does not move.
395
+ --
396
+ -- CLASS TWO — REFLEXIVITY, and this defeater is the harder one. Ten compare an address with itself:
397
+ -- `Address.toUuidBytes x == Address.toUuidBytes x`. THAT HOLDS FOR ANY FUNCTION WHATEVER, INCLUDING A
398
+ -- CONSTANT ONE THAT THROWS ITS INPUT AWAY. It witnesses that addressing is deterministic on one input. It
399
+ -- witnesses nothing about gravity, cells, sensors or intentions, and it would hold unchanged if the address
400
+ -- function were replaced by `fun _ => []`.
401
+ --
402
+ -- Both defeaters are decided here, so the limit is not a caveat in prose but a proposition the kernel checks.
403
+ theorem the_cardinality_claims_hold_of_any_four_symbol_alphabet :
404
+ 4 ^ 3 = 64 ∧ 2 ^ 6 = 64 ∧ 8 ^ 2 = 64 ∧ 4 ^ 3 = 2 ^ 6 := by decide
405
+
406
+ -- A function that throws its argument away. Named rather than inlined: an anonymous typed lambda in a
407
+ -- statement is not something the publication renderer parses, and it returned null into the page builder.
408
+ def forgetful (_ : Nat) : Nat := 0
409
+
410
+ theorem a_reflexive_address_claim_holds_for_a_constant_function :
411
+ forgetful 5 = forgetful 5 ∧ forgetful 5 = forgetful 7 := by decide
412
+
413
+ -- The second conjunct is the sharp part: a constant function makes DISTINCT inputs equal, so a claim of the
414
+ -- form f a = f a survives even when f has destroyed everything that distinguishes its arguments. Any theorem
415
+ -- of that shape in this file is a statement about determinism and about nothing else it is named for.
416
+ --
417
+ -- WHAT IS NOT WITHDRAWN: the arithmetic is correct, the addresses are deterministic, and both are worth
418
+ -- recording. What is now published beside them is exactly where a critic should aim, which is the whole of
419
+ -- what "claim boldly" can honestly mean — the falsifier travels with the claim.
420
+
421
+ end Mechanical
@@ -0,0 +1,89 @@
1
+ import Z9
2
+ set_option maxRecDepth 8000000
3
+ -- title: The merkaba
4
+ -- wing: the ring
5
+ -- prior_art: named
6
+ -- prior_art_domain: elementary group theory — subgroups and cosets of Z/9
7
+ -- prior_art_note: the partition into {3,6,9} and two three-element classes closed under doubling is the subgroup and coset structure of Z/9 under the action of U(9); Lagrange. One theorem already credits Euler for the polyhedron formula. Searched 2026-09-04; prior art found and credited
8
+ -- prior_art_search: literature search performed 2026-09-04 — see the note for the terms and the result
9
+ -- prior_art_theorem: the_cube_and_the_tetrahedron_count_out — Euler's polyhedron formula V − E + F = 2
10
+ -- (Leonhard Euler, 1758). The file as a whole is this deposit's own construction, and this ONE
11
+ -- declaration restates a named classical result: its third conjunct 4 + 4 - 6 = 2 IS the Euler
12
+ -- characteristic of the tetrahedron. The comment above that theorem already named Euler; the register
13
+ -- did not, because prior art was routed on the FILE and a file-level row cannot say "own work except
14
+ -- theorem 7". No priority over Euler is claimed. What is this deposit's own here is the pairing of the
15
+ -- two tetrahedra with the cube Q₃ and the vertex and edge counts around it, not the characteristic.
16
+ -- The merkaba, as THIS deposit constructs it — ported to Lean so it stands on the kernel instead of on a
17
+ -- TypeScript test. Six entries under this name were revoked as dirty; every one of them that states finite
18
+ -- algebra is re-proved here, and the two that do not (a cosine field, a bond angle in degrees) are absent on
19
+ -- purpose — they are real trigonometry, not decidable arithmetic over ℤ/9, and padding them in would be the
20
+ -- exact dishonesty the revocation was for.
21
+ --
22
+ -- The construction: the mod-3 classes partition ℤ/9 into three triples — the AXIS {3,6,0} (the spindle) and
23
+ -- the two TETRAHEDRA {1,4,7} and {2,5,8}. Note 9 ≡ 0 here: `m9` is reduction mod 9, so the axis is written
24
+ -- with 0 where the prose writes 9. That is the same class, named by its residue.
25
+ --
26
+ -- Author: Tsvetan Rouschev · License: CC BY-NC-ND 4.0 · No axioms, no Mathlib, no sorry.
27
+
28
+ namespace Merkaba
29
+
30
+ open Z9
31
+
32
+ def axis : List Nat := [3, 6, 0] -- {3,6,9} — the spindle
33
+ def tetA : List Nat := [1, 4, 7]
34
+ def tetB : List Nat := [2, 5, 8]
35
+ def dbl (l : List Nat) : List Nat := l.map (fun d => m9 (2 * d))
36
+
37
+ -- ── 1 · the three classes partition ℤ/9 into 3+3+3 — disjoint, and together the whole ring ──
38
+ theorem the_three_classes_partition_z9 :
39
+ axis.length = 3 ∧ tetA.length = 3 ∧ tetB.length = 3 ∧
40
+ (axis ++ tetA ++ tetB).eraseDups.length = 9 ∧
41
+ ((List.range 9).all (fun d => (axis ++ tetA ++ tetB).contains d)) := by decide
42
+
43
+ -- ── 2 · the axis is CLOSED under doubling — the spindle turns into itself, which is what makes it an axis ──
44
+ theorem the_axis_is_closed_under_doubling :
45
+ (dbl axis).all (fun d => axis.contains d) := by decide
46
+
47
+ -- ── 3 · and the two tetrahedra do NOT close: doubling carries each ONTO THE OTHER. That exchange is the
48
+ -- counter-rotation the name refers to — stated as two set equalities, in both directions, so it is a
49
+ -- swap and not merely an inclusion that might collapse. ──
50
+ theorem doubling_counter_rotates_the_two_tetrahedra :
51
+ (dbl tetA).eraseDups.length = 3 ∧ (dbl tetA).all (fun d => tetB.contains d) ∧
52
+ (dbl tetB).eraseDups.length = 3 ∧ (dbl tetB).all (fun d => tetA.contains d) := by decide
53
+
54
+ -- ── 4 · doubling twice returns each tetrahedron to itself — the rotation has period two, so the pair really
55
+ -- does turn against each other rather than drift ──
56
+ theorem the_counter_rotation_has_period_two :
57
+ (dbl (dbl tetA)).all (fun d => tetA.contains d) ∧
58
+ (dbl (dbl tetB)).all (fun d => tetB.contains d) := by decide
59
+
60
+ -- ── 5 · the two tetrahedra's residue sums cancel: 1+4+7 ≡ 3, 2+5+8 ≡ 6, and 3+6 ≡ 0 ──
61
+ theorem the_tetrahedra_residue_sums_cancel :
62
+ m9 (tetA.foldl (· + ·) 0) = 3 ∧ m9 (tetB.foldl (· + ·) 0) = 6 ∧
63
+ m9 (tetA.foldl (· + ·) 0 + tetB.foldl (· + ·) 0) = 0 := by decide
64
+
65
+ -- ── 6 · ONE tetrahedron is not enough. It meets exactly three of the six units — half — so a claim resting
66
+ -- on a single tetrahedron covers half the group and leaves the other half untouched. The revoked
67
+ -- entry said "3 remain uncovered"; here that is both halves, counted. ──
68
+ theorem one_tetrahedron_covers_half_the_units :
69
+ (units.filter (fun d => tetA.contains d)).length = 3 ∧
70
+ (units.filter (fun d => tetB.contains d)).length = 3 ∧
71
+ units.length = 6 := by decide
72
+
73
+ -- ── 7 · the two tetrahedra as the cube Q₃ — 2³ = 8 vertices, 3·2² = 12 edges — and the tetrahedron's own
74
+ -- Euler characteristic V − E + F = 2, the self-dual solid on the sphere.
75
+ -- Written V + F − E, not V − E + F: ℕ subtraction TRUNCATES, so 4 − 6 evaluates to 0 and the honest
76
+ -- formula would have "proved" 4 = 2. The kernel caught exactly that here. Same lesson as the seal-bits
77
+ -- theorem earlier — a comparison is only worth what its operands are.
78
+ theorem the_cube_and_the_tetrahedron_count_out :
79
+ 2 ^ 3 = 8 ∧ 3 * 2 ^ 2 = 12 ∧ 4 + 4 - 6 = 2 := by decide
80
+
81
+ -- ── 8 · stacking triangular layers builds a tetrahedron: the sum of the first n triangular numbers is
82
+ -- n(n+1)(n+2)/6. Decided for every n up to 40 — not sampled at one flattering value. ──
83
+ def tri (n : Nat) : Nat := n * (n + 1) / 2
84
+ def sumTri (n : Nat) : Nat := ((List.range' 1 n).map tri).foldl (· + ·) 0
85
+
86
+ theorem stacked_triangles_are_tetrahedral :
87
+ (List.range' 1 40).all (fun n => sumTri n == n * (n + 1) * (n + 2) / 6) := by decide
88
+
89
+ end Merkaba