首页 > 解决方案 > 模拟农民、山羊、卷心菜、狼拼图的方法?

问题描述

我正在对模拟农民、山羊、卷心菜、狼问题的各种方法进行分类。

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

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

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

另一种模型有一个River 对象。河两岸的物品随着时间的推移而变化。

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

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

标签: alloy

解决方案


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

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

推荐阅读