prolog - 错误1,Backtrack Stack Full

时间:2015-07-13 22:34:37

标签: prolog

我试图在prolog中编写一个程序,确定是否存在从一个地方到另一个地方的方式。这些是关系:

road(ny,florida).
road(washington,florida).
road(washington,texas).
road(vegas,california).

我想写:there_is_way(X,Y)确定是否有办法。 例如:

?- road(florida,ny).
no
?-there_is_way(florida,ny).
yes

这是我的代码:

there_is_way(X,Y):- road(X,Y);
                        road(Y,X);
                        road(X,Z),road(Z,Y),X\=Y;
                        road(X,Z),road(Y,Z),X\=Y;
                        road(Z,X),road(Z,Y),X\=Y;
                        road(Z,X),road(Y,Z),X\=Y.
there_is_way(X,Y):-
                        road(Z,Y),there_is_way(X,Z).
there_is_way(X,Y):-
                        road(Y,Z),there_is_way(X,Z).

但不幸的是我得到了#34;错误1,Backtrack Stack Full"。

有人?

谢谢

2 个答案:

答案 0 :(得分:2)

首先,我们需要一个对称的定义:

:- meta_predicate symm(2, ?,  ?).

symm(P_2, A, B) :-
   call(P_2, A, B).
symm(P_2, A, B) :-
   call(P_2, B, A).

现在,使用closure0/3

there_is_way(A, B) :-
   closure0(symm(road), A, B).

答案 1 :(得分:1)

如果您将道路/ 2视为指向边缘,那么您可以简单地:

road(ny,florida).
road(washington,florida).
road(washington,texas).
road(vegas,california).

there_is_way(X,Y):- road(X,Y).
there_is_way(X,Y):- road(X,Z),there_is_way(Z,Y).

但是,如果您的图表中有一个循环,或者由于方向,或者您认为road / 2是一个无向边(并相应地执行此操作),那么您需要跟踪路径查找时的位置。否则你将陷入无限循环。请记住prolog首先默认搜索深度,所以你需要检查一下,当一个项目添加到一个路径时它还没有,否则prolog会一遍又一遍地找到相同的路径..

请参阅本书第5章:https://www.cs.bris.ac.uk/~flach/SL/SL.pdf进行完整讨论。