Z3:使用C API解决迭代示例

时间:2017-12-19 23:18:28

标签: c z3 solver smt

我是Z3求解器的新手,使用Windows 10,VS2013命令提示符。

我正在尝试使用C,我尝试使用Z3求解器解决以下简单问题。

问题集:以下if-then-else语句满足(b = 1)条件的可能值是什么,

(这里,我们正在寻找(a = 1))

的解决方案
if (a = 1)
  b = 1
else
  b = 0

所以我根据Z3的C代码示例制作了下面的C代码,

(但代码无效,因为使用Z3完全没有意义,我真诚地为此道歉)

void ite_example()
{
    Z3_context ctx = mk_context();
    Z3_solver  s = mk_solver(ctx);
    Z3_model m = 0;
    Z3_ast a, b, one, zero, ite, ite_true;
    Z3_ast a_eq_one, b_eq_one, b_eq_zero;
    Z3_ast c1;

    printf("\nite_example\n");

    one = mk_int(ctx, 1);
    zero = mk_int(ctx, 0);
    a = mk_int_var(ctx, "a");
    b = mk_int_var(ctx, "b");

    a_eq_one = Z3_mk_eq(ctx, b, one);
    b_eq_one = Z3_mk_eq(ctx, a, one);
    b_eq_zero = Z3_mk_eq(ctx, a, zero);

    ite = Z3_mk_ite(ctx, a_eq_one, b_eq_one, b_eq_zero); // if(a = 1) then(b = 1) else(b = 0)
    Z3_solver_assert(ctx, s, ite);

    // we want to find the integer variable (a) that makes (b = 1)
    c1 = Z3_mk_eq(ctx, b, one);
    Z3_solver_assert(ctx, s, c1);

    m = Z3_solver_get_model(ctx, s);
    printf("%s\n", Z3_model_to_string(ctx, m));

    /* delete logical context */
    Z3_del_context(ctx);
}

int main() {
    #ifdef LOG_Z3_CALLS
        Z3_open_log("z3.log");
    #endif
        ite_example();
        return 0;
}

但似乎代码无效(生成错误代码如下)

D:\z3-master\z3-master\build>make examples
cl /nologo /c /Zi /W3 /WX- /O2 /Oy- /D _EXTERNAL_RELEASE /D WIN32 /D NDEBUG /D _CONSOLE /D _WINDOWS /D ASYNC_COMMANDS /Gm- /EHsc /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /analyze- /arch:SSE2  /openmp /MD /D _WINDOWS  /Fotest_capi2.obj /nologo /MD -I..\src\api ..\examples\c\test_capi2.c
test_capi2.c
cl /Fec_example.exe /nologo /MD test_capi2.obj  libz3.lib /link /DEBUG /MACHINE:X86 /SUBSYSTEM:CONSOLE /INCREMENTAL:NO /STACK:8388608 /OPT:REF /OPT:ICF /TLBID:1 /DYNAMICBASE /NXCOMPAT
Z3 examples were successfully built.

D:\z3-master\z3-master\build>c_example.exe

ite_example
Error code: 10
BUG: incorrect use of Z3.

我很抱歉问你这么多基本问题。

对于如何解决这个问题的任何想法都将非常感激。

(非常感谢修改后的ite_example代码!)

非常感谢。

此致 李。

0 个答案:

没有答案