Z3求解器中的二维数组

时间:2013-04-17 08:28:05

标签: arrays z3

我想使用C API

使用z3求解器将二维数组定义如下

a [3] [3] = {{0,0,0},{0,0,0},{0,0,0}}

如何使用Z3求解器C API定义它,其中我需要添加约束,例如每行的总和等于1,每个coloums的总和应该<= 100。

1 个答案:

答案 0 :(得分:3)

Z3支持数组理论,但通常用于编码无界数组或非常大的数组。此问题已在其他帖子中讨论过(请参阅:Create an array with fixed size and initialize it)。如果我们搜索[z3] array,我们会发现许多其他帖子。 对于预定义大小的数组,创建“Z3表达式数组”更容易(也更有效)。 Z3 tutorial中的数独示例显示了如何执行此操作。 以下是您帖子中描述的问题的Python代码(也可在线提供here)。

# 3x3 matrix of integer variables
A = [ [ Int("a_%s_%s" % (i+1, j+1)) for j in range(3) ] 
      for i in range(3) ]
print A

# Rows constraints
rows_c = [ Sum(r) == 1 for r in A ]
print rows_c

# Columns constraints
A_transpose = [ [ A[i][j] for i in range(3) ] for j in range(3) ]
cols_c = [ Sum(c) <= 10 for c in A_transpose ]
print cols_c

s = Solver()
s.add(rows_c)
s.add(cols_c)
# solve constraints
print s.check()
# print solution
m = s.model()
print m
# printing the solution in a nicer way
r = [ [ m.evaluate(A[i][j]) for j in range(3) ] for i in range(3) ]
print_matrix(r)