理解Z3中的量词遍历

理解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))

我试图理解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(),但如何获得正确返回变量的公式。在这里呆了一段时间

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)

谢谢你,我正想把绳子解开,但是没有线索。非常感谢。是的,我忘了添加基本情况(变量/常量)。