Ich versuche, alle möglichen Modelle für einige Theorie erster Ordnung mit Z3, einem von Microsoft Research entwickelten SMT-Löser, zu erhalten. Hier ist ein minimales Arbeitsbeispiel:Z3: Finden aller befriedigenden Modelle
(declare-const f Bool)
(assert (or (= f true) (= f false)))
In diesem propositionalen Fall gibt es zwei erfüllenden Belegungen: f->true
und f->false
. Da Z3 (und SMT-Solver im Allgemeinen) nur versuchen werden, ein befriedigendes Modell zu finden, ist es nicht direkt möglich, alle Lösungen zu finden. Here Ich fand einen nützlichen Befehl namens (next-sat)
, aber es scheint, dass die neueste Version von Z3 dies nicht mehr unterstützt. Das ist etwas unglücklich für mich, und im Allgemeinen finde ich den Befehl sehr nützlich. Gibt es eine andere Möglichkeit, dies zu tun?
Auch hierzu finden Sie diese Antwort: http://stackoverflow.com/questions/11867611/z3py-checking-all -solutions-for-equation – Taylor
Ist Z3 Stateful in dem Sinne, dass es dort aufhört, wo es für eine solche Suche aufgehört hat? Es scheint, es wäre verschwenderisch, jedes Mal neu anzufangen, wenn (intuitiv) die ganze Arbeit bis auf das Ende identisch ist. – GManNickG
@GManNickG Für die Beispiele, mit denen ich diese Methode verwendet habe, scheint es, dass es in der Tat Stateful ist, dass das Finden der nächsten Modelle nach dem ersten schneller ist. Hier ist eine Liste von Laufzeiten in Millisekunden für einen bestimmten Fall mit 58 Modellen: '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'. Beachten Sie, dass die erste definitiv die längste ist, aber die anderen sind zufälliger (hängt wahrscheinlich von dem Problem und wie viel Glück der Löser bekommt). –