
- •1.Введение в функциональное и логическое программирование
- •1.1. Основные классы вычислительных моделей
- •1.1.1 Процедурная вычислительная модель
- •1.1.2 Функциональная вычислительная модель
- •1.1.3. Логическая вычислительная модель
- •1.1.4. Объектно-ориентированная вычислительная модель (ооп)
- •1.2.Метод оценки (способ получения результатов)
- •1.3. Обмен информацией в процессе оценки
- •1.4.Понятие искусственного интеллекта
- •1.5.Символьные языки программирования
- •1.6. Основные направления в искусственном интеллекте
- •Для работы в сфере ии надо иметь:
- •1) Языки ии, обеспечивающие простоту модификации
- •3) Важна и структура самой машины, позволяющая с
- •2.Основы логического программирования и язык Пролог.
- •2.1.Основные понятия
- •2.2.Определение отношений на основе фактов и правил
- •2.3 Пример программы на языке Пролог
- •2.4.Использование рекурсии
- •2.5.Декларативная и процедурная трактовка программы
- •2.6. Cтруктура программы
- •2.7.Особенности лп:
- •2.8 Использование предиката not и
- •3.Синтаксис Пролога
- •3.1. Объекты данных
- •3.2. Составные объекты и альтернативные домены. В утверждениях объекты представляют собой данные.
- •3.2.1. Составная структура
- •Листинг3.1. Использование доменной структуры с именем personal_library
- •3.2.2.Доменная структурная диаграмма программы “Библиотека” (дсд)
- •3.2.3.Предикатная структурная диаграмма программы “Библиотека” (псд)
- •3.2.4. Альтернативные домены
- •Выводы:
- •Рассмотрение работы с составными объектами и альтернативными доменами закончено. Посмотрим, как именно строится логический вывод, реализованный на эвм?
- •3.3. Сопоставление структур(matching)
- •3.4.Унификация и подстановки (Unify).
- •3.5.Основные правила поиска с возвратом:
- •Листинг 3.4.Унификация и поиск с возвратом
- •4.Принцип резолюции
- •Метод резолюции в исчислении предикатов – это пра-
- •4.1.Логическое следствие
- •4.2. Логический вывод
- •4.3 Преимущества и недостатки метода резолюции
- •4.4. Пример применения метода резолюций.
- •5. Управление поиском решений
- •5.1.Метод отката после неудачи – опн
- •5.2 Метод отсечения и отката – оо
- •5.2.1.Влияние предиката cut на составную цель
- •5.2.3. Использование зеленых и красных отсечений
- •5.2.4.Использование предиката not как средства управления
- •5.3.Метод повтора, определяемый пользователем (мп)
- •5.4.Методы организации рекурсии
- •Листинг 5.9. Бесконечная рекурсия (хвостовая рекурсия)
- •Пример программы, которая циклически считывает символ, введенный пользователем. Если символ не равен #, то он выводится на экран, иначе процесс заканчивается.
- •Листинг 5.14. Пример рекурсии для генерации ряда чисел в порядке возрастания
- •Определение
- •Список помогает сделать программу компактной, эффектив-
- •Список – это рекурсивный составной объект, поэтому
- •6.1.Операции над структурами данных типа список.
- •6.2.Предикат findall
- •6.3. Операции со структурами данных.
5.4.Методы организации рекурсии
Другим способом реализации циклических частей программы является использование рекурсии(смотри рис.5.1.)Понятие рекурсии введено в разделе “Основы логического программирования” и использовалось в решении задачи о родственных отношениях. Ее особенность заключается в том, что вычисленные с помощью рекурсии значения передаются из одного вызова в другой как аргументы рекурсивно вызываемого предиката.
Там же были даны определения рекурсии и рекурсивности.
Когда и где применяется рекурсия?
Рекурсия применяется:
-Для решения задач, содержащих в себе подзадачи такого же типа (поиск в дереве, рекурсивная обработка (например, сортировка списков);
-работа с базами данных (БД);
-обработка файлов;
-встречаются задачи, не имеющие нерекурсивного алгоритма решения;
- в математических вычислениях.
Рекурсивные программы дают компактное и элегантное описание интересующих нас отношений, но есть один минус - во время счета образуется все увеличивающийся в размерах стек вызовов, для хранения которых может потребоваться слишком большой объем памяти.
Однако, существует класс рекурсивных программ, которые выполняются с использованием постоянного объема памяти. Это такие рекурсивные программы, которые могут быть преобразованы непосредственно в итерационные программы. Метод реализации таких программ называется оптимизацией хвостовой рекурсии (tail recursion optimization) (оптимизацией последнего обращения). Основная идея метода: рекурсивная программа выполняется так, как если бы она была итерационной. Когда процедура может вызвать себя без сохранения информации о своем состоянии? Это возможно в том случае, если процедура не генерирует указателей отката и последней подцелью ее является рекурсивный вызов самой себя. В этом случае информация о состоянии процедуры больше не понадобится. Получается, что когда процедура на последнем шаге вызывает саму себя, то стек для вызывающей процедуры должен быть заменен на стек для вызванной процедуры. То есть происходит при замене стека очень простая операция – аргументам процедуры присваиваются новые значения, после чего выполнение процесса возвращается на начало процедуры. Поэтому с процедурной точки зрения происходящее очень похоже на итерацию (обновление управляющих переменных в цикле).
На Прологе можно задать хвостовую рекурсию следующим образом:
- рекурсивный вызов является самой последней подцелью последнего предложения в процедуре.
- ранее в предложении не было точек возврата (если они есть, то от них можно избавиться с помощью отсечения, которое ставится непосредственно перед рекурсивным вызовом и помогает убрать все лишние альтернативы)
Замечание: В общем случае невозможно определить, является ли подобное отсечение зеленым или красным, поэтому надо предварительно тщательно исследовать этот вопрос.
Пролог автоматически отслеживает хвостовую рекурсию и устраняет дополнительные расходы, которые вызывает рекурсия. Этот процесс называется устранением хвостовой рекурсии.
Замечание:
-рекурсия логически проще метода итерации;
-при работе с рекурсивными правилами обязательны условия выхода из рекурсии, иначе рекурсия будет бесконечной и правила бесполезными. Ответственность за выход из рекурсии лежит на программисте. Это рассмотрено в задаче о дереве родственных отношений.