81
список_дуг=дуга*
структура_ребро=р (symbol, вершина, вершина)
список_ребер=структура_ребро*
predicates
граф (список_ребер)
шлях (вершина, список_дуг)
шлях1 (дуга, вершина, список_дуг, список_дуг)
дуга (дуга, вершина, вершина)
довжина (список_дуг, integer)
довжина (список_ребер, integer)
сумiжна_дуга (дуга, дуга, вершина, вершина)
member (дуга, список_дуг)
member (структура_ребро, список_ребер)
clauses
граф ([р (a, 1, 2), р (b, 1, 3), р (c, 2, 3), р (d, 2, 5), р (e, 3, 4), р (f, 2, 4),
р (g, 3, 5), р (h, 4, 5)]).
шлях (Початкова_вершина, Шлях):-
дуга (Початкова_дуга, Початкова_вершина, Поточна_вершина),
шлях1 (Початкова_дуга, Поточна_вершина, [Кiнцева_дуга], Шлях),
Початкова_дуга<>Кiнцева_дуга.
шлях1 (Початкова_дуга, _, [Початкова_дуга|Шлях1],
[Початкова_дуга|Шлях1]).
шлях1 (Початкова_дуга, Поточна_вершина, [Дуга_Y|Шлях1], Шлях):-
граф (Список_ребер),
сумiжна_дуга (Дуга_X, Дуга_Y, Поточна_вершина, Нова_вершина),
not (member (Дуга_X, Шлях1)),
шлях1 (Початкова_дуга, Нова_вершина, [Дуга_X, Дуга_Y|Шлях1],
Шлях),
довжина (Список_ребер, L), довжина (Шлях, L).
сумiжна_дуга (X, Y, Поточна_вершина, Нова_вершина):-
дуга (Y, Поточна_вершина, Нова_вершина),
дуга (X, Нова_вершина, _),
X<>Y.
дуга (X, M, N):-
граф (Список_ребер), member (р (X, N, M), Список_ребер);
граф (Список_ребер), member (р (X, M, N), Список_ребер).
member (R, [R|T]).
member (R, [H|T]):-
member (R, T).
довжина ([ ], 0).
довжина ([Н|T], N):-
довжина (T, N1),
N=N1+1.
Êîìåíòàð. Ó ïðîãðàì³ ïðåäèêàò граф/1 ïîäຠãðàô ÿê ñïèñîê ðåáåð. Ïðè öüî-
ìó ñïèñîê âåðøèí îêðåìî íå âêàçóºòüñÿ, òàê ÿê âîíè íåÿâíî ì³ñ-