如何知道在到达目标节点之前是否已在图表中访问过所有节点?

时间:2016-11-20 19:32:22

标签: prolog transitive-closure

我有这种类型的知识库:

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).

为了处理双重连接,例如actions我使用一个列表来保存我经历的每个节点,然后在进入递归调用之前我确保我要去的节点不属于该列表。

现在我需要确保在到达最后一个节点之前通过所有现有节点。我完全不知道如何处理这个问题。如何在到达最后一个节点之前确定我访问过所有其他节点?

1 个答案:

答案 0 :(得分:1)

您已将网络定义为边缘列表。收集所有节点的快捷方式是:

findall(X, ( connect(X, _) ; connect(_, X) ), Xs),
sort(Xs, Nodes)

这将首先收集您在connect/2中列出的所有“从”和“到”,然后通过排序和删除重复项来设置它。

此时你可以将这个集合与你找到的路径进行比较(也可以在设置之后)。

显然,谓词失败很重要,没有路径访问connect/2定义的网络中的所有节点。