Próbuję rozwiązać problem SAT z 12000 zmiennych boolowskich za pomocą Z3. Spodziewam się, że większość zmiennych oceni jako fałszywe w rozwiązaniu. Czy istnieje sposób na przypomnienie lub wskazanie Z3 jako solver SAT, aby najpierw spróbować "polaryzacji fałszywej"? Próbowałem go z cryptominisat 2 i uzyskałem dobre wyniki.Biegunowość Z3 za pomocą Z3 jako SAT Solver
Odpowiedz
Z3 to zbiór solverów i preprocesorów. Możemy dostarczyć wskazówek dla niektórych solverów. Gdy zostanie użyte polecenie (check-sat)
, Z3 wybierze dla nas automatycznie solver. Powinniśmy (check-sat-using <strategy>)
, jeśli chcemy samodzielnie wybrać solver. Na przykład następujące polecenie pokaże Z3, aby użył Boolowskiego SAT solver.
(check-sat-using sat)
Możemy zmusić go zawsze wypróbować „polaryzację false” najpierw za pomocą:
(check-sat-using (with sat :phase always-false))
Możemy również kontrolować czynności wstępnego przetwarzania. Jeśli chcemy umieścić formułę w CNF przed wywołaniem sat
powinniśmy używać:
(check-sat-using (then tseitin-cnf (with sat :phase always-false)))
EDIT: jeśli używasz formatu wejściowego DIMACS i Z3 v4.3.1, to nie można ustawić parametry wszystkie dostępne solwery za pomocą wiersza poleceń. Następne wydanie rozwiąże to ograniczenie. Tymczasem można pobrać gałąź prac w toku, używając:
git clone https://git01.codeplex.com/z3 -b unstable
i skompilować Z3. Następnie, aby zmusić polaryzacją fałszywe, używamy opcji wiersza poleceń
sat.phase=always_false
Komenda z3 -pm:sat
wyświetli wszystkie dostępne opcje dla tego modułu.
END EDIT
Powyżej znajduje się pełna przykład w SMT 2.0 (również 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)
Dzięki za natychmiastową odpowiedź! –
Obecnie używam DIMACS jako formatu wejściowego dla Z3. Czy powinienem przetłumaczyć moje klauzule DIMACS/CNF na format SMT, aby skorzystać z podpowiedzi? Próbowałem pozwolić Z3 rozwiązać mój pierwotny problem sformułowany jako zestaw wyrażeń logicznych SMT. Ale odkryłem, że solver SAT jest znacznie szybszy w moim przypadku. –
Zaktualizowałem odpowiedź, podając informacje istotne dla formatu wejściowego DIMACS. –
- 1. drukowanie formuł wewnętrznych solver w z3
- 2. Sprawdź przepełnienie za pomocą Z3
- 3. Z3: znajdowanie wszystkich satysfakcjonujących modeli
- 4. Czytaj func interp tablicy z3 z modelu z3
- 5. Obsługa kwantyfikatora Z3
- 6. kwantyfikatorów w Z3
- 7. z3 C++ API & ite
- 8. Wynik kontrprzykładu Z3
- 9. Definiowanie teorii zbiorów za pomocą Z3/SMT-LIB2
- 10. Jak ukryć zmienną Z3
- 11. Czy Z3 może pracować w trybie przyrostowym?
- 12. Czy Z3 może być używany do wnioskowania o podciągach?
- 13. Czy obsługa Z3 Interpolacja Craiga
- 14. Różnica między Z3 i coq
- 15. TryFor w Z3 nie przestaje sprawdzać po podanym limicie czasu
- 16. Szukasz praktycznych przykładów zastosowań SMT Z3 (jak DbC) i alternatywy open source dla Z3?
- 17. Zrozumienie indeksowania powiązanych zmiennych w Z3
- 18. QF_FPA? Czy Z3 obsługuje arytmetykę IEEE-754?
- 19. Jak uzyskać losowe wyniki z Microsoft Z3?
- 20. Równoważnik określenia-zabawy w Z3 API
- 21. typ danych zawiera zestaw w Z3
- 22. Stosowanie taktyki Z3 QFNRA z typami danych: interakcja lub podpowiedź
- 23. (get-unsat-core) zwraca pustą wartość w Z3
- 24. Czy Z3 może być używany do wstępnego przetwarzania problemów?
- 25. Jak używać Z3 SMT-LIB online do rozwiązywania problemów ze wzmacniaczami operacyjnymi
- 26. W jaki sposób Z3 obsługuje arytmetyczną liczbę całkowitą nieliniową?
- 27. Czy liczenie odwołań Z3_ast zawiera odniesienia poza Z3?
- 28. Jaka jest różnica między "uproszczeniem" i "uproszczeniem ctx-solvera" w Z3
- 29. Kompilatory tłumaczące algorytmy weryfikacji na problemy SAT
- 30. Zrozumienie skutki produkują-dowodów, nazwy pól i pośredni check-SAT w serwisie wydajności
Witamy na przepełnienie stosu! Co próbujesz? – IronMan84
Wygenerowałem kilka plików CNF/DIMACS z rosnącą złożonością. Niektóre mogą być rozwiązane od razu przez Z3/DIMACS. Inne trwają godzinami lub wcale się nie kończą. Użyłem Cryptominisat 2 dla plików i udało mi się je rozwiązać po dodaniu "--polarity-mode = false". W parametrach INI Z3 nie mogłem znaleźć parametru związanego z polaryzacją. Dlatego mam nadzieję znaleźć jakąś mądrą wskazówkę tutaj w stackoverflow. –