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
Antwort
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)
Danke für die sofortige Antwort! –
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. –
Ich aktualisierte die Antwort mit Informationen, die für das DIMACS-Eingabeformat relevant sind. –
- 1. Zweck von z3 :: Taktik und z3 :: Ziel
- 2. Z3 Kompilierungsoption
- 3. Mehrfachgewinde Z3?
- 4. Lesen func interp eines z3-Arrays aus dem z3-Modell
- 5. Sortiervererbung in z3
- 6. z3 Echte Exponentiation
- 7. Überprüfen Sie Überlauf mit Z3
- 8. Wie variabel verstecken mit Z3
- 9. z3/python Reale
- 10. HORN Klausel Z3 Dokumentation
- 11. Z3-Quantor-Unterstützung
- 12. Lesen einer Z3-Datei
- 13. z3 C++ API & ite
- 14. Segmentierungsfehler für Z3 SMT
- 15. Z3-Power-Modulo-Anweisungen
- 16. z3 falsch sagen UNSAT
- 17. Z3-Invariant-Check
- 18. Annahmen in Z3 oder Z3Py
- 19. Auslösen von Problemen in Z3
- 20. Drucken interner Solverformeln in z3
- 21. z3 und z3PY unterschiedliche Ergebnisse
- 22. Wie behandelt Z3 nichtlineare Ganzzahlarithmetik?
- 23. Entscheidbare sqrt Funktion in Z3
- 24. Angeben anfänglicher Modellwerte für Z3
- 25. Z3: Finden aller befriedigenden Modelle
- 26. Z3 C# API Assertion entfernen
- 27. Z3-Leistung mit nicht-linearer Arithmetik
- 28. z3 C++ API: Operation von expr
- 29. z3: Hinzufügen von Variablendeklarationen in den Assertionen
- 30. Die Indizierung gebundener Variablen in Z3 verstehen
Willkommen bei Stack-Überlauf! Was hast du probiert? – IronMan84
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. –