我有这种类型的知识库:
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
我使用一个列表来保存我经历的每个节点,然后在进入递归调用之前我确保我要去的节点不属于该列表。
现在我需要确保在到达最后一个节点之前通过所有现有节点。我完全不知道如何处理这个问题。如何在到达最后一个节点之前确定我访问过所有其他节点?
答案 0 :(得分:1)
您已将网络定义为边缘列表。收集所有节点的快捷方式是:
findall(X, ( connect(X, _) ; connect(_, X) ), Xs),
sort(Xs, Nodes)
这将首先收集您在connect/2
中列出的所有“从”和“到”,然后通过排序和删除重复项来设置它。
此时你可以将这个集合与你找到的路径进行比较(也可以在设置之后)。
显然,谓词失败很重要,没有路径访问connect/2
定义的网络中的所有节点。