上下文,首先。我有以下双向图。
在 Prolog 中表示如下:
relation(a,c).
relation(b,d).
relation(c,d).
relation(d,e).
relation(e,f).
connection(X,Y) :- relation(X,Y).
connection(X,Y) :- relation(Y,X).
所以我有节点之间的关系,然后节点之间的连接相关,正如我之前所说,在两个方向上。
我想要做的是一个序言定义,path(X,Y)
能够判断图中两个节点之间是否存在路径(如果两个节点之间至少存在一条路径,则为 true,如果两个节点之间不存在路径,则为 false)。
因此,此模型中的目标输出应如下所示:
?- path(a,d).
true.
?- path(b,a).
true.
?- path(f,b).
true
? path(a,g). % The node g doesn't exist
false.
我知道这涉及使用访问列表,并且我已经看到了这样的示例,但是给出了两个节点之间的所有可能路径。然而,这不是我要找的。我正在寻找的是一个定义,它检测两个节点之间是否存在路径,而不是给出两个节点之间的所有可能路径。
编辑:所以,感谢@mbratch,我现在可以将建议的问题调整为解决方案:
relation(a,c).
relation(b,d).
relation(c,d).
relation(d,e).
relation(e,f).
connection(X,Y) :- relation(X,Y).
connection(X,Y) :- relation(Y,X).
path_exists(X,Y) :- path(X,Y,_), !.
path(A,B,Path) :-
travel(A,B,[A],Q),
reverse(Q,Path).
travel(A,B,P,[B|P]) :-
connection(A,B).
travel(A,B,Visited,Path) :-
connection(A,C),
C \== B,
\+member(C,Visited),
travel(C,B,[C|Visited],Path).