一张海报询问如何比较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;
答案 0 :(得分:2)
我目前无法查看详细信息,但看起来你可能会看到溢出行为,部分原因是Alloy的整数非常窄(默认情况下是4位,我相信?)twos - 实现整数,因此溢出会定期发生。
若干变化可能是有益的,单独的或一起的,以确定它们是否会影响行为。
some V
scope
命令为Int提供显式位宽(对于其他签名,范围编号指定最大实例数;对于Int,它指定位宽)正如LoïcGammaitoni在另一个问题中提出的那样“在使用Alloy中的数字时,你应该小心。”