z3 提取 Seq Int 作为 std::vector<int>
z3 extracting Seq Int as std::vector<int>
我正在尝试将Seq Int
从model
提取到std::vector<int>
。 我可以用<<
打印它,但我该如何进行提取?
void oren_example()
{
// context + solver
context ctx;
solver solver(ctx);
// sorts
sort int_sort = ctx.int_sort();
sort seq_int_sort = ctx.seq_sort(int_sort);
sort bool_sort = ctx.bool_sort();
// constants
expr two = ctx.int_val(2);
expr five = ctx.int_val(5);
expr four = ctx.int_val(4);
expr three = ctx.int_val(3);
// define State sort
const char *names[4]={"x","A","b","n"};
sort sorts[4]={int_sort,seq_int_sort,bool_sort,int_sort};
func_decl_vector projs(ctx);
sort state_sort = ctx.tuple_sort("State",4,names,sorts,projs).range();
// define an arbitrary state sigma
expr sigma = ctx.constant("sigma",state_sort);
// define some predicate on the state
func_decl init = function("init",state_sort,bool_sort);
solver.add(forall(sigma,
init(sigma) == (
((projs[0](sigma)) == two ) &&
((projs[1](sigma).length()) == three) &&
((projs[1](sigma).nth(two)) == five ) &&
((projs[3](sigma)) == five ))));
// find an initial state
solver.add(init(sigma));
// check sat + get model
if (solver.check() == sat)
{
model m = solver.get_model();
std::cout << "x = " << m.eval(projs[0](sigma)) << "n";
std::cout << "A = " << m.eval(projs[1](sigma)) << "n";
std::cout << "b = " << m.eval(projs[2](sigma)) << "n";
std::cout << "n = " << m.eval(projs[3](sigma)) << "n";
}
}
一切都按预期打印出来:
x = 2
A = (seq.++ (seq.unit 6) (seq.unit 7) (seq.unit 5))
b = false
n = 5
尝试:
std::vector<int> output;
int size = m.eval(projs[1](sigma).length()).get_numeral_int();
std::cout << "size = " << size << std::endl;
for(int i = 0; i < size; ++i)
output.push_back(m.eval(projs[1](sigma).nth(ctx.int_val(i))).get_numeral_int());
for(int i = 0; i < size; ++i)
std::cout << "output[" << i << "] = " << output[i] << std::endl;
当我将其添加到您的程序中并运行它时,我得到:
x = 2
A = (seq.++ (seq.unit 4) (seq.unit 6) (seq.unit 5))
b = false
n = 5
size = 3
output[0] = 4
output[1] = 6
output[2] = 5
相关文章:
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 如何从 std::atomic 中提取指针 T<T>?
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 为什么istream不支持右值提取
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 如何设置一个范围来提取我想要获得的信息
- <<操作员在下面的行中工作
- 视觉工作室项目.提取源文件夹名称
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 从字符串中提取整数并形成一个数组
- C ++中的StringStream有助于使用向量从字符串中提取逗号分隔的整数,而不是空格分隔的整数,为什么?
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 从 std::vector<无符号字符>切片中提取 int?
- 在C++中使用重载提取运算符时出现问题
- 在 Qt(C++) 中使用 QProcess 解压缩 - 提取目录问题
- C++(.cpp文件和.h文件)拆分代码并添加一个函数,提取 - 这很容易吗?
- 无法从 std::string 中提取C++ Unicode 符号
- 如何从也包含C++字母的文本文件中提取某些数字?
- 如何从适合一定范围的数字中提取数字?