如何为农民,山羊,白菜,狼之谜建模?

时间:2018-07-12 16:12:38

标签: alloy

我正在分类对农民,山羊,白菜,狼问题进行建模的各种方法。

下面是对问题进行建模的两种方法。还有其他合理的建模方法吗?

一个模型定义了River对象的集合。农夫摆渡之后,每个河流对象代表河流及其两侧的快照。

sig River {
    side1: set Item,
    side2: set Item
}

另一个模型有一个河对象。河两岸的物品随时间变化。

one sig River {
    side1: Item -> Time,
    side2: Item -> Time
}

还有什么其他合理的方法来模拟农民,山羊,白菜,狼问题?

1 个答案:

答案 0 :(得分:1)

让我们把这个难题想象成一系列有序的情况,其中一个情况包含位置-项目对。

open util/ordering[Situation]

abstract sig Location {}
one sig SideA, SideB extends Location {}

abstract sig Item {}
one sig Goat, Cabbage, Wolf, Farmer extends Item {}

sig Situation {
  l_i: Location -> Item
}

然后很容易形成拼图规则:

// in the initial situation everyone is on SideA
one s: Situation & first |  all i: Item | s.l_i.i = SideA
// in the final situation everyone is on SideB
one s: Situation & last  |  all i: Item | s.l_i.i = SideB

// in all other situations the locations of the goat/wolf and the cabbage/goat must be diffent, except when the farmer is also there
all s: Situation - first - last |  (s.l_i.Goat != s.l_i.Cabbage) or s.l_i.Goat = s.l_i.Farmer
all s: Situation - first - last |  (s.l_i.Goat != s.l_i.Wolf)    or s.l_i.Goat = s.l_i.Farmer
// further puzzle constraints ...

我很好奇是否有一种更紧凑的方式来引用订单中的第一项

one s: Situation & first
相关问题