Это рекурсивно, потому что предикат вызывает сам себя:
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).