我之前已经发布了这个问题,并在Python中得到了解决方案。我们已经在python中实现了下面的问题。我们试图将Z3求解器移植到内部工具中,作为我论文的一部分。你能不能帮助我在“C”语言中显示以下要求的解决方案,而不是在python中。
我想使用c API
使用z3求解器定义和创建如下的二维数组例子:a [3] [3] 如何使用Z3求解器C API定义它,我需要添加约束,如
二维数组的元素只有0或1。 每行的总和等于1 每列的总和(控制器存储器)应该<= 100 我想要解决的问题是,我有两个数组,其中一个是[sw] = {50,25,100,75},表示每个函数产生的数据(50kb).b [cont] = {100,100,100}个控制器记忆(kb)capacity.we试图生成[4] [3]矩阵,显示满足上述约束的控制器的功能分配
对于上述问题,示例输出(这可以是这么多的一个配置)。但它是一个有效的配置
a [sw] [续] =
A B C
A 1 0 0
B 1 0 0
C 0 1 0
D 0 0 1
答案 0 :(得分:1)
Z3 Python API在C API之上实现。用Python编写的任何Z3示例都可以转换为C / C ++。但是,Z3 Python API使用起来更方便,Python列表推导简化了编码。这是在C ++中编写Python示例(Two dimensional Array in Z3 solver)的一种方法。
主要区别在于:我使用std::vector
而不是列表,而使用for循环而不是列表推导。
void cpp_vector_example() {
context c;
unsigned n = 3;
std::vector<std::vector<expr> > A;
// Create a nxn matrix of Z3 integer constants
for (unsigned i = 0; i < n; i++) {
A.push_back(std::vector<expr>());
for (unsigned j = 0; j < n; j++) {
char name[100];
sprintf(name, "a_%d_%d", i, j);
A[i].push_back(c.int_const(name));
}
}
solver s(c);
// Add constraint: the sum of each row is one
for (unsigned i = 0; i < n; i++) {
expr sum(c);
sum = A[i][0];
for (unsigned j = 1; j < n; j++) {
sum = sum + A[i][j];
}
s.add(sum == 1);
}
// Add constraint: the sum of each column is less than 100
for (unsigned j = 0; j < n; j++) {
expr sum(c);
sum = A[0][j];
for (unsigned i = 1; i < n; i++) {
sum = sum + A[i][j];
}
s.add(sum <= 100);
}
// Add constraint: for each a_i_j in the matrix, 0 <= a_i_j <= 10
for (unsigned j = 0; j < n; j++) {
for (unsigned i = 1; i < n; i++) {
s.add(0 <= A[i][j]);
s.add(A[i][j] <= 100);
}
}
// Display constraints added to solver s.
std::cout << s << "\n";
// Solve constraints
std::cout << s.check() << "\n";
// Print solution (aka model)
model m = s.get_model();
std::cout << m << "\n";
// Print result as a matrix
for (unsigned i = 0; i < n; i++) {
for (unsigned j = 0; j < n; j++) {
std::cout << m.eval(A[i][j]) << " ";
}
std::cout << "\n";
}
}