理解Z3中的量词遍历

时间:2017-12-08 15:56:13

标签: 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))
        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(),但如何让公式正确返回变量。坚持了一段时间。

1 个答案:

答案 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()