C++ Z3:如何在不使用硬编码索引的情况下从model()访问变量?
下面是我为获得所有可能的解决方案而编写的示例代码C++ Z3:如何在不使用硬编码索引的情况下从model()访问变量?,c++,z3,C++,Z3,下面是我为获得所有可能的解决方案而编写的示例代码 #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);
#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);
int j = 1;
while (s.check() == sat)
{
model m = s.get_model();
cout << "solution " << j << " :" << endl;
for (int i = 0; i < m.size(); i++)
{
func_decl f1 = m[i];
cout << f1.name() << " = " << m.get_const_interp(f1) << endl;
}
j++;
s.add((Y != m.get_const_interp(m[1])) || (Z != m.get_const_interp(m[0])) || (X != m.get_const_interp(m[2])));
}
}
#包括“z3++.h”
使用名称空间z3;
使用名称空间std;
int main(){
上下文c;
expr X=c.int_const(“X”);
expr Y=c.int_const(“Y”);
expr Z=c.int_const(“Z”);
s(c);
s、 加(X==Y+Z);
s、 加上((X>0)和&(Y>0)和&(Z>0));
s、 add(X您不应该引用索引,而是应该使用表达式向量并通过迭代变量来添加阻塞子句。类似这样的方法应该有效:
#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));
}
}
我将省略输出,但当我运行生成的可执行文件时,它会打印45个不同的解决方案,与原始输出相匹配。“如何获取所有可能的解决方案?”…“这是获取所有可能的解决方案的代码”现在还不完全清楚您的代码以何种方式没有完成您希望它完成的任务,我们同时会遇到如此相似的问题。+1:)@PatrickTrentin正在执行“获取所有解决方案”在所有语言中,z3都应该是一个常见问题,我们可以简单地指出。:-)不久前,S.O.将Wiki作为一个补充资源引入了这个板块。我还没有使用过这个功能,但实际上您可能能够以一种易于访问的方式编写常见问题
$ g++ -std=c++11 a.cpp -lz3