我正在尝试使用python和z3解算器来描述约束。这个常数包括三个位向量矩阵为X[i]=X[j]-->(R1[i]*X=R1[j]*X)&(R1[i]*X=R1[j]*X)&(R1[i]*X=R1[j]*X)
X,R1,R2,R3是3 * 3的位向量矩阵
我得到了一些追溯:
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
File "D:\Z3\z3-master\z3-master\build\python\z3\z3.py", line 1613, in Implies
b = s.cast(b)
File "D:\Z3\z3-master\z3-master\build\python\z3\z3.py", line 1369, in cast
_z3_assert(is_expr(val), "True, False or Z3 Boolean expression expected. Received %s" % val)
File "D:\Z3\z3-master\z3-master\build\python\z3\z3.py", line 92, in _z3_assert
raise Z3Exception(msg)
z3.z3types.Z3Exception: True, False or Z3 Boolean expression expected. Received [[ True True True]]
如何调试它?
要解决位向量矩阵乘法问题,除了导入z3之外,我还导入了numpy,numpy可以解决乘法问题。
from z3 import*
from numpy import*
X=[[BitVec("x_%s_%s"%(i+1,j+1),16) for j in range(3)] for i in range(3)];
s=Solver();
s.add(X[0][1]==0);s.add(X[0][2]==0);s.add(X[1][2]==0);
a=BitVecVal(1,16);b=BitVecVal(0,16);
r_1=[[b,b,a],[b,b,a],[b,b,b]]
r_2=[[b,b,b],[b,b,b],[a,a,b]]
r_3=[[a,b,b],[a,b,b],[b,b,b]]
import numpy as np
mr1=np.matrix(r_1)
mr2=np.matrix(r_2);mr3=np.matrix(r_3);mXx=np.matrix(X);
for p in range(0,2,1):
for q in range(0,2,1):
s.add(Implies((X[p]==X[q]),(((mr1[p]*mXx)==(mr1[q]*mXx))&((mr2[p]*mXx)==(mr2[q]*mXx))&((mr3[p]*mXx)==(mr3[q]*mXx)))))
s.check()