Ваш предыдущий вопрос Матрица смежности в прологе касалась визуального отображения (строка за строкой) матрицы смежности графика.Здесь мы рассмотрим, как реализовать / представить матрицу смежности как термин Пролог.В частности, мы будем использовать предикат allnodes / 1 , показанный выше, в качестве средства получения списка всех узлов.
В Прологе отсутствует какой-либо собственный тип данных "матрицы", поэтому подходздесь будет использоваться список списков для представления матрицы смежности.Записи организованы по «строке» в 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) )
, который позволяет рассматривать ребро в любом направлении.