首页 > 解决方案 > 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. 生成所有可能的解决方案,对其进行排序,然后根据需要一一生成。然而,其他方法可能更容易。对于这部分工作,您可能需要使用剪切和失败。

当我运行代码时,我收到这些错误。在此处输入图像描述

标签: prologmaze

解决方案


推荐阅读