Z3 矩阵乘法的断言约束

Z3 矩阵乘法的断言约束,z3,smt,z3py,Z3,Smt,Z3py,我试图通过使用z3pyapi断言矩阵乘法的约束来计算结果矩阵。以下方法适用于矩阵加法。下面是代码,它有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 = [ [Re

我试图通过使用z3pyapi断言矩阵乘法的约束来计算结果矩阵。以下方法适用于矩阵加法。下面是代码,它有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"
从z3导入*
x=[[Real(“x_%s_%s”%(i+1,j+1))表示范围(2)内的j]表示范围(2)内的i]
y=[[范围(2)内j的实数(“y_%s_%s”%(i+1,j+1)]对于范围(2)内的i]
sol=[[Real(“sol_%s_%s”%(i+1,j+1))表示范围(2)中的j]表示范围(2)中的i]
加法=[sol[i][j]==x[i][j]+y[i][j]表示范围(2)中的i,表示范围(2)中的j]
s=解算器()
s、 添加(添加)
s、 添加(x[0][0]>=0)
s、 添加(x[0][1]>=0)
s、 加(x[1][0]>=0)
s、 加(x[1][1]>=1)

s、 加上(及(y[0][0]>=0,y[0][0]=0,y[0][0]=0,y[0][0]=0,y[0][0]不,Z3没有用于矩阵乘法的内置函数。它仍然可以以简单的方式完成,但约束可能会变得非常大。

谢谢,我能够使用列表理解来解决乘法问题,但即使我使用6*6矩阵,“Solver()”添加简单约束(如>=0)需要相当长的时间。原因可能是什么?实际上是添加需要花费很多时间,还是在断言所有内容后,您最终会遇到一个困难的问题?如果是添加,问题可能在Python方面;还有:“相当长的时间”是什么对你来说?平均30分钟,我想问题出在python方面。因为列表理解需要95%的时间。