比较谓词

时间:2016-06-14 09:39:15

标签: alloy

一张海报询问如何比较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或更高并且&#39; f1&#39;在分析报告&#39; 0变量时处于活动状态。 0个主要变量。 0条款。&#39;

1 个答案:

答案 0 :(得分:2)

我目前无法查看详细信息,但看起来你可能会看到溢出行为,部分原因是Alloy的整数非常窄(默认情况下是4位,我相信?)twos - 实现整数,因此溢出会定期发生。

若干变化可能是有益的,单独的或一起的,以确定它们是否会影响行为。

  • 将事实f1替换为some V
  • 启用“禁止溢出”选项
  • 使用scope命令为Int提供显式位宽(对于其他签名,范围编号指定最大实例数;对于Int,它指定位宽)

正如LoïcGammaitoni在另一个问题中提出的那样“在使用Alloy中的数字时,你应该小心。”