问题标签 [river-crossing-puzzle]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3207 浏览

prolog - Prolog过河

所以我被分配了一个任务来尝试在 Prolog 中解决这个问题,尽管老师只介绍了基础知识,这基本上是 Prolog 中唯一的项目。我觉得我想多了,而且他对第一次 Prolog 程序的期望太高了。

下面列出了问题,我应该如何解决这个问题?

编写一个 Prolog 程序来解决下面的单词问题。作为解决方案的一部分,它应该打印所有的交叉点,首先列出桨手。

汤姆、杰克、比尔和吉姆不得不使用只能容纳两个人的独木舟过河。
在河的左岸到右岸的三个渡口中,独木舟都有两个人,从右到左岸的两个渡口中,独木舟的每个人都有一个人。当其他人在独木舟中时,汤姆无法划桨。
当除比尔以外的其他人在独木舟中时,杰克无法划桨。每个人至少划过一个路口。

这是我到目前为止所拥有的,虽然它“有效”,但它并不能确保每个人都至少划一次。

0 投票
1 回答
2025 浏览

artificial-intelligence - PDDL - 山羊、狼和卷心菜

我被要求为著名的“山羊、狼和卷心菜”场景写一个解决方案。场景如下:

农夫想把这三个人都运过河。但是,如果:

  • 山羊和白菜一个人呆着,山羊会吃白菜
  • 如果狼和山羊一个人呆着,狼会吃掉山羊!

因此,该问题的一种解决方案如下:

  • 把山羊带过河,然后把它扔到另一边
  • 过河回来
  • 拿起卷心菜或狼,把它带到另一边
  • 放下狼,捡起山羊,然后回到另一边
  • 放下山羊,拿起卷心菜,然后回到另一边
  • 拿起山羊,瞧!这三个都被运输了。

但是,我无法将其投影到 PDDL 中。我已经给出了问题定义:

最后,我们只得到了 1 个谓词,并被告知这可以通过 4 个动作来完成。move_empty,move_goat,move_wolf,move_cabbage。

谓词是:

(配置?狼?山羊?卷心菜?船)(有效?狼?山羊?卷心菜?船)

我试图从 move_empty 开始:

我不希望得到答案,只希望得到关于如何解决这个问题的帮助和建议,因为我能找到的关于 PDDL 的信息并不多。

0 投票
1 回答
757 浏览

prolog - Prolog-Farmer Wolf Goat Cabbage 中的谓词演算

我从人工智能中经典的农夫狼山羊白菜问题中得到了这个启示

在此处输入图像描述

教科书说,当农夫和狼在河的对面时,这条规则就会起作用。我无法理解“如果暗示的一部分”

这是什么意思?

0 投票
1 回答
316 浏览

clips - 使用 Jess 解决过河难题

起初我解决了一个无限循环的问题,我通过向我的 CONSTRAIN 模块添加规则来解决这个问题。我已经考虑了所有的限制,但似乎所有的事实都因为某种原因被删除了......到目前为止这是我的代码:

这是我的输出:

0 投票
0 回答
150 浏览

prolog - 三个有不同袋子钱的窃贼

我已经编写了这段代码,但是当我在 GNU Prolog 中查阅它时,它显示如下。

在此处输入图像描述

这是我的代码

我希望大家能帮助我修复这段代码,以便在我在 GNU Prolog 中咨询时它可以运行良好。

0 投票
1 回答
1038 浏览

prolog - Prolog中的桥梁手电筒拼图

在我陈述这一点之前,我从逻辑上理解了这个问题的解决方案,只是很难对其进行编码。一家四口试图在夜间过桥。一个人过桥需要手电筒,只能两个人同时过桥,以两人中较慢的速度移动。父亲在 1 分钟内过桥,母亲在 2 分钟内过桥,孩子在 5 分钟内过桥,奶奶在 10 分钟内过桥。我正在尝试编写一个 Prolog 程序来处理此类问题,但适用于以任何速度移动的任何规模的家庭。总穿越时间必须小于最大指定时间。我们以事实形式获得了这些家庭family(Name,[X1/T1,X2/T2...etc])。我们被要求定义一个谓词MoveFamily(FamilyName, MAxTime, Moves, Time)wherefamilyNameMax time是绑定变量,moves 绑定到将每个人从一侧穿越到另一侧所采取的移动,time 绑定到它所花费的总时间。这是我到目前为止所拥有的:

