alloy - 模拟农民、山羊、卷心菜、狼拼图的方法?
问题描述
我正在对模拟农民、山羊、卷心菜、狼问题的各种方法进行分类。
以下是对问题建模的两种方法。还有其他合理的方法来建模吗?
一个模型定义了一组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
推荐阅读
- .net - 如何让 Windows 10 检测到我安装的所有文字转语音?
- ocaml - OCaml 将(无参数)变体序列化为“字符串枚举”(通过 Yojson)
- javascript - 使用Javascript获取提交按钮的父表单
- django - 查询数据库并为每个结果返回复选框
- node.js - 如何在页面刷新时存储和检索复选框状态?Mongoose/EJS/Nodejs/Express
- css - 在 Nebular 聊天 UI 中隐藏发件人姓名
- android - Android避免在圆角上绘图
- macos - 在 MacOS 上是否有替代 usermod 的方法?
- spring-boot - Spring JPA:如何在多对多关系中将父子对象作为嵌套对象
- python - 获取特定格式的数据框