查看 z3py 中的单个断言

Looking at single assertions in z3py

在求解器上声明断言后,如何从所有断言中获取和利用单个断言?因此,如果 s.assertions 可以转换为列表,我们就可以访问单个语句。这是不可能的。我通过以下关于 'BitVecs' 的断言以及我想表达的内容进行解释。

from z3 import *

s = Solver()
x,y,z,w   = BitVecs("x y z w",7)    #rows
a,b,c,d,e = BitVecs("a b c d e",7)  #cols

constr = [x&a==a,x&b==b,x&c!=c,x&d!=d,x&e!=e,
          y&a==a,y&b!=b,y&c!=c,y&d!=d,y&e==e,
          z&a!=a,z&b==b,z&c==c,z&d==d,z&e!=e,
          w&a!=a,w&b==b,w&c!=c,w&d==d,w&e==e ]

s.add(constr)

R = [x,y,z,w]
C = [a,b,c,d,e]

s.assertions()

我需要一个矩阵(列表列表)来指示 RC 对是否具有 ==!= 类型的 'constr' .因此,声明的 constr 的矩阵是

[[1,1,0,0,0],
 [1,0,0,0,1],
 [0,1,1,1,0],
 [0,1,0,1,1]]

.

想做这件事很奇怪。您自己构建这些断言,因此最好只跟踪您构建它们的方式以找出它们包含的内容。

如果这些来自其他来源(我想可能),那么您将不得不将它们“解析”回 AST 形式并遍历它们的结构以回答“变量是什么”形式的问题,“连接词是什么”等。这样做需要了解 z3py 在内部如何表示这些对象。虽然这是可能的,但我非常怀疑这是您想要做的事情,除非您正在处理一个应该处理所有事情的库。 (即,既然您知道自己在构建什么,只需在别处跟踪它即可。)

但是,如果你真的想分析这些表达式,方法就是研究 AST 结构。您必须熟悉此文件的内容:https://github.com/Z3Prover/z3/blob/master/src/api/python/z3/z3.py, and especially the functions decl and children 等。