2012-12-17 9 views
6

Ich versuche ein SAT-Problem mit 12000 booleschen Variablen mit Z3 zu lösen. Ich erwarte, dass die meisten Variablen in der Lösung als falsch bewertet werden. Gibt es eine Möglichkeit, Z3 als SAT-Solver zu führen oder anzudeuten, zuerst "polarity false" auszuprobieren? Ich habe es mit Cryptominisat 2 versucht und gute Ergebnisse erzielt.Z3 Polarität mit Z3 als SAT-Solver

+0

Willkommen bei Stack-Überlauf! Was hast du probiert? – IronMan84

+1

Ich habe mehrere CNF/DIMACS-Dateien mit wachsender Komplexität generiert. Einige können sofort von Z3/DIMACS gelöst werden. Andere nehmen Stunden oder enden überhaupt nicht. Ich habe Cryptominisat 2 für die Dateien verwendet und habe mehr davon gelöst, nachdem ich "--polarity-mode = false" hinzugefügt habe. In den INI-Parametern von Z3 konnte ich keinen polaritätsbezogenen Parameter finden. Daher hoffe ich, hier im Stackoverflow einen cleveren Hinweis zu finden. –

Antwort

5

Z3 ist eine Sammlung von Solvern und Präprozessoren. Wir können Hinweise für einige der Löser geben. Wenn der Befehl (check-sat) verwendet wird, wählt Z3 den Solver automatisch für uns aus. Wir sollten (check-sat-using <strategy>), wenn wir den Löser selbst auswählen möchten. Zum Beispiel weist der folgende Befehl Z3 an, einen booleschen SAT-Solver zu verwenden.

(check-sat-using sat) 

Wir können es zwingen, immer versuchen, „Polarität false“ zuerst unter Verwendung:

(check-sat-using (with sat :phase always-false)) 

Wir können auch die Vorverarbeitungsschritte steuern. Wenn wir die Formel in KNF setzen wollen, bevor sat aufrufen, sollten wir verwenden:

(check-sat-using (then tseitin-cnf (with sat :phase always-false))) 

EDIT: Wenn Sie das DIMACS Eingabeformat und Z3 V4.3.1 verwenden, dann können Sie nicht parametrieren alle verfügbaren Löser über die Befehlszeile. Die nächste Version wird sich mit dieser Einschränkung befassen. In der Zwischenzeit können Sie den Work-in-Progress-Zweig herunterladen:

git clone https://git01.codeplex.com/z3 -b unstable 

und kompilieren Z3. Dann Polarität falsch zu erzwingen, verwenden wir die Befehlszeilenoption

sat.phase=always_false 

Der Befehl z3 -pm:sat wird für dieses Modul alle verfügbaren Optionen anzuzeigen.

END EDIT

Hier ist ein vollständiges Beispiel in SMT 2.0 (auch online):

(declare-const p Bool) 
(declare-const q Bool) 
(declare-const r Bool) 
(declare-const s Bool) 

(assert (or (not p) (not q) (not r))) 
(assert (or r s)) 
(assert (or r (not s))) 
(assert (or r (and p q))) 

(echo "With always false") 
(check-sat-using (then tseitin-cnf (with sat :phase always-false))) 
(get-model) 
(echo "With always true") 
(check-sat-using (then tseitin-cnf (with sat :phase always-true))) 
(get-model) 
+0

Danke für die sofortige Antwort! –

+0

Derzeit verwende ich DIMACS als Eingabeformat für Z3. Soll ich meine DIMACS/CNF-Klauseln in das SMT-Format übersetzen, um Ihren Hinweis zu nutzen? Ich habe versucht, Z3 mein ursprüngliches Problem zu lösen, das als SMT-Satz boolescher Ausdrücke formuliert wurde. Aber ich habe festgestellt, dass der SAT-Solver in meinem Fall viel schneller ist. –

+0

Ich aktualisierte die Antwort mit Informationen, die für das DIMACS-Eingabeformat relevant sind. –