了解 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)
我正在尝试了解 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)