Z3 量词的C API

Z3 量词的C API,z3,Z3,我想使用Z3CAPI解决包含量词的约束。 我正在努力使用诸如“Z3_mk_exists()”之类的函数,因为我在tar文件的测试示例中或在线上都找不到任何示例。 我不完全理解这些函数需要的所有参数以及它们的确切意义。 有人能帮忙吗 谢谢。 Kaustubh.这里是一个使用通用量词的完整示例。评论是内联的: Z3_config cfg = Z3_mk_config(); Z3_set_param_value(cfg, "MODEL", "true"); Z3_context ctx = Z3_mk

我想使用Z3CAPI解决包含量词的约束。 我正在努力使用诸如“Z3_mk_exists()”之类的函数,因为我在tar文件的测试示例中或在线上都找不到任何示例。 我不完全理解这些函数需要的所有参数以及它们的确切意义。 有人能帮忙吗

谢谢。
Kaustubh.

这里是一个使用通用量词的完整示例。评论是内联的:

Z3_config cfg = Z3_mk_config();
Z3_set_param_value(cfg, "MODEL", "true");
Z3_context ctx = Z3_mk_context(cfg);
Z3_sort intSort = Z3_mk_int_sort(ctx);
/* Some constant integers */
Z3_ast zero  = Z3_mk_int(ctx, 0, intSort);
Z3_ast one   = Z3_mk_int(ctx, 1, intSort);
Z3_ast two   = Z3_mk_int(ctx, 2, intSort);
Z3_ast three = Z3_mk_int(ctx, 3, intSort);
Z3_ast four  = Z3_mk_int(ctx, 4, intSort);
Z3_ast five  = Z3_mk_int(ctx, 5, intSort);
我们为fibonacci创建了一个未被解释的函数:
fib(n)
。我们将用一个通用量词来指定它的含义

Z3_func_decl fibonacci = Z3_mk_fresh_func_decl(ctx, "fib", 1, &intSort, intSort);

/* fib(0) and fib(1) */
Z3_ast fzero = Z3_mk_app(ctx, fibonacci, 1, &zero);
Z3_ast fone  = Z3_mk_app(ctx, fibonacci, 1, &one);
我们开始指定
fib(n)
的含义。基本情况不需要量词。我们有
fib(0)=0
fib(1)=1

Z3_ast fib0 = Z3_mk_eq(ctx, fzero, zero);
Z3_ast fib1 = Z3_mk_eq(ctx, fone,  one);
这是一个绑定变量。它们在量化表达式中使用。索引应从
0
开始。在这种情况下,我们只有一个

Z3_ast x = Z3_mk_bound(ctx, 0, intSort);
这表示
fib()
,其中
是绑定变量

Z3_ast fibX = Z3_mk_app(ctx, fibonacci, 1, &x);
Z3_ast axiomTree = Z3_mk_implies(ctx, xGTone, Z3_mk_eq(ctx, fibX, fibSum));
模式将触发实例化。我们再次使用
fib(41;
。这意味着(或多或少)Z3将在看到
fib(“某个术语”)
时实例化axiom

据我所知,此符号仅用于调试。它为
\uu
提供了一个名称

Z3_symbol someName = Z3_mk_int_symbol(ctx, 0);

/* _ > 1 */
Z3_ast xGTone = Z3_mk_gt(ctx, x, one);
Z3_ast xOne[2] = { x, one };
Z3_ast xTwo[2] = { x, two };
/* _ - 1 */
Z3_ast fibXminusOne = Z3_mk_sub(ctx, 2, xOne);
/* _ - 2 */
Z3_ast fibXminusTwo = Z3_mk_sub(ctx, 2, xTwo);
Z3_ast toSum[2] = { Z3_mk_app(ctx, fibonacci, 1, &fibXminusOne), Z3_mk_app(ctx, fibonacci, 1, &fibXminusTwo) };
/* f(_ - 1) + f(_ - 2) */
Z3_ast fibSum = Z3_mk_add(ctx, 2, toSum);
这就是公理的主体。它说:
\u>1=>(fib(\u)=fib(\u1)+fib(\u2)
,其中,\u0是绑定变量

Z3_ast fibX = Z3_mk_app(ctx, fibonacci, 1, &x);
Z3_ast axiomTree = Z3_mk_implies(ctx, xGTone, Z3_mk_eq(ctx, fibX, fibSum));
最后,我们可以使用模式、绑定变量、名称和公理体构建一个量词树。(
Z3\u TRUE
表示它是一个所有的量词)。参数列表中的
0
指定了优先级。如果你不知道放什么,Z3文档建议使用
0

Z3_ast fibN = Z3_mk_quantifier(ctx, Z3_TRUE, 0, 1, &pattern, 1, &intSort, &someName, axiomTree);
最后,我们将公理添加到上下文中

Z3_assert_cnstr(ctx, fib0);
Z3_assert_cnstr(ctx, fib1);
Z3_assert_cnstr(ctx, fibN);