我在C ++中使用Z3,我有一些bool-sort exprs。
我想要做的是计算真值exprs的数量。
一种非常简单的方法是将这些expr转换为int-sort,然后将它们添加起来。
但我不知道如何将bool转换为int。
谢谢!
解决方案:
正如cpp示例文件所示(函数ite_example2()):
expr b = c.bool_const("x");
expr x = c.int_val(1);
expr y = c.int_val(0);
expr conj = ite(b,x,y);
答案 0 :(得分:1)
对于计算布尔值,并断言有多少是真等等(互斥量条件),伪布尔函数是你的朋友:
https://github.com/Z3Prover/z3/blob/master/src/api/c%2B%2B/z3%2B%2B.h#L949-L953
这些函数允许您声明可以创建基数条件的约束,这是我怀疑您首先尝试做的事情。与任何其他间接编码相比,这些函数为z3生成了更好的代码来解决。以下是基于python接口的讨论:K-out-of-N constraint in Z3Py
当然,您也可以直接计算,但如果符合您的需要,您应该更喜欢上述功能。如果你真的想得到一个整数,你将不得不使用:
基本上创建表达式(伪代码):
z = int_val(0);
o = int_val(1);
sum(ite(b1, o, z), ite(b2, o, z), ...)
但是如果可能的话,你应该坚持使用伪布尔。
答案 1 :(得分:0)
#include <iostream>
using namespace std;
int main() {
int a = 6;
a += (int)true;
cout << a << "\n";
}
答案 2 :(得分:0)
我使用Z3很长一段时间,但我认为你应该能够定义一个有效投影true =&gt; 1和false =&gt; 0(或其他方式)的函数。 / p>
假设您正在使用脚本,它看起来与
类似(declare-fun boolToIntDirect (Bool) Int)
(assert (= (boolToIntDirect false) 0))
(assert (= (boolToIntDirect true) 1))
(declare-fun boolToIntNegated (Bool) Int)
(assert (= (boolToIntNegated false) 1))
(assert (= (boolToIntNegated true) 0))
然后,如果你使用该函数构造一个表达式,它将进行转换,并且还会报告任何问题,例如获取非bool参数。