在Z3中添加对函数的约束

时间:2014-01-27 19:55:07

标签: c++ z3

我试图让Z3找到整数上某些函数的解释。我遇到了一个奇怪的小问题。我写了一小段代码来说明它:

#include "z3++.h"
#include<iostream>
using namespace std;
using namespace z3;
main()
{
    context c;
    sort I=c.int_sort();
    func_decl trial1=function("trial1",I,I);
    func_decl trial2=function("trial2",I,I,I);
    solver s(c);
    expr temp=trial1(1)==2;
    cout<<temp<<endl;
    s.add(temp);
    //temp=trial2(1,2)==3;
    temp=trial2(c.int_val(1),c.int_val(2))==3;
    cout<<temp<<endl;
    s.add(temp);

}

在此代码中,注释掉的行会导致错误。但是我在下面写的替代方案工作得很好。我混淆的原因是导致2个参数错误的构造可以使用1个参数(上面3行)。这是一个限制吗?我错过了什么吗?这不是一个严重的问题,只是好奇才知道。

1 个答案:

答案 0 :(得分:2)

Z3 C ++ API重载了类operator()的{​​{1}}。我们的想法是允许我们使用自然符号创建小术语。当前可用的重载是:

func_decl

请注意 expr operator()() const; expr operator()(unsigned n, expr const * args) const; expr operator()(expr_vector const& v) const; expr operator()(expr const & a) const; expr operator()(int a) const; expr operator()(expr const & a1, expr const & a2) const; expr operator()(expr const & a1, int a2) const; expr operator()(int a1, expr const & a2) const; expr operator()(expr const & a1, expr const & a2, expr const & a3) const; expr operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4) const; expr operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4, expr const & a5) const; 没有重载。这就是为什么你的例子不起作用的原因。为这种情况添加一个新的重载并不困难,但是对于3个或更多的参数来说它真的很乏味。 C ++ API是在C API之上定义的。文件operator()(int a1, int a2)是自包含的。我们可以添加新的重载而无需重新编译Z3。我们只需要包括

z3++.h

在类 expr operator()(int a1, int a2) const; 中,以及执行其他func_decl重载后的以下代码。

func_decl::operator()