当我运行这个事实时family(two, [fred/1, george/2])。我得到:

有谁知道为什么这不起作用?

编辑:一次穿过两个时,它们以较慢成员的速度移动

编辑2:家庭“二”是family(two, [fred/1, george/2])

edit3:查询的所需输出moveFamily(two,20,Moves,Time)应该是

编辑4:我把家庭事实放在代码块中,我是个傻瓜,应该意识到这就是你的意思哈哈

0 投票
0 回答
230 浏览

prolog - 在 Prolog 中生成可能的组合

我正在尝试使用 Prolog 解决“传教士和食人族”问题,在该问题中,您在岛屿的一侧输入了传教士和食人族的数量,并且他们必须乘坐一艘指定的船穿越到另一侧最大容量,约束为:

  1. 在岛的两侧和船上,食人者的人数不能超过传教士。

  2. 船上必须至少有一个人。

我试图用以下代码来实现这一点:

上面所有变量的键:

我认为我非常接近,主要(唯一?)问题在于该state功能,因为我不明白您应该如何生成可能的动作/实际进行动作。有人可以请教。

我正在尝试使用上述功能专门解决它,因为它是过去的试卷问题。

编辑:

为了阐明state/7谓词的目的,它用于查找并输出通过求解过程发生的所有状态的列表。例如。

如果你打电话state(2,2,1,0,0,1,[])(上面说左边岛上有一艘容量为 2 的船,左边岛上有两个传教士和一个食人族,右边岛上有零传教士和零个食人族),然后打印出结果L 最终可能会给出:

0 投票
1 回答
1039 浏览

prolog - Prolog中解决农民山羊狼和白菜问题的优化

我正在为Prolog中的经典“狼、山羊和卷心菜”问题寻找更好的算法,计算效率更高。下面的算法基于 BFS 搜索可能的情况。

问题:_

“从前,一个农夫去市场买了一头狼、一只山羊和一棵卷心菜。在回家的路上,农夫来到河边租了一条船。但乘船过河,农夫只能携带他自己和他购买的一件物品:狼、山羊或卷心菜。

如果无人看管,狼会吃山羊,或者山羊会吃白菜。

农民面临的挑战是将自己和他的购买物带到河的远处,让每件购买的东西都完好无损。他是怎么做到的呢?”

这个问题的当前解决方案是这个:

0 投票
1 回答
81 浏览

prolog - 在 GNU Prolog 中编译失败

在 GNU Prolog 中加载 .pl 文件时出现编译错误

农夫-狼-山羊-白菜问题

0 投票
1 回答
56 浏览

append - 如何将多个项目附加到嵌套列表?您如何成功地处理过河问题的变体?

我正在尝试解决这个类似于狼、山羊和卷心菜问题的谜语,并尝试以图形格式表示它(节点和边表示所有潜在路径)。

这就是问题:

2 个马戏团家庭有一个行为,其中一个家庭,由母亲、父亲和女儿组成,位于空中飞人的左侧,而另一个家庭,有两个兄弟和一个姐妹,位于空中飞人的右侧。空中飞人。每个人都从各自的秋千上吊起来,两个家庭之间有一个空荡荡的秋千,如下所示:

母亲,父亲,女儿,空,妹妹,弟弟,哥哥

一个人只能从他们的秋千摆动到一个空荡荡的秋千上,该空荡荡的秋千要么与他们当前的秋千相邻,要么被来自任一家庭的单个人与他们的位置隔开。诀窍的目的是让两个家庭交换双方。任何家庭成员都不得在任何阶段向后摆动。将导致成功执行该技巧的动作顺序是什么?

我将左侧的族标记为“A”族,将右侧的族标记为“B”,将空族标记为“É”,并从第一个位置开始,尝试绘制所有可能存在的排列。

现在我试着只做第一个可能的移动(移动到相邻的空荡荡),但我似乎遇到了一些技术问题,我不知道为什么会这样。

我正在尝试在每个步骤中列出可能的步骤。

这就是我所拥有的。

我正在尝试将新项目附加到新列表中,但它会更改项目。可能是因为 append 在 if 语句中两次并且只是更改了附加的项目吗?有没有更有效的方法来做到这一点?感谢任何帮助将不胜感激:)