我想在Prolog中编写这个算法,首先我需要从图表列表中创建一个矩阵。我以前做过这个(也是在你们这些人的帮助下),但现在我不知道如何将它存储在列表列表中(我认为这是prolog案例中的最佳方法)。我想我可以从那里继续(在每个算法中使用三重for循环)。程序的逻辑对我来说并不困难,但如何处理数据。很抱歉打扰并提前致谢!
我的矩阵生成器:
graph(a,b).
graph(a,a).
graph(b,c).
graph(b,d).
graph(c,d).
graph(a,e).
graph(e,f).
matrix :- allnodes(X),printmatrix(X).
node(X) :- graph(X,_).
node(X) :- graph(_,X).
allnodes(Nodes) :- setof(X, node(X), Nodes).
printedge(X,Y) :- graph(Y,X), write('1 ').
printedge(X,Y) :- \+ graph(Y,X), write('0 ').
printmatrix(List):- member(Y, List),nl,member(X, List),printedge(X,Y),fail.
答案 0 :(得分:2)
您之前的问题Adjacency Matrix in prolog涉及图表的邻接矩阵的可视化显示(行上行)。在这里,我们讨论如何实现/表示邻接矩阵作为Prolog术语。特别是我们将采用上面显示的 allnodes / 1 谓词作为获取所有节点列表的方法。
Prolog缺少任何原生“矩阵”数据类型,因此这里采用的方法是使用列表列表来表示邻接矩阵。条目由0和1中的“行”组织,表示与对应于列的节点对应的节点的邻接。
查看您的示例 graph / 2 事实,我发现您已经包含了一个自我边缘(从a到a)。我不确定你是否打算将图表定向或不定向,所以我假设有一个有向图,并注意如果另外指的是无向图,那么需要进行小的改动。
这里有一个“设计模式”,它通过将规则应用于列表中的每个项目来定义列表。在这里,我们这样做一种方法来构造“矩阵”的每一行,并(也作为我们的规则)构建整个列表列表。
/* construct adjacency matrix for directed graph (allow self-edges) */
adjacency(AdjM) :-
allnodes(L),
adjMatrix(L,L,AdjM).
adjMatrix([ ],_,[ ]).
adjMatrix([H|T],L,[Row|Rows]) :-
row_AdjM(H,L,Row),
adjMatrix(T,L,Rows).
row_AdjM(_,[ ],[ ]).
row_AdjM(X,[Y|Ys],[C|Cs]) :-
( graph(X,Y)
-> C = 1
; C = 0
),
row_AdjM(X,Ys,Cs).
如果指的是无向图,那么对graph(X,Y)
的调用应替换为允许在任一方向上考虑边缘的替代( graph(X,Y); graph(Y,X) )
。