Каков порядок выполнения рекурсивного журнала данных? - PullRequest
0 голосов
/ 03 марта 2020
Q(a, b) :- Edge(a, b).
Q(a, b) :- Q(a, x),
            Edge(x, b).

Функция этого кода заключается в поиске всех пар узлов, которые доступны. Как это рекурсивно?

1 Ответ

1 голос
/ 03 марта 2020

Это рекурсивно, потому что предикат вызывает сам себя:

q(A, B) :- q(A, X),edge(X, B).

Какой фактический порядок выполнения зависит от реализации. Это может быть «снизу вверх»:

  • Из любого edge(A,B) производного q(A,B)
  • Применять q(A, B) :- q(A, X),edge(X, B). до тех пор, пока не будет достигнута фиксированная точка (то есть, не дальше q(A,B) может выводится).

тем не менее, вы должны иметь возможность изменить код без риска генерирования непрерывного поиска, в отличие от Пролога.

Это должно работать тоже:

q(A, B) :- q(A, X),edge(X, B).
q(A, B) :- edge(A, B).
...