在river crossing Alloy model中,这个谓词:
pred crossRiver [from, from', to, to': set Object] {
one x: from | {
from' = from - x - Farmer - from'.eats
to' = to + x + Farmer
}
}
模拟河流穿越:x
侧的一个物体from
与农民一起移动到to
侧。
为了测试我的理解,我改变了:one x: from
改为lone x: from - Farmer
---前者移动"完全是一件事"河对岸,后者最多移动一个非农民的东西"。
我认为后者更好地模拟了这个问题:农民在平等约束条件下硬编码并且总是穿过河流,lone
应该更好地传达农民可以在河对岸采取零或一件事。
但是,在此更改后运行模型时,结果是无意义的:
这里的第二个州实例显示河流两侧的鸡肉和谷物,而农民根本没有穿过。
我错过了什么? (这是在合金4.2_2015-02-22上运行)
答案 0 :(得分:1)
当您将one
更改为lone
时,您允许Alloy从true
谓词中轻松返回crossRiver
,无论near
和{{{{}}是什么1}}看起来像。因此,模型状态不以任何方式约束该步骤。因此,far
中near
和far
的每一组可能值都非常适合合金。
这并不意味着Alloy会以某种方式优化它并且永远不会限制。它会尝试State
(正确约束one
和near
)并且只会far
不限制解决方案。但是,两种解决方案都必须位于解决方案空间中。显然,有更多的无约束解决方案,所以你可能会看到垃圾。
如果您使用true
,则Alloy 必须满足谓词,这意味着具有one
和far
关系的正文受限于此类一种只在国家建模的有效过境点的方式。
将合金视为石雕工具。你从一大块状态开始:near
和near
和far
中每个可以想象的原子组合都在那里。但是,如果您跳过跟踪中的约束,那么您只会得到一个随机的原子组合。
发生类似情况的常见问题是:
State
这看起来总是错误的。唉,当没有Foo原子时,这是真的,因为从未看过身体。