Mantıksal bir ifadeyi konjonktif normal forma dönüştürme


10

Hedef:

Formül önerme mantığında (bundan sonra mantıksal ifade veya ifade olarak anılır ) alan ve bu formülü konjonktif normal formda çıkaran eksiksiz bir program veya işlev yazın . Orada iki sabittir, ve bir tek terimli operatör, doğru ve yanlış temsil ¬olumsuzlamasıydı temsil ve ikili operatörler , , ve ima, eşdeğerlik, bağlaç, ve ayrılmalara temsil sırasıyla hangi (olağan mantıksal işlemlerin hepsi itaat DeMorgan kanunu , çift olumsuzluk ortadan kaldırılması , vb.).

Konjonktif normal form aşağıdaki gibi tanımlanır:

  1. Herhangi bir atomik ifade ( ve dahil ) konjonktif normal formdadır.
  2. Önceden oluşturulmuş herhangi bir ifadenin reddi, konjonktif normal formdadır.
  3. Önceden oluşturulmuş herhangi iki ifadenin ayrılması, konjonktif normal formdadır.
  4. Önceden oluşturulmuş herhangi iki ifadenin birleşimi, konjonktif normal formdadır.
  5. Başka herhangi bir ifade konjonktif normal formda değildir.

Herhangi bir mantıksal ifade, konjonktif normal formda mantıksal olarak eşdeğer bir ifadeye dönüştürülebilir (benzersiz olmayan) ( bu algoritmaya bakınız ). Bu algoritmayı kullanmanıza gerek yoktur.

Giriş:

Herhangi bir uygun formatta girdi alabilirsiniz; örneğin, sembolik bir mantıksal ifade (diliniz destekliyorsa), bir dize, başka bir veri yapısı. Burada yaptığım gibi doğru, yanlış ve mantıksal işleçler için aynı sembolleri kullanmanıza gerek yoktur, ancak seçiminiz tutarlı olmalı ve net değilse cevabınızda seçimlerinizi açıklamalısınız. Başka bir girişi kabul edemez veya giriş biçiminizdeki ek bilgileri kodlayamazsınız. Rastgele sayıda atom ifadesini ifade etmenin bir yoluna sahip olmalısınız; tamsayılar, karakterler, dizgiler vb.

Çıktı:

Formül konjonktif normal formda, yine herhangi bir uygun formatta. Girişinizle aynı formatta olması gerekmez, ancak herhangi bir fark olup olmadığını açıklamanız gerekir.

Test senaryoları:

P ∧ (P ⇒ R) -> P ∧ R
P ⇔ (¬ P) -> ⊥
(¬ P) ∨ (Q ⇔ (P ∧ R)) -> ((¬ P) ∨ ((¬ Q) ∨ R)) ∧ ((¬ P) ∨ (Q ∨ (¬ R)))

Notlar:

  1. Giriş ifadesi bir totoloji ise, geçerli bir çıktı olur. Benzer şekilde, girdi ifadesi bir çelişki ise, geçerli bir çıktı olur.
  2. Hem giriş hem de çıkış biçimleriniz, tüm olası mantıksal ifadeleri ifade edebilen iyi tanımlanmış bir işlem sırasına sahip olmalıdır. Bir çeşit parantez gerekebilir.
  3. Mantıksal işlemler için iyi tanımlanmış herhangi bir infix, önek veya postfix gösterimi kullanabilirsiniz. Seçiminiz standarttan farklıysa (olumsuzlama önek, geri kalanı infix), lütfen cevabınızda bunu açıklayın.
  4. Konjonktif normal form genel olarak benzersiz değildir (yeniden sıralamaya kadar bile değil). Sen çıkış gereken tek bir geçerli formu.
  5. Atom ifadelerini temsil etmenize rağmen, mantıksal sabitlerden, işleçlerden ve gruplama sembollerinden (bunlara sahipseniz) farklı olmaları gerekir.
  6. Konjonktif normal formu hesaplayan yerleşiklere izin verilir.
  7. Standart boşluklar yasaktır.
  8. Bu ; en kısa cevap (bayt cinsinden) kazanır.


