合金的独行与河流穿越的一个量词

时间:2018-03-14 10:03:57

标签: alloy model-checking

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应该更好地传达农民可以在河对岸采取零或一件事。

但是,在此更改后运行模型时,结果是无意义的:

Alloy visualization projected on State

这里的第二个州实例显示河流两侧的鸡肉和谷物,而农民根本没有穿过。

我错过了什么? (这是在合金4.2_2015-02-22上运行)

1 个答案:

答案 0 :(得分:1)

当您将one更改为lone时,您允许Alloy从true谓词中轻松返回crossRiver,无论near和{{{{}}是什么1}}看起来像。因此,模型状态以任何方式约束该步骤。因此,farnearfar的每一组可能值都非常适合合金。

这并不意味着Alloy会以某种方式优化它并且永远不会限制。它会尝试State(正确约束onenear)并且只会far不限制解决方案。但是,两种解决方案都必须位于解决方案空间中。显然,有更多的无约束解决方案,所以你可能会看到垃圾。

如果您使用true,则Alloy 必须满足谓词,这意味着具有onefar关系的正文受限于此类一种只在国家建模的有效过境点的方式。

将合金视为石雕工具。你从一大块状态开始:nearnearfar中每个可以想象的原子组合都在那里。但是,如果您跳过跟踪中的约束,那么您只会得到一个随机的原子组合。

发生类似情况的常见问题是:

State

这看起来总是错误的。唉,当没有Foo原子时,这是真的,因为从未看过身体。