ゴール:
命題論理式(以降、論理式または式と呼ぶ)の式を取り、その式を論理積標準形で出力する完全なプログラムまたは関数を記述します。そこの2つの定数があり、⊤
そして⊥
単項演算子、真と偽を表す¬
否定を表す、およびバイナリ演算子は⇒
、⇔
、∧
、と∨
暗に、同値、接続詞、および論理和を表す、それぞれどの(通常の論理演算のすべてに従わドモルガンの法則を、二重否定の除去など)。
結合標準形は次のように定義されます。
- アトミック表現(
⊤
およびを含む⊥
)は、連言正規形です。 - 以前に作成された式の否定は、接続詞の正規形です。
- 以前に作成された2つの式の分離は、接続詞の正規形です。
- 以前に作成された2つの式の結合は、接続詞の正規形です。
- 他の表現は、接続型の通常の形式ではありません。
すべての論理式は、論理的に等価な論理積形式に変換できます(一意ではありません)(このアルゴリズムを参照)。その特定のアルゴリズムを使用する必要はありません。
入力:
入力は任意の形式で行うことができます。たとえば、シンボリック論理式(言語でサポートされている場合)、文字列、その他のデータ構造。ここで説明するように、true、false、および論理演算子に同じ記号を使用する必要はありませんが、選択は一貫している必要があり、明確でない場合は、回答で選択を説明する必要があります。他の入力を受け入れたり、入力形式で追加情報をエンコードしたりすることはできません。任意の数の原子式を表現する方法が必要です。例:整数、文字、文字列など
出力:
連想標準形の数式。これも便利な形式です。入力と同じ形式である必要はありませんが、違いがあるかどうかを説明する必要があります。
テストケース:
P ∧ (P ⇒ R) -> P ∧ R
P ⇔ (¬ P) -> ⊥
(¬ P) ∨ (Q ⇔ (P ∧ R)) -> ((¬ P) ∨ ((¬ Q) ∨ R)) ∧ ((¬ P) ∨ (Q ∨ (¬ R)))
ノート:
- 入力式がトートロジーの
⊤
場合、有効な出力になります。同様に、入力式が矛盾している場合⊥
は、有効な出力になります。 - 入力形式と出力形式の両方で、考えられるすべての論理式を表現できる明確に定義された操作順序が必要です。ある種の括弧が必要になるかもしれません。
- 論理演算には、インフィックス、プレフィックス、またはポストフィックス表記の明確に定義された選択を使用できます。選択が標準と異なる場合(否定は接頭辞、残りは接頭辞です)、回答でそれを説明してください。
- 連言正規形は一般に一意ではありません(並べ替えまでは)。あなたは出力にのみ必要な有効な形式を。
- ただし、アトミック式を表す場合、それらは論理定数、演算子、およびグループ化記号(ある場合)とは異なる必要があります。
- 連言正規形を計算する組み込み関数が許可されています。
- 標準の抜け穴は禁止されています。
- これはコードゴルフです。最短の回答(バイト単位)が優先されます。
P
あり(P ∨ Q) ∧ (P ∨ (¬Q))
、両方とも論理積形式です。