Obbiettivo:
Scrivi un programma o una funzione completa che prende una formula nella logica proposizionale (d'ora in poi definita espressione o espressione logica ) e genera quella formula in forma congiuntiva normale . Ci sono due costanti, ⊤
e ⊥
rappresentano vero e falso, un operatore unario ¬
rappresenta negazione e operatori binari ⇒
, ⇔
, ∧
, e ∨
rappresentano implicazione, equivalenza, congiunzione e disgiunzione, rispettivamente che obbediscono tutte le usuali operazioni logiche ( legge di DeMorgan , eliminazione doppia negazione , eccetera.).
La forma normale congiuntiva è definita come segue:
- Qualsiasi espressione atomica (incluso
⊤
e⊥
) è in forma normale congiuntiva. - La negazione di qualsiasi espressione precedentemente costruita è in forma normale congiuntiva.
- La disgiunzione di due espressioni precedentemente costruite è in forma normale congiuntiva.
- La congiunzione di due espressioni precedentemente costruite è in forma normale congiuntiva.
- Qualsiasi altra espressione non è in forma normale congiuntiva.
Qualsiasi espressione logica può essere convertita (in modo univoco) in un'espressione logicamente equivalente in forma congiuntiva normale (vedere questo algoritmo ). Non è necessario utilizzare quel particolare algoritmo.
Ingresso:
È possibile accettare input in qualsiasi formato conveniente; ad esempio, un'espressione logica simbolica (se la tua lingua lo supporta), una stringa, qualche altra struttura di dati. Non è necessario utilizzare gli stessi simboli per vero, falso e gli operatori logici come faccio qui, ma la tua scelta dovrebbe essere coerente e dovresti spiegare le tue scelte nella tua risposta se non è chiaro. Non puoi accettare nessun altro input o codificare qualsiasi informazione aggiuntiva nel tuo formato di input. Dovresti avere un modo di esprimere un numero arbitrario di espressioni atomiche; ad esempio numeri interi, caratteri, stringhe, ecc.
Produzione:
La formula in forma congiuntiva normale, sempre in qualsiasi formato conveniente. Non deve essere nello stesso formato del tuo input, ma dovresti spiegare se ci sono differenze.
Casi test:
P ∧ (P ⇒ R) -> P ∧ R
P ⇔ (¬ P) -> ⊥
(¬ P) ∨ (Q ⇔ (P ∧ R)) -> ((¬ P) ∨ ((¬ Q) ∨ R)) ∧ ((¬ P) ∨ (Q ∨ (¬ R)))
Appunti:
- Se l'espressione di input è una tautologia,
⊤
sarebbe un output valido. Allo stesso modo, se l'espressione di input è una contraddizione,⊥
sarebbe un output valido. - Entrambi i formati di input e output dovrebbero avere un ordine ben definito di operazioni in grado di esprimere tutte le possibili espressioni logiche. Potresti aver bisogno di parentesi di qualche tipo.
- È possibile utilizzare qualsiasi scelta ben definita di notazione infisso, prefisso o postfisso per le operazioni logiche. Se la tua scelta differisce dallo standard (la negazione è prefisso, il resto è infisso), spiegalo nella tua risposta.
- La forma normale congiuntiva non è unica in generale (nemmeno fino al riordino). Devi solo produrre un modulo valido.
- Comunque tu rappresenti le espressioni atomiche, devono essere distinte dalle costanti logiche, dagli operatori e dai simboli di raggruppamento (se ne hai).
- Sono ammessi incorporati che calcolano la forma normale congiuntiva.
- Sono vietate le scappatoie standard .
- Questo è code-golf ; la risposta più breve (in byte) vince.
P
e (P ∨ Q) ∧ (P ∨ (¬Q))
sono entrambi in forma normale congiuntiva.