Доказательства

Что именно доказано в Lean4

В репозитории Balansis лежит формальный слой на Lean 4 с Mathlib. Ниже — не пересказ бейджа из README, а результат прогона: 73 теорем собраны компилятором, у каждой запрошено #print axioms, и ни одна не опирается ни на что, кроме трёх стандартных аксиом Mathlib.

сборка и аудит: 4 шага, все с кодом 0leanprover/lean4:v4.28.0Mathlib v4.28.0 · 8f9d9cff6bПроверено 2026-09-08

Статус проверки

73теорем в публичном фасаде ACT
73/73получили отчёт #print axioms от ядра Lean
0теорем вне стандартной аксиоматики Mathlib

Стандартная аксиоматика здесь — это ровно три аксиомы: Classical.choice, Quot.sound, propext. Их использует практически любая работа с Mathlib; ничего специфичного для Balansis в этот список не добавлено. Отдельная проверка исходников: в 16 файлах formal/ нет вхождений sorry, admit и объявлений axiom.

Команды прогона аудита и их коды возврата. Прогон выполнен 2026-09-08 на той же машине, что и бенчмарки. Выполнено 2026-09-08
КомандаКод возвратаДлительность
lake build BalansisFormal04.6 с
lake build ACT03.7 с
lake env lean FormalAudit.lean039.2 с
lake env lean <tmp>/SiteAxiomAudit.lean026.8 с

Что означают эти цифры и чего они не означают. Из 73 теорем содержательно самостоятельна группа ExtendedRatio: семантика вырожденных состояний в ℝ не существует, и доказывать её приходится с нуля (включая утверждение о том, что носитель ExtendedRatio полем не является). Группы алгебры и анализа — перенос структуры ℝ через toReal/fromReal: доказано, что перенос корректен. Счётчик «73» складывает и то и другое, поэтому читать его как «73 независимых результатов» не следует.

Граница честности — главное на этой странице. Lean доказывает алгебру идеализированной модели, изоморфной вещественным числам (величина из NNReal плюс направление). Он не доказывает, что Python-код Balansis устойчив в арифметике float64, и не проверяет саму реализацию. Python и Lean здесь — две независимые реализации одной математической теории; связь между ними поддерживается тестами на паритет семантики, а не выводом кода из доказательств. Формулировка «библиотека формально верифицирована» была бы преувеличением: формально верифицирована теория, на которой библиотека построена.

Что доказано, по группам

A1–A5 · AbsoluteValue 6 теорем, formal/ACT/Absolute.lean

Существование и единственность представления вещественного числа, неотрицательность величины, компенсация, аддитивная единица и сохранение направления.

ТеоремаФормулировка в исходникеАксиомы
a1_exists_uniquea1_exists_unique (x : ℝ) : ∃! a : AbsoluteValue, AbsoluteValue.toReal a = xстандартные 3
a2_nonnega2_nonneg (a : AbsoluteValue) : (0 : ℝ) ≤ (a.magnitude : ℝ)стандартные 3
a3_compensationa3_compensation (a b : AbsoluteValue)стандартные 3
a4_additive_identitya4_additive_identity (a : AbsoluteValue) : a + AbsoluteValue.absolute = aстандартные 3
a4_additive_identity_lefta4_additive_identity_left (a : AbsoluteValue) : AbsoluteValue.absolute + a = aстандартные 3
a5_direction_preservationa5_direction_preservation (a : AbsoluteValue) (c : ℝ)стандартные 3

E1–E4 · EternalRatio 5 теорем, formal/ACT/EternalRatio.lean

Корректность отношения как фактор-типа, устойчивость при масштабировании, мультипликативная единица и обратимость.

ТеоремаФормулировка в исходникеАксиомы
e1_well_definede1_well_defined (a b : AbsoluteValue) (hb : b ≠ 0) :стандартные 3
e2_stabilitye2_stability (r : EternalRatio) :стандартные 3
e3_multiplicative_identitye3_multiplicative_identity (r : EternalRatio) : r * unity = rстандартные 3
e3_multiplicative_identity_lefte3_multiplicative_identity_left (r : EternalRatio) : unity * r = rстандартные 3
e4_inversee4_inverse (r : EternalRatio) (hr : r ≠ zero) : r * r⁻¹ = unityстандартные 3

S1–S3 · алгебраические законы 22 теорем, formal/ACT/Algebra.lean

Аддитивные и мультипликативные законы, дистрибутивность и полевые структуры: инстансы Field для AbsoluteValue и для EternalRatio. Структура здесь перенесена из ℝ через toReal/fromReal — проверяется точность переноса, а не новая алгебра.

