Ich versuche, herauszufinden, warum Abfrage Aufträge Swapping kann die Antwort von Z3 FixedPoint Motor ändern:Ändern der Reihenfolge der Z3 fixepoint Abfragen ändert das Ergebnis
(declare-rel fib (Int Int))
(declare-rel q1())
(declare-rel q2())
(declare-var n Int)
(declare-var tmp1 Int)
(declare-var tmp2 Int)
(rule (=> (< n 2) (fib n 1)))
(rule (=> (and (>= n 2)
(fib (- n 1) tmp1)
(fib (- n 2) tmp2))
(fib n (+ tmp1 tmp2))))
(rule (=> (< n 2) q1))
(rule (=> (and (fib n tmp1) (<= tmp1 0)) q2))
(query q1)
(query q2)
erste Abfrage q1
ist ein Dummy ein, nur Motor zu fragen über etwas. Die zweite Abfrage q2
widerspricht mit infered Invariant, dass Fibonacci-Zahlen immer positiv sind.
Wenn die Reihenfolge der Anfragen ist
(query q2)
(query q1)
alles funktioniert, sind richtige Antworten gegeben. Aber tauschen sie den nächsten Fehler gibt, während q2
Abfrage:
(smt.diff_logic: non-diff logic expression (+ fib_1_1 fib_1_0 (* (- 1) fib_1_n))) unknown
Kann jemand den Grund erklären? Ist es Z3 Problem oder mache ich etwas falsch? Als erstes werden irgendwelche Vorschläge zur Bearbeitung (ich verwende .NET API) sehr geschätzt. Vielen Dank!
Vielen Dank! Es funktioniert jetzt. – dvvrd