在调试Alloy中一个令人困惑的问题时,我已经使用评估者执行3 > 10
并获得结果true
。我错过了什么吗?!
答案 0 :(得分:2)
按正常标准,合金整数通常非常窄,并且它们通常具有一种“环绕式”。语义。在默认范围内,在合金4.2中,Int的范围为-8到7,而文字8,9,10与文字-8,-7,-6无法区分。 (使用像文字10这样的超出范围的值不能静态检测,因为原则上合金模型可以是无限的; Int的大小不是静态知道的。它是动态已知的,所以外面的文字应该是可能的Int的范围引起动态错误;我不知道他们为什么不这样做。如果他们这样做,肯定会让一些用户的生活变得更加混乱。)
如果您想要#x > 10
之类的约束,那么您将要为Int指定更大的范围。注:为Int或int指定的范围指定用于整数的二进制补码表示的位宽,而不是Universe中的Int原子数。
有一个禁止溢出选项,这可能有所帮助(但请参阅this question,这表明可能出现并发症。)
在考虑在Alloy中使用整数时,值得考虑杰克逊在软件抽象中所说的内容(第2.3.2节后的讨论):
你真的可以在没有解释原子的情况下工作吗?
是的,几乎所有的时间。事实证明,在大多数情况下,你可能认为你需要整数,使用未解释类型的原子与某些关系来提供所需的任何解释都更清晰,更抽象。合金实际上支持整数,虽然受到限制(由于有限界限的限制)。
(4.8之后的讨论):
祝你好运。为什么要将整数留到最后?
整数实际上并不是很有用。如果您认为自己需要它们,请再想一想;通常有一个更抽象的描述可以更好地匹配问题。仅仅因为整数出现在问题域中并不意味着它们应该被建模。要弄清楚整数是否必要,请问自己实际依赖的是什么属性。例如,对其消息进行编号的通信协议可能仅依赖于不同的数字;或者它可以继续增加;或者甚至可能完全被命令。在这些情况下,都不应使用整数。当然,如果你有一个很大的数值问题,你可能需要整数(以及更多),但是然后Alloy可能不适合。