In der Mathematik gibt es ein Gespenst
(overreacted.io)- Lean ist eine Programmiersprache, die für die Formalisierung von Mathematik entwickelt wurde und es Mathematiker:innen ermöglicht, mathematische Sätze wie Code zu behandeln.
- Nutzer schreiben Satz, Beweis, Axiom etc. in Codeform; der Beweisablauf wird über ein Befehlsset namens tactic durchgeführt.
- Ein Beweis muss nicht vollständig fertiggestellt sein, er kann aber mit
sorryvorläufig abgeschlossen werden; das ist jedoch ein falscher Beweis ähnlichanyin TypeScript. - Wird ein falsches Axiom hinzugefügt (z. B.
2 = 3), entsteht das Risiko eines logischen Widerspruchs und der Beweisbarkeit jeder Behauptung. - Lean leitet Schlussfolgerungen nur aus den logisch ausgewählten Axiomen und dem Beweissystem ab, daher hat die Aufrechterhaltung mathematischer Gültigkeit große Bedeutung.
Lean: Mathematik als Code behandeln
- Lean ist eine Programmiersprache, die auf formalisiertes Mathematikschreiben spezialisiert ist.
- Mit Lean können Mathematiker mathematische Sätze und Beweise in Codeform ausdrücken und so strukturieren, dass sie kooperativ geteilt werden können.
- Es entwirft eine mögliche Zukunft, in der ein Großteil des mathematischen Wissens in Codeform vorliegt und mechanisch verifiziert sowie kombinierbar wird.
Der erste Schritt eines Lean-Beweises
- In Lean ist eine einfache Theorem-Deklaration der Form
theorem two_eq_two : 2 = 2 := by sorrymöglich. - Wenn ein Beweis unvollständig ist, kann
sorryverwendet werden, aber das ist nur ein vorläufiger Schritt, kein echter Beweis.sorrylässt die Beweisprüfung von Lean passieren, ist jedoch logisch nicht vertrauenswürdig.
- Für vollständige Beweise wird eine Taktik wie
rfl(Reflexivität) verwendet, um offensichtliche Gleichungen wie2 = 2zu beweisen. - Bereits bewiesene Inhalte können mit
exactusw. in anderen Theoremen wiederverwendet werden, was die Modularität betont.
Axiome und Widerspruch: Wenn die Mathematik von einem Gespenst heimgesucht wird
- Wenn ein Axiom wie
axiom math_is_haunted : 2 = 3hinzugefügt wird, betrachtet Lean dies als wahr. - Dieses Axiom kann anschließend im Beweisprozess verwendet werden und sogar mathematisch unsinnige Schlussfolgerungen (z. B.
2 + 2 = 6) werden beweisbar. - Es ist möglich, mit der Tactic
rewrite2durch3zu ersetzen und den Beweis mitrflabzuschließen. - Wenn ein ungeeignetes Axiom zu einem Widerspruch führt, kann in Lean der Zustand eintreten, dass jede Aussage beweisbar ist (logischer Kollaps).
- Tatsächlich führte etwa Russells Paradoxon zu Beginn des 20. Jahrhunderts dazu, dass Inkonsistenzen in Axiomensystemen zu einer grundlegenden Fragestellung der Mathematik wurden.
- So zeigt Lean eindrücklich, dass die Wahl der Axiome entscheidend für die Aufrechterhaltung der logischen Konsistenz eines Systems ist.
Lean als Beweisprüfer
- Sind die Axiome gut gewählt und Lean ist logisch korrekt, liefert es theoretisch verlässliche Schlüsse.
- Von einfachen Gleichungen bis zu sehr komplexen Sätzen (z. B. Fermat's Last Theorem) werden alle nach denselben Prinzipien geprüft.
- Bei großen Theoremen entsteht der vollständige Beweisbaum durch wiederholtes, aufeinander aufbauendes Beweisen von Unterstrukturen und Sätzen.
- Als Beispiel wird ein großes Projekt beschrieben, das Fermat's Last Theorem in Lean formalisiert, mit dem Ziel, dass am Ende ein vollständiges Beweissystem ohne
sorrysteht.
Die Freude am Lernen von Lean
- Das Beweisen in Lean ist eine kreative Verbindung von Programmierung und Mathematik.
- Anfangs geht es darum, einfache Aussagen zu beweisen; allmählich wird der Prozess, schrittweise immer komplexere und tiefere Mathematik rigoros aufzubauen, zur eigentlichen Freude.
- Offizielle Tutorials und Community-Materialien (z. B. Natural Numbers Game, Mathematics in Lean usw.) eignen sich gut für den Einstieg.
- Mit Lean formalisierst du die Logik direkt selbst und entdeckst die Schönheit hinter raffinierten Ideen und Argumenten erneut.
- Das Fazit lautet: Für manche Menschen macht Lean einfach besonderen Spaß, auch ohne äußeren Anlass.
1 Kommentare
Hacker-News-Kommentare
two_eq_twosehe wie eine Funktion aus. Es hat ja keine Argumente und ist daher eher eine Konstante, auch wenn ich natürlich verstehe, dass Konstanten letztlich Funktionen ohne Argumente sind. Überzeugender wäre vielleicht,x_eq_xwie unten zu verwenden und es in2_eq_2tatsächlich wie eine Funktion anzuwenden. Hier siehtx_eq_xwie eine Funktion aus und wird in2_eq_2auch tatsächlich so verwendet.xeinen Beweis vonx = xzurückbekommt – selbst noch etwas fremd ist und ein eigenes Thema verdient. Das werde ich im nächsten Artikel behandeln.rflund ähnliche) zu umfassend sind und man selbst mit Tutorials ihre genaue Bedeutung nur schwer erfassen kann. Bei C kann ich Zustandsänderungen bis auf Bit-Ebene verfolgen, aber Lean wirkt irgendwie unbestimmt. Auch die Syntax derrewrite- (rw-)Tactic fühlt sich für mich unnatürlich an.A = BundP(A,A)und wollte zuP(A,B)kommen, aberrewritefunktionierte aus schwer erklärbaren Gründen nicht – vermutlich wegen der Definition einer Zwischenstruktur. Metamath und dieset.mm-Datenbank hingegen verzichten ganz auf Tactics und lassen nur konkretes Schlussfolgern zu, also etwa nur Inferenzregeln wieax-mp. Das hat aber wiederum den Nachteil, dass man sich eine ganze Menge nützlicher Hilfslemmata merken muss.rewrite-Syntax wirke unnatürlich: Mich würde interessieren, was für dich eine natürlicherewrite-Syntax wäre.rewritefundamentaler wären als Addition. Lean scheint Addition eingebaut zu haben, aberrfloderrewritemuss man offenbar jedes Mal explizit anwenden. Vielleicht gibt es in Lean eine Art Prelude, das das automatisch übernimmt.rw [x], und ich finde sie so sehr schwer lesbar. Im Editor kann ich den Zustand jeder Zeile sehen, aber dafür muss ich ständig klicken, was den Fluss unterbricht. Bei Python wäre es genauso, wenn es keine Einrückung gäbe und man die Struktur eines Blocks nur durch Anklicken verstehen könnte. Vielleicht liegt das aus meiner Sicht an den eingeschränkten Befehlen am Anfang des Spiels, aber ich frage mich, ob sich dieser Lesefluss in einer echten, vollständigen Lean-Umgebung verbessert.by ...abkürzen. Ich weiß nicht, ob Lean etwas Vergleichbares hat, aber zumindest taugt das als Suchbegriff oder als Frage für ein Lean-Forum.introden Eintritt in einen Quantor bedeutet oderconstructorein Goal aufteilt. Im Grunde sind Tactics Makros oder eine DSL, die einen Beweisbaum beziehungsweise Termbaum erzeugen. Beim Lesen fühlt es sich für mich an wie das Manipulieren eines Baums – Teile zerlegen, Reihenfolge füllen usw. Trotzdem bleibt es dabei, dass man klicken muss, wenn man Zwischenaussagen im Beweis ganz genau sehen will. Beweise mit einer guten Idee lassen sich jedoch ähnlich klar lesen wie die logische Entwicklung in einem Paper. Wer also Absicht klar vermitteln will, schreibt gut lesbare Namen, eine klare Entwicklung, zieht kleine Lemmata heraus und notiert erst die Hypothesen, bevor ein kurzes Stück Beweiscode folgt. Umgekehrt wird das, was mathematisch offensichtlich, maschinell aber lästig ist, oft „gegolft“, also auf möglichst kurze Schreibweise gebracht. Dieser Golf-Stil macht den Code häufig kürzer, behandelt dann aber genau die Teile, die für Menschen ohnehin intuitiv sind. Kurz gesagt: Die Struktur beim Lesen von Lean ist implizit, aber man kann sie klarer machen, und je vertrauter man mit Tactics wird, desto besser erkennt man die Struktur auch ohne Klicken. Oft reicht schon ein Blick auf die Lemma-Namen, um den großen Fluss zu verstehen, und die Reihenfolge lässt sich leicht rekonstruieren.Die Lean-Community versammelt sich stark auf Zulip, und im Machine-Learning-for-Theorem-Proving-Kanal findet man viele relevante Threads und Referenzen.
sorry-Stellen selbst ausfülle (meine Lösungen sind hier).proof with "sorry") oder zusätzliche Axiome hineingeraten. Kann man zum Beispiel überprüfen, dass „ein Beweis in keiner Weisesorryverwendet“ oder dass er „nur von einer festen Axiomenmenge an Beweiskraft abhängt“?#print axioms some_theoremdürfte doch genau dafür ein Beispiel sein. Damit lässt sich sehen, ob ein Beweis direkt oder indirekt vonsorryoder von ungeprüften Axiomen abhängt.print axiomskann man prüfen, ob zusätzliche Axiome eingeführt wurden. Außerdem kann man darauf achten, ob der Code ohne Warnungen oder Fehler kompiliert. Das Utility SafeVerify fängt auch einige Tricks ab, die RL-Systeme gefunden haben.