1
CNF yeniden sıralamaya kadar benzersiz değildir: eşdeğer ifadeler Pve (P ∨ Q) ∧ (P ∨ (¬Q))her ikisi de konjonktif normal formdadır.
Greg Martin

1
Tautoloji / çelişki kontrolü, CNF dönüşümüyle ilgili olmayan ikinci bir görevdir, bu yüzden bu gereksinimi bırakıp kendi zorluğuna sokmayı öneririm.
Laikoni

@Laikoni Çok doğru. Soruyu, bunların istenen çıktılar yerine totolojiler ve çelişkiler için olası çıktılar olduğunu söyleyerek güncelledim.
ngenisis

Yanıtlar:


1

Maxima, 4 bayt

pcnf

Çevrimiçi Deneyin!

Sen kullanabilirsiniz implies, eq, and, or sırasıyla çıkarım, denklik, birlikte, ve ayrılmalara ilişkin operatörler.


8

Benden nefret edeceksin ...

Mathematica, 23 bayt

#~BooleanConvert~"CNF"&

Giriş kullanacak Trueve Falseyerine ve sorunun notasyonu çok benzer bakacağız aksi fakat: karakterlerin hepsi ¬, , , , ve Mathematica (tanınan zaman 2227 UTF-8 karakter 00AC, F523, 29E6 ile giriş ve sırasıyla 2228) ve parantezler beklediğiniz gibi davranır.

Varsayılan olarak, çıktı Mathematica tercih ettiği semboller kullanır: Örneğin, son test durumu irade çıkışı (! P || ! Q || R) && (! P || Q || ! R)yerine ((¬ P) ∨ ((¬ Q) ∨ R)) ∧ ((¬ P) ∨ (Q ∨ (¬ R))). Ancak, işlevi

TraditionalForm[#~BooleanConvert~"CNF"]&

çıktının güzel görünmesini ve bu olağan simgelere uymasını sağlayacaktır:

geleneksel form


2

JavaScript (ES6), 127 bayt

f=(s,t='',p=s.match(/[A-Z]/),r=RegExp(p,'g'))=>p?'('+f(s.replace(r,1),t+'|'+p)+')&('+f(s.replace(r,0),t+'|!'+p)+')':eval(s)?1:0+t

G / Ç formatı aşağıdaki gibidir (öncelik sırasına göre):

  • (: (
  • ): )
  • : 1
  • : 0
  • ¬: !
  • : <=
  • : ==
  • : &
  • : |

Örnekler:

P&(P<=R) -> ((1)&(0|P|!R))&((0|!P|R)&(0|!P|!R))
P==(!P) -> (0|P)&(0|!P)
(!P)|(Q==(P&R)) -> (((1)&(0|P|Q|!R))&((0|P|!Q|R)&(1)))&(((1)&(1))&((1)&(1)))

İşlev ayrık normal form üretmek için önemsiz bir şekilde yeniden yazılır:

f=(s,t='',p=s.match(/[A-Z]/),r=RegExp(p,'g'))=>p?'('f(s.replace(r,1),t+'&'+p)+')|('+f(s.replace(r,0),t+'&!'+p)+')':eval(s)?1+t:0

Çıktıda yukarıdaki önceliği de benimsememe izin verilirse, 8 bayt bu sürümden kaydedilebilir, bu da çıktı örneklerinden tüm parantezleri kaldıracaktır:

P&(P<=R) -> ((1&P&R)|(0))|((0)|(0))
P==(!P) -> (0)|(0)
(!P)|(Q==(P&R)) -> (((1&P&Q&R)|(0))|((0)|(1&P&!Q&!R)))|(((1&!P&Q&R)|(1&!P&Q&!R))|((1&!P&!Q&R)|(1&!P&!Q&!R)))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.