Пролог: если в диаграмме можно пересечь два узла - PullRequest
0 голосов
/ 09 января 2019

Вот вопрос, который мне дали:

Определите путь предиката 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 были в паре / списке вместе. Но я не уверен, как заставить его пересекать узлы.

1 Ответ

0 голосов
/ 14 января 2019

График направлен и не имеет циклов.

Базовым регистром может быть path(X, Y, G) :- member([X,Y],G)., а рекурсивный регистр может сказать, что существует путь от X до Y, сделать шаг от X до некоторой средней ноты, а затем найти путь от середины до Y.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...