Вот вопрос, который мне дали:
Определите путь предиката Prolog (X, Y, G), где путь (-, -, +), который
истина, когда существует путь от узла X к узлу Y в ориентированном графе G,
где график представлен списком ребер, каждый из которых представлен
двухэлементный список узлов источника и назначения.
Вот пример вывода:
?- path(b,Y,[[a,b],[b,c],[b,d],[d,e]]).
Y = c ;
Y = d ;
Y = e ;
no
?- path(X,b,[[a,b],[b,c],[b,d],[d,e]]).
X = a ;
no
?- path(c,e,[[a,b],[b,c],[b,d],[d,e]]).
yes
Это отличается от других примеров, которые я видел в Интернете, где обходы узлов были бы такими фактами, как:
canTraverse(a,b).
canTraverse(b,c).
и т.д.
Так что я довольно озадачен этим.
Это то, что я получил до сих пор:
path(X, Y, G) :-
(
G = [CurrentPair | EverythingElse],
CurrentPair = [X1 , Y1| _],
=(X, X1),
=(Y, Y1)
)
;
path(X, Y, EverythingElse).
Что, похоже, сработало, если два узла X и Y были в паре / списке вместе. Но я не уверен, как заставить его пересекать узлы.