使用 # 计算在 Fact 中不起作用 (Alloy)

Count using # not working in Fact (Alloy)

我是 Alloy(麻省理工学院制作的建模语言)的初学者。我正在尝试模拟 Alloy 的两居室公寓的租赁情况。我试图添加一个事实,使每间出租公寓的人数不超过 4 人。但是在 运行 上生成的实例仍然显示只有一间 2 居室的出租公寓有 10 人。我究竟做错了什么?另外,如果可能的话,除了麻省理工学院网站上的教程之外,有人可以指出一些关于学习 Alloy 的好资源吗?谢谢

abstract sig apartment {}

sig twoLeased extends apartment {
occupants: some People
} { #occupants < 5 }

sig twoUnleased extends apartment {

}

sig People {}

run {} for 3 but 4 twoLeased, 10 People

默认情况下,用于表示整数的位宽为 4,因此您的实例包含范围从 -87 的整数。在乘员人数为 10 的情况下,因此会发生整数溢出(如 10>8),#occupants 返回一个负数,因此它不如 5,因此满足您的不变量。

要解决此问题,您可以在 Alloy 分析器设置中禁止整数溢出或增加用于表示整数的位宽(例如 run {} for 6 Int)。