Вместо того, чтобы ссылаться на индексы, вы должны вместо этого использовать вектор выражения и добавить предложение блокировки, перебирая переменные. Примерно так должно работать:
#include"z3++.h"
using namespace z3;
using namespace std;
int main() {
context c;
expr X = c.int_const("x");
expr Y = c.int_const("y");
expr Z = c.int_const("z");
solver s(c);
s.add(X == Y + Z);
s.add((X > 0) && (Y > 0) && (Z > 0));
s.add(X <= 10);
expr_vector myVars(c);
myVars.push_back(X);
myVars.push_back(Y);
myVars.push_back(Z);
int j = 1;
while (s.check() == sat)
{
model m = s.get_model();
expr_vector blocker(c);
cout << "solution " << j << " :" << endl;
for(expr v : myVars)
{
cout << v << " = " << m.eval(v) << endl;
blocker.push_back(v != m.eval(v));
}
j++;
s.add(mk_or(blocker));
}
}
Предполагая, что вы поместите это в файл с именем a.cpp
, скомпилируйте его так:
$ g++ -std=c++11 a.cpp -lz3
Я исключу вывод, но когда Я запускаю сгенерированный исполняемый файл, который печатает 45 различных решений, что соответствует вашему исходному выводу.