ТеоремаФормулировка в исходникеАксиомы
s1_closures1_closure (a b : AbsoluteValue) : ∃ c : AbsoluteValue, c = a + bстандартные 3
s1_associativitys1_associativity (a b c : AbsoluteValue) : (a + b) + c = a + (b + c)стандартные 3
s1_commutativitys1_commutativity (a b : AbsoluteValue) : a + b = b + aстандартные 3
s1_identity_rights1_identity_right (a : AbsoluteValue) : a + 0 = aстандартные 3
s1_identity_lefts1_identity_left (a : AbsoluteValue) : (0 : AbsoluteValue) + a = aстандартные 3
s1_inverses1_inverse (a : AbsoluteValue) : a + (-a) = 0стандартные 3
s2_closures2_closure (a b : AbsoluteValue) (ha : a ≠ 0) (hb : b ≠ 0) : a * b ≠ 0стандартные 3
s2_mul_associativitys2_mul_associativity (a b c : AbsoluteValue) : (a * b) * c = a * (b * c)стандартные 3
s2_mul_commutativitys2_mul_commutativity (a b : AbsoluteValue) : a * b = b * aстандартные 3
s2_mul_identity_rights2_mul_identity_right (a : AbsoluteValue) : a * 1 = aстандартные 3
s2_mul_identity_lefts2_mul_identity_left (a : AbsoluteValue) : (1 : AbsoluteValue) * a = aстандартные 3
s2_mul_inverses2_mul_inverse (a : AbsoluteValue) (ha : a ≠ 0) : a * a⁻¹ = 1стандартные 3
mul_add_distribmul_add_distrib (a b c : AbsoluteValue) : a * (b + c) = a * b + a * cстандартные 3
s3_add_assocs3_add_assoc (r₁ r₂ r₃ : EternalRatio) : (r₁ + r₂) + r₃ = r₁ + (r₂ + r₃)стандартные 3
s3_add_comms3_add_comm (r₁ r₂ : EternalRatio) : r₁ + r₂ = r₂ + r₁стандартные 3
s3_add_identitys3_add_identity (r : EternalRatio) : r + zero = rстандартные 3
s3_add_inverses3_add_inverse (r : EternalRatio) : r + (-r) = zeroстандартные 3
s3_mul_assocs3_mul_assoc (r₁ r₂ r₃ : EternalRatio) : (r₁ * r₂) * r₃ = r₁ * (r₂ * r₃)стандартные 3
s3_mul_comms3_mul_comm (r₁ r₂ : EternalRatio) : r₁ * r₂ = r₂ * r₁стандартные 3
s3_mul_identitys3_mul_identity (r : EternalRatio) : r * unity = rстандартные 3
s3_mul_inverses3_mul_inverse (r : EternalRatio) (hr : r ≠ zero) : r * r⁻¹ = unityстандартные 3
s3_distributivitys3_distributivity (a b c : EternalRatio) : a * (b + c) = a * b + a * cстандартные 3

Семантика вырожденных состояний 19 теорем, formal/ACT/ExtendedRatio.lean

Поведение finite / infinite / indeterminate: как состояние возникает из деления, как распространяется через сложение и умножение, что делают политики raise/propagate/saturate — и доказательство того, что носитель ExtendedRatio полем не является. Содержательно самостоятельная группа: эти утверждения не переносятся из ℝ, потому что в ℝ таких состояний нет.

ТеоремаФормулировка в исходникеАксиомы
fromDivision_of_den_nonzerofromDivision_of_den_nonzero (a b : AbsoluteValue) (hb : b ≠ 0) :стандартные 3
fromDivision_zero_zerofromDivision_zero_zero :стандартные 3
fromDivision_of_num_nonzero_den_zerofromDivision_of_num_nonzero_den_zero (a : AbsoluteValue) (ha : a ≠ 0) :стандартные 3
finite_iff_den_nonzerofinite_iff_den_nonzero (a b : AbsoluteValue) :стандартные 3
indeterminate_iff_zero_zeroindeterminate_iff_zero_zero (a b : AbsoluteValue) :стандартные 3
add_indeterminate_leftadd_indeterminate_left (x : ExtendedRatio) : add .indeterminate x = .indeterminateстандартные 3
add_indeterminate_rightadd_indeterminate_right (x : ExtendedRatio) : add x .indeterminate = .indeterminateстандартные 3
mul_indeterminate_leftmul_indeterminate_left (x : ExtendedRatio) : mul .indeterminate x = .indeterminateстандартные 3
mul_indeterminate_rightmul_indeterminate_right (x : ExtendedRatio) : mul x .indeterminate = .indeterminateстандартные 3
add_opposite_infinities_indeterminateadd_opposite_infinities_indeterminate (d : ExtendedDirection) :стандартные 3
add_same_infinitiesadd_same_infinities (d : ExtendedDirection) : add (.infinite d) (.infinite d) = .infinite dстандартные 3
mul_finite_zero_infinite_indeterminatemul_finite_zero_infinite_indeterminate (d : ExtendedDirection) :стандартные 3
mul_infinite_finite_zero_indeterminatemul_infinite_finite_zero_indeterminate (d : ExtendedDirection) :стандартные 3
saturate_infinitesaturate_infinite (d : ExtendedDirection) :стандартные 3
applyPolicy_raise_infiniteapplyPolicy_raise_infinite (d : ExtendedDirection) :стандартные 3
applyPolicy_raise_indeterminateapplyPolicy_raise_indeterminate : applyPolicy .raise .indeterminate = noneстандартные 3
applyPolicy_propagateapplyPolicy_propagate (x : ExtendedRatio) : applyPolicy .propagate x = some xстандартные 3
applyPolicy_saturateapplyPolicy_saturate (x : ExtendedRatio) : applyPolicy .saturate x = some (saturate x)стандартные 3
extendedRatio_not_field_carrierextendedRatio_not_field_carrier :стандартные 3

