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

问题描述:

由于采用了具有Prolog的问题的一些问题:获得具有连接到它们的至少2个节点的所有节点

以下子句表示的有向图,其中节点是 原子,并且边缘被连接谓词表示。鉴于 以下条款在数据库中,回答下面的两个问题 。

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ç
我觉得有一个以上的节点的字母是A,B, c,f
我想这让A,BÇ

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

但我得到一个,B,C^h
我假设我不得不喜欢这个让所有我想要的字母:

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

它给了我一个,B,C,E,F,G和H虽然。

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

,如果你显示你的图形,也许Graphviz的

enter image description here

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

你可以看到,只有[C,F]有2个传入边和你需要路径/ 2。在connected/2的第二个参数上加入一个连接就足够了,第一个参数是不同的(operator(\ =)/ 2)。

+0

非常感谢!我认为,因为它用括号表示,连接到它的所有边缘,我包括a和b。也感谢关于操作员和答案的暗示,它给了我正确的方向来寻找答案。起初我很困惑,因为我没有真正得到你的答案。 – shadow 2013-05-13 13:29:11