如何回答这个关于路径的序言问题?

问题描述 投票:0回答:1

https://i.ibb.co/q0zXPGv/qe.jpg

在Prolog中,我们可以引入一个关于边缘方向的谓词来表示上图:

edge(s,a).
edge(a,b).

我们进一步引入一个关于节点连通性的谓词:

connected(X,Y) :- edge(X,Y).
connected(X,Y) :- edge(X,Z), connected(Z,Y).

现在,我们想使用谓词

path(X,Y,P)
进一步扩展我们的程序,它将使用变量
P
来保存构成从节点
X
到节点
Y
的有效路径的节点列表。

实现路径谓词并将Prolog系统的答案写入以下查询:
1. ?- 路径(s,f,P).
2. ?- 路径(d,c,P).
3. ?- 路径(s,g,P).
4. ?- 路径(s,e,P)。
Image of path

prolog
1个回答
1
投票

让我们检查一下我的问题解决方案:

edge(s,a).
edge(s,f).
edge(s,e).
edge(f,e).
edge(a,b).
edge(e,d).
edge(d,a).
edge(d,c).
edge(b,c).
edge(c,g).

connected(X,Y):- edge(X,Y).
connected(X,Y):- edge(X,Z), connected(Z,Y).

path(X,X,[X]).
path(X,Y,[X|P]):- connected(X,Z), path(Z,Y,P),!.

如果路径是从节点到节点本身,那么结果一定是节点。 否则,如果我们可以通过某个节点 Z 从 X 到 Y,则节点 X 应该在路径中。

我不太喜欢实现连接,因为它迫使你放弃解决方案。

希望有帮助!以下是上述问题的答案:

?- path(s,f,P).
P = [s, f].

?- path(d,c,P).
P = [d, a, b, c].

?- path(s,g,P).
P = [s, a, b, c, g].

?- path(s,e,P).
P = [s, f, e].
© www.soinside.com 2019 - 2024. All rights reserved.