如何获得所有模型或所有凸评估?

时间:2019-05-11 13:18:06

标签: c++ z3 smt

我是C ++中具有API的Z3-Solver的新手,想解决一组不等式并找到结果。

我已经读过the answer which written in 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和...}),但不遍历所有求值

顺便说一句,有很多关于python的教程(例如this),由于exampleapi doc.不容易上手,因此我可以在c ++中学习z3。

1 个答案:

答案 0 :(得分:0)

您的“模型反驳”循环不太正确。由于您没有发布整个代码,因此很难确定是否还有其他问题,但这就是我的解决方法:

location.hash = '#'+location.hash.split('#')[1]

此代码运行并枚举所有“具体”模型。从您的问题中,我想您还想知道您是否可以获得“符号”模型:SMT求解器无法做到这一点。 SMT求解器仅生成具体的(即所有基本项)模型,因此,如果需要从它们进行概括,则必须在z3边界之外进行。