Поиск пути выполняется в gprolog

#prolog

#prolog

Вопрос:

Я пытаюсь создать функцию в GProlog, которая, на мой взгляд, довольно проста, но у меня возникают проблемы с ее написанием.

Идея состоит в том, чтобы предположить, что взвешенный ориентированный граф описывается с помощью предиката edge/3, такого, что edge (X, Y, C) является истинным, если существует ребро от вершины X до вершины Y стоимостью C. Например, справа находится граф и его описание с использованием edge/3: ребро (a, c,1). ребро (a, d, 3). ребро (b,d,2). ребро (c, e,5). ребро (e, c,2). ребро (e,f,2). ребро (d,f,10).

Цель состоит в том, чтобы определить предикат cheaperPath/3, такой, чтобы cheaperPath(X, Y,N) был истинным, если существует путь от X до Y общей стоимостью меньше N. Предполагается, что предикат вызывается со всеми созданными экземплярами X, Y и N, например, для запроса cheaperPath(a, f,7) ответ должен быть no .

Вот что я сделал на данный момент в Gprolog, но цикл, похоже, продолжается и продолжается:

 edge(a, c,1).
edge(a,d,3).
edge(b,d,2).
edge(c,e,5).
edge(e, c,2).
edge(e,f,2).
edge(d,f,10).


cheaperPath(X,Y,N):-edge(X,Y,N1),N1@=<N.
cheaperPath(X,Y,N):-edge(X,Z,N1),cheaperPath(Z,Y,M),M is (N-N1).

 

Есть идеи, почему??

Комментарии:

1. вы можете принять ответ, щелкнув серую галочку слева от ответа.

Ответ №1:

Вы должны уменьшить границу, когда берете ребро, поэтому:

 cheaperPath(X, Y, N) :-
    edge(X,Y,N1),
    N1 @=< N.
cheaperPath(X,Y,N):-
    edge(X,Z,N1),
    M is N-N1,
    M > 0,
    cheaperPath(Z,Y,M). 

В противном случае вы реализуете это способом генерации и тестирования, когда вы сначала генерируете весь путь, а затем проверяете, что это действительно более короткий путь.