
- •Введение
- •Принципы логического программирования
- •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. Построение синтаксического анализатора
- •Рекомендуемая литература
2.4.1. Секция Domains
Эта секция является в некотором смысле аналогом описания типов алгоритмических языков, но со своими отличиями, преимуществами и, соответственно, недостатками. Поскольку описание типов всегда следует в начале программы, Пролог в этом смысле не является исключением. На первых порах нужно, наверно, запомнить, что для объявления секции domains используются всего четыре следующих способа (формата):
1. Первый формат используется для объявления объектов, которые синтаксически схожи, а семантически различны.
2. Второй формат используется для объявления списков – одной из основных структур данных Пролога.
3. Третий формат описывает сложную область определения, задает описание структур, позволяет также рекурсивно описывать объекты сложных типов (деревьев).
4. Четвертый формат описывает файловый тип для ссылки на файлы по их символическим именам.
Сейчас мы рассмотрим только первый способ, поскольку он нам может понадобиться в скором времени, а остальные отложим до лучших времен, поскольку все равно из головы выветрятся. Описание типов списков рассмотрим сразу же со списками, структурных типов – при подробном знакомстве со структурами, а четвертый файловый тип вообще отложим в долгий ящик, для наших высокоуровневых манипуляций он не потребуется, в Прологе имеется мощное высокоуровневое средство манипулирования внешними файлами.
Первый формат используется для объявления объектов, которые синтаксически схожи, а семантически различны.
domains
name = t ,
где name – имя Пролога, выбираемое пользователем для своей задачи;
t – один из стандартных типов или пользовательских, т.е. ранее определенных domains
Это объявление используется для объектов, которые синтаксически схожи, а семантически различны. Например, первое предложение
domains
age, number = integer
r = real
объявляет два domains целого типа. Объявление вида r = real ускоряет набор программы.
Раздел domains задает область интерпретации предметных переменных, т.е. теперь две переменные, относящиеся одна к типу age, а другая – к number, уже не могут быть сопоставимы, хотя обе остаются переменными целого типа.
2.4.2. Секция Predicates
Здесь указываются все имена предикатов с соответствующими областями определения аргументов. Аргументы дизъюнктов Пролога называются термами. Существует три типа термов: константа, переменная, составной терм (структура). Описание предикатов включает в себя имя предиката и в скобках – перечисление имен предметных переменных
Общий вид описания предиката:
Predicates
name(domain1, domain2, ..., domainN) ,
где name – имя предиката, domain1, domain2, ... domainN – соответственно области определения аргумента1, аргумента2 и т.д. Например:
Predicates
child( string )
mother( string, string ) .
Допускается множественное определение предиката: один и тот же предикат может быть объявлен для различного числа аргументов:
Predicates
hanoi
hanoi( integer )
В этом случае для каждого предиката требуется своя реализация, т.е. это по сути два разных предиката с одним и тем же именем.
Также можно объявить один предикат для аргументов разных типов:
Predicates
member( name, namelist )
member( number, numberlist )
В этом случае отдельной реализации не потребуется.