您想在Prolog中编写一个简单的程序来查找穿过迷宫的路径。您的 输入将包含以下形式的事实 pway(a,b,10)。 表示从路口a到路口b的长度为10米。 你要写一条规则 resolve(X,Y,P,N):-... 它将找到从交点X到交点Y的长度为N(如果存在)的路径P。 是用户将调用solve作为查询,将X和Y指定为常量,将P和N指定为 变量。 这是一个具体的例子。假设数据库包含以下规则: pway(a,b,10)。 pway(b,c,15)。 pway(d,c,5)。 pway(d,b,10)。 如果用户输入 解(a,d,P,N) Prolog解释器可能会回应 P = [a,b,c,d] N = 30如果此时用户键入分号,则解释器应使用 P = [a,b,d] N = 20 应该再产生一个分号 没有 没有更多的途径。
我已经使用在线口译员制作了这个迷宫
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十米,您可以 距离b toa也走10米。 2.大多数迷宫都有循环。您的代码必须应付它们。毫无意义 通过同一个路口不止一次,您当然不希望 解释器这样做会陷入无限回归。 3.请注意,通道的双向性会产生大量的琐碎循环: 您将要避免从a到b再回到a。
您不需要使用Prolog的任何命令性功能(剪切,失败或 数据库排序)。实际上,尽管您会,甚至不需要, 可能想要\ =(数字``不等于'')。分配的解决方案包括 确实只有七个规则! 3.您需要添加距离。请记住,您必须使用is谓词强制 算术运算。 4.生成所有可能的解决方案,对它们进行排序,然后一一生成 需求。但是,其他方法可能更容易。您可能需要使用断断续续的方法 对于这部分工作。