我试图在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"。
有人?
谢谢
答案 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进行完整讨论。