Z3 如何访问钻头爆破时使用的变量映射?

Z3 如何访问钻头爆破时使用的变量映射?,z3,z3py,Z3,Z3py,我正在修改一个使用Z3(特别是Python API)来解决位向量约束的工具。我需要使用一个特定的外部SAT解算器,而不是内部的Z3解算器,所以我首先使用这个策略 Then('simplify', 'bit-blast', 'tseitin-cnf') 之后,我可以相对轻松地将子句转储到DIMACS文件中。问题是将生成的命题模型映射回原始约束的模型:据我所知,pythonapi没有提供访问对应于策略的模型转换器的方法。这是真的吗?如果是这样的话,可以使用不同的API来完成,还是有更简单的方法?基

我正在修改一个使用Z3(特别是Python API)来解决位向量约束的工具。我需要使用一个特定的外部SAT解算器,而不是内部的Z3解算器,所以我首先使用这个策略

Then('simplify', 'bit-blast', 'tseitin-cnf')

之后,我可以相对轻松地将子句转储到DIMACS文件中。问题是将生成的命题模型映射回原始约束的模型:据我所知,pythonapi没有提供访问对应于策略的模型转换器的方法。这是真的吗?如果是这样的话,可以使用不同的API来完成,还是有更简单的方法?基本上,我只需要知道最后一个CNF子句中的命题变量如何与原始位向量变量相对应。

这听起来很特别。最简单的方法可能是插入goal2sat转换(并重新编译Z3)以保存
文件中的翻译表。我不认为通过API公开的任何功能都会提供这些信息。

我遇到了同样的问题,并在不修改Z3的情况下解决了它。下面是一个python示例。(根据莱昂纳多的一篇文章。)

从z3导入位向量、位向量排序、目标、If、Then、Bool、solve
输入数学
x=比特向量('x',16)
y=比特向量('y',16)
z=比特向量('z',16)
g=目标()
位图={}
对于范围(16)中的i:
位图[(x,i)]=Bool('x'+str(i))
掩码=比特向量排序(16).cast(数学功率(2,i))
g、 添加(位图[(x,i)]=((x和掩码)=掩码))
g、 加(x==y,z>If(x<0,x,-x))
打印g
#t是一种将位向量问题简化为命题CNF的策略
t=Then('simplify'、'bit blast'、'tseitin cnf')
子目标=t(g)
断言len(子目标)=1
#遍历第一个子目标的每个子句
对于子目标[0]中的c:
打印c
求解(g)

对于位向量X的每个位置i,我们引入新的布尔变量席席,并要求Xi等于位向量的第i位。布尔变量的名称在钻头爆破期间保留。

请您提及哪一个是转换表,好吗?
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)