Z3,C ++ API,如何将bool排序转换为int排序

时间:2017-05-28 13:33:12

标签: z3

我在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);

3 个答案:

答案 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

直接计算

当然,您也可以直接计算,但如果符合您的需要,您应该更喜欢上述功能。如果你真的想得到一个整数,你将不得不使用:

  • int_val:创建一个数字表达式
  • ite:if-then-else
  • sum:创建一笔款项

基本上创建表达式(伪代码):

 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参数。