我是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代码!)
非常感谢。
此致 李。