Prolog 正在获取至少连接了2个节点的所有节点

Prolog 正在获取至少连接了2个节点的所有节点,prolog,Prolog,在序言问题上有一些问题: 以下子句表示一个有向图,其中节点是 原子和边由连接谓词表示。鉴于此 数据库中有以下子句,请回答这两个问题 下面 显示返回具有两个或多个节点的所有节点的Prolog查询 不同的传入边(即,至少有两个不同的节点 连接到它)。另外,显示输入查询(询问)的结果 对于每个解决方案)。您的查询可能会多次返回同一节点 时间,并可能打印出查询中其他变量的值。 表示相关节点的变量应称为DNode 到目前为止,我已经: path(DNode,__) , path(__,DNode).

在序言问题上有一些问题:

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

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


到目前为止,我已经:

path(DNode,__) , path(__,DNode).
但那只给了我b和c
我认为有多个节点的字母是a、b、c、f。
我试着得到a,b和c:

但我有a、b、c和h.
我想我必须这样才能得到我想要的所有字母:

path(__,DNode),path(DNode,__) ; path(DNode,__) , path(DNode,__) ; path(__,DNode) , path(__,DNode).
它给了我a,b,c,e,f,g和h


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

如果您显示您的图形,也许可以使用Graphviz

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


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

非常感谢!我想,因为它在括号中表示,所有与它相连的边,我包括了a和b。同时也感谢关于接线员和答案的提示,它给了我正确的方向去寻找答案。一开始我很困惑,因为我没有真正得到你的答案。
path(__,DNode),path(DNode,__) ; path(DNode,__) , path(DNode,__) ; path(__,DNode) , path(__,DNode).
?- writeln('digraph G {'), forall(connected(A,B), writeln(A->B)), writeln('}').