Я новичок в Z3-Solver с API на C ++ и хочу решить группу неравенств и найти результаты.
Я прочитал ответ, который написан на Python и пытаюсь написать его на C ++, но повторяет печать одной модели.
5 <= x + y + z <= 16
AND -4 <= x - y <= 6
AND 1 <= y - z <= 3
AND -1 <= x - z <= 7
AND x >= 0 AND y >= 0 AND z >= 0
Были добавлены неравенствав решатель, и есть много оценок.
c - это контекст, а s - это решатель.
vector<const char*> variables {"x", "y", "z"};
// ...
// till here, s was added into several constraints
while(s.check() == sat){
model m = s.get_model();
cout << m << "\n######\n";
expr tmp = c.bool_val(false);
for(int i = 0; i < variables.size(); ++ i){
tmp = tmp || (m[c.int_const(variables[i])] != c.int_const(variables[i]));
}
s.add(tmp);
}
И результат:
(define-fun z () Int
0)
(define-fun y () Int
2)
(define-fun x () Int
3)
######
(define-fun z () Int
0)
(define-fun y () Int
2)
(define-fun x () Int
3)
######
(define-fun z () Int
0)
...
И он просто печатает одну модель.Я не уверен, где не так.
Как я могу получить все модели или получить один или несколько выпуклых множеств (таких как {l1 <= x <= u1 и l2 <= x - y <= u2 и ...}), но неПройдите все оценки. </p>
Кстати, на Python есть много обучающих программ (таких как this ), где я могу выучить z3 на c ++ как пример и API Doc. не легко начать.