我正在学习 Prolog,但我发现在解释我的教授提出的幻灯片时遇到了一些困难。
从表示图的两个节点之间是否存在路径的经典程序开始,这个:
edge(a,b).
edge(b,c).
edge(a,e).
edge(c,d).
edge(d,e).
edge(f,e).
path(X,Y) :- edge(X,Y).
path(X,Y) :- path(X,Z),
edge(Z,Y).
他介绍了一个使用谓词的新版本:path(X,Y,Path)如果图中存在 X 和 Y 之间的路径并且Path是访问节点的列表,则为 TRUE
于是他给了我之前程序的以下新版本:
/* BASE CASE: exist an edge between X and Y, so the Path is
the couple [X,Y]
*/
path(X,Y,[X,Y]) :- edge(X,Y).
path(X,Y,P) :- path(X,Z,P1),
edge(Z,Y),
lastelem(P,Y,P1).
基本情况非常简单:如果存在连接 X 和 Y 的边,则确实存在从 X 到 Y 的路径,并且访问节点的列表是 [X,Y]
我对第二条规则有一些问题:如果 X 和 Y 不是仅通过一条边连接,因此 X 和 Y 之间存在路径,则 X 和另一个节点 Z 之间必须存在路径(并且 P1 是此路径中访问节点的列表)将 Z 连接到最终节点 Y 的一条边。
这很简单......问题在于幻灯片中未提供的最后一个谓词lastelem/3(所以我不知道它究竟做了什么):
lastelem(P,Y,P1).
我认为它会生成 P 在 P1 中插入 Y 或类似的东西......
你对它有更精确的想法以及这个谓词的可能实现吗?