Z3中的唯一变量名称

时间:2017-11-26 10:27:24

标签: variables z3

我需要依赖两个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

这真的是怎么回事?还是只是巧合? 非常感谢任何帮助,谢谢!

0 个答案:

没有答案