Próbuję zrozumieć, jak zmienne związane są indeksowane w z3
. Tutaj w urywku w z3py
i odpowiednim wyjściu. (http://rise4fun.com/Z3Py/plVw1)Zrozumienie indeksowania powiązanych zmiennych w Z3
x, y = Ints('x y')
f1 = ForAll(x, And(x == 0, Exists(y, x == y)))
f2 = ForAll(x, Exists(y, And(x == 0, x == y)))
print f1.body()
print f2.body()
wyjściowa:.
ν0 = 0 ∧ (∃y : ν1 = y)
y : ν1 = 0 ∧ ν1 = y
W f1
, dlaczego jest taka sama zmienna związana x
ma inny wskaźnik (0
i 1
). Jeśli zmienię f1
i wydam Exists
, wówczas x
ma ten sam indeks (0
).
Powód chcę zrozumieć mechanizm indeksowania:
mam formułę FOL reprezentowane w DSL w Scala, który chcę wysłać do z3
. Teraz ScalaZ3
ma api mkBound
do tworzenia powiązanych zmiennych, które przyjmują jako argumenty index
i sort
. Nie jestem pewien, jaką wartość powinienem podać argumentowi index
. Więc chciałbym wiedzieć, co następuje:
Jeśli mam dwa wzory phi1
i phi2
z maksymalnymi związany zróżnicowanym indeksie n1
i n2
jaki byłby indeks x
w ForAll(x, And(phi1, phi2))
Także, czy istnieje sposób wyświetlić wszystkie zmienne w postaci indeksowanej? f1.body()
po prostu pokazuje mi x
w postaci indeksowanej, a nie y
. (Myślę, że powodem jest to, że y
jest nadal związany w f1.body()
)