我有这种类型的知识库:
connect(a, b).
connect(a, d).
connect(a, e).
connect(b, a).
connect(b, c).
...
我的目标是,给定起点和命运,在到达最终节点之前遍历所有现有节点一次。
到目前为止,这是我所得到的:
path(O, D, L):-
path(O, D, [O], L).
path(D, D, _, [D]).
path(O, D, A, [O|T]):-
connect(O, I),
\+ member(I, A),
path(I, D, [I|A], T).
为了处理双重连接,例如connect(a, b). connect(b, a).
我使用一个列表来保存我经过的每个节点,在进入递归调用之前,我确保我要访问的节点不属于该列表。
现在我需要确保在到达最后一个节点之前遍历所有现有节点。我完全不知道如何处理这个问题。我如何确定在到达最后一个节点之前我访问了所有其他节点?
最佳答案
您可以使用自己的代码(不使用 findall)进行一些小的更改来测试它。不要丢弃已访问节点的列表,而是保留它。因此,将path/4更改为path/5,如下所示:
path(D, D, V, V, [D]).
path(O, D, A, V, [O|T]):-
connect(O, I),
\+ member(I, A),
path(I, D, [I|A], V, T).
现在您可以查询 path(a,c,[a], Visited, Path) 并测试是否存在不属于 Visited 成员的连接节点。
关于prolog - 在到达预期节点之前,如何知道图中的所有节点是否已被访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40708469/