我对 Prolog 完全陌生,并且正在研究图表。我在网上发现了一个问题,要求我指定一个节点,然后列出从该节点可到达的所有简单路径。没有目标节点,只需尝试所有可能性并返回所有这些路径。
我将图表示为路径(X,Y),表示从 X 到 Y 的有向边。
我建立了这个简单的周期性知识库:
path(a, b).
path(b, c).
path(c, d).
path(d, a).
path(d, e).
path(d, f).
path(f, g).
如果我查询 all_paths(a, P),那么 P 应该是(假设 ; 是垃圾邮件,直到所有选项用尽)。
P = [a].
P = [a, b].
P = [a, b, c].
P = [a, b, c, d].
P = [a, b, c, d, e].
P = [a, b, c, d, f].
P = [a, b, c, d, f, g].
作为初学者,我写了类似的东西:
all_paths(Source, P) :- all_paths(Source, P, []).
all_paths(_, [], _).
all_paths(Source, [Source | P], Visited) :-
path(Source, Node),
\+ memberchk(Node, Visited),
all_paths(Node, P, [Node | Visited]).
好的,稍微改了一下,现在我回来了:
X = [] ? ;
X = [a] ? ;
X = [a,b] ? ;
X = [a,b,c] ? ;
X = [a,b,c,d] ? ; <- Here it does not pick up e
X = [a,b,c,d] ? ;
X = [a,b,c,d] ? ;
X = [a,b,c,d,f] ? ;
有人可以帮助弄清楚如何正确获取所有路径吗?