理解Z3中的量词遍历
我试图理解z3中的遍历量化公式(我使用的是z3py)。不知道如何提取量化变量。例如,在下面显示的代码中,我试图打印相同的公式,结果出现错误理解Z3中的量词遍历,z3,z3py,quantifiers,Z3,Z3py,Quantifiers,我试图理解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))
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(),但如何获得正确返回变量的公式。在这里呆了一段时间
var\u 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)
谢谢你,我正想把绳子解开,但是没有线索。非常感谢。是的,我忘了添加基本情况(变量/常量)。