Ich bin verwirrt und zu verstehen, wie zwei verschiedene Eingabeformate für Z3-Fixpunkt-Engine verwandt sind. Kurzes Beispiel: Angenommen, ich möchte die Existenz negativer Zahlen beweisen. Ich deklariere eine Funktion, die 1 für nichtnegative Zahlen und 0 für negative zurückgibt und anschließend Solver fehlschlägt, wenn es Argumente gibt, für die Funktion 0 zurückgibt. Es gibt jedoch eine Einschränkung: Ich möchte Solver antworten sat
, wenn mindestens eine vorhanden ist negative Zahl und unsat
, wenn alle Zahlen nicht negativ sind.∃-Abfragen und ∀-Abfragen mit Z3-Fixpunkt-Engine
Es ist trivialerweise mit der Verwendung von declare-rel
und query
Format:
(declare-rel f (Int Int))
(declare-rel fail())
(declare-var n Int)
(declare-var m Int)
(rule (=> (< n 0) (f n 0)))
(rule (=> (>= n 0) (f n 1)))
(rule (=> (and (f n m) (= m 0)) fail))
(query fail)
Aber es wird heikel, während reines Format SMT-LIB2 Verwendung (mit forall
). Zum Beispiel gibt
(set-logic HORN)
(declare-fun f (Int Int) Bool)
(declare-fun fail() Bool)
(assert (forall ((n Int))
(=> (< n 0) (f n 0))))
(assert (forall ((n Int))
(=> (>= n 0) (f n 1))))
(assert (forall ((n Int) (m Int))
(=> (and (f n m) (= m 0)) fail)))
(assert (not fail))
(check-sat)
unsat
zurück. Es überrascht nicht, dass das Ändern von (= m 0)
zu (= m 1)
dasselbe ergibt. Wir können sat
nur implizieren fail
von (= m 2)
. Das Problem ist, dass ich nicht verstehen kann, , wie Solver mit diesem Format zu fragen.
Wie ich es im Moment bin zu verstehen, während forall
-Form mit können wir fragen nur ∀-Lösungen zu finden, dh die Antwort sat
bedeutet, dass Solver (oder invariant) satisfiying alle Behauptungen für alle finden Interpretation verwaltet Werte und unsat
bedeutet, dass es keine solchen Funktionen gibt. Mit anderen Worten, es versucht beweisen, setzen Sie den "Beweis" (die Invariante) in das Modell (offensichtlich, wenn sat
).
Im Gegenteil, wenn query
die Lösung in dem declare-rel
Format Solver ing sucht die Lösung für einig Variablen, wie nur die Einschränkungen unter dem ∃-Quantor sind. Mit anderen Worten gibt es das Gegenbeispiel. Es kann nur die Invariante im Fall von unsat
drucken.
Ich habe ein paar Fragen:
- Bin Verständnis ich es richtig? Ich habe das Gefühl, dass ich einige Schlüsselideen vermisse. Zum Beispiel wird eine allgemeine Idee, wie
(query ...)
in Bezug auf(assert (forall ...))
ausgedrückt wird wirklich hilfreich sein (und Frage 2 automatisch beantworten). - Gibt es eine Möglichkeit, solche ∃-Einschränkungen (Ausgabe
sat
, wenn Gegenbeispiel gefunden wurde) mit reinem SMT-LIB2-Format zu lösen? Wenn ja, wie?
Nikolaj, vielen Dank für eine klare und vollständige Antwort. – dvvrd