获取至少有2个节点连接到它们的所有节点

时间:2013-05-13 02:48:46

标签: prolog

在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).

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

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

但是我得到了 a,b,c h 我假设我必须要这样才能得到我想要的所有信件:

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

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

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

1 个答案:

答案 0 :(得分:0)

如果您显示图表,可能使用Graphviz

enter image description here

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

你可以看到只有[c,f]有2个传入边缘,而你需要路径/ 2。在连接/ 2的第二个参数上连接是足够的,测试第一个参数是不同的(运算符(\ =)/ 2)。