我试图通过使用z3py API断言矩阵乘法的约束来评估结果矩阵。以下方法适用于矩阵添加。以下是代码,它有3个矩阵:x,y和sol。 sol是x和y的加法(sol == x + y),我有兴趣将得到的矩阵(sol)的值限制为零,并检查" x"中的哪些未知值。和" y"得到的矩阵为零。以下是添加的列表理解方法。
from z3 import*
x = [ [Real("x_%s_%s" %(i+1, j+1)) for j in range(2) ] for i in range(2)]
y = [ [Real("y_%s_%s" %(i+1, j+1)) for j in range(2) ] for i in range(2)]
sol = [ [Real("sol_%s_%s" %(i+1, j+1)) for j in range(2) ] for i in range(2)]
addition = [sol[i][j]==x[i][j]+y[i][j] for i in range(2) for j in range(2) ]
s = Solver()
s.add(addition)
s.add(x[0][0]>=0)
s.add(x[0][1]>=0)
s.add(x[1][0]>=0)
s.add(x[1][1]>=1)
s.add(And(y[0][0]>=0, y[0][0]<=2))
s.add(And(y[0][1]>=0, y[0][0]<=2))
s.add(And(y[1][0]>=0, y[0][0]<=2))
s.add(And(y[1][1]>=0, y[0][0]<=2))
s.add(sol[0][0]==0)
s.add(sol[0][1]==0)
s.add(sol[1][0]==0)
s.add(sol[1][1]==0)
if s.check()==sat:
m =s.model()
print SAT,'\n', m
result=[[ m.evaluate(sol[i][j]) for i in range (2)] for j in range (2)]
print result
if (s.check()==unsat):
print "UNSAT, no model exists"
现在,列表理解是否有任何方法可以断言矩阵乘法? (溶胶== X * Y)...?
答案 0 :(得分:0)
不,Z3没有矩阵乘法的内置函数。它仍然可以以直接的方式完成,但约束可能会变得非常大。