如何访问位爆破时使用的变量映射?
How can I access the variable mapping used when bit-blasting?
我正在修改一个工具,它使用 Z3(特别是 Python API)来解决位向量约束。我需要使用特定的外部 SAT 求解器而不是内部 Z3 求解器,所以我首先使用策略
进行位爆破
Then('simplify', 'bit-blast', 'tseitin-cnf')
之后我可以相对轻松地将子句转储到 DIMACS 文件中。问题是将生成的命题模型映射回原始约束的模型:据我所知,Python API 没有提供访问与策略对应的模型转换器的方法.这是真的?如果是这样,是否可以使用不同的 API 来完成,或者是否有更简单的方法?基本上我只需要知道最后的CNF子句中的命题变量如何对应于原始的位向量变量。
这听起来很特别。最简单的方法可能是检测 goal2sat 转换(并重新编译 Z3)以保存
文件中的翻译 table。我认为 API 上公开的任何功能都不会为您提供此信息。
我遇到了同样的问题,没有修改Z3就解决了。这是 python 中的示例。 (基于莱昂纳多的 example。)
from z3 import BitVec, BitVecSort, Goal, If, Then, Bool, solve
import math
x = BitVec('x', 16)
y = BitVec('y', 16)
z = BitVec('z', 16)
g = Goal()
bitmap = {}
for i in range(16):
bitmap[(x,i)] = Bool('x'+str(i))
mask = BitVecSort(16).cast(math.pow(2,i))
g.add(bitmap[(x,i)] == ((x & mask) == mask))
g.add(x == y, z > If(x < 0, x, -x))
print g
# t is a tactic that reduces a Bit-vector problem into propositional CNF
t = Then('simplify', 'bit-blast', 'tseitin-cnf')
subgoal = t(g)
assert len(subgoal) == 1
# Traverse each clause of the first subgoal
for c in subgoal[0]:
print c
solve(g)
对于位向量x的每个位置i,我们引入一个新的布尔变量xi,并要求xi等于位向量的第i个位置。布尔变量的名称在位爆破期间被保留。
我正在修改一个工具,它使用 Z3(特别是 Python API)来解决位向量约束。我需要使用特定的外部 SAT 求解器而不是内部 Z3 求解器,所以我首先使用策略
进行位爆破Then('simplify', 'bit-blast', 'tseitin-cnf')
之后我可以相对轻松地将子句转储到 DIMACS 文件中。问题是将生成的命题模型映射回原始约束的模型:据我所知,Python API 没有提供访问与策略对应的模型转换器的方法.这是真的?如果是这样,是否可以使用不同的 API 来完成,或者是否有更简单的方法?基本上我只需要知道最后的CNF子句中的命题变量如何对应于原始的位向量变量。
这听起来很特别。最简单的方法可能是检测 goal2sat 转换(并重新编译 Z3)以保存 文件中的翻译 table。我认为 API 上公开的任何功能都不会为您提供此信息。
我遇到了同样的问题,没有修改Z3就解决了。这是 python 中的示例。 (基于莱昂纳多的 example。)
from z3 import BitVec, BitVecSort, Goal, If, Then, Bool, solve
import math
x = BitVec('x', 16)
y = BitVec('y', 16)
z = BitVec('z', 16)
g = Goal()
bitmap = {}
for i in range(16):
bitmap[(x,i)] = Bool('x'+str(i))
mask = BitVecSort(16).cast(math.pow(2,i))
g.add(bitmap[(x,i)] == ((x & mask) == mask))
g.add(x == y, z > If(x < 0, x, -x))
print g
# t is a tactic that reduces a Bit-vector problem into propositional CNF
t = Then('simplify', 'bit-blast', 'tseitin-cnf')
subgoal = t(g)
assert len(subgoal) == 1
# Traverse each clause of the first subgoal
for c in subgoal[0]:
print c
solve(g)
对于位向量x的每个位置i,我们引入一个新的布尔变量xi,并要求xi等于位向量的第i个位置。布尔变量的名称在位爆破期间被保留。