
- •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.14. Пример рекурсии для генерации ряда чисел в порядке возрастания
domains
number=integer
predicates
write_number(number)
goal
clearwindow,
write(“ вот числа”),nl,nl,
write_number(1),nl,nl,
write(“all done,bye”).
clauses
write_number(8).
write_number(Number):-
Number<8,
write(“ “,Number),nl,
next_number=Number+1,
write_number(Next_number).
Подумайте, что надо изменить в программе для выдачи на экран чисел в обратном порядке.
Листинг 5.15. Рекурсивная программа вычисления факториала
trace
predicates
factorial(integer,real)
clauses
factorial(1,1):-!.
factorial(X,FactX):-
Y=X-1,
factorial(Y,FactY),
FactX=X*FactY.
goal
clearwindow,
write("input X-integer\n"),
readint(X),
factorial(X,FactX),
write("X=",X," FactX=",FactX).
Измените программу таким образом, чтобы рекурсия стала хвостовой.
Замечание: ПК создает новую копию предиката factorial таким образом, что factorial становится способным вызывать сам себя как полностью самостоятельную процедуру. При этом код выполнения не будет, конечно, копироваться, но все аргументы и промежуточные переменные копируются.
Информация хранится в стеке, который создается каждый раз при вызове правила. Когда выполнение правила завершится, стек освободится (если это не недетерминированный откат), и выполнение продолжается в стеке правила-родителя.
Выводы
Prolog имеет два способа повторения циклических участков программы – поиск с возвратом и рекурсию.
Поиск с возвратом – это мощное средство с точки зрения использования памяти, но после каждой итерации переменные обновляют свои значения, при этом их старые значения теряются.
Рекурсия позволяет сохранять значения переменных, но она не эффективна с точки зрения требуемого объема памяти. Однако, есть хвостовая рекурсия, и Prolog способен ее оптимизировать, то есть снять требования к объему памяти. Для этого рекурсивный вызов должен быть последней подцелью в теле предложения, а тело предложения и рекурсивный предикат должны быть детерминированными.
В Prolog’е рекурсивным может быть не только предложение, но и структуры данных.Prolog в отличие от большинства других языков позволяет определять типы рекурсивных данных, в которых указатели создаются и обрабатываются автоматически. Тип данных является рекурсивным, если он допускает структуры, содержащие такие же структуры, как и они сами. Такими структурами являются, например, список, дерево и др. Каждая ветвь дерева сама является деревом, поэтому структура рекурсивна. В Prolog’е мы имеем собственно рекурсивную структуру дерева, а не представление дерева в памяти, как это было в С и С++.
6. С П И С К И И Р Е К У Р С И Я
В Прологе рекурсивными могут быть не только предложения, но и структуры данных. Наиболее важный рекурсивный тип данных – это список.