模拟农民,山羊,卷心菜,狼谜的方法?

问题描述 投票:0回答:1

我正在编制农民,山羊,卷心菜,狼问题的各种建模方法。

以下是两种模拟问题的方法。是否有其他合理的方法对其进行建模?

一个模型定义了一组River对象。在农民完成渡轮之后,每个River对象代表河流及其两侧的快照。

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

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

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

什么是其他的,合理的,模拟农民,山羊,卷心菜,狼问题的方法?

alloy
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.