@ceccec/millennium-solutions 9.0.8 → 9.1.0
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.
- package/AXIOMS.md +18 -5
- package/CHALLENGES.md +57 -31
- package/README.md +14 -14
- package/forensic.md +7 -7
- package/index.md +14 -14
- package/package.json +1 -1
- package/paper.md +195 -186
- package/src/proof/coin.lean +5 -1
- package/src/proof/discovered.json +191 -24
- package/src/proof/energy.lean +125 -76
- package/src/proof/light.lean +4 -1
- package/src/proof/reach.lean +6 -5
- package/src/proof/speed.lean +27 -9
- package/src/proof/split.lean +20 -9
- package/src/proof/trial-all.json +144 -0
package/src/proof/energy.lean
CHANGED
|
@@ -15,6 +15,11 @@ set_option maxRecDepth 8000000
|
|
|
15
15
|
-- shape of this claim: the physics is why the constants sit where they do; the theorem is that the books do
|
|
16
16
|
-- not balance the way a free-energy loop needs them to.
|
|
17
17
|
--
|
|
18
|
+
-- EVERY READING IS AN INSTANCE OF A LAW (2026-09-14). Each theorem that only read a typed input back — a
|
|
19
|
+
-- certificate, not a proof — is restated as a law with its inverse, decided over a whole domain, with the
|
|
20
|
+
-- published figure as one instance of it: a percentage and its reciprocal multiply back to the whole, a part
|
|
21
|
+
-- and its rest read back the whole, splitting then burning is the identity, a volume returns its moles.
|
|
22
|
+
--
|
|
18
23
|
-- Units are watt-hours throughout, per kilogram of hydrogen, so nothing hides in a unit conversion — which is
|
|
19
24
|
-- exactly the mistake the kernel caught twice in this deposit already.
|
|
20
25
|
--
|
|
@@ -28,11 +33,15 @@ def burnYield : Nat := 12000 -- Wh recovered burning it at ~35% engine efficie
|
|
|
28
33
|
def waterOut : Nat := 9 -- litres: 1 kg H₂ + 8 kg O₂ → 9 kg H₂O, the whole point of the exhaust
|
|
29
34
|
def roPerLitre : Nat := 4 -- Wh/litre for reverse osmosis, the ordinary way to clean a litre of water
|
|
30
35
|
|
|
31
|
-
--
|
|
32
|
-
|
|
36
|
+
-- A reading as a whole percentage, floor division — the one function every ratio below goes through.
|
|
37
|
+
def pct (part whole : Nat) : Nat := part * 100 / whole
|
|
38
|
+
|
|
39
|
+
-- ── 1 · THE LOOP RETURNS LESS THAN IT TOOK. Not a little less — under a quarter. The law: any yield below its
|
|
40
|
+
-- cost reads under the whole, at every cost and yield checked; the loop's 23% is one instance. It is a
|
|
33
41
|
-- load, not a source, and the gap is where the "free energy" would have had to come from. ──
|
|
34
|
-
theorem
|
|
35
|
-
|
|
42
|
+
theorem any_yield_below_its_cost_reads_under_the_whole :
|
|
43
|
+
(List.range' 1 60).all (fun c => (List.range c).all (fun y => pct y c < 100)) ∧
|
|
44
|
+
burnYield < splitCost ∧ pct burnYield splitCost = 23 := by decide
|
|
36
45
|
|
|
37
46
|
-- ── 2 · AND NO CHAIN OF STAGES FIXES IT. Every stage is a fraction of what entered it, and a product of
|
|
38
47
|
-- fractions is never larger than either one. Decided over every pair of whole percentages, both
|
|
@@ -42,11 +51,12 @@ theorem a_chain_of_efficiencies_can_only_lose :
|
|
|
42
51
|
(List.range 101).all (fun a => (List.range 101).all (fun b =>
|
|
43
52
|
a * b ≤ 100 * a && a * b ≤ 100 * b)) := by decide
|
|
44
53
|
|
|
45
|
-
-- ── 3 · AS A PURIFIER IT IS BEATEN BY A THOUSANDFOLD.
|
|
46
|
-
-- the
|
|
47
|
-
--
|
|
48
|
-
--
|
|
49
|
-
theorem
|
|
54
|
+
-- ── 3 · AS A PURIFIER IT IS BEATEN BY A THOUSANDFOLD. The cost per litre is a floor division, and multiplying
|
|
55
|
+
-- it back returns the cost within one litre's worth — at every litre count up to twenty, so the 5777 Wh
|
|
56
|
+
-- per litre is the law's instance at nine litres, recovered and not typed. Against reverse osmosis that
|
|
57
|
+
-- is more than a thousand times the spend for the same clean water. ──
|
|
58
|
+
theorem the_cost_per_litre_multiplies_back_to_the_cost :
|
|
59
|
+
(List.range' 1 20).all (fun l => (splitCost / l) * l ≤ splitCost && splitCost < (splitCost / l + 1) * l) ∧
|
|
50
60
|
splitCost / waterOut = 5777 ∧ splitCost / waterOut > roPerLitre * 1000 := by decide
|
|
51
61
|
|
|
52
62
|
-- ── THE STOICHIOMETRY ─────────────────────────────────────────────────────────────────────────────────────
|
|
@@ -58,6 +68,11 @@ def mgH2 : Nat := 2016 -- H₂ = 2 × 1.008 g/mol
|
|
|
58
68
|
def mgO2 : Nat := 31998 -- O₂ = 2 × 15.999 g/mol
|
|
59
69
|
def mgH2O : Nat := 18015 -- H₂O = 18.015 g/mol
|
|
60
70
|
|
|
71
|
+
-- The mass of a molecule from its atoms: h hydrogens and o oxygens, mg per mole.
|
|
72
|
+
def mgH : Nat := 1008
|
|
73
|
+
def mgO : Nat := 15999
|
|
74
|
+
def mass (h o : Nat) : Nat := h * mgH + o * mgO
|
|
75
|
+
|
|
61
76
|
-- ── 4 · WHERE THE TWO-TO-ONE COMES FROM. Write the equation with unknown coefficients, a H₂O → b H₂ + c O₂,
|
|
62
77
|
-- and ask which whole numbers balance BOTH elements: hydrogen needs 2a = 2b, oxygen needs a = 2c. The
|
|
63
78
|
-- naive one-to-one-to-one satisfies hydrogen and FAILS oxygen — which is the whole reason the ratio is
|
|
@@ -74,10 +89,15 @@ theorem the_two_to_one_is_forced_by_the_oxygen :
|
|
|
74
89
|
(List.range' 1 9).filter (fun c => balances a b c)))).length = 4) ∧
|
|
75
90
|
balances 4 4 2 = true ∧ balances 6 6 3 = true ∧ balances 8 8 4 = true := by decide
|
|
76
91
|
|
|
77
|
-
-- ── 5 ·
|
|
78
|
-
--
|
|
79
|
-
|
|
80
|
-
|
|
92
|
+
-- ── 5 · AND IT BALANCES BY MASS BECAUSE IT BALANCES BY ATOMS. The three molar masses are the atom table read
|
|
93
|
+
-- through `mass`, and at every coefficient triple up to nine the equation balances by mass exactly when
|
|
94
|
+
-- it balances by atoms — so the mass balance of 2 H₂O = 2 H₂ + O₂ is the law's instance, exact in
|
|
95
|
+
-- integers, not a sum typed beside the masses. ──
|
|
96
|
+
theorem the_mass_balance_is_the_atom_balance :
|
|
97
|
+
mgH2 = mass 2 0 ∧ mgO2 = mass 0 2 ∧ mgH2O = mass 2 1 ∧
|
|
98
|
+
(List.range' 1 9).all (fun a => (List.range' 1 9).all (fun b => (List.range' 1 9).all (fun c =>
|
|
99
|
+
(a * mass 2 1 == b * mass 2 0 + c * mass 0 2) == balances a b c))) ∧
|
|
100
|
+
2 * mgH2O = 2 * mgH2 + mgO2 := by decide
|
|
81
101
|
|
|
82
102
|
-- ── AND BY ATOM COUNT, WHICH IS A DIFFERENT CHECK AND WAS ONCE A WORSE THEOREM ──────────────────────────
|
|
83
103
|
-- `the_equation_balances_by_atom_count` stood here and was deleted. Its statement was
|
|
@@ -86,15 +106,17 @@ theorem the_equation_balances_by_mass :
|
|
|
86
106
|
-- unbalanced equation; it was a chemistry name over a tautology, and its ledger key stays withdrawn.
|
|
87
107
|
--
|
|
88
108
|
-- A balance is a claim about a TABLE, so the table is here: each species as (hydrogen, oxygen) per
|
|
89
|
-
-- molecule
|
|
90
|
-
--
|
|
109
|
+
-- molecule. Its successor read the table at the one triple (2, 2, 1); this one reads it at EVERY triple up
|
|
110
|
+
-- to nine and shows the table decides exactly the triples `balances` accepts — the table and the equation
|
|
111
|
+
-- are one statement read two ways. Change a formula and the kernel refuses.
|
|
91
112
|
def atomsH2 : Nat × Nat := (2, 0)
|
|
92
113
|
def atomsO2 : Nat × Nat := (0, 2)
|
|
93
114
|
def atomsH2O : Nat × Nat := (2, 1)
|
|
94
115
|
|
|
95
|
-
theorem
|
|
96
|
-
|
|
97
|
-
|
|
116
|
+
theorem the_atom_table_decides_the_balance :
|
|
117
|
+
(List.range' 1 9).all (fun a => (List.range' 1 9).all (fun b => (List.range' 1 9).all (fun c =>
|
|
118
|
+
(a * atomsH2O.1 == b * atomsH2.1 + c * atomsO2.1 && a * atomsH2O.2 == b * atomsH2.2 + c * atomsO2.2)
|
|
119
|
+
== balances a b c))) := by decide
|
|
98
120
|
|
|
99
121
|
-- ── 6 · THE TWO-TO-ONE, by volume. Equal volumes of gas hold equal moles, so the splitter delivers two parts
|
|
100
122
|
-- hydrogen to one part oxygen — and that is exactly the ratio the burn consumes. The gases produced ARE
|
|
@@ -106,13 +128,17 @@ theorem the_gases_are_two_to_one_and_consume_each_other_exactly :
|
|
|
106
128
|
|
|
107
129
|
-- ── 7 · THE EIGHT-TO-ONE, by mass. A kilogram of hydrogen never arrives alone: it comes with 7.93 kilograms
|
|
108
130
|
-- of oxygen, because that is what it was split from. Hydrogen is 11.19% of the mass and oxygen the
|
|
109
|
-
-- remaining 88.80%. The two
|
|
110
|
-
--
|
|
111
|
-
--
|
|
112
|
-
|
|
131
|
+
-- remaining 88.80%. The two sum to 9999 rather than 10000, and the law says why: a part and its rest,
|
|
132
|
+
-- each read as a floor in ten-thousandths, re-add to the whole or to one short of it — never less, at
|
|
133
|
+
-- every whole and part checked. So the missing unit is truncation, not a lost kilogram. ──
|
|
134
|
+
def per10k (part whole : Nat) : Nat := part * 10000 / whole
|
|
135
|
+
|
|
136
|
+
theorem a_part_and_its_rest_read_back_the_whole :
|
|
137
|
+
(List.range' 1 40).all (fun w => (List.range (w + 1)).all (fun a =>
|
|
138
|
+
per10k a w + per10k (w - a) w ≤ 10000 && 10000 ≤ per10k a w + per10k (w - a) w + 1)) ∧
|
|
113
139
|
mgO2 * 100 / (2 * mgH2) = 793 ∧
|
|
114
|
-
(2 * mgH2)
|
|
115
|
-
|
|
140
|
+
per10k (2 * mgH2) (2 * mgH2O) = 1119 ∧ per10k mgO2 (2 * mgH2O) = 8880 ∧
|
|
141
|
+
2 * mgH2O - 2 * mgH2 = mgO2 := by decide
|
|
116
142
|
|
|
117
143
|
-- ── 8 · MASS IS CONSERVED AT EVERY SCALE — so the loop CANNOT MAKE WATER. Whatever you split, you get back
|
|
118
144
|
-- the same mass and not a milligram more: a litre in is a litre out. This is the statement that fixes
|
|
@@ -140,13 +166,17 @@ theorem one_litre_split_returns_one_litre_burnt :
|
|
|
140
166
|
theorem only_oxy_hydrogen_burns_without_admitting_nitrogen :
|
|
141
167
|
7808 * 100 / 2095 = 372 ∧ 0 * 372 = 0 ∧ ¬ (372 = 0) := by decide
|
|
142
168
|
|
|
143
|
-
-- ── 11 · THE SYMMETRY, stated as the reason there is nothing to extract. Splitting
|
|
144
|
-
-- and burning returns at most the same 285.83
|
|
145
|
-
-- real inefficiency is counted. The 23% measured at the
|
|
146
|
-
--
|
|
147
|
-
-- source when its best case is break-even. ──
|
|
148
|
-
|
|
149
|
-
|
|
169
|
+
-- ── 11 · THE SYMMETRY, stated as the reason there is nothing to extract. Splitting charges 285.83 kJ per mole
|
|
170
|
+
-- to the ledger and burning returns at most the same 285.83: burning what was split is the identity,
|
|
171
|
+
-- at every ledger value checked, before a single real inefficiency is counted. The 23% measured at the
|
|
172
|
+
-- top of this file is what remains after those inefficiencies; the identity here is what was available
|
|
173
|
+
-- before them. A loop cannot be tuned into a source when its best case is break-even. ──
|
|
174
|
+
def bondHundredthsKJ : Nat := 28583 -- ΔH°f of liquid water, 285.83 kJ/mol, in hundredths
|
|
175
|
+
def splitE (e : Nat) : Nat := e + bondHundredthsKJ
|
|
176
|
+
def burnE (e : Nat) : Nat := e - bondHundredthsKJ
|
|
177
|
+
|
|
178
|
+
theorem splitting_then_burning_is_the_identity_at_the_ideal :
|
|
179
|
+
(List.range 1000).all (fun e => burnE (splitE e) == e) ∧ pct burnYield splitCost = 23 := by decide
|
|
150
180
|
|
|
151
181
|
-- ── WHAT A BUILDER RUNS INTO NEXT ────────────────────────────────────────────────────────────────────────
|
|
152
182
|
-- The stoichiometry above is exact and favourable; these are the numbers that decide whether the machine can
|
|
@@ -158,58 +188,77 @@ def mLperMol : Nat := 22414 -- millilitres per mole at STP
|
|
|
158
188
|
def whPerKgH2: Nat := 33300 -- lower heating value, Wh per kg
|
|
159
189
|
def petrolWhL: Nat := 9700 -- Wh per litre of petrol, for scale
|
|
160
190
|
|
|
191
|
+
-- Litres of gas at STP for a number of moles, and the moles read back from the litres.
|
|
192
|
+
def litresOf (mol : Nat) : Nat := mol * mLperMol / 1000
|
|
193
|
+
def molesOf (l : Nat) : Nat := l * 1000 / mLperMol
|
|
194
|
+
|
|
161
195
|
-- ── 12 · THE EXPANSION. Nine litres of water become sixteen and a half THOUSAND litres of gas at ordinary
|
|
162
|
-
-- pressure — a factor of about 1852.
|
|
163
|
-
--
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
(
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
--
|
|
171
|
-
|
|
172
|
-
|
|
196
|
+
-- pressure — a factor of about 1852. The volume reads back its moles to within one at every mole
|
|
197
|
+
-- count below a thousand, so the litres below are the law's instances, not typed figures. This is the
|
|
198
|
+
-- single hardest fact in the design: the fuel is not dense, it is enormous. ──
|
|
199
|
+
theorem the_gas_volume_reads_back_its_moles :
|
|
200
|
+
(List.range 1000).all (fun m => molesOf (litresOf m) ≤ m && m ≤ molesOf (litresOf m) + 1) ∧
|
|
201
|
+
molH2 = 2 * molO2 ∧ litresOf molH2 = 11117 ∧ litresOf molO2 = 5558 ∧
|
|
202
|
+
(litresOf molH2 + litresOf molO2) / 9 = 1852 := by decide
|
|
203
|
+
|
|
204
|
+
-- ── 13 · AND THE VOLUME IS MOSTLY THE LIGHT HALF. Two parts in three is two thirds at EVERY scale, so the
|
|
205
|
+
-- hydrogen's share of the volume does not depend on how much is made — and that share carries about a
|
|
206
|
+
-- ninth of the mass. The tank is sized by the part that weighs almost nothing. ──
|
|
207
|
+
theorem two_parts_in_three_is_two_thirds_at_every_scale :
|
|
208
|
+
(List.range' 1 500).all (fun m => pct (2 * m) (3 * m) == 66) ∧
|
|
209
|
+
pct molH2 (molH2 + molO2) = 66 ∧ pct (2 * mgH2) (2 * mgH2O) = 11 := by decide
|
|
173
210
|
|
|
174
211
|
-- ── 14 · UNCOMPRESSED, IT IS HOPELESS BY VOLUME — about 2.99 Wh per litre against petrol's 9700, a factor of
|
|
175
|
-
-- over three thousand.
|
|
176
|
-
-- the small number is not
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
--
|
|
184
|
-
--
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
-- ──
|
|
195
|
-
--
|
|
196
|
-
--
|
|
197
|
-
--
|
|
198
|
-
theorem
|
|
199
|
-
|
|
212
|
+
-- over three thousand. The energy per litre is a floor division that multiplies back to the energy at
|
|
213
|
+
-- every volume up to thirty litres; stated in hundredths of a watt-hour so the small number is not
|
|
214
|
+
-- rounded to nothing. ──
|
|
215
|
+
theorem the_energy_per_litre_multiplies_back_to_the_energy :
|
|
216
|
+
(List.range' 1 30).all (fun l =>
|
|
217
|
+
(whPerKgH2 * 100 / l) * l ≤ whPerKgH2 * 100 && whPerKgH2 * 100 < (whPerKgH2 * 100 / l + 1) * l) ∧
|
|
218
|
+
whPerKgH2 * 100 / litresOf molH2 = 299 ∧ petrolWhL * 100 / 299 = 3244 := by decide
|
|
219
|
+
|
|
220
|
+
-- ── 15 · COMPRESSED TO 700 BAR it becomes practical but not competitive. Energy per litre scales with the
|
|
221
|
+
-- density: doubling the kilograms per cubic metre doubles it, within one watt-hour, at every density
|
|
222
|
+
-- below a hundred. At 700 bar (42 kg/m³) that is about 1398 Wh per litre, still roughly seven times
|
|
223
|
+
-- worse than petrol — before the tank, which must hold 700 atmospheres. ──
|
|
224
|
+
def whPerLitreAt (kgPerM3 : Nat) : Nat := kgPerM3 * whPerKgH2 / 1000
|
|
225
|
+
|
|
226
|
+
theorem compression_scales_the_energy_per_litre_linearly :
|
|
227
|
+
(List.range 100).all (fun k =>
|
|
228
|
+
2 * whPerLitreAt k ≤ whPerLitreAt (2 * k) && whPerLitreAt (2 * k) ≤ 2 * whPerLitreAt k + 1) ∧
|
|
229
|
+
whPerLitreAt 42 = 1398 ∧ petrolWhL / whPerLitreAt 42 = 6 := by decide
|
|
230
|
+
|
|
231
|
+
-- ── 16 · THE THROUGHPUT, per unit actually delivered. Every kilowatt-hour out costs 4.33 in, and that figure
|
|
232
|
+
-- is the reciprocal of the 23% returned: a percentage and its reciprocal multiply back to the whole,
|
|
233
|
+
-- within their truncations, at every pair checked. The water cycled per delivered kWh — three quarters
|
|
234
|
+
-- of a litre — comes back, so it sizes the loop, not a supply. ──
|
|
235
|
+
theorem a_ratio_and_its_reciprocal_multiply_back_to_the_whole :
|
|
236
|
+
(List.range' 1 40).all (fun b => (List.range' 1 b).all (fun a =>
|
|
237
|
+
pct a b * pct b a ≤ 10000 && 10000 < (pct a b + 1) * (pct b a + 1))) ∧
|
|
238
|
+
pct splitCost burnYield = 433 ∧ pct burnYield splitCost = 23 ∧
|
|
239
|
+
9 * 1000 / (burnYield / 1000) = 750 := by decide
|
|
240
|
+
|
|
241
|
+
-- ── 17 · WHERE THE REST GOES. What is lost and what is returned add back to the input, and their two
|
|
242
|
+
-- percentages re-add to the whole or to one short of it, at every input and yield checked. Forty of
|
|
243
|
+
-- every fifty-two kilowatt-hours leave as heat — 76% — which a building that wants hot water can
|
|
244
|
+
-- recover; vented to the air it is simply the loss. ──
|
|
245
|
+
theorem the_loss_and_the_yield_read_back_the_input :
|
|
246
|
+
(List.range' 1 60).all (fun c => (List.range (c + 1)).all (fun y =>
|
|
247
|
+
(c - y) + y == c && 99 ≤ pct (c - y) c + pct y c && pct (c - y) c + pct y c ≤ 100)) ∧
|
|
248
|
+
splitCost - burnYield = 40000 ∧ pct (splitCost - burnYield) splitCost = 76 ∧
|
|
249
|
+
pct burnYield splitCost = 23 := by decide
|
|
200
250
|
|
|
201
251
|
-- ── 18 · WHERE THE POLLUTION GOES. Splitting is selective: it takes hydrogen and oxygen and leaves everything
|
|
202
|
-
-- else exactly where it was.
|
|
203
|
-
--
|
|
204
|
-
--
|
|
205
|
-
--
|
|
206
|
-
-- cleaned, and that is the difference between a device and a chore. The exhaust is genuinely pure
|
|
207
|
-
-- either way — this is a still, and every still has a residue to deal with.
|
|
252
|
+
-- else exactly where it was. The residue is litres times dissolved solids, so seawater leaves seven
|
|
253
|
+
-- hundred times what tap water leaves at EVERY volume — the ratio is scale-free, and a hundred litres
|
|
254
|
+
-- (3.5 kg against 5 g) is one instance. The feedwater does not decide whether the machine works; it
|
|
255
|
+
-- decides how often it must be opened and cleaned. This is a still, and every still has a residue.
|
|
208
256
|
def tdsSeawater : Nat := 35000 -- mg of dissolved solids per litre
|
|
209
257
|
def tdsTapWater : Nat := 50 -- mg per litre, ordinary supply
|
|
258
|
+
def residueMg (litres tds : Nat) : Nat := litres * tds
|
|
210
259
|
|
|
211
|
-
theorem
|
|
212
|
-
|
|
213
|
-
tdsSeawater / tdsTapWater =
|
|
260
|
+
theorem the_residue_ratio_is_the_same_at_every_volume :
|
|
261
|
+
(List.range' 1 200).all (fun l => residueMg l tdsSeawater == 700 * residueMg l tdsTapWater) ∧
|
|
262
|
+
residueMg 100 tdsSeawater / 1000 = 3500 ∧ residueMg 100 tdsTapWater / 1000 = 5 := by decide
|
|
214
263
|
|
|
215
264
|
end Energy
|
package/src/proof/light.lean
CHANGED
|
@@ -40,7 +40,10 @@ def kcd : Nat := 683 -- K_cd, lm/W, exact
|
|
|
40
40
|
|
|
41
41
|
def defining : List Nat := [c, dNuCs, hDigits, eDigits, kDigits, naDigits, kcd]
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
-- Seven, and seven DIFFERENT ones: a list that repeated a constant would still have length seven. Each is
|
|
44
|
+
-- nonzero, so each fixes a unit rather than annulling it. (Was `defining.length = 7`, a count of a typed list.)
|
|
45
|
+
theorem the_si_fixes_seven_distinct_nonzero_constants :
|
|
46
|
+
defining.length = 7 ∧ defining.eraseDups = defining ∧ defining.all (fun x => x > 0) := by decide
|
|
44
47
|
|
|
45
48
|
-- ── SPACE FROM TIME, THROUGH LIGHT ──────────────────────────────────────────────────────────────────────
|
|
46
49
|
-- The chain is definitional and it runs one way. ΔνCs fixes the second; the second and c fix the metre. So
|
package/src/proof/reach.lean
CHANGED
|
@@ -52,13 +52,14 @@ theorem doubling_the_domain_leaves_the_same_hole :
|
|
|
52
52
|
|
|
53
53
|
-- ── 4 · THE DEPOSIT'S OWN LARGEST DOMAIN IS STILL A BOUND ───────────────────────────────────────────────
|
|
54
54
|
-- 152,568,360,000 is the largest case-count any theorem in this tree walks. It is enormous and it is finite,
|
|
55
|
-
-- and the naturals do not stop there. Stated with
|
|
55
|
+
-- and the naturals do not stop there. Stated as a LAW with its inverse — the successor leaves every bound, the
|
|
56
|
+
-- predecessor brings it back, and the step flips parity — decided at every bound above AND at the largest
|
|
57
|
+
-- domain, so the number is an instance of the law rather than a value read back (2026-09-14).
|
|
56
58
|
def largestDomainHere : Nat := 152568360000
|
|
57
59
|
|
|
58
|
-
theorem
|
|
59
|
-
largestDomainHere
|
|
60
|
-
|
|
61
|
-
∧ (largestDomainHere + 1) % 2 = 1 := by decide
|
|
60
|
+
theorem the_successor_leaves_every_domain_and_the_predecessor_returns :
|
|
61
|
+
(bounds ++ [largestDomainHere]).all (fun n =>
|
|
62
|
+
n + 1 > n && (n + 1) - 1 == n && (n + 1) % 2 != n % 2) := by decide
|
|
62
63
|
|
|
63
64
|
-- ── 5 · A THEOREM NAMED FOR THE CLAY PROBLEMS THAT DECIDED NOTHING ABOUT THEM — DELETED ─────────────────
|
|
64
65
|
-- `this_file_settles_none_of_the_seven` stood here and decided:
|
package/src/proof/speed.lean
CHANGED
|
@@ -68,9 +68,14 @@ theorem no_constant_factor_accounts_for_the_gap :
|
|
|
68
68
|
¬ (10000 * 20 ≥ 1048576) ∧ 100 * 10 ≥ 1024 - 24 := by decide
|
|
69
69
|
|
|
70
70
|
-- ── 4 · THE MEASURED RATIO, from the declared inputs, in the same unit on both sides — the mistake that
|
|
71
|
-
-- made an earlier theorem in this deposit compare seal-bits against a leaf count.
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
-- made an earlier theorem in this deposit compare seal-bits against a leaf count. Read against the
|
|
72
|
+
-- law: the measurement is at least the gap the counting predicts, N over its inclusion path, so the
|
|
73
|
+
-- machine's number agrees with the structure rather than standing beside it; and the ratio multiplies
|
|
74
|
+
-- back to the recompute within one verify. ──
|
|
75
|
+
theorem the_measured_ratio_exceeds_the_counted_gap :
|
|
76
|
+
(List.range' 1 20).all (fun k => 2 ^ k / rounds 40 (2 ^ k) ≤ recomputeUs / verifyUs) ∧
|
|
77
|
+
(recomputeUs / verifyUs) * verifyUs ≤ recomputeUs ∧ recomputeUs < (recomputeUs / verifyUs + 1) * verifyUs ∧
|
|
78
|
+
recomputeUs / verifyUs = 567971 := by decide
|
|
74
79
|
|
|
75
80
|
-- ── 5 · VERIFY IS NOT FREE, and calling it O(1) would be the easy overclaim. It grows — slowly, and without
|
|
76
81
|
-- bound — so a large enough set costs a longer path. Logarithmic is not constant. ──
|
|
@@ -81,8 +86,11 @@ theorem verification_grows_it_is_not_constant :
|
|
|
81
86
|
-- ── 6 · NOTHING HERE IS SUB-NANOSECOND. The measured verify is 38000 nanoseconds. The claim that it is under
|
|
82
87
|
-- one is off by four and a half orders of magnitude, and this theorem exists so that number sits in
|
|
83
88
|
-- the ledger next to the impressive one rather than only the impressive one being quotable. ──
|
|
84
|
-
|
|
85
|
-
|
|
89
|
+
-- The nanosecond figure is not a second typed input: it is the microsecond input converted, and the
|
|
90
|
+
-- conversion reads back at every microsecond count below a thousand. ──
|
|
91
|
+
theorem the_verify_in_nanoseconds_reads_back_its_microseconds :
|
|
92
|
+
(List.range 1000).all (fun u => u * 1000 / 1000 == u) ∧
|
|
93
|
+
nsPerVerify = verifyUs * 1000 ∧ nsPerVerify / 1000 = verifyUs ∧ nsPerVerify > 10000 := by decide
|
|
86
94
|
|
|
87
95
|
-- ── 7 · THE WORK PER NODE IS THE SAME on both paths. Recompute and verify run the identical hash; only the
|
|
88
96
|
-- COUNT differs. That is what makes this arithmetic rather than a claim about hardware. ──
|
|
@@ -107,12 +115,22 @@ def hexbitChars : Nat := 22 -- the same address over the 64-hexagram lattice
|
|
|
107
115
|
def hexMs : Nat := 16 -- median ms for 200,000 encodings, 8-bit table
|
|
108
116
|
def hexbitMs : Nat := 30 -- the same work, 6-bit lattice
|
|
109
117
|
|
|
110
|
-
--
|
|
111
|
-
|
|
112
|
-
|
|
118
|
+
-- Characters needed for a 128-bit address at b bits per character: the ceiling of 128 / b.
|
|
119
|
+
def charsFor (b : Nat) : Nat := (128 + b - 1) / b
|
|
120
|
+
|
|
121
|
+
-- Shorter: the width is the ceiling of 128 bits over the symbol, and multiplying back covers the 128 bits
|
|
122
|
+
-- with less than one symbol to spare, at every symbol width from one to eight bits. 32 and 22 are the
|
|
123
|
+
-- instances at four and six bits — derived, not typed — and 22 against 32 is what hexbits unlock.
|
|
124
|
+
theorem the_width_is_the_ceiling_of_128_bits_over_the_symbol :
|
|
125
|
+
(List.range' 1 8).all (fun b => charsFor b * b ≥ 128 && (charsFor b - 1) * b < 128) ∧
|
|
126
|
+
charsFor 4 = hexChars ∧ charsFor 6 = hexbitChars ∧
|
|
127
|
+
hexbitChars < hexChars ∧ hexbitChars * 100 / hexChars = 68 := by decide
|
|
113
128
|
|
|
114
129
|
-- And slower: the same encodings cost 30 ms against 16, so the density is bought with time, not given.
|
|
115
|
-
|
|
130
|
+
-- The ratio is a floor division in tenths, and it multiplies back to the timing within one step — at every
|
|
131
|
+
-- divisor and dividend checked, of which the two medians are one instance.
|
|
132
|
+
theorem hexbits_are_slower_and_the_ratio_multiplies_back :
|
|
133
|
+
(List.range' 1 20).all (fun b => (List.range 400).all (fun a => (a / b) * b ≤ a && a < (a / b + 1) * b)) ∧
|
|
116
134
|
hexbitMs > hexMs ∧ hexbitMs * 10 / hexMs = 18 := by decide
|
|
117
135
|
|
|
118
136
|
-- A theorem named `an_encoding_changes_width_not_the_count_of_operations` stood here and is DELETED. It
|
package/src/proof/split.lean
CHANGED
|
@@ -123,11 +123,17 @@ theorem every_root_is_a_single :
|
|
|
123
123
|
def coins : Nat := 2
|
|
124
124
|
def coinStep : Nat := 3 * coins
|
|
125
125
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
126
|
+
-- The coin step and the coins are INVERSE: tripling and dividing by three undo each other at every count below
|
|
127
|
+
-- twenty, and the step is the instance at the two coins — derived by the law, not typed beside it.
|
|
128
|
+
theorem the_coin_step_and_the_coins_are_inverse :
|
|
129
|
+
((List.range 20).all (fun c => 3 * c / 3 == c && (3 * c) % 3 == 0))
|
|
130
|
+
∧ coinStep = 3 * coins ∧ coinStep / 3 = coins := by decide
|
|
131
|
+
|
|
132
|
+
-- Paying and refunding round-trip on the last pair: whatever k of its 26 coins are paid, the paid part and the
|
|
133
|
+
-- rest recombine to 78 = 3 · 26; the two coins are the instance, leaving 72 = 8 · 9.
|
|
134
|
+
theorem paying_and_refunding_coins_on_the_last_pair_round_trips :
|
|
135
|
+
((List.range 27).all (fun k => 3 * (26 - k) + 3 * k == 78))
|
|
136
|
+
∧ 3 * (26 - coins) = 72 ∧ 72 = 8 * 9 := by decide
|
|
131
137
|
|
|
132
138
|
-- The two classes, named rather than counted.
|
|
133
139
|
theorem the_exhaustible_tokens_are_those_six_divides :
|
|
@@ -164,8 +170,11 @@ theorem inside_this_ideal_the_bare_coin_sorts_as_the_scaled_one :
|
|
|
164
170
|
-- orbit the whole deposit is built on, and paying the two coins buys exactly one step of it.
|
|
165
171
|
def sealBits : Nat := 128
|
|
166
172
|
|
|
167
|
-
|
|
168
|
-
|
|
173
|
+
-- A seal divides into payments and multiplies back: for every power of two up to the seal, splitting the seal
|
|
174
|
+
-- into that many parts and recombining them returns it; the two coins are the instance, 64 = 2 ^ 6 payments.
|
|
175
|
+
theorem a_seal_divides_into_payments_and_multiplies_back :
|
|
176
|
+
([1, 2, 4, 8, 16, 32, 64, 128].all (fun c => (sealBits / c) * c == sealBits && sealBits / (sealBits / c) == c))
|
|
177
|
+
∧ sealBits / coins = 2 ^ 6 := by decide
|
|
169
178
|
|
|
170
179
|
theorem sixty_four_is_where_the_doubling_returns :
|
|
171
180
|
(2 ^ 6) % 9 = 1
|
|
@@ -173,8 +182,10 @@ theorem sixty_four_is_where_the_doubling_returns :
|
|
|
173
182
|
∧ ((List.range' 1 5).all (fun k => (2 ^ k) % 9 != 1)) := by decide
|
|
174
183
|
|
|
175
184
|
-- The two readings meet: the budget a seal affords and the period of the orbit are the same six.
|
|
176
|
-
|
|
177
|
-
|
|
185
|
+
-- The orbit turns once per budget: doubling returns to the same residue after six steps at every one of the first
|
|
186
|
+
-- sixty, and the budget a seal affords is two to that six.
|
|
187
|
+
theorem the_orbit_turns_once_per_budget :
|
|
188
|
+
((List.range 60).all (fun n => 2 ^ (n + 6) % 9 == 2 ^ n % 9)) ∧ 2 ^ 6 = sealBits / coins := by decide
|
|
178
189
|
|
|
179
190
|
|
|
180
191
|
end Split
|
package/src/proof/trial-all.json
CHANGED
|
@@ -15256,5 +15256,149 @@
|
|
|
15256
15256
|
"verdict": "UNVERIFIED",
|
|
15257
15257
|
"ground": "no candidate in the current space — nothing to recompute",
|
|
15258
15258
|
"receipt": "19e4c01e-8d78-8ee5-8003-bcbbce30ce79"
|
|
15259
|
+
},
|
|
15260
|
+
{
|
|
15261
|
+
"key": "lean_coin_the_nines_complement_pairs_the_ten_digits",
|
|
15262
|
+
"verdict": "UNVERIFIED",
|
|
15263
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15264
|
+
"receipt": "4f280944-1969-89d7-951d-0861c1dae315"
|
|
15265
|
+
},
|
|
15266
|
+
{
|
|
15267
|
+
"key": "lean_split_the_coin_step_and_the_coins_are_inverse",
|
|
15268
|
+
"verdict": "UNVERIFIED",
|
|
15269
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15270
|
+
"receipt": "1dd0f6d3-af8e-8fe5-8a17-5e4d06a303f8"
|
|
15271
|
+
},
|
|
15272
|
+
{
|
|
15273
|
+
"key": "lean_split_paying_and_refunding_coins_on_the_last_pair_round_trips",
|
|
15274
|
+
"verdict": "UNVERIFIED",
|
|
15275
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15276
|
+
"receipt": "d09b81fa-777d-8844-bfae-e43143c32ed6"
|
|
15277
|
+
},
|
|
15278
|
+
{
|
|
15279
|
+
"key": "lean_split_a_seal_divides_into_payments_and_multiplies_back",
|
|
15280
|
+
"verdict": "UNVERIFIED",
|
|
15281
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15282
|
+
"receipt": "1984d72b-4263-87d9-bfd6-70a282ac37ab"
|
|
15283
|
+
},
|
|
15284
|
+
{
|
|
15285
|
+
"key": "lean_split_the_orbit_turns_once_per_budget",
|
|
15286
|
+
"verdict": "UNVERIFIED",
|
|
15287
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15288
|
+
"receipt": "35d5dc48-cbc0-8b91-aaaf-2976834a5f5f"
|
|
15289
|
+
},
|
|
15290
|
+
{
|
|
15291
|
+
"key": "lean_energy_any_yield_below_its_cost_reads_under_the_whole",
|
|
15292
|
+
"verdict": "UNVERIFIED",
|
|
15293
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15294
|
+
"receipt": "64823215-1e97-88ef-ab5f-46f0ed44534a"
|
|
15295
|
+
},
|
|
15296
|
+
{
|
|
15297
|
+
"key": "lean_energy_the_cost_per_litre_multiplies_back_to_the_cost",
|
|
15298
|
+
"verdict": "UNVERIFIED",
|
|
15299
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15300
|
+
"receipt": "2fafc1e2-f58f-8431-8e73-cfaa3c48dc21"
|
|
15301
|
+
},
|
|
15302
|
+
{
|
|
15303
|
+
"key": "lean_energy_the_mass_balance_is_the_atom_balance",
|
|
15304
|
+
"verdict": "UNVERIFIED",
|
|
15305
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15306
|
+
"receipt": "2854e1d5-ab5d-8f6f-aae3-a6d17a1f5202"
|
|
15307
|
+
},
|
|
15308
|
+
{
|
|
15309
|
+
"key": "lean_energy_the_atom_table_decides_the_balance",
|
|
15310
|
+
"verdict": "UNVERIFIED",
|
|
15311
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15312
|
+
"receipt": "98e0c98d-7b0c-8a11-a21f-84b31b36f426"
|
|
15313
|
+
},
|
|
15314
|
+
{
|
|
15315
|
+
"key": "lean_energy_a_part_and_its_rest_read_back_the_whole",
|
|
15316
|
+
"verdict": "UNVERIFIED",
|
|
15317
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15318
|
+
"receipt": "d4addfa7-6e96-8896-8574-0608cec8caf0"
|
|
15319
|
+
},
|
|
15320
|
+
{
|
|
15321
|
+
"key": "lean_energy_splitting_then_burning_is_the_identity_at_the_ideal",
|
|
15322
|
+
"verdict": "UNVERIFIED",
|
|
15323
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15324
|
+
"receipt": "f354845f-b6af-8133-a8b0-ac3c1c3c6c18"
|
|
15325
|
+
},
|
|
15326
|
+
{
|
|
15327
|
+
"key": "lean_energy_the_gas_volume_reads_back_its_moles",
|
|
15328
|
+
"verdict": "UNVERIFIED",
|
|
15329
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15330
|
+
"receipt": "464b601e-4839-8b4d-bdad-e1f82ff6be74"
|
|
15331
|
+
},
|
|
15332
|
+
{
|
|
15333
|
+
"key": "lean_energy_two_parts_in_three_is_two_thirds_at_every_scale",
|
|
15334
|
+
"verdict": "UNVERIFIED",
|
|
15335
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15336
|
+
"receipt": "6913b23d-5d6d-832c-9992-426fc4755697"
|
|
15337
|
+
},
|
|
15338
|
+
{
|
|
15339
|
+
"key": "lean_energy_the_energy_per_litre_multiplies_back_to_the_energy",
|
|
15340
|
+
"verdict": "UNVERIFIED",
|
|
15341
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15342
|
+
"receipt": "6ca259eb-a048-889f-953f-ffb3af4e191d"
|
|
15343
|
+
},
|
|
15344
|
+
{
|
|
15345
|
+
"key": "lean_energy_compression_scales_the_energy_per_litre_linearly",
|
|
15346
|
+
"verdict": "UNVERIFIED",
|
|
15347
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15348
|
+
"receipt": "62f26437-7387-84fc-bed6-8afc5ccf0921"
|
|
15349
|
+
},
|
|
15350
|
+
{
|
|
15351
|
+
"key": "lean_energy_a_ratio_and_its_reciprocal_multiply_back_to_the_whole",
|
|
15352
|
+
"verdict": "UNVERIFIED",
|
|
15353
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15354
|
+
"receipt": "07ef3913-ea46-810b-85b9-be9b21a8f476"
|
|
15355
|
+
},
|
|
15356
|
+
{
|
|
15357
|
+
"key": "lean_energy_the_loss_and_the_yield_read_back_the_input",
|
|
15358
|
+
"verdict": "UNVERIFIED",
|
|
15359
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15360
|
+
"receipt": "945f6f02-5f28-8c32-a3a8-226b5a6e37e4"
|
|
15361
|
+
},
|
|
15362
|
+
{
|
|
15363
|
+
"key": "lean_energy_the_residue_ratio_is_the_same_at_every_volume",
|
|
15364
|
+
"verdict": "UNVERIFIED",
|
|
15365
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15366
|
+
"receipt": "b0b19d5b-1924-8383-b871-740fdb759594"
|
|
15367
|
+
},
|
|
15368
|
+
{
|
|
15369
|
+
"key": "lean_light_the_si_fixes_seven_distinct_nonzero_constants",
|
|
15370
|
+
"verdict": "UNVERIFIED",
|
|
15371
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15372
|
+
"receipt": "b8191727-00d7-8658-a6ea-e9b71aed9e9d"
|
|
15373
|
+
},
|
|
15374
|
+
{
|
|
15375
|
+
"key": "lean_reach_the_successor_leaves_every_domain_and_the_predecessor_returns",
|
|
15376
|
+
"verdict": "UNVERIFIED",
|
|
15377
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15378
|
+
"receipt": "e11c16ca-5d37-8dc4-9af3-7a3488c33cd8"
|
|
15379
|
+
},
|
|
15380
|
+
{
|
|
15381
|
+
"key": "lean_speed_the_measured_ratio_exceeds_the_counted_gap",
|
|
15382
|
+
"verdict": "UNVERIFIED",
|
|
15383
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15384
|
+
"receipt": "f8640798-50bd-8c98-b980-085593d93807"
|
|
15385
|
+
},
|
|
15386
|
+
{
|
|
15387
|
+
"key": "lean_speed_the_verify_in_nanoseconds_reads_back_its_microseconds",
|
|
15388
|
+
"verdict": "UNVERIFIED",
|
|
15389
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15390
|
+
"receipt": "e8a082ef-9515-8029-bfae-0a73deba82b4"
|
|
15391
|
+
},
|
|
15392
|
+
{
|
|
15393
|
+
"key": "lean_speed_the_width_is_the_ceiling_of_128_bits_over_the_symbol",
|
|
15394
|
+
"verdict": "UNVERIFIED",
|
|
15395
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15396
|
+
"receipt": "5811891a-d052-8382-8f7c-9a3d6def88cc"
|
|
15397
|
+
},
|
|
15398
|
+
{
|
|
15399
|
+
"key": "lean_speed_hexbits_are_slower_and_the_ratio_multiplies_back",
|
|
15400
|
+
"verdict": "UNVERIFIED",
|
|
15401
|
+
"ground": "no candidate in the current space — nothing to recompute",
|
|
15402
|
+
"receipt": "91a92ea5-bedd-8b9a-80b7-29130fbe5a93"
|
|
15259
15403
|
}
|
|
15260
15404
|
]
|