
- •27.Управление программой. Внутренние подпрограммы унификации Пролога.
- •28.Структура программ на Прологе. Предикаты и утверждения.
- •29.Арифметика в Прологе.
- •30.Программирование повторяющихся операций. Повторение и откат.
- •31.Методы повторения. Методы организации рекурсии.
- •32.Списки в Прологе. Применение списков в программе.
- •33.Использование метода с разделением списка на голову и хвост. Компоновка данных в список.
- •34.Присваивание переменным строковых значений. Конкатенация строк. Преобразование данных.
- •35.Создание символьных префиксов. Преобразование строк в список символов.
- •36.Специальные строки Пролога.
- •37.Формирование атомов из строк.
- •38.Преобразование строк в списки атомов с функторами.
- •39.Предикаты Пролога для работы с файлами. Использование предикатов для работы с файлами.
31.Методы повторения. Методы организации рекурсии.
Если цель является внутренней целью программы, то внутренние унификационные подпрограммы Турбо-Пролога останавливают поиск решений после первого же успешного вычисления цели. Таким образом, выявляется только первое решение. Другие значения, которые могут быть присвоены переменным цели, не активизи-
руются до тех пор пока программа не заставит внутренние унификационные подпрограммы повторно искать еще имеющиеся решения.
Метод отката после неудачи может быть использован для управления вычислением внутренней цели при поиске всех возможных ее решений. Метод ОПН использует предикат fail. Предикат fail вызывает неуспешное завершение правила, внутренние унификационные подпрограммы выполняют откат в точку 1, и процесс повторяется до тех пор, пока последнее утверждение не будет обработано.
Метод отсечения и отката (ОО) может быть использован для фильтрации данных, выбираемых из утверждений базы данных. Удобство этого метода становится более явным при большем числе условий для выборки.
Для того, чтобы из базы данных выбирать данные, удовлетворяющие некоторым условиям, необходимо иметь средства управления откатом. Для этих целей Турбо-Пролог имеет встроенный предикат cut (отсечение). Предикат cut обозначается символом восклицательного знака (!). Этот предикат, вычисление которого всегда завершается успешно, заставляет внутренние унификационные подпрограммы "забыть" все указатели отката, установленные во время попыток вычислить текущую подцель.
Другими словами, предикат cut "устанавливает барьер", запрещающий выполнить откат ко всем альтернативным решениям текущей подцели. Однако последующие подцели могут создать новые указатели отката, и тем самым создать условия для поиска новых решений. Область действия предикат cut на них уже не распространяется. Но если все более поздние цели окажутся неуспешными, то барьер, установленный предикатом cut, заставит механизм отката отсечь все решения в области действия cut путем немедленного отката к другим возможным решениям вне области действия cut.
Метод отсечения и отката использует предикат fail для того, чтобы имитировать неуспешное вычисление и выполнять последующий откат, до тех пор, пока не будет обнаружено определенное условие. Предикат cut служит для устранения всех последующих откатов.
Предикат cut выполнит отсечение в указанном месте. Предикат fail используется для продолжения откатов и доступа к базе данных по определенному признаку.
Метод повтора (МП), определяемый пользователем, как и ОО-метод, использует откат. Но в МП-методе выполнить откат возможно всегда в отличии от ОО-метода, где откат выполняются только после искусственного созданного неуспешного результата. Правило рекурсии общего вида имеет более сложную структуру и является обобщением этих методов. Вид правила повтора, определяемого пользователем, следующий:
repeat. /* повторить */
repeat :- repeat.
Первый repeat является утверждением, объявляющим предикат repeat истинным. Первый repeat не создает подцелей, поэтому данное правило всегда успешо. Однако, поскольку имеется еще один вариант для этого правила, то указатель отката устанавливается на первый repeat. Второй repeat - это правило, которое использует само себя как компоненту (третий repeat).Второй repeat вызывает третий repeat, и этот вызов вычисляется успешно, так как первый repeat удовлетворяет подцели repeat. Следовательно, правило repeat так же всегда успешно. Предикат repeat
будет вычисляться успешно при каждой новой попытке его вызвать после отката. Факт в правиле будет использоваться для выполнения всех подцелей программы. Таким образом, repeat это рекурсивное правило, которое никогда не бывает неудачным.
МП-метод наиболее эффективен при реализации доступа к данным в базе данных и файлах на диске, а также для организации выдачи на экран и формирования меню.
Методы организации рекурсии - правила, не использующие правил повтора в качестве компонент, являются наиболее общим способом организации рекурсивной
обработки данных при программировании на Турбо-Прологе. Этот метод подходит для целого ряда применений, начиная с обработки файлов и кончая математическими вычислениями.
Простая рекурсия - правило, содержащее само себя в качестве компоненты, называется правилом рекурсии. Правила рекурсии так же как правила повтора реализуют повторное выполнение задач. Они весьма эффективны, например, при формировании запросов к базе данных, а также при обработке таких доменных структур, как списки.
write_srting :- /* выдать строку */
write("МЫ - ЭТО ВЕСЬ МИР"),
nl,
write_string.
Метод обобщенного правила рекурсии (ОПР) содержит в теле правила само себя. Рекурсия будет конечной, если в правило включено условие выхода, гарантирующее окончание его работы. Тело правила состоит из утверждений и правил, определяющих задачи, которые должны быть выполнены.
<имя правила рекурсии> :-
<список предикатов>, (1)
<предикат условия выхода>, (2)
<список предикатов>, (3)
<имя правила рекурсии>, (4)
<список предикатов>. (5)
Данное правило рекурсии имеет пять компонент. Первая – это группа предикатов. Успех или неудача любого из них на рекурсию не влияет. Следующая компонента - предикат условия выхода. Успех или неудача этого предиката либо позволяет продолжить рекурсию, либо вызывает ее остановку. Третья компонента – список других предикатов. Аналогично, успех или неудача этих предикатов на рекурсию не оказывает влияния. Четвертая группа – само рекурсивное правило. Успех этого правила вызывает рекурсию. Пятая группа - список предикатов, успех или неудача которых не влияет на рекурсию. Пятая группа также получает значения (если они имеются), помещенные в стек во время выполнения рекурсии.
write_number(8).
write_number(Number) :-
Number < 8,
write(Number), nl,
Next_Number = Number + 1,
write_number(Next_number).