Próbuję odzyskać wszystkie możliwe modele dla niektórych teorii pierwszego rzędu za pomocą Z3, solver SMT opracowany przez Microsoft Research. Oto minimalne przykład roboczych:Z3: znajdowanie wszystkich satysfakcjonujących modeli
(declare-const f Bool)
(assert (or (= f true) (= f false)))
W tym przypadku zdań istnieją dwa satysfakcjonujące zadania: f->true
i f->false
. Ponieważ Z3 (i ogólnie solucje SMT) będą próbować znaleźć tylko jeden satysfakcjonujący model, znalezienie wszystkich rozwiązań nie będzie bezpośrednio możliwe. Here Znalazłem użyteczne polecenie o nazwie (next-sat)
, ale wygląda na to, że najnowsza wersja Z3 już tego nie obsługuje. To trochę niefortunne dla mnie i generalnie myślę, że polecenie jest całkiem użyteczne. Czy istnieje inny sposób robienia tego?
również zobaczyć tę odpowiedź: http://stackoverflow.com/questions/11867611/z3py-checking-all -solutions-for-równanie – Taylor
Czy Z3 jest stanowy w tym sensie, że odbierze to miejsce, w którym zostało przerwane na takie poszukiwania? Wydaje się, że marnowanie byłoby rozpoczynanie za każdym razem, gdy (intuicyjnie) cała praca jest dokładnie taka sama, z wyjątkiem samego końca. – GManNickG
@GManNickG Dla przykładów, z których korzystałem w tej metodzie, wydaje się, że rzeczywiście jest to stanowy w tym, że znalezienie kolejnych modeli po tym pierwszym jest szybsze. Oto lista środowisk wykonawczych w milisekundach dla konkretnego przypadku z 58 modelami: '8942 801 1663 5 599 320 450 2 2 3 1 5 1377 36 5 738 162 105 1639 3 5 16 2041 27 475 953 562 746 45 151 18 4206 3416 9 850 120 3 4 12 615 593 1219 449 154 987 3 10 1365 16 438 792 1686 743 46 5 8 412 126'. Należy zauważyć, że pierwsza z nich jest zdecydowanie najdłuższa, ale pozostałe są bardziej losowe (prawdopodobnie zależy od problemu i szczęścia, jakie otrzymuje solver). –