Очень часто в программах необходимо выполнить одну и ту же задачу несколько раз. В программах на Турбо-Прологе повторяющиеся операции обычно выполняются при помощи правил, которые используют либо механизм возвратов, либо рекурсию.
Итеративное правило имеет следующий вид:
iterative_rule :- % правило повторения
<предикаты и правила>,
fail. % неудача
Встроенный предикат fail(неудача) вызывает возврат, поэтому <предикаты и правила> выполняются до тех пор, пока не будут перебраны все способы их повторного согласования.
Рассмотрим задачу о генерации платежной ведомости почасовых выплат кафедры ВТиПМ (пример 4.1).
Задача правила report (выдать отчет о выплатах) заключается в формировании отчета. Оно вызывает правило culc_sum для вычисления выплат, затем предикат write для печати информации о преподавателе, затем fail инициирует возврат к следующему утверждению prep.
Для программы 4.1 напишите правило генерации списка всех преподавателей, у которых почасовая оплата 5 долларов.
2. ОТСЕЧЕНИЕ (!)
Автоматический перебор возможных вариантов — полезный программный механизм, так как он освобождает от необходимости программировать его самому.
С другой стороны, ничем не ограниченный перебор может стать источником неэффективности программы.
Поэтому необходимо уметь его ограничить или исключить вовсе.
Для этих целей Турбо-Пролог имеет встроенный предикат cut (отсечение). Предикат cut обозначается символом восклицательного знака (!). Этот предикат, вычисление которого всегда завершается успешно, заставляет внутренние унификационные подпрограммы «забыть» все указатели возврата, установленные во время попыток вычислить текущую подцель. Другими словами, предикат cut устанавливает «барьер», запрещающий выполнить возврат ко всем альтернативным решениям текущей подцели.
Более точно, отсечение имеет два побочных (т.е. проявляемых при возврате) эффекта:
1. БЛОКИРУЕТ ВОЗВРАТ К ПРЕДШЕСТВУЮЩИМ ЕМУ ПОДЦЕЛЯМ В ДАННОМ УТВЕРЖДЕНИИ.
правило1:-
согласована подцель1, передоказать
согласована подцель2, нельзя
!,
согласована подцель3, попытка передоказать
отказ подцель4.
2. ЗАПРЕЩАЕТ ИСПОЛЬЗОВАНИЕ ВСЕХ УТВЕРЖДЕНИЙ ДАННОЙ ПРОЦЕДУРЫ, КОТОРЫЕ В БАЗЕ ДАННЫХ НАХОДЯТСЯ ПОСЛЕ ДАННОГО.
правило1:- передоказать
согласована подцель1, нельзя
!,
отказ подцель2.
правило1:- передоказать
<.......>.
правило1:- нельзя
< .......>.
Действие отсечения превращает процедуру, способную генерировать альтернативные варианты означивания переменных цели (такая процедура называется НЕДЕТЕРМИНИРОВАННОЙ), в процедуру, порождающую лишь один ответ (ДЕТЕРМИНИРОВАННУЮ).