logo search
TurboProlog / Документация / TOM_1

Использование предиката fail

Для того, чтобы повторно оценивать некоторую последовательность под-

целей, зачастую бывает необходимо вводить предикат, подобный приведенному

ниже предикату run с предложениями следующего вида

run:-readln(X),

process(X,Y),

write(Y),

run.

вызывая тем самым ненужные дополнительные затраты, связанные с использо-

ванием хвостовой рекурсии, которая не может быть устранена системой, пос-

кольку предикат process(X,Y) вызывает поиск с возвратом.

В этом случае применение комбинации repeat...fail позволяет избежать

хвостовой рекурсии.

Введя предикат

repeat.

repeat:-repeat.

мы можем переопределить предикат run без помощи хвостовой рекурсии следу-

ющим образом:

run:-readln(X),

process(X,Y),

write(Y),

fail.

Предикат fail вызывает поиск с возвратом к предикату process и, в

конечном счете, к повторному выполнению предиката repeat, которое всегда

завершается успешно.