Recursion 当我找到路由时,Prolog中的爬行错误

Recursion 当我找到路由时,Prolog中的爬行错误,recursion,routes,prolog,transitive-closure,Recursion,Routes,Prolog,Transitive Closure,我在学习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)

我在学习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
,而不是atom
Other
,然后使用事实路线/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

你的谓词几乎是正确的。您只需将列表的尾部写为变量
Other
,而不是atom
Other
,然后使用事实路线/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