Narzędzie do sprawdzania twierdzeń z3 zajmuje dużo czasu, aby rozwiązać formułę, która moim zdaniem powinna być w stanie poradzić sobie z łatwością. Aby to lepiej zrozumieć i ewentualnie zoptymalizować moje dane wejściowe do Z3, chciałem zobaczyć wewnętrzne ograniczenia, które z3 generuje jako część procesu rozwiązywania. Jak wydrukować formułę, którą z3 tworzy dla swoich solverów, gdy używasz z3 z wiersza poleceń?drukowanie formuł wewnętrznych solver w z3
Odpowiedz
Narzędzie wiersza poleceń Z3 nie ma takiej opcji. Co więcej, Z3 zawiera kilka solverów i etapów wstępnego przetwarzania. Nie jest jasne, który krok byłby dla ciebie przydatny. Kod źródłowy Z3 jest dostępny pod adresem https://github.com/Z3Prover/z3. Kiedy Z3 jest kompilowany w trybie debugowania, zapewnia dodatkową opcję linii poleceń: -tr:<tag>
. Ta opcja może być używana do selektywnego zrzucania informacji. Na przykład, plik źródłowy nlsat_solver.cpp
zawiera następującą instrukcję:
TRACE("nlsat", tout << "starting search...\n"; display(tout);
tout << "\nvar order:\n";
display_vars(tout););
Polecenie opcja wiersza -tr:nlsat
poinstruuje Z3 do wykonania instrukcji powyżej. tout
to strumień wyjściowy śledzenia. Zostanie on zapisany w pliku .z3-trace
. Źródło Z3 jest pełne tych poleceń TRACE
. Ponieważ kod jest dostępny, możemy również dodać własne komendy śledzenia w kodzie.
Jeśli umieścisz swój przykład, mogę powiedzieć, które komponenty Z3 są używane do wstępnego przetworzenia i rozwiązania. Następnie możemy wybrać, które "tagi" powinniśmy włączyć do śledzenia.
EDIT (po constraints zostały wysłane): Twój przykład jest w mieszanym całkowitą & rzeczywistym nieliniowej arytmetyki. Nowy nieliniowy moduł arytmetyczny (nlsat
) w Z3 nie obsługuje to_int
. W ten sposób do rozwiązywania problemu służy rozwiązany ogólnego przeznaczenia Z3. Chociaż ten solver akceptuje prawie wszystko, nie jest on nawet kompletny dla nieliniowej rzeczywistej arytmetyki. Nieliniowe wsparcie dla tego solver opiera się na: analizie przedziałowej i obliczeniach Grobnera. Ten solver jest zaimplementowany w folderze src/smt
(w unstable branch). Moduł arytmetyczny jest zaimplementowany w plikach theory_arith*
. Opcja dobrej linii poleceń śledzenia to -tr:after_reduce
. Wyświetli zestaw wiązań po wstępnym przetworzeniu. Wąskim gardłem jest moduł arytmetyczny (theory_arith*
).
Uwagi dodatkowe
problem jest w nierozstrzygalnym fragmentu: mieszany całkowitą & rzeczywistym nieliniowe arytmetycznych. Oznacza to, że niemożliwe jest napisanie dźwięku i pełne rozwiązanie dla tego fragmentu. Oczywiście możemy napisać rozwiązanie, które rozwiązuje przypadki, które znajdziemy w praktyce. Uważam, że możliwe jest rozszerzenie
nlsat
w celu obsługito_int
.Jeśli unikniesz
to_int
, będziesz mógł użyćnlsat
. Problem tkwi w nieliniowym rzeczywistym fragmencie arytmetycznym. Rozumiem, że może to być trudne, ponieważ kodowanieto_int
wydaje się być kluczową rzeczą.Kod w gałęzi "niestabilny" na stronie z3.codeplex.com jest znacznie lepiej zorganizowany niż wersja oficjalna w gałęzi "master". Wkrótce połączę to z oddziałem "master".Możesz pobrać gałąź "niestabilną", jeśli chcesz grać z kodem źródłowym.
Oddział "niestabilny" korzysta z nowego systemu kompilacji. Możesz zbudować wersję Release ze wsparciem śledzenia. Po wygenerowaniu pliku Makefile wystarczy użyć opcji
-t
.
skrypty python/mk_make.py -t
- Kiedy Z3 jest skompilowany w trybie debugowania, opcja
AUTO_CONFIG=false
domyślnie. Aby odtworzyć zachowanie trybu "Release", należy podać opcję wiersza poleceń:AUTO_CONFIG=true
.
- 1. Biegunowość Z3 za pomocą Z3 jako SAT Solver
- 2. Obsługa kwantyfikatora Z3
- 3. Równoważnik określenia-zabawy w Z3 API
- 4. Excel Solver w Pythonie
- 5. Z3: znajdowanie wszystkich satysfakcjonujących modeli
- 6. Czytaj func interp tablicy z3 z modelu z3
- 7. kwantyfikatorów w Z3
- 8. TryFor w Z3 nie przestaje sprawdzać po podanym limicie czasu
- 9. Solver QP dla Javy
- 10. Objaśnienie kodu Sudoku Solver
- 11. Excel jak formuł z pand
- 12. Excel: Zmień wiele formuł naraz?
- 13. Jak ukryć zmienną Z3
- 14. z3 C++ API & ite
- 15. Wynik kontrprzykładu Z3
- 16. Zatrzymany w Solvoku soltrackowanie solver (Java)
- 17. Zmiana parametrów solver w Caffe poprzez pycaffe
- 18. Deklarowanie typów wewnętrznych w F #
- 19. statyczne pola w wewnętrznych klas
- 20. Ustawodawcy nieruchomości wewnętrznych w C#
- 21. Czy obsługa Z3 Interpolacja Craiga
- 22. Sprawdź przepełnienie za pomocą Z3
- 23. Różnica między Z3 i coq
- 24. Czy Z3 może pracować w trybie przyrostowym?
- 25. Zrozumienie indeksowania powiązanych zmiennych w Z3
- 26. typ danych zawiera zestaw w Z3
- 27. Czy Z3 może być używany do wnioskowania o podciągach?
- 28. Optymalizacja pętli wewnętrznych Haskell
- 29. Jaka jest różnica między "uproszczeniem" i "uproszczeniem ctx-solvera" w Z3
- 30. Solver Foundation Optimization - 1D Bin Packing
Dziękujemy za szybkie odpowiedzi. – user1779685
Dziękuję również za link do kodu źródłowego: nie wiedziałem, że został wydany. Jak sugerujesz, spróbuję użyć tagów i śledzenia, by zrzucić selektywne informacje. Gdybyś mógł podać wskazówki dotyczące tego, jakie moduły mogą być zaangażowane, byłby bardzo pomocny - pomógłby mi też dostroić ograniczenia - uważam, że może nie używać z3 w najlepszy możliwy sposób dla tego problemu. stackoverflow nie pozwala mi wkleić tego kodu: prawdopodobnie przekracza limit linii dla postu. Spróbuję opublikować to ponownie jako nowy post lub części destylacji ograniczeń i postów, jednocześnie będąc zrozumiałym. – user1779685
(dochodzić (> = ab)) (dochodzić (i (< a 128.0) (> = a 1,0))) (dochodzić (i (< b 128.0) (> = B 0,5))) (dochodzić (i (< c 128.0) (> = C 0,5))) (assert (= dwa-do-p (to_realne (^ 2 23)))) ; Wykładnik obliczeniowy z (assert (= dwa do wyeksportowania-a (ite (i (> = a 0.5) ( = a 1.0) ( = a 2.0) ( = a 4.0) ( = a 8.0) ( = a 16,0) ( = 32.0) ( = a 64.0) ( = a 128.0) ( user1779685