比较谓词

Comparing predicates

一位发帖者询问如何比较 Alloy 中的函数。在测试一个小示例(比较谓词而不是函数)来回答问题时,我注意到以下行为,这让我感到困惑。

只要检查命令的边界高于 3 且事实 'f1' 处于活动状态,分析器就找不到反例。使事实失效,分析器按预期工作。为什么冗余事实 'f1' 会如此修改分析器的操作,为什么只是在边界高于 3 的情况下?

open util/ordering [V]
sig V {}

fact f1 {
    # V > 0
}

pred p1 [x: V] {
    x = last
}

pred p2 [x: V] {
    x = first
}

assert a1 {
    all x: V | p1[x] <=> p2[x]
}

check a1 for 3

似乎只要检查边界为 4 或更高并且 'f1' 处于活动状态,分析器就会报告“0 vars”。 0个主要变量。 0 个条款。'

我目前无法查看细节,但您似乎看到了溢出行为,部分原因是 Alloy 的整数非常窄(4 位)默认情况下,我相信?)二进制补码整数,所以溢出经常发生。

几项更改单独或一起可能具有指导意义,看看它们是否会影响行为。

  • 将事实 f1 替换为 some V
  • 开启"Forbid Overflow"选项
  • 使用 scope 命令为 Int 提供明确的位宽(对于其他签名,范围编号指定最大实例数;对于 Int,它指定位宽)

正如 Loïc Gammaitoni 在此处的另一个问题中所说的那样 "You should always be careful when playing with numbers in Alloy"。