Tor:
Schreiben Sie ein vollständiges Programm oder eine vollständige Funktion, die eine Formel in Aussagenlogik (im Folgenden als logischer Ausdruck oder Ausdruck bezeichnet ) verwendet und diese Formel in konjunktiver Normalform ausgibt . Es gibt zwei Konstanten sind , ⊤
und ⊥
repräsentieren wahr und falsch, ein unärer Operator ¬
Negation repräsentiert, und binäre Operatoren ⇒
, ⇔
, ∧
, und ∨
repräsentiert Implikation, Äquivalenz, Konjunktion und Disjunktion bzw. dem gehorchen alle üblichen logischen Operationen ( DeMorgan-Gesetz , doppelte Negation Eliminierung , usw.).
Die konjunktive Normalform ist wie folgt definiert:
- Jeder atomare Ausdruck (einschließlich
⊤
und⊥
) liegt in konjunktiver Normalform vor. - Die Negation eines zuvor konstruierten Ausdrucks erfolgt in konjunktiver Normalform.
- Die Disjunktion von zwei zuvor konstruierten Ausdrücken erfolgt in konjunktiver Normalform.
- Die Konjunktion von zwei zuvor konstruierten Ausdrücken erfolgt in konjunktiver Normalform.
- Jeder andere Ausdruck liegt nicht in konjunktiver Normalform vor.
Jeder logische Ausdruck kann (nicht eindeutig) in einen logisch äquivalenten Ausdruck in konjunktiver Normalform umgewandelt werden (siehe diesen Algorithmus ). Sie müssen diesen bestimmten Algorithmus nicht verwenden.
Eingang:
Sie können Eingaben in jedem beliebigen Format vornehmen. zB ein symbolischer logischer Ausdruck (sofern Ihre Sprache dies unterstützt), eine Zeichenfolge oder eine andere Datenstruktur. Sie müssen nicht dieselben Symbole für wahr, falsch und die logischen Operatoren verwenden wie hier, aber Ihre Auswahl sollte konsistent sein und Sie sollten Ihre Auswahl in Ihrer Antwort erläutern, wenn dies nicht klar ist. Sie dürfen keine anderen Eingaben akzeptieren oder zusätzliche Informationen in Ihrem Eingabeformat codieren. Sie sollten eine Möglichkeit haben, eine beliebige Anzahl von atomaren Ausdrücken auszudrücken. zB Ganzzahlen, Zeichen, Zeichenfolgen usw.
Ausgabe:
Die Formel in konjunktiver Normalform, wiederum in einem beliebigen geeigneten Format. Es muss nicht das gleiche Format wie Ihre Eingabe haben, aber Sie sollten erklären, ob es Unterschiede gibt.
Testfälle:
P ∧ (P ⇒ R) -> P ∧ R
P ⇔ (¬ P) -> ⊥
(¬ P) ∨ (Q ⇔ (P ∧ R)) -> ((¬ P) ∨ ((¬ Q) ∨ R)) ∧ ((¬ P) ∨ (Q ∨ (¬ R)))
Anmerkungen:
- Wenn der Eingabeausdruck eine Tautologie ist,
⊤
wäre dies eine gültige Ausgabe. Wenn der Eingabeausdruck ein Widerspruch ist,⊥
wäre dies ebenfalls eine gültige Ausgabe. - Sowohl Ihr Eingabe- als auch Ihr Ausgabeformat sollten eine genau definierte Reihenfolge von Operationen haben, die alle möglichen logischen Ausdrücke ausdrücken können. Möglicherweise benötigen Sie Klammern.
- Sie können für die logischen Operationen eine genau definierte Auswahl an Infix-, Präfix- oder Postfix-Notationen verwenden. Wenn Ihre Wahl vom Standard abweicht (Negation ist Präfix, der Rest ist Infix), erklären Sie dies bitte in Ihrer Antwort.
- Die konjunktive Normalform ist im Allgemeinen nicht eindeutig (nicht einmal bis zur Neuordnung). Sie müssen nur ein gültiges Formular ausgeben .
- Wie auch immer Sie atomare Ausdrücke darstellen, sie müssen sich von den logischen Konstanten, Operatoren und Gruppierungssymbolen unterscheiden (falls vorhanden).
- Eingebaute, die die konjunktive Normalform berechnen, sind zulässig.
- Standardlücken sind verboten.
- Das ist Code-Golf ; Die kürzeste Antwort (in Bytes) gewinnt.
P
und (P ∨ Q) ∧ (P ∨ (¬Q))
sind beide in konjunktive Normalform.