在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个字母的任何建议将不胜感激。
答案 0 :(得分:0)
如果您显示图表,可能使用Graphviz
?- writeln('digraph G {'), forall(connected(A,B), writeln(A->B)), writeln('}').
你可以看到只有[c,f]有2个传入边缘,而你不需要路径/ 2。在连接/ 2的第二个参数上连接是足够的,测试第一个参数是不同的(运算符(\ =)/ 2)。