In der Aussagenlogik gibt es Wahrheitstabellen. So können Sie überprüfen, ob die logische Struktur Ihrer Argumentation nicht per se korrekt ist, sondern ob sie beabsichtigt ist.
In der Prädikatenlogik habe ich keinen Verweis auf Wahrheitstabellen gesehen, noch habe ich eine Verwendung (wörtliche Verwendung) von Wahrheitstabellen gesehen, als ich nach Beispielen gesucht habe, in denen Wahrheitstabellen in PL verwendet werden.
Es wäre schön, die logische Struktur meiner eigenen Argumente zu überprüfen, da ich nicht immer jemanden haben werde, der meine eigene Arbeit validiert. Ich habe vor, meine logischen Fähigkeiten einzusetzen, aber ich möchte einen sicheren Weg, um sicherzustellen, dass meine Form korrekt ist :)
Wahrheitstabellen reichen nicht aus, um die Logik erster Ordnung (mit Quantoren) zu erfassen, daher verwenden wir stattdessen Inferenzregeln. Jede Folgerungsregel wird so gewählt, dass sie solide ist, was bedeutet, dass Sie, wenn Sie mit wahren Aussagen beginnen und die Regel anwenden, nur wahre Aussagen ableiten werden. Wir sagen, dass diese Regeln wahrheitserhaltend sind. Wenn Sie sorgfältig genug auswählen, können Sie es so machen, dass die Regeln nicht nur wahrheitserhaltend sind, sondern es Ihnen auch ermöglichen, jede (wohlgeformte) Aussage abzuleiten, die notwendigerweise (in allen Situationen) wahr ist.
Was Sie wahrscheinlich suchen (nämlich eine praktische Möglichkeit, die logische Gültigkeit Ihrer Argumente streng zu überprüfen), ist die natürliche Deduktion. Es gibt viele verschiedene Stile, der intuitivste Typ ist der Fitch-Stil , der Unterkontexte durch Einrückung oder eine ähnliche visuelle Abgrenzung markiert. Das folgende System verwendet Einrückungen und folgt meiner Meinung nach der Intuition am ehesten.
Jede Zeile ist entweder eine Überschrift oder eine Anweisung. Wir setzen einen Doppelpunkt nach jeder Überschrift und einen Punkt nach jeder Anweisung. Jeder Header gibt einen Subkontext an (der im aktuellen Kontext enthalten ist), und die Zeilen, die von diesem Header gesteuert werden, werden durch die Einrückung angezeigt. Der vollständige Kontext jeder Zeile wird durch alle Header angegeben, die sie regeln (dh alle nächsten Header darüber auf jeder niedrigeren Einrückungsebene).
Eine verschachtelte Fallanalyse könnte beispielsweise so aussehen:
Und über ein willkürliches Mitglied einer Sammlung nachdenken würde aussehen wie:
Beachten Sie, dass das, was in manchen Zusammenhängen gesagt wird, in anderen Zusammenhängen ungültig sein kann. Sobald Sie das Prinzip hinter Kontexten und Einrückungen verstanden haben, sind die folgenden Regeln sehr natürlich. Beachten Sie auch, dass für die Logik erster Ordnung diese beiden Arten von Kontextheadern (für bedingte Unterkontexte bzw. universelle Unterkontexte) die einzigen Arten sind, die benötigt werden.
Eine Aussage muss eine atomare (unteilbare) Aussage oder eine zusammengesetzte Aussage sein, die auf die übliche Weise unter Verwendung von Booleschen Operationen oder Quantoren gebildet wird, mit der Einschränkung, dass nicht jede Variable, die durch einen Quantor gebunden ist, bereits verwendet wird, um auf ein Objekt im aktuellen Kontext zu verweisen , und dass es keine verschachtelten Quantoren gibt, die dieselbe Variable binden.
Jede Folgerungsregel hat die Form:
Das heißt, wenn die letzten Zeilen, die Sie geschrieben haben, mit "X" übereinstimmen, können Sie unmittelbar danach auf derselben Einrückungsebene "Y" schreiben. Jede Anwendung einer Inferenzregel ist auch an den aktuellen Kontext gebunden, nämlich den Kontext von "X". Wir werden nicht ständig den „aktuellen Kontext“ erwähnen.
Nehmen Sie irgendwelche Aussagen (im aktuellen Kontext).
restate : Wenn wir etwas beweisen, können wir es im gleichen Kontext noch einmal bestätigen.
Beachten Sie, dass " " bezeichnen eine beliebige Anzahl von Zeilen, die sich mindestens auf der dargestellten Einrückungsebene befinden. In der obigen Regel bedeutet dies, dass alle seit dem früheren Schreiben von " geschriebenen Zeilen " muss sich im selben Kontext (oder einem Unterkontext) befinden.
In der Praxis schreiben wir eigentlich nie dieselbe Zeile zweimal. Um anzuzeigen, dass wir eine Zeile in einem Beweis weglassen können, markiere ich sie mit eckigen Klammern wie folgt:
⇒sub ⇒restate (Wir können einen bedingten Subkontext erstellen, in dem hält.)
⇒Einleitung ⇒elim
∧Einleitung ∧elim
∨Einleitung ∨elim
¬intro ¬elim ¬¬elim
Beachten Sie, dass wir durch die Verwendung von ¬intro und ¬¬elim die folgende zusätzliche Inferenzregel erhalten können:
was dem entspricht, wie man zu beweisen versuchen würde durch Widerspruch , nämlich um zu zeigen, dass vorausgesetzt impliziert eine Unwahrheit.
⇔Einleitung ⇔elim
Die Regeln hier gelten für eingeschränkte Quantifizierer, weil wir normalerweise in Bezug auf sie denken. Zuerst brauchen wir einige Definitionen.
Benutzte Variable : Eine Variable, die im Header eines enthaltenden ∀-Kontexts oder in einem vorangegangenen ∃-Eliminierungsschritt ("let") in einem enthaltenden Kontext deklariert ist.
Nicht verwendete Variable : Eine Variable, die nicht verwendet wird.
Frische Variable : Eine Variable, die in keiner vorherigen Anweisung in irgendeinem enthaltenden Kontext erscheint.
Objektausdruck : Ein Ausdruck, der sich auf ein Objekt bezieht (z. B. eine verwendete Variable oder ein Funktionssymbol, das auf Objektausdrücke angewendet wird).
Eigentum mit Parameter : Eine Zeichenfolge mit einigen Leerzeichen, wobei jedes Leerzeichen ein Etikett von hat Zu , sodass jedes Leerzeichen in ersetzt wird durch einen Objektausdruck ergibt eine Aussage. Wenn , Dann ist das Ergebnis des Ersetzens jedes beschrifteten Leerzeichens von und Ersetzen jedes markierten Leerzeichens von . Ähnlich für andere .
In diesem Abschnitt, (falls beteiligt) können beliebige Objektausdrücke (im aktuellen Kontext) sein.
Wir beginnen mit den folgenden Regeln, die einen Typ aller Objekte liefern.
Universum : ist ein Typ.
Nehmen Sie jetzt einen beliebigen Typ und eine 1-Parameter-Eigenschaft und eine unbenutzte Variable das taucht nicht auf oder .
∀sub ∀restate (Wir können einen ∀-Subkontext erzeugen, in dem ist vom Typ .)
( darf nicht vorkommen )
∀Einführung ∀elim
( darf keine ungenutzten Variablen mit teilen )
∃Einleitung ∃elim
(Wo ist eine frische Variable)
=Einführung =elimin
( darf keine ungenutzte Variable mit teilen )
Schließlich sind die folgenden Regeln zur Variablenumbenennung redundant, würden aber Beweise verkürzen.
∀umbenennen ∃umbenennen
(Wo ist eine unbenutzte Variable, die nicht in erscheint )
Der Einfachheit halber schreiben wir " „als Kurzform für“ ", und ähnlich für weitere Variablen und für " ". Wir werden auch verschachtelte ∀-Unterkontext-Header in der folgenden Form komprimieren:
Zu:
Zusätzlich, " " ist eine Kurzform für " ".
Hier ist ein Beispiel, wo sind alle Arten und ist eine beliebige Eigenschaft mit zwei Parametern.
Zuerst mit allen angezeigten Zeilen:
Wenn
: [⇒sub]
. [⇒sub]
Let
so dass
. [∃elim]
. [∃elim]
. [∃elim]
. [∀umbenennen]
Gegeben
: [∀sub]
. [∀sub]
. [∀wiederholen]
. [wiederholen]
. [∀elim]
. [∀wiederholen]
. [∃Einführung]
. [∀Einleitung]
. [⇒Einleitung]
Schließlich mit allen Zeilen in eckigen Klammern entfernt:
Wenn
: [⇒sub]
Let
so dass
. [∃elim]
Gegeben
: [∀sub]
. [∀elim]
. [∃Einführung]
. [∀Einleitung]
. [⇒Einleitung]
Dieser endgültige Beweis ist sauber und dennoch leicht computerüberprüfbar.
Um Definitionen zu erleichtern , die Beweise erheblich verkürzen können, haben wir auch die folgenden definitorialen Erweiterungsregeln.
Für jede -parameter-Eigenschaft und frisches Prädikatsymbol :
Für jede -parameter-Eigenschaft und frisches Funktionssymbol :
Diese Regeln sind insofern überflüssig, als dass jede beweisbare Aussage, die keines der neuen Symbole verwendet, bewiesen werden kann, ohne die definitorische Erweiterung zu verwenden.
Die obigen Regeln vermeiden die üblichen Schwierigkeiten, die viele andere Systeme haben, wo Variablen, die für Zeugen existentieller Aussagen verwendet werden, von Variablen unterschieden werden müssen, die für beliebige Objekte verwendet werden. Der Grund ist, dass hier jede Variable entweder durch einen ∀-Unterkontext oder durch eine „let“-Anweisung spezifiziert wird; dh es gibt keine freien Variablen. Die Tatsache, dass jede Variable gebunden ist, hängt stark damit zusammen, dass dieses System ein leeres Universum zulässt, wenn es keine anderen Axiome gibt.
Außerdem wird jede Variable durch einen eindeutigen Header oder eine "let"-Anweisung im aktuellen Kontext angegeben; mit anderen Worten, es gibt keine variable Abschattung. Dies ist so beabsichtigt, und in der tatsächlichen mathematischen Praxis halten wir uns auch daran, obwohl die meisten anderen formalen Systeme dies nicht tun. Als Konsequenz werden Sätze wie „ ." kann in diesem System einfach nicht geschrieben werden. Wenn Sie solche schrecklichen Sätze zulassen möchten, müssten Sie die Regeln entsprechend ändern, aber es wird höchstwahrscheinlich Kopfschmerzen verursachen.
Schließlich gab es einige subtile technische Entscheidungen. Für die Quantifiziererregeln, der Grund, warum ich das verlangt habe taucht nicht auf ist, dass wir, wenn wir später Regeln zum Spezifizieren von Typen hinzufügen, normalerweise Variablennamen in seiner Syntax haben würden, was Probleme verursachen würde. Wenn wir zum Beispiel im aktuellen Kontext geschrieben haben " " Und " "Es wird nicht sinnvoll sein, das Schreiben zuzulassen" ". Ebenso, wenn wir geschrieben haben " " Und " "Wir wollen das Schreiben nicht zulassen" ".
Damit eine Variable nach dem Verlassen des Subkontexts, in dem sie deklariert wurde, wieder frisch wird, habe ich gefordert, dass die ⇒intro- und ∀intro-Regeln nur unmittelbar nach dem entsprechenden ⇒-Subkontext oder ∀-Subkontext angewendet werden können. Es wäre einfacher, eine neue Variable einfach als eine zu definieren, die in keiner vorherigen Zeile vorkommt, aber dann können uns in einem langen Beweis leicht die frischen Variablennamen ausgehen.
~ ~ ~ ~ ~ ~ ~
Um die Flexibilität dieses Systems zu veranschaulichen, werde ich sowohl die Peano-Arithmetik als auch die Mengenlehre als zusätzliche Regeln ausdrücken, die dem System einfach hinzugefügt werden können.
Fügen Sie den Typ hinzu und die Symbole von PA, nämlich die Konstantensymbole und das -Funktionssymbole eingeben und das -Eingabe Prädikat-Symbol .
Fügen Sie die Axiome von PA hinzu , angepasst von hier :
Fügen Sie die Induktionsaxiome hinzu, und zwar für jede Eigenschaft mit nur den Symbolen von PA und Quantoren über füge das folgende Axiom hinzu (wobei taucht nicht auf ):
Fügen Sie den Typ hinzu und die Regel, dass jedes Mitglied von ist auch ein typ.
Fügen Sie die unären Funktionssymbole hinzu , die binären Funktionssymbole , und das Konstantensymbol . Wir verwenden das binäre Prädikat-Symbol wieder , da es keine Zweideutigkeit geben wird. Fügen Sie auch die folgenden Regeln (in jedem Kontext) für die andere Notation hinzu:
Fügen Sie die folgenden Axiome hinzu:
Fügen Sie die folgenden Regeln hinzu:
Typ-Notation
Nehmen Sie (im aktuellen Kontext) eine beliebige Eigenschaft und Objektausdruck und unbenutzte Variable .
Dann ist ein Typ und seine Mitgliedschaft wird geregelt durch:
. ( darf nicht vorkommen oder )
Verständnis
Nimm irgendein Eigentum und unbenutzte Variable .
. ( darf nicht vorkommen oder )
Ersatz
Such dir irgendeine aus -parameter-Eigenschaft und ungenutzte Variablen .
( darf nicht vorkommen oder )
Induktion
Nimm irgendein Eigentum mit Parameter ab .
( darf nicht vorkommen )
Die Induktionsregel fasst die Induktionsaxiome für PA zusammen, und im Wesentlichen besteht der einzige Unterschied darin, dass die Eigenschaft kann Mengenoperationen und Quantifizierung über Mengen umfassen.
Funktionsnotation
Diese Regel ist theoretisch unnötig, aber pragmatisch sehr praktisch (in der Informatik auch als Lambda-Ausdrücke bekannt).
Nimm irgendein Set und jeder Objektausdruck mit Parameter ab , und unbenutzte Variable .
Dann ist ein Objekt und sein Verhalten wird bestimmt durch:
Die Kombination der obigen Peano-Arithmetik plus der Mengenlehre ergibt ein grundlegendes System, das im Wesentlichen so stark wie ZFC, aber viel benutzerfreundlicher ist. Es ist auch agnostisch gegenüber der Existenz von Objekten, die keine Mengen sind, und geht nicht einmal davon aus, dass die Mitglieder von sind Sätze. Es behandelt auch kartesische Produkte und geordnete Paare als eingebaute abstrakte Begriffe. So verwenden wir sie in der eigentlichen Mathematik. (Genauer gesagt interpretiert das obige System ZFC minus Regularität direkt.)
Hagen von Eitzen
Dan Christensen
Stefan Mesken