Tujuan:
Menulis sebuah program lengkap atau fungsi yang mengambil rumus di logika proposisional (selanjutnya disebut sebagai ekspresi logika atau ekspresi ) dan output yang formula dalam bentuk normal penghubung . Ada dua konstanta, ⊤
dan ⊥
mewakili benar dan salah, operator unary ¬
yang mewakili negasi, dan operator biner ⇒
, ⇔
, ∧
, dan ∨
mewakili implikasi, kesetaraan, hubungannya, dan disjungsi, masing-masing yang taat semua operasi logis biasa ( hukum DeMorgan , ganda negasi eliminasi , dll.).
Bentuk normal konjungtif didefinisikan sebagai berikut:
- Ekspresi atom apa pun (termasuk
⊤
dan⊥
) dalam bentuk normal konjungtif. - Peniadaan ekspresi yang dikonstruksikan sebelumnya dalam bentuk konjungtif normal.
- Disjungsi dari dua ekspresi yang dibangun sebelumnya adalah dalam bentuk normal konjungtif.
- Konjungsi dari dua ekspresi yang dibangun sebelumnya adalah dalam bentuk normal konjungtif.
- Ekspresi lain apa pun tidak dalam bentuk normal konjungtif.
Ekspresi logis apa pun dapat dikonversi (non-unik) menjadi ekspresi yang setara secara logis dalam bentuk normal konjungtif (lihat algoritma ini ). Anda tidak perlu menggunakan algoritma khusus itu.
Memasukkan:
Anda dapat mengambil input dalam format apa pun yang mudah; misalnya, ekspresi logis simbolis (jika bahasa Anda mendukungnya), string, beberapa struktur data lainnya. Anda tidak perlu menggunakan simbol yang sama untuk operator yang benar, salah, dan logis seperti yang saya lakukan di sini, tetapi pilihan Anda harus konsisten dan Anda harus menjelaskan pilihan Anda dalam jawaban Anda jika tidak jelas. Anda tidak boleh menerima input lain atau menyandikan informasi tambahan apa pun dalam format input Anda. Anda harus memiliki beberapa cara untuk mengekspresikan sejumlah ekspresi atom; misalnya bilangan bulat, karakter, string, dll.
Keluaran:
Rumus dalam bentuk normal konjungtif, lagi dalam format yang mudah. Tidak harus dalam format yang sama dengan input Anda, tetapi Anda harus menjelaskan jika ada perbedaan.
Kasus uji:
P ∧ (P ⇒ R) -> P ∧ R
P ⇔ (¬ P) -> ⊥
(¬ P) ∨ (Q ⇔ (P ∧ R)) -> ((¬ P) ∨ ((¬ Q) ∨ R)) ∧ ((¬ P) ∨ (Q ∨ (¬ R)))
Catatan:
- Jika ekspresi input adalah tautologi,
⊤
akan menjadi output yang valid. Demikian pula, jika ekspresi input adalah kontradiksi,⊥
akan menjadi output yang valid. - Baik format input dan output Anda harus memiliki urutan operasi yang terdefinisi dengan baik yang mampu mengekspresikan semua ekspresi logis yang mungkin. Anda mungkin membutuhkan semacam tanda kurung.
- Anda dapat menggunakan pilihan notasi infiks, awalan, atau postfix yang didefinisikan dengan baik untuk operasi logis. Jika pilihan Anda berbeda dari standar (negasi adalah awalan, sisanya adalah infix), tolong jelaskan itu dalam jawaban Anda.
- Bentuk normal konjungtif tidak unik pada umumnya (bahkan tidak untuk pemesanan ulang). Anda hanya perlu output suatu bentuk yang valid.
- Bagaimanapun Anda merepresentasikan ekspresi atom, mereka harus berbeda dari konstanta logis, operator, dan simbol pengelompokan (jika Anda memilikinya).
- Built-in yang menghitung bentuk normal konjungtif diizinkan.
- Celah standar dilarang.
- Ini adalah kode-golf ; jawaban terpendek (dalam byte) menang.
P
dan(P ∨ Q) ∧ (P ∨ (¬Q))
keduanya dalam bentuk normal konjungtif.Jawaban:
Maksima, 4 byte
Cobalah secara Online!
Anda dapat menggunakan
implies
,eq
,and
,or
operator untuk implikasi, kesetaraan, hubungannya, dan disjungsi masing-masing.sumber
Anda akan membenci saya ....
Mathematica, 23 byte
Input akan menggunakan
True
danFalse
bukannya⊤
dan⊥
, tetapi sebaliknya akan terlihat sangat mirip dengan notasi dari pertanyaan: semua karakter¬
,⇒
,⇔
,∧
, dan∨
diakui dalam Mathematica (ketika input dengan karakter UTF-8 00AC, F523, 29E6, 2227 , dan 2228, masing-masing), dan tanda kurung bertindak seperti yang Anda harapkan.Secara default, output akan menggunakan simbol yang disukai Mathematica: misalnya, test case terakhir akan menghasilkan
(! P || ! Q || R) && (! P || Q || ! R)
bukannya((¬ P) ∨ ((¬ Q) ∨ R)) ∧ ((¬ P) ∨ (Q ∨ (¬ R)))
. Namun, mengubah fungsinya menjadiakan membuat output terlihat cantik dan sesuai dengan simbol yang biasa ini:
sumber
JavaScript (ES6), 127 byte
Format I / O adalah sebagai berikut (dalam urutan diutamakan):
(
:(
)
:)
⊤
:1
⊥
:0
¬
:!
⇒
:<=
⇔
:==
∧
:&
∨
:|
Contoh:
Fungsi ini ditulis ulang secara sepele untuk menghasilkan bentuk normal disjungtif:
8 byte dapat disimpan dari versi ini jika saya diizinkan untuk menganggap prioritas di atas pada output juga, yang akan menghapus semua tanda kurung dari contoh output:
sumber