prolog - 在到达预期节点之前,如何知道图中的所有节点是否已被访问?

标签 prolog transitive-closure

我有这种类型的知识库:

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/

相关文章:

database - 令人困惑的DES Datalog语法错误

prolog - 如何检查序言中的顺序?

prolog - 我需要 "base step"在 Prolog 中进行递归吗?

performance - Spark 示例程序运行很慢

prolog - 序言中的递归引用

prolog - 我可以在事实/规则中使用变量吗?

java - Prolog/tuprolog,一行返回 'The enitire [sic] string could not be read as one term'

prolog - 如何将文件中的数据读入Prolog

swi-prolog - SWI/CLP(FD) 中的可达性约束

algorithm - 双向图中的传递闭包