查看 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()
我需要一个矩阵(列表列表)来指示 R
、C
对是否具有 ==
或 !=
类型的 '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 等。
在求解器上声明断言后,如何从所有断言中获取和利用单个断言?因此,如果 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()
我需要一个矩阵(列表列表)来指示 R
、C
对是否具有 ==
或 !=
类型的 '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 等。