- •Введение
- •Принципы логического программирования
- •1.2. Математическая основа языка Пролог
- •1.2. Организация вычислительного процесса
- •1.2.2. Использование переменных
- •1.2.1. Синтаксис фактов и правил
- •1.3. Бэктрекинг
- •2.2. Типы данных
- •2.3. Константы и переменные
- •2.4. Программные секции Пролога
- •2. Основные элементы языка
- •2.1. Имена
- •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. Основные элементы языка
2.1. Имена
Имена в языке Prolog используются для обозначения переменных, символьных констант, объявлений типов и предикатов.
Имя может начинаться с любой латинской буквы или символа подчеркивания "_", затем следует любая комбинация букв, цифр и символа "_".
При образовании имен необходимо учитывать следующие правила:
- имена строковых констант должны начинаться с маленькой буквы либо они должны быть заключены в кавычки;
- имена переменных должны начинаться с большой буквы или символа подчеркивания "_".
Имена предикатов могут быть записаны с любой буквы или символа подчеркивания.
2.2. Типы данных
Имеется следующие основные стандартные типы данных:
symbol |
Символьная строка, которая начинается со строчной буквы или заключена в кавычки |
string |
Также символьная строка, но имеющая другое внутреннее представление |
char |
Отдельный символ, заключенный в апострофы |
integer |
Целое число в диапазоне от -32768 до 32767 |
real |
Вещественное число в диапазоне степеней 10 от -307 до +308 |
2.3. Константы и переменные
Константы Пролога должны быть записаны:
а) либо с маленькой буквы (исключая кириллицу):
fact1, summa, person ;
б) либо стоять в одинарных кавычках (отдельный символ) или бинарных кавычках (строковая константа):
'c' , "summa=", "сумма" ;
в) либо они являются числами, целыми или вещественными:
25, 0.5, 3.2e-4 .
Таким образом, константы могут быть любого из стандартных типов Пролога. В программе тип констант явно не указывается.
Переменные – это цепочки, состоящие из букв, цифр и символа подчеркивания. Имя переменной всегда начинается с прописной буквы или с символа подчеркивания:
X, Summa, List_of_members, _x23.
Переменная может иметь один из стандартных типов, или тип ее определяется в секции описания областей определения (типов) domaims. Можно также использовать так называемую анонимную переменную, которая записывается в виде одного символа подчеркивания.
2.4. Программные секции Пролога
Программа на Прологе состоит из нескольких программных секций (разделов), каждой из которых предшествует ключевое слово, представленное в следующей таблице:
Domains |
Объявление областей определение данных (типов) |
Database |
Объявление предикатов базы данных |
Predicates |
Объявление предикатов |
Clauses |
Определение фактов и правил |
Goal |
Цель |
В программе необязательно наличие всех секций. Обычно в небольшой программе, находящейся в стадии отладки, присутствуют разделы Predicates и Clauses, хотя, вообще говоря, можно обойтись даже без них (например, когда проверяется работа стандартного предиката). Для больших программ появляется необходимость в секции Domains для объявления собственных имен типов, списков или сложных структур данных.
Порядок следования программных секций, как правило, соответствует порядку, приведенному в таблице, т.е. предикаты должны быть прежде объявлены (в секции Predicates), а затем следует их реализация (программирование) в секции Clauses. Единственное, пожалуй, исключение – цель в программе, если она есть, может стоять в любом месте, Пролог все равно «прочешет» весь код в поисках цели, и только если ее не найдет, запросит цель отдельно. Обычно цель записывают в конце программы как логическое ее завершение, но если цель стоит у вас в середине, не забудьте за ней записать ключевое слово, соответствующее продолжению программы, например Clauses.
В программе может использоваться только одна цель; если цель не указана, Пролог цель запросит. Прочих программных секций может быть сколько угодно. Можно описать несколько динамических баз данных или несколько объявлений предикатов с дальнейшей их реализацией.
Ключевые слова разделов можно записывать прописными и строчными буквами.
Комментарии к программе записываются либо парами символов слэш-звездочка:
/* это комментарий,
он занимает несколько строк */
либо остаток строки записывается после знака процента:
% это тоже комментарий
