当我找到一条路线时 Prolog 中出现蠕变错误

creep error in Prolog when I find a route

我正在学习 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

我做错了什么? 我应该定义其他东西吗?

提前致谢!

你的判断几乎是正确的。您只需要将列表的尾部写为变量 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