了解 Z3 中的量词遍历

Understanding quantifier traversing in Z3

我正在尝试了解 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() 但如何正确地获得 return 变量的公式。卡在这里有一段时间了。

var_list 是一个字符串列表,但 ForAll 需要一个常量列表。此外,当 traverse 不是量词时,它应该 return 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)