Логическое программирование на языке Visual Prolog. Солдатова О.П - 42 стр.

UptoLike

42
Предикат repeat будет вычисляться успешно при каждой новой попытке его
вызвать после возврата. Факт будет использоваться для выполнения всех
подцелей. Таким образом, repeat это рекурсивное правило, которое никогда
не бывает неуспешным. Предикат repeat широко используется в качестве
компонента других правил, который вызывает повторное выполнение всех
следующих за ним компонентов.
Пример
39: ввести с клавиатуры целые числа и вывести их на экран.
Программа завершается при вводе числа 0.
domains
d=integer
predicates
repeat
write_decimal
do_echo
check (d)
clauses
repeat.
repeat:- repeat.
write_decimal:-nl, write( «Введите, пожалуйста, цифры»), nl,
write(«Для останова, введите 0»), nl.
do_echo:- repeat, readln (D), write(D), nl, check (D), !.
check (0):- nl, write («-OK!»).
check(_):- fail.
goal
write_decimal, do_echo.
Правило do_echoэто конечное правило повтора, благодаря тому, что
предикат repeat является его компонентом и вызывает повторение
предикатов readln, write, и check. Предикат check описывается двумя
предложениями. Первое предложение будет успешным, если вводимая цифра
0, при этом курсор сдвигается на начало следующей строки и на экране
появляется сообщение «OK!» и процесс повторения завершается, так как
после предиката check в теле правила следует предикат отсечения. Если
введенное значение отличается от 0, то результатом выполнения предиката
check будет fail в
соответствии со вторым предложением. В этом случае
произойдет возврат к предикату repeat. Repeat повторяет посылки в правой
части правила, находящиеся правее repeat и левее условия выхода из
бесконечного цикла.
2.13 Методы организации рекурсии
Рекурсивная процедураэто процедура, которая вызывает сама себя. В
рекурсивной процедуре нет проблемы запоминания результатов ее
выполнения потому, что
любые вычисленные значения можно передавать из
одного вызова в другой, как аргументы рекурсивного предиката.