2
私は数式(Z3pyの定量化された式)ですべての変数を収集しようとしています。小さな例Z3定量化された式の変数の数を数えて
w, x, y, z = Bools('w x y z')
fml = And(ForAll(x, ForAll(y, And(x, y))), ForAll(z, ForAll(w, And(z, w))))
varSet = traverse(fml)
iが横断するために使用するコードは
def traverse(e):
r = set()
def collect(e):
if is_quantifier(e):
# Lets assume there is only one type of quantifier
if e.is_forall():
collect(e.body())
else:
if (is_and(e)):
n = e.num_args()
for i in range(n):
collect(e.arg(i))
if (is_or(e)):
n = e.num_args()
for i in range(n):
collect(e.arg(i))
if (is_not(e)):
collect(e.arg(0))
if (is_var(e)):
r.add(e)
collect(e)
return r
と私は取得してい:セット([ヴァー(0)、ヴァー(1)])を。これはZ3がDe Bruijn indexを使用しているためです。これを避けて、所望のセットを得ることができるか:セット([Var(0)、Var(1)、Var(2)、Var(3)])。
ありがとう、私はQBFの数式を量子なしの式に変換しようとしているので、Var(2)Var(3)を0と1に置き換えた場合、非定量化バージョンは情報を失います。たとえば、上記の式の場合、非qbfバージョンは、And(And(Var(0)、Var(1))、And(Var(0)、Var(1)))です。 – Pushpa
申し訳ありませんが、それはde-Bruijnインデックスがどのように機能するかです。数式が変更されている場合は、インデックスを調整する必要があります(Z3では多くの場所で調整が行われます)。同じ変数名を使用する部分式を考えてみましょう。名前の変更も必要です。 –
ありがとう、私はそれを理解している、私はそこに出る方法がありますか?あなたのコメントはNo. – Pushpa