0

我正在学习 Prolog,当我尝试查找路线时出现蠕变错误。我认为我所做的是递归,因为这是在没有直路时找到路线的方法。

这是代码:

route(london,paris).
route(paris,rome).
route(rome,spain).
route(london,berlin).
route(berlin,praga).
route(london,dublin).
route(dublin,berlin).

path(X,Y,[X,Y]):- straight(X,Y).
path(X,Z,[X | other]):- straight(X,Y), path(Y,Z,other). 

当我试图找到时,假设从伦敦到罗马的路线

path(london,rome,Store).

我收到此错误:

Exception: (8) straight(london, rome) ? creep

Exception: (7) path(london, rome, _G4705) ? creep

我究竟做错了什么?我应该定义别的东西吗?

提前致谢!

4

1 回答 1

2

您的谓词几乎是正确的。您只需要将列表的尾部写为变量Other而不是原子other,然后使用您的事实 route/2 进行直接连接:

path(X,Y,[X,Y]) :-
    route(X,Y).
path(X,Z,[X | Other]) :-
    route(X,Y),
    path(Y,Z,Other).

现在您的查询有效:

   ?- path(london,rome,S).
S = [london,paris,rome] ? ;
no
于 2016-04-17T19:12:01.150 回答