我需要依赖两个Z3变量的事实 可以不具有相同的名称。 为了确保这一点, 我在tuple_example1()中使用了test_capi.c中的z3/examples/c并更改了原始代码:
// some code before that ...
x = mk_real_var(ctx, "x");
y = mk_real_var(ctx, "y"); // originally y is called "y"
// some code after that ...
为:
// some code before that ...
x = mk_real_var(ctx, "x");
y = mk_real_var(ctx, "x"); // but now both x and y are called "x"
// some code after that ...
并且(正如预期的那样)输出变为:
tuple_example1
tuple_sort: (real, real)
prove: get_x(mk_pair(x, y)) = 1 implies x = 1
valid
disprove: get_x(mk_pair(x, y)) = 1 implies y = 1
invalid
counterexample:
y -> 0.0
x -> 1.0
为:
tuple_example1
tuple_sort: (real, real)
prove: get_x(mk_pair(x, y)) = 1 implies x = 1
valid
disprove: get_x(mk_pair(x, y)) = 1 implies y = 1
valid
BUG: unexpected result.
然而,当我仔细观察时,我发现Z3并没有真正失败或任何东西,它只是一个天真的(驱动程序)打印到控制台。 所以我继续编写完全相同的测试,y是一个名为“x”的int类。 令我惊讶的是,当Z3有不同的排序时,同名可以处理两个变量:
tuple_example1
tuple_sort: (real, real)
prove: get_x(mk_pair(x, y)) = 1 implies x = 1
valid
disprove: get_x(mk_pair(x, y)) = 1 implies y = 1
invalid
counterexample:
x -> 1.0
x -> 0
这真的是怎么回事?还是只是巧合? 非常感谢任何帮助,谢谢!