Incident(а, в, g):-
member(А-В, G);
member(В-А, G).
top(А, Tree) :- % А належить графу, якщо
incident(А,_, G). % А суміжна деякій вершині
Постановка 12.
Програму побудови остовного дерева можна написати зовсім іншим, повністю декларативним способом, лише формулюючи на Прологу деякі математичні визначення. Нехай, так само, як і попередньо, і графи, і дерева задані списками своїх ребер.
Використаємо наступні визначення:
(1) Т є остовним деревом графа G, якщо:
Т - це підмножина графа G і
Т - дерево і
Т "накриває" (covers) G, тобто кожна вершина з G також є у Т.
(2) Множина ребер Т є дерево, якщо
Т - зв'язний граф і
Т не містить циклів.
Ці визначення можна сформулювати на Прологу з використанням попередньої програми path(A, Z, G, Р).
% Побудова остовного дерева
% Графи й дерева представлені списками ребер.
tree_column(G, Tree):- subset(G, Tree),
tree(Tree), covers(Tree, G).
subset([ ], [ ]).
subset([Х | L], [Х | L1]) :- subset(L, L1).
tree(Tree):- connect(Tree),not(cycle(Tree)).
connect(Tree):-not(top(А, Tree), top(В, Tree),
not(path(А, В, Tree, _ ))).
top(А, G) :- incident(А,_, G).
cycle(Tree):-
Incident(а, в, Tree),
path(А,B,Tree,[А,X |_]). % Довжина шляху>1
path( A, Z, G, Р) :- path1( А, [Z], G, Р).
path1( А, [А | Р1], _, [А | Р1] ).
path1( А, [Y | Р1], G, Р) :- incident( X, Y, G),
not(member(X, Р1)), % Умова відсутності циклу
path1( А, [ X, Y | Р1], G, Р).
Incident(X, y, g(V, e)):- member(edge(X, y), e);
member(edge(Y, X), E).
covers(Tree, G) :-not(top(А, G), not(top(А, Tree))).
member(A,[A|_]):-!.
member(A,[_|T]):-member(A,T).
Зауважимо, що ця програма не має практичного інтересу через свою неефективність.
Самостійна робота.
Розгляньте використання наведених рішень задач на конкретних прикладах графів.
Розгляньте остовні дерева у випадку, коли кожному ребру графа приписана його вартість. Нехай вартість остовного дерева визначена, як сума вартостей складових його ребер. Напишіть програми:
визначення для заданого графа вартості його остовного дерева;
побудови для заданого графа його остовного дерева мінімальної вартості.