
- •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. Операции со структурами данных.
Определение
Список- это бинарная структура данных, представляющая собой логически связанную последовательность записей - элементов списка.
Эта структура либо пуста, либо состоит из двух частей – головы и хвоста.
Хвост в свою очередь является списком.
Голова – обычная переменная. Выделив из списка голову, можно ее обрабатывать как и любую другую переменную. Все элементы списка обладают общим свойством: в Прологе это свойство трактуется как отношение, определяющее связь между элементами списка или между списком в целом и элементом, внешним по отношению к списку. Все элементы списка заключаются в [] и отделяются друг от друга запятыми:
[ann, peter, jim, tom] , [2,5.7.8]
В Прологе список – это последовательность, состоящая из любого количества элементов. Известно, что все структурированные объекты Пролога – это деревья. Списки не являются исключением из этого правила:
[3,7,10]
/ \
3 [7,10]
/ \
7 [10]
/ \
10 []
Рис.6.1.Двоичное дерево списка
Замечание
Конечно, объединить объекты в один можно различными способами. Если число объектов заранее известно,
то можно сделать эти объекты аргументами одной составной структуры данных. Если число объектов не определено, то можно использовать рекурсивную составную структуру данных, такую, как дерево, но наиболее легко и удобно работать со списками.
Список помогает сделать программу компактной, эффектив-
ной и легко управляемой. Списки широко используются в программах искусственного интеллекта, при разработке трансляторов программных языков, в реализации методов управления памятью.
Это базовые структуры функциональных языков. С помощью списков можно представить практически любые сложные структуры.
Порядок расположения элементов является отличительной чертой списка: те же элементы, упорядоченные иным способом, представляют собой уже совсем другой список. Порядок важен в процессе сопоставления. Объекты cписка называются элементами списка. Единственное ограничение на их число – объем оперативной памяти.
Все элементы списка принадлежат одному и тому же типу доменов. (Исключением являются списки структур. Структура может принадлежать альтернативному домену, и тогда элементы списка могут иметь разный тип).
Как представить список в виде стандартного объекта Пролога?
Список – это рекурсивный составной объект, поэтому
мы рассматриваем два случая – пустой список и непустой список.
Непустой список следует рассматривать как структуру, состоящую из двух частей - головы и хвоста, при этом хвост тоже список, который либо пуст, либо имеет свою голову и хвост.
Одноэлементный список [a]- не то же самое, что элемент, который в него входит, так как [a] –на самом деле – это составная структура данных:
list
/ \
a []
Список в Прологе рассматривается как частный случай двоичного дерева.
При построении списков необходимо наличие константного символа, чтобы рекурсия не была бесконечной. Таким символом является символ [], обозначающий пустой список.
Требуется также функтор арности два [X|Y],где X и Y-компоненты терма, имеющие специальные названия: X – голова(car),а Y-хвост (cdr) списка.
Определение списка
list([]).
list([Head|Tail]):-
list(Tail).
Например, список [a,b,c] – это терм [H|T] при подстановке H=a и T=[b,c].
list([a,b,c])
|
list([b,c])
|
list([c])
|
list([])
Рис 6.2.Дерево вывода при проверке списка
Таблица 6.1. Примеры разделения списка на голову и хвост
список |
голова |
хвост |
[[1,2],[2,3,4],[]] |
[1,2] |
[[2,3,4],[]] |
[] |
Не определен |
Не определен |
[3] |
3 |
[] |
Таблица 6.2.Примеры сопоставления двух списков:
Список 1 |
Список 2 |
Присвоение переменным |
[X,Y,Z] |
[2,3,4] |
X=2,Y=3,Z=4 |
[5] |
[X|Y] |
X=5,Y=[] |
[1,2,3,4] |
[X,Y|Z] |
X=1,Y=2,Z=[3,4] |
[1,2] |
[3|X] |
fail |
Использование списков отразится в программе на трех ее разделах:
1 domains
<описание домена списка>
2 predicates
<описание работающего со списком предиката>
3 clauses
<задание самого списка>