为什么Alloy分析仪无法找到以下断言的反例?

时间:2015-09-29 10:20:44

标签: alloy

检查以下断言不会产生反例:

assert G4_3__10
{ 
  all x : Int | (x = 1) 
}
check G4_3__10

产生以下输出:

Executing "Check G4_3__10"

Solver=sat4j Bitwidth=0 MaxSeq=0 SkolemDepth=1 Symmetry=20
0 vars. 0 primary vars. 0 clauses. 4ms.
No counterexample found. Assertion may be valid. 0ms.

当我添加事实或签名时,它确实找到了一个反例 使用Ints(例如,添加

fact { 0 in Int }

有人可以解释这种行为的原因吗?

1 个答案:

答案 0 :(得分:3)

由于在原始模型中不强制将Integer集合设置为非空,因此分析将仅考虑没有整数的实例。因此,你的断言将永远存在,因此不会找到反例。

第二次尝试中添加的事实推动Alloy考虑0在整数集中的实例。 Alloy,将隐式地将默认位4与Int关联,以便现在考虑的实例在区间[-8,7]中包含整数。在这些情况下,将会发现反例。

您还可以显式指定要在check命令中使用的Integer位宽(而不是使用此虚拟事实)来强制存在整数,例如:check G4_3__10 for 4 Int