Правило, содержащее само себя в качестве компоненты, называется ПРАВИЛОМ РЕКУРСИИ. Правила рекурсии так же, как правила повтора, реализуют повторное выполнение задач. Они весьма эффективны, например, при формировании запросов к базе данных, а также при обработке таких доменных структур, как списки. Этот метод подходит для целого ряда применений, начиная с обработки файлов и кончая математическими вычислениями.
Если рекурсивное правило не генерирует указателей возврата, и последняя подцель правила является рекурсивным вызовом самого правила, то Турбо-Пролог устранит дополнительные расходы, вызываемые рекурсией.
Этот процесс называется УСТРАНЕНИЕМ ХВОСТОВОЙ РЕКУРСИИ.
Пример простого правила рекурсии:
write_string :- /* выдать строку */
write("У ПОПА БЫЛА СОБАКА..."),
nl,
write_string.
Это правило будет бесконечно вызывать само себя.
Избежать возникновения бесконечной рекурсии можно. Для этого следует ввести предикат завершения, содержащий условие выхода.
Формулировка условия выхода на русском языке для правила write_string может иметь вид: «Продолжать печать строки до тех пор, пока счетчик печати не превысит число 7. После чего остановить процесс».
Правило read_a_char демонстрирует простое правило рекурсии, в которое включено условие выхода. Программа циклически считывает символ, введенный пользователем: если этот символ не #, то он выдается на экран, если этот символ — #, то программа завершается.
Простое правило рекурсии с условием выхода:
read_a_char :-
readchar(Ch),
Ch <> '#',
write(Ch),
read_a_char.