prolog - Prolog 迷宫赛跑者
问题描述
你打算在 Prolog 中编写一个简单的程序来寻找穿过迷宫的路径。您的输入将包含 pway(a, b, 10) 形式的事实。表示从a到b有一条长10米的通道。您将编写一个规则 solve(X, Y, P, N) :- ... 它将找到从交叉点 X 到交叉点 Y 的长度为 N(如果存在)的路径 P。目的是用户将调用作为查询求解,将 X 和 Y 指定为常量,将 P 和 N 指定为变量。这是一个具体的例子。假设数据库包含以下规则:pway(a, b, 10)。pway(b, c, 15)。pway(d, c, 5)。pway(d, b, 10)。如果用户键入 solve(a, d, P, N),Prolog 解释器可能会响应 P = [a, b, c, d] N = 30 如果此时用户键入分号,
我使用在线解释器制作了这个迷宫
https://swish.swi-prolog.org/example/kb.pl
pway(a, b, 10).
pway(b, c, 15).
pway(d, c, 5).
pway(d, b, 10).
pway(c, d, 20).
pway(a, c, 25).
pway(b, a, 30).
solve(a, b, []).
solve(X, Y, P, N):- pway(a,[]),
not(member(a, b)),
solve(a, b).
solve(a, b, N):- pway(a, b),
not(member(a, b, N)),
solve(b, a, N).
solve(a, b, N):- (pway(a, b) ; pway(b, a)),
not(member(b, N)), solve(a, b, P, N).
sovle(a, b, P, N).
请注意,通道是双向的;如果从a到b可以走10米,从b到a也可以走10米。2. 大多数迷宫都有循环。您的代码必须应对它们。多次通过同一个交叉点是没有意义的,您当然不希望解释器陷入无限回归。3. 请注意,通道的双向性会产生大量的琐碎循环:您需要避免从 a 走到 b 再回到 a。
对于这项工作,您不需要使用 Prolog 的任何命令式特性(剪切、失败或数据库排序)。事实上,您甚至不需要,尽管您可能需要 \=(数字“不等于”)。确实存在仅包含七个规则的分配解决方案!3. 你会想要增加距离。请记住,您必须使用 is 谓词来强制算术计算。4. 生成所有可能的解决方案,对其进行排序,然后根据需要一一生成。然而,其他方法可能更容易。对于这部分工作,您可能需要使用剪切和失败。
解决方案
推荐阅读
- javascript - 将附件和一些附加参数上传到 MVC 控制器
- javascript - 在移动 Web 浏览器中使用 Facebook JavaScript SDK 的 FB.login 会打开新选项卡而不是原生 Facebook 应用程序
- mysql - 求和时间值 MySQL
- android - EndlessRecyclerViewScrollListener 不显示 recyclerview 上的所有项目
- javascript - free-jqgrid 在子网格中填充下拉菜单
- javascript - 将google分析跟踪代码限制为一个js
- oauth - 应该如何为使用 OAuth 的 API 生态系统定义范围?
- javascript - 为什么在 foreach 函数中未定义变量?
- javascript - 添加自定义工具栏按钮后react-quill缺少样式
- parallel-processing - Kubernetes 根据任务的 Pod 数量