- •Введение
- •Принципы логического программирования
- •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. Построение синтаксического анализатора
- •Рекомендуемая литература
База данных с использованием структур.
Создание конкретной структуры и соответствующих этой структуре объектов представляет собой создание еще одной базы данных. Объекты – это записи базы данных, а структура – описание формата такой записи и ее полей. Применение структур продемонстрируем на примере программы, которая представляет базу данных о семьях. Покажем, как извлекается информация из этой базы данных. Удачно выбранное представление облегчает интерпретацию извлеченной информации.
Каждая семья состоит, с точки представления ее логической структуры, из трех объектов: мужа, жены и детей. Поскольку количество детей в разных семьях может быть разным, то их целесообразно представить в виде списка, состоящего из произвольного числа элементов. Информацию о каждом члене семьи, в свою очередь, можно собрать структурой, состоящей из четырех компонент: имени, фамилии, даты рождения и работы. Информация о работе – это или указания кода работы и оклада, или "не работает".
Ясно, что для описания такой базы данных понадобится сложная область определения. Введем следующие структуры, соответствующие соответственно дате рождения члена семьи (число, месяц, год) и работе:
Domains
data = dat( integer, string, integer )
work = worker( string, integer );
notwork
Тогда основная структура, соответствующая описанию каждого члена семьи, может выглядеть таким образом:
Domains
memfam= mem(string,string,data,work);
absent % Член семьи может отсутствовать
list_memfam = memfam *
Информацию о двух семьях можно занести в базу данных с помощью следующих описаний и предложений:
Predicates
family (memfam, memfam, list_memfam)
Clauses
family(mem(jon, kelly, dat(17, may, 1950), worker(bbz, 15000)),
mem(bony, kelly, dat( 29, may, 1951), notwork)),
[mem(pat, kelly, dat(5, april, 1983), notwork),
mem(liz, kelly, dat(10, april, 1960), notwork)).
family(mem(bob, rob, dat(14, may, 1930), worker(pla, 12000)),
mem(sally, rob, dat(5, october, 1931), worker(plt, 11000)), [ ]). % нет детей в семье
Теперь из такой базы данных уже можно извлекать информацию. Так, в запросах к базе данных можно ссылаться на всех kelly с помощью цели:
goal: family(mem( _ , kelly, _ , _ ), _ , X ).
Данная цель вернет значение переменной – список структурированных объектов, содержащий информацию о детях семью Келли:
X = [mem(pat, kelly, dat(5, april, 1983), notwork),
mem(liz, kelly, dat(10, april, 1960), notwork)).
Символы подчеркивания в записи цели обозначают различные анонимные переменные, значения которых нас не интересуют.
Можно найти все семьи с тремя детьми при помощи выражения:
goal: family( X, _ , [ _ , _ , _ ] ).
Здесь переменная X будет конкретизирована структурой, представляющей первый аргумент предиката family.
Чтобы найти имена и фамилии всех женщин, имеющих, по крайней мере, трех детей, можно задать вопрос:
goal: family( _ , mem( Name, Fam, _ , _ ), [ _ , _ , _ | _ ] ).
Главным моментом в этих примерах является то, что указывать интересующие нас объекты можно не только по их содержимому, но и по их структуре, т.е. иметь результат в виде целой структуры или в виде отдельных элементов структур.
Можно также создать набор процедур, который делал бы взаимодействие с базой данных более удобным. Такие процедуры являлись бы частью пользовательского интерфейса. Вот некоторые из них:
husband(X) :– family( X, _ , _ ). % X – муж
