1

Prolog问题有一些问题:

以下子句表示一个有向图,其中节点是原子,边由连接谓词表示。鉴于以下子句在数据库中,请回答以下两个问题。

connected(a,b).
connected(b,d).
connected(b,e).
connected(b,f).
connected(a,c).
connected(c,f).
connected(c,g).
connected(h,c).
path(X,Y) :- connected(X,Y).
path(X,Z) :- connected(X,Y), path(Y,Z).

显示 Prolog 查询,该查询返回具有两个或多个不同传入边的所有节点(即,至少有两个不同的节点连接到它)。此外,显示输入查询的结果(询问每个解决方案)。您的查询可能会多次返回同一个节点,并且可能会打印出查询中其他变量的值。表示相关节点的变量应称为 DNode。


到目前为止,我有:

path(DNode,__) , path(__,DNode).

但这只给我bc
我认为具有多个节点的字母是a, b, c, f
我试过这个来获得a、bc

path(__,DNode),path(DNode,__) ; path(DNode,__) , path(DNode,__).

但我得到了a, b, ch
我假设我必须喜欢这样才能获得我想要的所有字母:

path(__,DNode),path(DNode,__) ; path(DNode,__) , path(DNode,__) ; path(__,DNode) , path(__,DNode).

它给了我 a、b、c、e、f、g 和 h。

任何关于如何获得我想要的 4 个字母的建议将不胜感激。

4

1 回答 1

0

如果你显示你的图表,也许用 Graphviz

在此处输入图像描述

?- writeln('digraph G {'), forall(connected(A,B), writeln(A->B)), writeln('}').

您可以看到只有 [c,f] 有 2 个传入边,并且您不需要path/2。对 connected/2 的第二个参数进行连接就足够了,并测试第一个参数是否不同(运算符 (\=)/2)。

于 2013-05-13T07:30:36.397 回答