Prax 2: lihtsa DPLL lahendaja realiseerimine

Allikas: Lambda

Ülesande sisuks on lihtsa DPLL lahendaja realiseerimine nullist.

Sisendiks oleks lahendajal triviaalses DIMACS formaadis CNF (conjunctive normal form ehk disjunktsioonide konjunktsioon) fail, näiteks:

c Example CNF format file
c
p cnf 4 3
1 3 -4 0
4 0 2
-3

Näiteid ja lisajuttu leiad: http://people.sc.fsu.edu/~jburkardt/data/cnf/cnf.html

Sinu programm peaks töötama lihtsalt käsurealt, võtma faili sisse, andma välja tulemuse ja soovitavalt veidi statistikat.

Tehnoloogia on vaba. Hea mõte on kasutada mõnda kiiremat, kompileeritud keelt a la C, C++, Java, C#.

Lahendaja peaks kindlasti sisaldama:

  • unit clausede propageerijat (ühikresolutsiooni tegemine)
  • rekursiivset splittijat (dpll põhiidee)

Mõistlik oleks realiseerida lahendaja nii, et ta ei genereeri füüsiliselt uusi disjunkte, vaid

  • muutujate teadaolevad väärtused on integer massiivis
  • muutujatel on küljes pointerite massiivid disjunktidele, kus ta esineb (eraldi negatiivsete ja positiivsete jaoks)
  • disjunktidel on küljes counterid seni määramata positiivsete ja määramata negatiivsete literaalide kohta

Kui tahad teha eriti vinget tõestajat (ei ole kohustuslik), tasub tutvuda:

Valmis saadud lahendajaga tuleks veidi eksperimenteerida:

  • loomulikult katsetada lihtsatel näidetel, et kas käib õieti
  • katsetada keerukamate näidete peal, et millistega veel hakkama saab ntx 5 sek vältel ja millistega mitte