
- •Введение
- •Принципы логического программирования
- •1.2. Математическая основа языка Пролог
- •1.2. Организация вычислительного процесса
- •1.2.2. Использование переменных
- •1.2.1. Синтаксис фактов и правил
- •1.3. Бэктрекинг
- •2. Основные элементы языка
- •2.1. Имена
- •2.2. Типы данных
- •2.3. Константы и переменные
- •2.4. Программные секции Пролога
- •2.4.1. Секция Domains
- •2.4.2. Секция Predicates
- •2.4.3. Секция Database
- •2.4.4. Секция Clauses
- •2.4.5. Секция Goal
- •3. Язык Пролог в задачах и примерах
- •3.1. Программирование с помощью фактов и правил
- •3.1.2. Первая формулировка задачи поиска в пространстве состояний 51 ад
- •3.1.3. Реализация на Прологе простой вопросно-ответной системы
- •It_is(“отказать в приеме на работу”):- not(this(“есть диплом”)).
- •It_is(“должность научного сотрудника”):- this(“есть диплом”),
- •3.2. Рекурсии
- •Упражнения
- •3.3. Программирование циклических процессов
- •3.4. Работа со списками
- •3.4.1. Описание списков в программе
- •3.4.2. Добавление элемента в список
- •3.4.3. Удаление элемента
- •3.4.4. Принадлежность элемента списку
- •3.4.5. Сцепление (конкатенация) списков
- •3.4.6. Удаление из списка повторяющихся элементов
- •3.4.7. Вычисление суммы элементов списка
- •3.4.8. Обращение списка
- •3.4.9. Нахождение максимального элемента списка
- •3.4.10. Перестановки
- •3.4.11. Примеры использования списков
- •Упражнения
- •3.5. Виды рекурсии
- •3.6. Поиск в пространстве состояний
- •Vshir ( [ [ V | Way ] | _ ], [ V | Way ] ) :- % Голова списка – полученное решение
- •Vshir ( Ways, Resh ). % Продолжение поиска в случае тупикового пути
- •Упражнения
- •3.6. Использование структур
- •3.6.1. Объявление структур
- •База данных с использованием структур.
- •Vife(X) :– family( _ , X , _ ). % X – жена
- •3.6.4. Планирование воздушного путешествия (143 Бр)
- •3.6.5. Реализация Планировщика в терминах структур
- •3.6.6. Задача «Зебра»
- •Упражнения
- •3.7. Динамическая база данных
- •3.7.1. Использование стандартных предикатов динамической базы данных
- •Упражнения
- •3.8. Средства управления
- •3.9. Представление множеств двоичными деревьями
- •3.9. Программы классификации
- •3.9.1. Программа классификации с обратной цепочкой рассуждений
- •Xpositive( X, y ), !. % в базе данных
- •Xnegative( X, y ), !, fail. % Отрицательный ответ обнаружен в базе данных
- •Xpositive("имеет","перья").
- •3.9.2. Программы классификации с прямой цепочкой рассуждений.
- •It_is( X ) :- write( X, “?”), % Механизм диалога
- •3.9. Обработка текстов
- •Verb( string ) % Глагол
- •Упражнения
- •4. Стандартные предикаты
- •4.1. Ввод/вывод
- •4.2. Управление экраном и оконная система
- •4.3. Обработка строк
- •4.4. Преобразование типов
- •4.5. Работа с базой данных
- •4.6. Управляющие предикаты
- •4.7. Прочие стандартные предикаты
- •4.8. Арифметические и логические предикаты
- •Приложение Приложение 1. Примерные варианты лабораторных заданий
- •1. Родословное дерево
- •2. Вопросно-ответная система
- •3. Работа со списками
- •4. Поиск пути на графе.
- •5. Разработайте прототип классификационной экспертной системы
- •6. Построение синтаксического анализатора
- •Рекомендуемая литература
Упражнения
1. Для улучшения алгоритма поиска в глубину можно добавить еще одно усовершенствование, а именно, ввести ограничение на глубину поиска. Программная реализация этого ограничения сводится к уменьшению на единицу величины предела глубины при каждом рекурсивном обращении и проверке, чтобы этот предел не стал отрицательным. Напишите процедуру поиска в глубину с ограничением глубины.
3.6. Использование структур
Одна из важных проблем при программировании задач искусственного интеллекта состоит в выборе адекватного представления решаемой задачи в терминах понятий используемой предметной области. В программных средствах систем искусственного интеллекта для подобного представления информации широко используются структуры. Язык Пролог как раз рассчитан на очень сложные символьные структуры. Структуры данных в сочетании с рекурсивным механизмом их обработки являются мощным средством программирования в Прологе.
Понятие структуры в Прологе в некотором смысле аналогично записи в языке Паскаль. Они позволяют организовать различные фрагменты информации в единые логические единицы, что дает возможность использовать информацию, не думая о деталях ее действительного представления. Широкое применение структур – это также средство представления структурных объектов (баз данных) и управления ими. Использование структур также делает Пролог и естественным языком запросов к базе данных.
Структуры состоят из нескольких компонент. Например, дату можно рассматривать как структуру, состоящую из трех компонент: день, месяц, год. Для того чтобы объединить компоненты в структуру, требуется выбрать функтор, например, data. Тогда дату «20 февраля 2000 года» можно записать так:
data( 20, february, 2000 )
То есть функтор есть имя связи, в которую включены аргументы.
Все компоненты в данном примере являются константами. Компонентами структуры могут быть также переменные или другие структуры, в том числе эти же самые. Таким образом, структура относится к рекурсивному типу данных. Структуры всегда выступают в качестве аргументов предикатов.
Ключевым моментом в использовании структур является вопрос сопоставления структур и унификации их компонент. При сопоставлении структур сначала проверяется, что функторы одинаковы. Затем сравниваются (слева направо) соответствующие аргументы обеих структур. В случае их совпадения процесс сопоставления продолжается. Если одна из сравниваемых переменных – свободная, то она связывается с соответствующим аргументом другой структуры. Если аргумент структуры является, в свою очередь, структурой, то правила сопоставления применяются рекурсивно для всех внутренних уровней.
Например, структуры data(D, M, 2003) и data(D1, may, Y1) сопоставимы. Конкретизацией, которая делает эти структуры идентичными, является следующая:
D = D1
M = may
Y1 = 2003.
С другой стороны, структуры data(D, M, 2003) и data(D1, may, 2006) не сопоставимы
3.6.1. Объявление структур
Структура данных в Прологе задается на составной области определения (третий способ указания Domains). Для задания структуры выбирается ее имя, далее после знака «равно» записываются функторы-альтернативы данной структуры. Альтернативы перечисляются через точку с запятой. Структура может быть без альтернатив, т.е. иметь один функтор. Функтор может иметь аргументы – компоненты структуры, либо функтор может быть объявлен без аргументов. Компонентами структуры могут быть простые типы Пролога или другие структуры, в том числе те же самые, что порождает рекурсивные описания, которые могут описывать объекты сложных типов (деревьев).
Общая форма описания структур
Domains
region = functor1(d1,d2,...); functor2(d3,d4,...);...
где region объявляет сложную область(структуру),
functor1,functor2 – имена альтернатив составной области,
d1,d1,...,d3,d4 – один из типов Пролога, стандартный или определенный ранее в программе в Domains (указание типов может отсутствовать вместе со скобками).
Примеры описания структур:
Domains
data = dat( integer, string, integer )
object = int( integer ); str( string )
mesto = left; right .
После описания структур можно приступать к объявлению предикатов:
Predicates
anyday( data )
state( mesto )
Далее записываем клозы объявленных предикатов:
Clauses
anyday( dat (1, may, 2003) ).
anyday( dat (15, june, 2001) ).
state( right ).
state( left ).
Определим еще одну область Domains – список структур:
Domains
objects = object *
Тогда можно объявить список, содержащий целые числа и строки:
Predicates
list( objects )
Clauses
list( [ int(25), int(33), str(asd), str(qwe), int(38) ] ).
Примеры рекурсивных описаний структур данных:
Domains
domains
treetype = tree( treetype, integer, treetype); empty
EXP = var( STRING );
plus( EXP, EXP );
mult( EXP, EXP )
Первый тип подходит для построения двоичного дерева, узлы которого – целые числа. Второй тип – для записи математического выражения в префиксной форме, содержащего строки, знаки операций plus и mult, соответствующие сложению и умножению. Если теперь объявить предикаты
Predicates
TREE( treetype )
s_exp( EXP )
то для них можно записать клозы-факты. Пусть наше выражение «x + y * z». Префиксная форма записи:
Clauses
s_exp( plus( var ( x ), mult ( var ( y ), var ( z )))).
Д
ля
небольшого дерева факт, задающий его,
будет следующий:
Clauses
TREE( tree( tree( empty, 3, empty ), 6, tree( tree( empty, 2, empty ), 5, tree( empty, 7, empty ) ) ) ).
Эти описания мы будем использовать дальше.
Рассмотрим ряд примеров с использованием структур.