@ceccec/millennium-solutions 9.0.9 → 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 +43 -24
- package/README.md +12 -12
- package/forensic.md +6 -6
- package/index.md +12 -12
- package/package.json +1 -1
- package/paper.md +156 -150
- package/src/proof/discovered.json +151 -19
- 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/trial-all.json +114 -0
|
@@ -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": "
|
|
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
|
]
|
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
|