检查以下断言不会产生反例:
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 }
有人可以解释这种行为的原因吗?
答案 0 :(得分:3)
由于在原始模型中不强制将Integer集合设置为非空,因此分析将仅考虑没有整数的实例。因此,你的断言将永远存在,因此不会找到反例。
第二次尝试中添加的事实推动Alloy考虑0在整数集中的实例。 Alloy,将隐式地将默认位4与Int关联,以便现在考虑的实例在区间[-8,7]中包含整数。在这些情况下,将会发现反例。
您还可以显式指定要在check命令中使用的Integer位宽(而不是使用此虚拟事实)来强制存在整数,例如:check G4_3__10 for 4 Int