我需要创建一个邻接矩阵,其中图形顶点表示为事实: e.g。
graph(a,b).
graph(c,c).
graph(b,c).
我需要输出矩阵:
0 1 0
0 0 1
0 0 1
我知道我应该为每一行列出一个列表,但是当它们是符号而不是数字时会出现问题,所以我不知道如何知道该列表的大小(例如,如果有图表(如果有的话) e,f)。列表必须是六个数字,所以f可以适合)。我不想要完整的答案,如果你只是想告诉我一个如何做的草图,我想我会没事的。
答案 0 :(得分:4)
获取所有节点的列表:
node(X) :- graph(X,_).
node(X) :- graph(_,X).
allnodes(Nodes) :-
setof(X, node(X), Nodes). % removes duplicates
获取节点数:
numnodes(N) :-
allnodes(Nodes),
length(Nodes, N).
答案 1 :(得分:2)
我最近没有写过很多Prolog代码,但这是我认为我会写的(未经测试):
printedge(X,Y) :- graph(X,Y), write("1 ").
printedge(X,Y) :- \+ graph(X,Y), write("0 ").
printmatrix :-
List = [a,b,c,d],
member(Y, List),
nl,
member(X, List),
printedge(X,Y),
fail.
现在你只需要以某种方式获得元素列表。