我试图养成使用 Dafny 作为一些简单公式的友好 SAT-QBF 求解器的习惯,因为在 Z3 中这样做太不舒服了。
上下文是我已经实现了 Cooper 的量词消除算法,当所有变量都有界时,它可以用作决策过程:因此,我想知道在执行它之前应该得到哪个结果。
但是,我在 Dafny 中遇到了一个问题。
例如,让我们提出这个公式(用 Dafny 编写):
assert forall x_1: int :: exists y_1: int :: forall x_2: int :: exists y_2 : int
:: (y_2<y_1) && (x_2<y_2) && (x_1<x_2);
在我的 Cooper 中,它返回False
,而 Dafny 返回assertion violation
(以及典型的triggers
警告),我False
也将其解释为。好的,所以这没有问题。
但如果我提出:
assert exists x_1: int :: exists y_1: int :: exists x_2: int :: exists y_2 : int
:: (y_2<y_1) && (x_2<y_2) && (x_1<x_2);
在我的 Cooper 中,它返回True
,而 Dafny 也返回assertion violation
。我已经完成了手动 Cooper 执行(铅笔和纸),我认为这True
是正确的。
知道发生了什么吗?
PS:我还没有在Z3中尝试过,因为我在做其他理论的第一次尝试。
编辑
使用一个简单的技巧来实例化量化变量可以避免触发警告:创建一个未解释的函数。
method Main() {
assert exists x_1 : int {:trigger P(x_1)} :: exists y_1: int {:trigger P(y_1)}
:: exists x_2: int {:trigger P(x_2)} :: exists y_2 : int {:trigger P(y_2)}
:: (y_2<y_1) && (x_2<y_2) && (x_1<x_2);
}
predicate P(a: int)
{
true
}