Objectif:
Écrivez un programme ou une fonction complète qui prend une formule en logique propositionnelle (désormais appelée expression ou expression logique ) et produit cette formule sous une forme normale conjonctive . Il y a deux constantes, ⊤
et ⊥
représentant vrai et faux, un opérateur unaire ¬
représentant la négation, et les opérateurs binaires ⇒
, ⇔
, ∧
et ∨
représentant l' implication, l' équivalence, la conjonction et disjonction, respectivement , qui obéissent à toutes les opérations logiques habituelles ( la loi de De Morgan , l' élimination double négation , etc.).
La forme normale conjonctive est définie comme suit:
- Toute expression atomique (y compris
⊤
et⊥
) est sous forme normale conjonctive. - La négation de toute expression précédemment construite se présente sous une forme normale conjonctive.
- La disjonction de deux expressions précédemment construites est sous forme normale conjonctive.
- La conjonction de deux expressions précédemment construites est sous forme normale conjonctive.
- Toute autre expression n'est pas sous forme normale conjonctive.
Toute expression logique peut être convertie (de manière non unique) en une expression logiquement équivalente sous forme normale conjonctive (voir cet algorithme ). Vous n'avez pas besoin d'utiliser cet algorithme particulier.
Contribution:
Vous pouvez prendre des entrées dans n'importe quel format pratique; par exemple, une expression logique symbolique (si votre langue le prend en charge), une chaîne, une autre structure de données. Vous n'avez pas besoin d'utiliser les mêmes symboles pour vrai, faux et les opérateurs logiques que je fais ici, mais votre choix doit être cohérent et vous devez expliquer vos choix dans votre réponse si ce n'est pas clair. Vous ne pouvez accepter aucune autre entrée ou encoder des informations supplémentaires dans votre format d'entrée. Vous devriez avoir un moyen d'exprimer un nombre arbitraire d'expressions atomiques; par exemple des entiers, des caractères, des chaînes, etc.
Production:
La formule sous forme normale conjonctive, encore une fois dans n'importe quel format pratique. Il n'est pas nécessaire qu'elle soit dans le même format que votre entrée, mais vous devez expliquer s'il y a des différences.
Cas de test:
P ∧ (P ⇒ R) -> P ∧ R
P ⇔ (¬ P) -> ⊥
(¬ P) ∨ (Q ⇔ (P ∧ R)) -> ((¬ P) ∨ ((¬ Q) ∨ R)) ∧ ((¬ P) ∨ (Q ∨ (¬ R)))
Remarques:
- Si l'expression d'entrée est une tautologie,
⊤
serait une sortie valide. De même, si l'expression d'entrée est une contradiction,⊥
serait une sortie valide. - Vos formats d'entrée et de sortie doivent avoir un ordre d'opérations bien défini capable d'exprimer toutes les expressions logiques possibles. Vous pourriez avoir besoin de parenthèses.
- Vous pouvez utiliser n'importe quel choix bien défini d'infixation, de préfixe ou de postfixation pour les opérations logiques. Si votre choix diffère de la norme (la négation est un préfixe, le reste est un infixe), veuillez l'expliquer dans votre réponse.
- La forme normale conjonctive n'est pas unique en général (pas même jusqu'à la réorganisation). Il vous suffit de sortir un formulaire valide.
- Quelle que soit la manière dont vous représentez les expressions atomiques, elles doivent être distinctes des constantes logiques, des opérateurs et des symboles de regroupement (si vous en avez).
- Les fonctions intégrées qui calculent la forme normale conjonctive sont autorisées.
- Les failles standard sont interdites.
- C'est du code-golf ; la réponse la plus courte (en octets) l'emporte.
P
et (P ∨ Q) ∧ (P ∨ (¬Q))
sont toutes deux sous forme normale conjonctive.