检验矩阵值函数的可满足性

时间:2014-04-14 22:29:51

标签: z3 smt z3py

我试图乘以2 * 2阶的2个矩阵。其中一个矩阵包含一个未知参数" k1"。我想检查一个可满足的解决方案,其值为k1。两个矩阵的乘积将等于第三个矩阵的乘积。 注意:我不想将乘法转换为线性关系或方程组我想将其作为矩阵进行操作。

这是我被困的地方。

k1 = Int ('k1')

x = [ [ Int("x_%s_%s" % (i+1, j+1)) for j in range(2) ] 
     for i in range(2) ]

a =((1,k1),(3,4))

b =((1,1),(1,1))

c= ((3,3),(7,7))

s = Solver()
s.add(a[0][1]>0)
s.add(a*b==c)
if s.check() == sat:
m = s.model()
r = [ [ m.evaluate(x[i][j]) for j in range(2) ] 
      for i in range(2) ]
print_matrix(r)
else:
print "failed to solve"

任何出路?

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案是

k1 = Int ('k1')

x = [ [ Int("x_%s_%s" % (i+1, j+1)) for j in range(2) ] 
 for i in range(2) ]

a =((1,k1),(3,4))

b =((1,1),(1,1))

c= ((3,3),(7,7))

s = Solver()
eq1= a[0][1]>0
eq2 =[[sum(a[i][k]*b[k][j] for k in range(2)) == c[i][j] for i in range(2) ]
         for j in range(2) ]
s.add(eq1)
s.add(eq2[0][0])
s.add(eq2[0][1])
s.add(eq2[1][0])
s.add(eq2[1][1])
print s             
print s.check()             
m = s.model()
print m

,相应的输出是

[k1 > 0, 1 + k1*1 == 3, True, 1 + k1*1 == 3, True] 
sat 
[k1 = 2]

请在线here

运行此示例