断言矩阵乘法的约束

时间:2015-03-15 10:20:05

标签: z3 smt z3py

我试图通过使用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)...?

1 个答案:

答案 0 :(得分:0)

不,Z3没有矩阵乘法的内置函数。它仍然可以以直接的方式完成,但约束可能会变得非常大。