我试图理解z3中的遍历量化公式(我使用z3py)。不知道如何获取量化变量。例如,在下面显示的代码中,我尝试打印相同的公式并获得错误。
from z3 import *
def traverse(e):
if is_quantifier(e):
var_list = []
if e.is_forall():
for i in range(e.num_vars()):
var_list.append(e.var_name(i))
return ForAll (var_list, traverse(e.body()))
x, y = Bools('x y')
fml = ForAll(x, ForAll (y, And(x,y)))
same_formula = traverse( fml )
print same_formula
通过很少的搜索,我知道z3使用De Bruijn索引,我必须得到类似Var(1,BoolSort())的东西。我可以考虑使用var_sort(),但如何让公式正确返回变量。坚持了一段时间。
答案 0 :(得分:3)
var_list
是一个字符串列表,但ForAll
需要一个常量列表。另外,当traverse
不是量词时,e
应返回from z3 import *
def traverse(e):
if is_quantifier(e):
var_list = []
if e.is_forall():
for i in range(e.num_vars()):
c = Const(e.var_name(i) + "-traversed", e.var_sort(i))
var_list.append(c)
return ForAll (var_list, traverse(e.body()))
else:
return e
x, y = Bools('x y')
fml = ForAll(x, ForAll (y, And(x,y)))
same_formula = traverse( fml )
print(same_formula)
。这是一个修改过的例子:
commit()