Пролог. Построить транзитивное замыкание графа
Nov 30 2020
Я новичок в Prolog. У меня такой график:
edge(a,e).
edge(e,f).
edge(f,d).
edge(d,a).
Я определяю переходное замыкание как:
p(X,Y) :- edge(X,Y).
tran(X,Z) :- p(X,Y), p(Y,Z).
Мне нужно построить транзитивное замыкание графа. Пожалуйста, дайте мне знать, как это сделать.
Ответы
2 WillemVanOnsem Nov 30 2020 at 00:58
Проблема в trans/2том, что он будет проходить только два ребра, а не произвольное число.
Мы можем определить предикат, tran(X, Z)который выполняется, если edge(X, Z)выполняется, или edge(X, Y)и then tran(Y, Z). Таким образом, в последнем мы проходим по одному ребру, а затем рекурсивно переходим к следующему tran/2:
tran(X, Z) :-
edge(X, Z).
tran(X, Z) :-
edge(X, Y),
tran(Y, Z).