@ceccec/millennium-solutions 9.0.9 → 9.1.1

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/src/api/gates.ts CHANGED
@@ -100,6 +100,7 @@ export const UNRUN_BY_DESIGN: Record<string, string> = {
100
100
  priorart: 'a generator; priorart-gen is the gate that holds its output',
101
101
  'stale-figures': 'REPORTS by design — a 75% false-positive rate is not something to gate a build on',
102
102
  'verify-theorems': 'covered by gates-fire, and its subject is re-verified by forensics on every commit',
103
+ probe: 'the control harness, not a gate: it takes a file, a theorem and a mutation as arguments, so no chain can run it bare; gates-fire holds its control — a mutation that never reaches the theorem must be refused',
103
104
  }
104
105
 
105
106
  /** Gates that REFUSE and that no routine chain runs. `seo` sat here with a real defect — paper.html
@@ -16331,7 +16331,9 @@
16331
16331
  {
16332
16332
  "key": "lean_energy_the_loop_returns_less_than_it_took",
16333
16333
  "name": "lean energy.lean: the_loop_returns_less_than_it_took — burnYield < splitCost ∧ burnYield * 100 / splitCost = 23 — decided by the Lean kernel over its whole finite domain, axiom-free",
16334
- "receipt": "8229c511-d4bd-8878-9abb-f498760675f7"
16334
+ "receipt": "8229c511-d4bd-8878-9abb-f498760675f7",
16335
+ "revoked": true,
16336
+ "reason": "orphaned: the theorem this key was sealed from is no longer in src/proof. It was deleted or renamed, so nothing recomputes it and no kernel run confirms it. Revoked in place — the receipt stays in the append-only chain, the claim does not stand."
16335
16337
  },
16336
16338
  {
16337
16339
  "key": "lean_energy_a_chain_of_efficiencies_can_only_lose",
@@ -16341,18 +16343,23 @@
16341
16343
  {
16342
16344
  "key": "lean_energy_as_a_purifier_the_loop_costs_a_thousandfold",
16343
16345
  "name": "lean energy.lean: as_a_purifier_the_loop_costs_a_thousandfold — splitCost / waterOut = 5777 ∧ splitCost / waterOut > roPerLitre * 1000 — decided by the Lean kernel over its whole finite domain, axiom-free",
16344
- "receipt": "840c66b6-b891-8807-a71e-eee3f14306a3"
16346
+ "receipt": "840c66b6-b891-8807-a71e-eee3f14306a3",
16347
+ "revoked": true,
16348
+ "reason": "orphaned: the theorem this key was sealed from is no longer in src/proof. It was deleted or renamed, so nothing recomputes it and no kernel run confirms it. Revoked in place — the receipt stays in the append-only chain, the claim does not stand."
16345
16349
  },
16346
16350
  {
16347
16351
  "key": "lean_energy_the_equation_balances_by_atom_count",
16348
16352
  "name": "lean energy.lean: the_equation_balances_by_atom_count — (2 * 2 = 2 * 2) ∧ (2 * 1 = 1 * 2) ∧ 4 = 2 * 2 ∧ 2 = 1 * 2 — decided by the Lean kernel over its whole finite domain, axiom-free",
16349
16353
  "receipt": "ecfd70b1-b35b-89d8-a1b0-18ed0d051f27",
16350
- "reason": "reinstated: this entry was withdrawn as orphaned when a regenerated file briefly lacked its theorem. The theorem is in src/proof again and the kernel decides it on every run, so the withdrawal no longer describes anything true. The receipt is untouched and the withdrawal is recorded here rather than erased."
16354
+ "reason": "orphaned: the theorem this key was sealed from is no longer in src/proof. It was deleted or renamed, so nothing recomputes it and no kernel run confirms it. Revoked in place — the receipt stays in the append-only chain, the claim does not stand.",
16355
+ "revoked": true
16351
16356
  },
16352
16357
  {
16353
16358
  "key": "lean_energy_the_equation_balances_by_mass",
16354
16359
  "name": "lean energy.lean: the_equation_balances_by_mass — 2 * mgH2O = 2 * mgH2 + mgO2 ∧ 2 * mgH2O = 36030 — decided by the Lean kernel over its whole finite domain, axiom-free",
16355
- "receipt": "debf920f-a945-870b-83c0-84614ef723bc"
16360
+ "receipt": "debf920f-a945-870b-83c0-84614ef723bc",
16361
+ "revoked": true,
16362
+ "reason": "orphaned: the theorem this key was sealed from is no longer in src/proof. It was deleted or renamed, so nothing recomputes it and no kernel run confirms it. Revoked in place — the receipt stays in the append-only chain, the claim does not stand."
16356
16363
  },
16357
16364
  {
16358
16365
  "key": "lean_energy_the_gases_are_two_to_one_and_consume_each_other_exactly",
@@ -16362,7 +16369,9 @@
16362
16369
  {
16363
16370
  "key": "lean_energy_hydrogen_is_a_ninth_of_the_mass_and_oxygen_the_rest",
16364
16371
  "name": "lean energy.lean: hydrogen_is_a_ninth_of_the_mass_and_oxygen_the_rest — mgO2 * 100 / (2 * mgH2) = 793 ∧ (2 * mgH2) * 10000 / (2 * mgH2O) = 1119 ∧ mgO2 * 10000 / (2 * mgH2O) = 8880 ∧ 1119 + 8880 = 9999 — decided by the Lean kernel over its whole finite domain, axiom-free",
16365
- "receipt": "585ebc79-3eac-8bd9-83ab-1bae798a3662"
16372
+ "receipt": "585ebc79-3eac-8bd9-83ab-1bae798a3662",
16373
+ "revoked": true,
16374
+ "reason": "orphaned: the theorem this key was sealed from is no longer in src/proof. It was deleted or renamed, so nothing recomputes it and no kernel run confirms it. Revoked in place — the receipt stays in the append-only chain, the claim does not stand."
16366
16375
  },
16367
16376
  {
16368
16377
  "key": "lean_energy_mass_is_conserved_at_every_scale_so_the_loop_cannot_make_water",
@@ -16382,7 +16391,9 @@
16382
16391
  {
16383
16392
  "key": "lean_energy_the_ideal_round_trip_is_exactly_zero",
16384
16393
  "name": "lean energy.lean: the_ideal_round_trip_is_exactly_zero — 28583 - 28583 = 0 ∧ 28583 ≤ 28583 ∧ burnYield * 100 / splitCost = 23 — decided by the Lean kernel over its whole finite domain, axiom-free",
16385
- "receipt": "181481c2-3745-806e-a705-38e157a3e345"
16394
+ "receipt": "181481c2-3745-806e-a705-38e157a3e345",
16395
+ "revoked": true,
16396
+ "reason": "orphaned: the theorem this key was sealed from is no longer in src/proof. It was deleted or renamed, so nothing recomputes it and no kernel run confirms it. Revoked in place — the receipt stays in the append-only chain, the claim does not stand."
16386
16397
  },
16387
16398
  {
16388
16399
  "key": "lean_energy_the_two_to_one_is_forced_by_the_oxygen",
@@ -16512,37 +16523,51 @@
16512
16523
  {
16513
16524
  "key": "lean_energy_the_gases_are_eighteen_hundred_times_the_water_they_came_from",
16514
16525
  "name": "lean energy.lean: the_gases_are_eighteen_hundred_times_the_water_they_came_from — molH2 * mLperMol / 1000 = 11117 ∧ molO2 * mLperMol / 1000 = 5558 ∧ (molH2 * mLperMol / 1000 + molO2 * mLperMol / 1000) / 9 = 1852 — decided by the Lean kernel over its whole finite domain, axiom-free",
16515
- "receipt": "033b4a15-d8ee-8506-939c-a8ccbb3e2888"
16526
+ "receipt": "033b4a15-d8ee-8506-939c-a8ccbb3e2888",
16527
+ "revoked": true,
16528
+ "reason": "orphaned: the theorem this key was sealed from is no longer in src/proof. It was deleted or renamed, so nothing recomputes it and no kernel run confirms it. Revoked in place — the receipt stays in the append-only chain, the claim does not stand."
16516
16529
  },
16517
16530
  {
16518
16531
  "key": "lean_energy_two_thirds_of_the_volume_carries_a_ninth_of_the_mass",
16519
16532
  "name": "lean energy.lean: two_thirds_of_the_volume_carries_a_ninth_of_the_mass — molH2 * 100 / (molH2 + molO2) = 66 ∧ (2 * mgH2) * 100 / (2 * mgH2O) = 11 — decided by the Lean kernel over its whole finite domain, axiom-free",
16520
- "receipt": "f8780f77-c9ef-885b-bf7c-41d9e25555fa"
16533
+ "receipt": "f8780f77-c9ef-885b-bf7c-41d9e25555fa",
16534
+ "revoked": true,
16535
+ "reason": "orphaned: the theorem this key was sealed from is no longer in src/proof. It was deleted or renamed, so nothing recomputes it and no kernel run confirms it. Revoked in place — the receipt stays in the append-only chain, the claim does not stand."
16521
16536
  },
16522
16537
  {
16523
16538
  "key": "lean_energy_uncompressed_hydrogen_is_three_thousandfold_worse_by_volume",
16524
16539
  "name": "lean energy.lean: uncompressed_hydrogen_is_three_thousandfold_worse_by_volume — whPerKgH2 * 100 / (molH2 * mLperMol / 1000) = 299 ∧ petrolWhL * 100 / 299 = 3244 — decided by the Lean kernel over its whole finite domain, axiom-free",
16525
- "receipt": "9c0e0943-6e5a-8989-b048-611a90ff1895"
16540
+ "receipt": "9c0e0943-6e5a-8989-b048-611a90ff1895",
16541
+ "revoked": true,
16542
+ "reason": "orphaned: the theorem this key was sealed from is no longer in src/proof. It was deleted or renamed, so nothing recomputes it and no kernel run confirms it. Revoked in place — the receipt stays in the append-only chain, the claim does not stand."
16526
16543
  },
16527
16544
  {
16528
16545
  "key": "lean_energy_even_at_seven_hundred_bar_it_is_sevenfold_worse_by_volume",
16529
16546
  "name": "lean energy.lean: even_at_seven_hundred_bar_it_is_sevenfold_worse_by_volume — 42 * whPerKgH2 / 1000 = 1398 ∧ petrolWhL / 1398 = 6 — decided by the Lean kernel over its whole finite domain, axiom-free",
16530
- "receipt": "a1413809-d6e9-820e-92c4-129ffb67272d"
16547
+ "receipt": "a1413809-d6e9-820e-92c4-129ffb67272d",
16548
+ "revoked": true,
16549
+ "reason": "orphaned: the theorem this key was sealed from is no longer in src/proof. It was deleted or renamed, so nothing recomputes it and no kernel run confirms it. Revoked in place — the receipt stays in the append-only chain, the claim does not stand."
16531
16550
  },
16532
16551
  {
16533
16552
  "key": "lean_energy_each_delivered_kilowatt_hour_costs_four_and_cycles_a_litre",
16534
16553
  "name": "lean energy.lean: each_delivered_kilowatt_hour_costs_four_and_cycles_a_litre — splitCost * 100 / burnYield = 433 ∧ 9 * 1000 / (burnYield / 1000) = 750 — decided by the Lean kernel over its whole finite domain, axiom-free",
16535
- "receipt": "574b2b86-71c5-8424-9cb9-b41f1f6744ed"
16554
+ "receipt": "574b2b86-71c5-8424-9cb9-b41f1f6744ed",
16555
+ "revoked": true,
16556
+ "reason": "orphaned: the theorem this key was sealed from is no longer in src/proof. It was deleted or renamed, so nothing recomputes it and no kernel run confirms it. Revoked in place — the receipt stays in the append-only chain, the claim does not stand."
16536
16557
  },
16537
16558
  {
16538
16559
  "key": "lean_energy_three_quarters_of_the_input_leaves_as_heat",
16539
16560
  "name": "lean energy.lean: three_quarters_of_the_input_leaves_as_heat — splitCost - burnYield = 40000 ∧ (splitCost - burnYield) * 100 / splitCost = 76 — decided by the Lean kernel over its whole finite domain, axiom-free",
16540
- "receipt": "35c25641-5b8d-8825-aa5f-94f0e2792339"
16561
+ "receipt": "35c25641-5b8d-8825-aa5f-94f0e2792339",
16562
+ "revoked": true,
16563
+ "reason": "orphaned: the theorem this key was sealed from is no longer in src/proof. It was deleted or renamed, so nothing recomputes it and no kernel run confirms it. Revoked in place — the receipt stays in the append-only chain, the claim does not stand."
16541
16564
  },
16542
16565
  {
16543
16566
  "key": "lean_energy_what_the_feedwater_leaves_behind_decides_the_maintenance",
16544
16567
  "name": "lean energy.lean: what_the_feedwater_leaves_behind_decides_the_maintenance — 100 * tdsSeawater / 1000 = 3500 ∧ 100 * tdsTapWater / 1000 = 5 ∧ tdsSeawater / tdsTapWater = 700 — decided by the Lean kernel over its whole finite domain, axiom-free",
16545
- "receipt": "2c3cf0b0-2ea7-80c7-916f-cdbefc6ac125"
16568
+ "receipt": "2c3cf0b0-2ea7-80c7-916f-cdbefc6ac125",
16569
+ "revoked": true,
16570
+ "reason": "orphaned: the theorem this key was sealed from is no longer in src/proof. It was deleted or renamed, so nothing recomputes it and no kernel run confirms it. Revoked in place — the receipt stays in the append-only chain, the claim does not stand."
16546
16571
  },
16547
16572
  {
16548
16573
  "key": "lean_mechanical_relation_digital_root",
@@ -17246,7 +17271,9 @@
17246
17271
  {
17247
17272
  "key": "lean_speed_the_measured_ratio_at_a_million_leaves",
17248
17273
  "name": "lean speed.lean: the_measured_ratio_at_a_million_leaves — recomputeUs / verifyUs = 567971 ∧ recomputeUs > verifyUs * 500000 — decided by the Lean kernel over its whole finite domain, axiom-free",
17249
- "receipt": "167a92e0-5d27-87aa-8735-a420d02b2705"
17274
+ "receipt": "167a92e0-5d27-87aa-8735-a420d02b2705",
17275
+ "revoked": true,
17276
+ "reason": "orphaned: the theorem this key was sealed from is no longer in src/proof. It was deleted or renamed, so nothing recomputes it and no kernel run confirms it. Revoked in place — the receipt stays in the append-only chain, the claim does not stand."
17250
17277
  },
17251
17278
  {
17252
17279
  "key": "lean_speed_verification_grows_it_is_not_constant",
@@ -17256,7 +17283,9 @@
17256
17283
  {
17257
17284
  "key": "lean_speed_the_verify_is_thirty_eight_thousand_nanoseconds_not_one",
17258
17285
  "name": "lean speed.lean: the_verify_is_thirty_eight_thousand_nanoseconds_not_one — nsPerVerify = 38000 ∧ nsPerVerify > 1 ∧ nsPerVerify > 10000 — decided by the Lean kernel over its whole finite domain, axiom-free",
17259
- "receipt": "8eb1b99d-9b78-8ac4-bb29-7455c8437987"
17286
+ "receipt": "8eb1b99d-9b78-8ac4-bb29-7455c8437987",
17287
+ "revoked": true,
17288
+ "reason": "orphaned: the theorem this key was sealed from is no longer in src/proof. It was deleted or renamed, so nothing recomputes it and no kernel run confirms it. Revoked in place — the receipt stays in the append-only chain, the claim does not stand."
17260
17289
  },
17261
17290
  {
17262
17291
  "key": "lean_speed_the_advantage_is_the_count_not_the_operation",
@@ -17658,7 +17687,9 @@
17658
17687
  {
17659
17688
  "key": "lean_light_the_si_fixes_exactly_seven_constants",
17660
17689
  "name": "lean light.lean: the_si_fixes_exactly_seven_constants — defining.length = 7 — decided by the Lean kernel over its whole finite domain, axiom-free",
17661
- "receipt": "34b3da62-a7f5-871c-90f4-e8cc3b63ea5d"
17690
+ "receipt": "34b3da62-a7f5-871c-90f4-e8cc3b63ea5d",
17691
+ "revoked": true,
17692
+ "reason": "orphaned: the theorem this key was sealed from is no longer in src/proof. It was deleted or renamed, so nothing recomputes it and no kernel run confirms it. Revoked in place — the receipt stays in the append-only chain, the claim does not stand."
17662
17693
  },
17663
17694
  {
17664
17695
  "key": "lean_light_one_second_is_c_metres_of_light",
@@ -17776,7 +17807,9 @@
17776
17807
  {
17777
17808
  "key": "lean_reach_even_the_largest_domain_here_has_an_outside",
17778
17809
  "name": "lean reach.lean: even_the_largest_domain_here_has_an_outside — largestDomainHere + 1 > largestDomainHere ∧ largestDomainHere % 2 = 0 ∧ (largestDomainHere + 1) % 2 = 1 — decided by the Lean kernel over its whole finite domain, axiom-free",
17779
- "receipt": "9f25da95-de94-86b7-90b6-937888a7a0b4"
17810
+ "receipt": "9f25da95-de94-86b7-90b6-937888a7a0b4",
17811
+ "revoked": true,
17812
+ "reason": "orphaned: the theorem this key was sealed from is no longer in src/proof. It was deleted or renamed, so nothing recomputes it and no kernel run confirms it. Revoked in place — the receipt stays in the append-only chain, the claim does not stand."
17780
17813
  },
17781
17814
  {
17782
17815
  "key": "lean_reach_this_file_settles_none_of_the_seven",
@@ -17835,12 +17868,16 @@
17835
17868
  {
17836
17869
  "key": "lean_speed_hexbits_are_shorter_than_hex",
17837
17870
  "name": "lean speed.lean: hexbits_are_shorter_than_hex — hexbitChars < hexChars ∧ hexChars - hexbitChars = 10 ∧ hexbitChars * 100 / hexChars = 68 — decided by the Lean kernel over its whole finite domain, axiom-free",
17838
- "receipt": "d3b171cf-2487-8772-9d92-573a4f88e84e"
17871
+ "receipt": "d3b171cf-2487-8772-9d92-573a4f88e84e",
17872
+ "revoked": true,
17873
+ "reason": "orphaned: the theorem this key was sealed from is no longer in src/proof. It was deleted or renamed, so nothing recomputes it and no kernel run confirms it. Revoked in place — the receipt stays in the append-only chain, the claim does not stand."
17839
17874
  },
17840
17875
  {
17841
17876
  "key": "lean_speed_hexbits_are_slower_than_hex",
17842
17877
  "name": "lean speed.lean: hexbits_are_slower_than_hex — hexbitMs > hexMs ∧ hexbitMs * 10 / hexMs = 18 — decided by the Lean kernel over its whole finite domain, axiom-free",
17843
- "receipt": "cf4672e4-0be3-8640-bd5c-2be01c301098"
17878
+ "receipt": "cf4672e4-0be3-8640-bd5c-2be01c301098",
17879
+ "revoked": true,
17880
+ "reason": "orphaned: the theorem this key was sealed from is no longer in src/proof. It was deleted or renamed, so nothing recomputes it and no kernel run confirms it. Revoked in place — the receipt stays in the append-only chain, the claim does not stand."
17844
17881
  },
17845
17882
  {
17846
17883
  "key": "lean_speed_an_encoding_changes_width_not_the_count_of_operations",
@@ -18454,5 +18491,100 @@
18454
18491
  "key": "lean_split_the_orbit_turns_once_per_budget",
18455
18492
  "name": "lean split.lean: the_orbit_turns_once_per_budget — ((List.range 60).all (fun n => 2 ^ (n + 6) % 9 == 2 ^ n % 9)) ∧ 2 ^ 6 = sealBits / coins — decided by the Lean kernel over its whole finite domain, axiom-free",
18456
18493
  "receipt": "35d5dc48-cbc0-8b91-aaaf-2976834a5f5f"
18494
+ },
18495
+ {
18496
+ "key": "lean_energy_any_yield_below_its_cost_reads_under_the_whole",
18497
+ "name": "lean energy.lean: any_yield_below_its_cost_reads_under_the_whole — (List.range' 1 60).all (fun c => (List.range c).all (fun y => pct y c < 100)) ∧ burnYield < splitCost ∧ pct burnYield splitCost = 23 — decided by the Lean kernel over its whole finite domain, axiom-free",
18498
+ "receipt": "64823215-1e97-88ef-ab5f-46f0ed44534a"
18499
+ },
18500
+ {
18501
+ "key": "lean_energy_the_cost_per_litre_multiplies_back_to_the_cost",
18502
+ "name": "lean energy.lean: the_cost_per_litre_multiplies_back_to_the_cost — (List.range' 1 20).all (fun l => (splitCost / l) * l ≤ splitCost && splitCost < (splitCost / l + 1) * l) ∧ splitCost / waterOut = 5777 ∧ splitCost / waterOut > roPerLitre * 1000 — decided by the Lean kernel over its whole finite domain, axiom-free",
18503
+ "receipt": "2fafc1e2-f58f-8431-8e73-cfaa3c48dc21"
18504
+ },
18505
+ {
18506
+ "key": "lean_energy_the_mass_balance_is_the_atom_balance",
18507
+ "name": "lean energy.lean: the_mass_balance_is_the_atom_balance — mgH2 = mass 2 0 ∧ mgO2 = mass 0 2 ∧ mgH2O = mass 2 1 ∧ (List.range' 1 9).all (fun a => (List.range' 1 9).all (fun b => (List.range' 1 9).all (fun c => (a * mass 2 1 == b * mass 2 0 + c * mass 0 2) == balances a b c))) ∧ 2 * mgH2O = 2 * mgH2… — decided by the Lean kernel over its whole finite domain, axiom-free",
18508
+ "receipt": "2854e1d5-ab5d-8f6f-aae3-a6d17a1f5202"
18509
+ },
18510
+ {
18511
+ "key": "lean_energy_the_atom_table_decides_the_balance",
18512
+ "name": "lean energy.lean: the_atom_table_decides_the_balance — (List.range' 1 9).all (fun a => (List.range' 1 9).all (fun b => (List.range' 1 9).all (fun c => (a * atomsH2O.1 == b * atomsH2.1 + c * atomsO2.1 && a * atomsH2O.2 == b * atomsH2.2 + c * atomsO2.2) == balances a b c))) — decided by the Lean kernel over its whole finite domain, axiom-free",
18513
+ "receipt": "98e0c98d-7b0c-8a11-a21f-84b31b36f426"
18514
+ },
18515
+ {
18516
+ "key": "lean_energy_a_part_and_its_rest_read_back_the_whole",
18517
+ "name": "lean energy.lean: a_part_and_its_rest_read_back_the_whole — (List.range' 1 40).all (fun w => (List.range (w + 1)).all (fun a => per10k a w + per10k (w - a) w ≤ 10000 && 10000 ≤ per10k a w + per10k (w - a) w + 1)) ∧ mgO2 * 100 / (2 * mgH2) = 793 ∧ per10k (2 * mgH2) (2 * mgH2O) = 1119 ∧ per10k mgO2 (2… — decided by the Lean kernel over its whole finite domain, axiom-free",
18518
+ "receipt": "d4addfa7-6e96-8896-8574-0608cec8caf0"
18519
+ },
18520
+ {
18521
+ "key": "lean_energy_splitting_then_burning_is_the_identity_at_the_ideal",
18522
+ "name": "lean energy.lean: splitting_then_burning_is_the_identity_at_the_ideal — (List.range 1000).all (fun e => burnE (splitE e) == e) ∧ pct burnYield splitCost = 23 — decided by the Lean kernel over its whole finite domain, axiom-free",
18523
+ "receipt": "f354845f-b6af-8133-a8b0-ac3c1c3c6c18"
18524
+ },
18525
+ {
18526
+ "key": "lean_energy_the_gas_volume_reads_back_its_moles",
18527
+ "name": "lean energy.lean: the_gas_volume_reads_back_its_moles — (List.range 1000).all (fun m => molesOf (litresOf m) ≤ m && m ≤ molesOf (litresOf m) + 1) ∧ molH2 = 2 * molO2 ∧ litresOf molH2 = 11117 ∧ litresOf molO2 = 5558 ∧ (litresOf molH2 + litresOf molO2) / 9 = 1852 — decided by the Lean kernel over its whole finite domain, axiom-free",
18528
+ "receipt": "464b601e-4839-8b4d-bdad-e1f82ff6be74"
18529
+ },
18530
+ {
18531
+ "key": "lean_energy_two_parts_in_three_is_two_thirds_at_every_scale",
18532
+ "name": "lean energy.lean: two_parts_in_three_is_two_thirds_at_every_scale — (List.range' 1 500).all (fun m => pct (2 * m) (3 * m) == 66) ∧ pct molH2 (molH2 + molO2) = 66 ∧ pct (2 * mgH2) (2 * mgH2O) = 11 — decided by the Lean kernel over its whole finite domain, axiom-free",
18533
+ "receipt": "6913b23d-5d6d-832c-9992-426fc4755697"
18534
+ },
18535
+ {
18536
+ "key": "lean_energy_the_energy_per_litre_multiplies_back_to_the_energy",
18537
+ "name": "lean energy.lean: the_energy_per_litre_multiplies_back_to_the_energy — (List.range' 1 30).all (fun l => (whPerKgH2 * 100 / l) * l ≤ whPerKgH2 * 100 && whPerKgH2 * 100 < (whPerKgH2 * 100 / l + 1) * l) ∧ whPerKgH2 * 100 / litresOf molH2 = 299 ∧ petrolWhL * 100 / 299 = 3244 — decided by the Lean kernel over its whole finite domain, axiom-free",
18538
+ "receipt": "6ca259eb-a048-889f-953f-ffb3af4e191d"
18539
+ },
18540
+ {
18541
+ "key": "lean_energy_compression_scales_the_energy_per_litre_linearly",
18542
+ "name": "lean energy.lean: compression_scales_the_energy_per_litre_linearly — (List.range 100).all (fun k => 2 * whPerLitreAt k ≤ whPerLitreAt (2 * k) && whPerLitreAt (2 * k) ≤ 2 * whPerLitreAt k + 1) ∧ whPerLitreAt 42 = 1398 ∧ petrolWhL / whPerLitreAt 42 = 6 — decided by the Lean kernel over its whole finite domain, axiom-free",
18543
+ "receipt": "62f26437-7387-84fc-bed6-8afc5ccf0921"
18544
+ },
18545
+ {
18546
+ "key": "lean_energy_a_ratio_and_its_reciprocal_multiply_back_to_the_whole",
18547
+ "name": "lean energy.lean: a_ratio_and_its_reciprocal_multiply_back_to_the_whole — (List.range' 1 40).all (fun b => (List.range' 1 b).all (fun a => pct a b * pct b a ≤ 10000 && 10000 < (pct a b + 1) * (pct b a + 1))) ∧ pct splitCost burnYield = 433 ∧ pct burnYield splitCost = 23 ∧ 9 * 1000 / (burnYield / 1000) = 750 — decided by the Lean kernel over its whole finite domain, axiom-free",
18548
+ "receipt": "07ef3913-ea46-810b-85b9-be9b21a8f476"
18549
+ },
18550
+ {
18551
+ "key": "lean_energy_the_loss_and_the_yield_read_back_the_input",
18552
+ "name": "lean energy.lean: the_loss_and_the_yield_read_back_the_input — (List.range' 1 60).all (fun c => (List.range (c + 1)).all (fun y => (c - y) + y == c && 99 ≤ pct (c - y) c + pct y c && pct (c - y) c + pct y c ≤ 100)) ∧ splitCost - burnYield = 40000 ∧ pct (splitCost - burnYield) splitCost = 76 ∧ pct burnY… — decided by the Lean kernel over its whole finite domain, axiom-free",
18553
+ "receipt": "945f6f02-5f28-8c32-a3a8-226b5a6e37e4"
18554
+ },
18555
+ {
18556
+ "key": "lean_energy_the_residue_ratio_is_the_same_at_every_volume",
18557
+ "name": "lean energy.lean: the_residue_ratio_is_the_same_at_every_volume — (List.range' 1 200).all (fun l => residueMg l tdsSeawater == 700 * residueMg l tdsTapWater) ∧ residueMg 100 tdsSeawater / 1000 = 3500 ∧ residueMg 100 tdsTapWater / 1000 = 5 — decided by the Lean kernel over its whole finite domain, axiom-free",
18558
+ "receipt": "b0b19d5b-1924-8383-b871-740fdb759594"
18559
+ },
18560
+ {
18561
+ "key": "lean_light_the_si_fixes_seven_distinct_nonzero_constants",
18562
+ "name": "lean light.lean: the_si_fixes_seven_distinct_nonzero_constants — defining.length = 7 ∧ defining.eraseDups = defining ∧ defining.all (fun x => x > 0) — decided by the Lean kernel over its whole finite domain, axiom-free",
18563
+ "receipt": "b8191727-00d7-8658-a6ea-e9b71aed9e9d"
18564
+ },
18565
+ {
18566
+ "key": "lean_reach_the_successor_leaves_every_domain_and_the_predecessor_returns",
18567
+ "name": "lean reach.lean: the_successor_leaves_every_domain_and_the_predecessor_returns — (bounds ++ [largestDomainHere]).all (fun n => n + 1 > n && (n + 1) - 1 == n && (n + 1) % 2 != n % 2) — decided by the Lean kernel over its whole finite domain, axiom-free",
18568
+ "receipt": "e11c16ca-5d37-8dc4-9af3-7a3488c33cd8"
18569
+ },
18570
+ {
18571
+ "key": "lean_speed_the_measured_ratio_exceeds_the_counted_gap",
18572
+ "name": "lean speed.lean: the_measured_ratio_exceeds_the_counted_gap — (List.range' 1 20).all (fun k => 2 ^ k / rounds 40 (2 ^ k) ≤ recomputeUs / verifyUs) ∧ (recomputeUs / verifyUs) * verifyUs ≤ recomputeUs ∧ recomputeUs < (recomputeUs / verifyUs + 1) * verifyUs ∧ recomputeUs / verifyUs = 567971 — decided by the Lean kernel over its whole finite domain, axiom-free",
18573
+ "receipt": "f8640798-50bd-8c98-b980-085593d93807"
18574
+ },
18575
+ {
18576
+ "key": "lean_speed_the_verify_in_nanoseconds_reads_back_its_microseconds",
18577
+ "name": "lean speed.lean: the_verify_in_nanoseconds_reads_back_its_microseconds — (List.range 1000).all (fun u => u * 1000 / 1000 == u) ∧ nsPerVerify = verifyUs * 1000 ∧ nsPerVerify / 1000 = verifyUs ∧ nsPerVerify > 10000 — decided by the Lean kernel over its whole finite domain, axiom-free",
18578
+ "receipt": "e8a082ef-9515-8029-bfae-0a73deba82b4"
18579
+ },
18580
+ {
18581
+ "key": "lean_speed_the_width_is_the_ceiling_of_128_bits_over_the_symbol",
18582
+ "name": "lean speed.lean: the_width_is_the_ceiling_of_128_bits_over_the_symbol — (List.range' 1 8).all (fun b => charsFor b * b ≥ 128 && (charsFor b - 1) * b < 128) ∧ charsFor 4 = hexChars ∧ charsFor 6 = hexbitChars ∧ hexbitChars < hexChars ∧ hexbitChars * 100 / hexChars = 68 — decided by the Lean kernel over its whole finite domain, axiom-free",
18583
+ "receipt": "5811891a-d052-8382-8f7c-9a3d6def88cc"
18584
+ },
18585
+ {
18586
+ "key": "lean_speed_hexbits_are_slower_and_the_ratio_multiplies_back",
18587
+ "name": "lean speed.lean: hexbits_are_slower_and_the_ratio_multiplies_back — (List.range' 1 20).all (fun b => (List.range 400).all (fun a => (a / b) * b ≤ a && a < (a / b + 1) * b)) ∧ hexbitMs > hexMs ∧ hexbitMs * 10 / hexMs = 18 — decided by the Lean kernel over its whole finite domain, axiom-free",
18588
+ "receipt": "91a92ea5-bedd-8b9a-80b7-29130fbe5a93"
18457
18589
  }
18458
18590
  ]
@@ -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
- -- ── 1 · THE LOOP RETURNS LESS THAN IT TOOK. Not a little less — under a quarter. The exhaust really is pure
32
- -- water and the engine really does turn a generator; what does not happen is a net output. It is a
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 the_loop_returns_less_than_it_took :
35
- burnYield < splitCost ∧ burnYield * 100 / splitCost = 23 := by decide
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. Judged as what it actually delivers — clean water —
46
- -- the loop spends more than a thousand times what reverse osmosis spends for the same litres. The
47
- -- purification is genuine. It is simply the most expensive way to do it that anyone has built.
48
- -- Stated as a ratio so it cannot be read as a preference. ──
49
- theorem as_a_purifier_the_loop_costs_a_thousandfold :
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 · and it balances by MASS, exactly — two moles of water weigh precisely what the gases they split into
78
- -- weigh together. The equality is exact in integers; nothing is rounded away here ──
79
- theorem the_equation_balances_by_mass :
80
- 2 * mgH2O = 2 * mgH2 + mgO2 ∧ 2 * mgH2O = 36030 := by decide
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, and the coefficients of 2H₂ + O₂ → 2H₂O. Change a coefficient or a formula and the kernel
90
- -- refuses, which is the property the old one lacked.
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 the_equation_balances_by_atom_count :
96
- 2 * atomsH2.1 + atomsO2.1 = 2 * atomsH2O.1 ∧
97
- 2 * atomsH2.2 + atomsO2.2 = 2 * atomsH2O.2 := by decide
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 percentages sum to 9999 rather than 10000 — that is truncation in the
110
- -- percentage, not missing mass; the masses themselves balance exactly, one theorem above. Saying which
111
- -- of the two is the rounding matters: one would be an arithmetic slip, the other a lost kilogram. ──
112
- theorem hydrogen_is_a_ninth_of_the_mass_and_oxygen_the_rest :
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) * 10000 / (2 * mgH2O) = 1119 ∧ mgO2 * 10000 / (2 * mgH2O) = 8880 ∧
115
- 1119 + 8880 = 9999 := by decide
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 costs 285.83 kJ per mole
144
- -- and burning returns at most the same 285.83 — the ideal round trip is exactly zero, before a single
145
- -- real inefficiency is counted. The 23% measured at the top of this file is what remains after those
146
- -- inefficiencies; the zero here is what was available before them. A loop cannot be tuned into a
147
- -- source when its best case is break-even. ──
148
- theorem the_ideal_round_trip_is_exactly_zero :
149
- 28583 - 28583 = 0 ∧ 28583 ≤ 28583 ∧ burnYield * 100 / splitCost = 23 := by decide
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. This is the single hardest fact in the design: the fuel is not
163
- -- dense, it is enormous, and every practical hydrogen system is a response to this number. ──
164
- theorem the_gases_are_eighteen_hundred_times_the_water_they_came_from :
165
- molH2 * mLperMol / 1000 = 11117 ∧ molO2 * mLperMol / 1000 = 5558 ∧
166
- (molH2 * mLperMol / 1000 + molO2 * mLperMol / 1000) / 9 = 1852 := by decide
167
-
168
- -- ── 13 · AND THE VOLUME IS MOSTLY THE LIGHT HALF. Two thirds of the gas by volume is hydrogen, which is only
169
- -- about a ninth of the mass. The tank is sized by the part that weighs almost nothing — which is why
170
- -- "it is only 1 kg of hydrogen" is the wrong intuition about how big the vessel must be. ──
171
- theorem two_thirds_of_the_volume_carries_a_ninth_of_the_mass :
172
- molH2 * 100 / (molH2 + molO2) = 66 ∧ (2 * mgH2) * 100 / (2 * mgH2O) = 11 := by decide
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. Stated in hundredths of a watt-hour so the comparison stays in integers and
176
- -- the small number is not rounded to nothing. ──
177
- theorem uncompressed_hydrogen_is_three_thousandfold_worse_by_volume :
178
- whPerKgH2 * 100 / (molH2 * mLperMol / 1000) = 299 ∧
179
- petrolWhL * 100 / 299 = 3244 := by decide
180
-
181
- -- ── 15 · COMPRESSED TO 700 BAR it becomes practical but not competitive: about 1398 Wh per litre, still
182
- -- roughly seven times worse than petrol by volume — and that is before the tank, which must hold 700
183
- -- atmospheres and weighs more than what it contains. Compression is not free either; it costs
184
- -- energy the loop has already been shown not to have. ──
185
- theorem even_at_seven_hundred_bar_it_is_sevenfold_worse_by_volume :
186
- 42 * whPerKgH2 / 1000 = 1398 ∧ petrolWhL / 1398 = 6 := by decide
187
-
188
- -- ── 16 · THE THROUGHPUT, per unit actually delivered. Every kilowatt-hour out of the engine costs 4.33
189
- -- kilowatt-hours in and cycles three quarters of a litre of water. The water is not consumed — it
190
- -- comes back — so this is the size of the circulating loop, not a supply requirement. ──
191
- theorem each_delivered_kilowatt_hour_costs_four_and_cycles_a_litre :
192
- splitCost * 100 / burnYield = 433 ∧ 9 * 1000 / (burnYield / 1000) = 750 := by decide
193
-
194
- -- ── 17 · WHERE THE REST GOES. Forty of every fifty-two kilowatt-hours leave as heat — 76% of the input. In a
195
- -- building that wants hot water anyway this is recoverable and changes the case considerably; vented
196
- -- to the air it is simply the loss. Naming the fraction is what makes that a design choice rather
197
- -- than a disappointment. ──
198
- theorem three_quarters_of_the_input_leaves_as_heat :
199
- splitCost - burnYield = 40000 ∧ (splitCost - burnYield) * 100 / splitCost = 76 := by decide
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. A litre of seawater carries about 35 grams of dissolved solids, and every
203
- -- one of those grams stays in the cell — a hundred litres leaves 3.5 kilograms of it behind. The same
204
- -- hundred litres of ordinary tap water leaves 5 grams, seven hundred times less. So the feedwater
205
- -- quality does not change whether the machine works; it changes how often it must be opened and
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 what_the_feedwater_leaves_behind_decides_the_maintenance :
212
- 100 * tdsSeawater / 1000 = 3500 ∧ 100 * tdsTapWater / 1000 = 5 ∧
213
- tdsSeawater / tdsTapWater = 700 := by decide
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