我正在编制农民,山羊,卷心菜,狼问题的各种建模方法。
以下是两种模拟问题的方法。是否有其他合理的方法对其进行建模?
一个模型定义了一组River对象。在农民完成渡轮之后,每个River对象代表河流及其两侧的快照。
sig River {
side1: set Item,
side2: set Item
}
另一个模型有一个River对象。河两岸的物品随着时间的推移而变化。
one sig River {
side1: Item -> Time,
side2: Item -> Time
}
什么是其他的,合理的,模拟农民,山羊,卷心菜,狼问题的方法?
让我们把这个谜想象成一个有序的一系列情境,其中情境包含位置 - 项对。
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