Порядок, метрика, полнота, непрерывность 18 теорем, formal/ACT/Analysis.lean

Линейный порядок, метрика с неравенством треугольника, полнота пространства и непрерывность сложения и умножения для обоих типов. Как и алгебра, всё это перенесено из ℝ (LinearOrder.lift, MetricSpace.induced): доказано, что перенос корректен, а не то, что модель обладает этими свойствами независимо.

ТеоремаФормулировка в исходникеАксиомы
order_reflexiveorder_reflexive (a : AbsoluteValue) : a ≤ aстандартные 3
order_antisymmetricorder_antisymmetric {a b : AbsoluteValue} (hab : a ≤ b) (hba : b ≤ a) : a = bстандартные 3
order_transitiveorder_transitive {a b c : AbsoluteValue} (hab : a ≤ b) (hbc : b ≤ c) : a ≤ cстандартные 3
metric_nonnegmetric_nonneg (a b : AbsoluteValue) : 0 ≤ dist a bстандартные 3
metric_symmetrymetric_symmetry (a b : AbsoluteValue) : dist a b = dist b aстандартные 3
metric_trianglemetric_triangle (a b c : AbsoluteValue) : dist a c ≤ dist a b + dist b cстандартные 3
completecomplete : CompleteSpace AbsoluteValueстандартные 3
continuous_addcontinuous_add : Continuous fun p : AbsoluteValue × AbsoluteValue => p.1 + p.2стандартные 3
continuous_mulcontinuous_mul : Continuous fun p : AbsoluteValue × AbsoluteValue => p.1 * p.2стандартные 3
order_reflexiveorder_reflexive (r : EternalRatio) : r ≤ rстандартные 3
order_antisymmetricorder_antisymmetric {r s : EternalRatio} (hrs : r ≤ s) (hsr : s ≤ r) : r = sстандартные 3
order_transitiveorder_transitive {r s t : EternalRatio} (hrs : r ≤ s) (hst : s ≤ t) : r ≤ tстандартные 3
metric_nonnegmetric_nonneg (r s : EternalRatio) : 0 ≤ dist r sстандартные 3
metric_symmetrymetric_symmetry (r s : EternalRatio) : dist r s = dist s rстандартные 3
metric_trianglemetric_triangle (r s t : EternalRatio) : dist r t ≤ dist r s + dist s tстандартные 3
completecomplete : CompleteSpace EternalRatioстандартные 3
continuous_addcontinuous_add : Continuous fun p : EternalRatio × EternalRatio => p.1 + p.2стандартные 3
continuous_mulcontinuous_mul : Continuous fun p : EternalRatio × EternalRatio => p.1 * p.2стандартные 3

Direction · знаковая структура 3 теорем, formal/ACT/Direction.lean

Инволютивность отрицания, коммутативность и ассоциативность умножения знаков.

ТеоремаФормулировка в исходникеАксиомы
negate_involutivenegate_involutive (d : Direction) : negate (negate d) = dбез аксиом
mul_commmul_comm (d₁ d₂ : Direction) : mul d₁ d₂ = mul d₂ d₁без аксиом
mul_assocmul_assoc (d₁ d₂ d₃ : Direction) :без аксиом

Как проверить это самому

git clone https://github.com/StudyLabPro/Balansis && cd Balansis/formal
elan toolchain install $(cat lean-toolchain)
lake exe cache get          # готовые .olean Mathlib, иначе сборка займёт часы
lake build BalansisFormal && lake build ACT
lake env lean FormalAudit.lean

# аксиоматическая база конкретной теоремы
echo 'import ACT
#print axioms ACT.a1_exists_unique' > /tmp/axioms.lean
lake env lean /tmp/axioms.lean
# 'ACT.a1_exists_unique' depends on axioms: [propext, Classical.choice, Quot.sound]

Всё, кроме elan и lake exe cache get (это предусловия окружения), выполняет сам генератор аудита — его коды возврата и длительности стоят в таблице выше, а результат целиком лежит в lean-audit.json; сам скрипт — generate-lean-audit.py. Ссылки на исходники на этой странице ведут в коммит 91c406d72421, из которого снят аудит, а не в подвижный master: иначе номера строк разъехались бы молча. README библиотеки, к слову, заявляет меньше, чем доказано: бейдж упоминает только A1–A5, E1–E4 и S1–S3, тогда как семантика ExtendedRatio и весь аналитический слой тоже доказаны. Мы считаем это недоговариванием, а не преувеличением, и поэтому показываем все 73 теорем.