
- •Введение
- •Принципы логического программирования
- •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.7. Динамическая база данных
Пролог поддерживает реляционную базу данных. Предикаты базы данных нужно объявлять в отдельном разделе Database. Программная секция Database должна предшествовать объявлению предикатов Predicates. Объявление предикатов базы данных аналогично их описанию в секции Predicates.
Динамическая база данных – раздел программы, в котором факты могут добавляться или загружаться из файла на диске во время выполнения программы или удаляться из нее. Факты, описывающие предикат базы данных, могут также обрабатываться как обыкновенные предикаты Пролога.
Встроенные предикаты asserta и assertz позволяют программисту добавлять новые утверждения в базу данных Пролога. Поскольку Пролог декларирует идентичность программ и данных, то риск изменения программы является главной причиной того, что надо проявлять известную осторожность при использовании предикатов assert и retract Этот риск минимизируется четким логическим разделением информации, связанной с данной задачей. Информация может быть постоянная и переменная. Постоянная информация – это программная часть, например, база знаний задачи, а переменной информацией могут быть данные, поступающие в ходе диалога Изменениям подвергаются только переменные данные.
Базу данных Пролога можно трактовать как некую глобальную переменную. Такая трактовка очень удобна: любая процедура может записывать в нее свой результат, который будет доступен любой другой процедуре, какая бы дистанция между ними ни была при их последовательных динамических вызовах. Передача аргументов через динамическую базу данных в ряде случаев оказывается более предпочтительной, чем передача их через параметры предикатов.
3.7.1. Использование стандартных предикатов динамической базы данных
Для работы с базой данных используют стандартные предикаты asseta, assertz, retractall, consult, save и др. (см. раздел "Стандартные предикаты"). Также нужно иметь представление о структуре памяти системы Пролога. Исходная программа на Прологе хранится в области SOURSE, в то время как для размещения фактов динамической базы данных отведена область HEAP. Поэтому на экране нельзя видеть информацию, записанную в базу данных. Однако ее можно просмотреть как текстовый файл, если сохранить его в каталоге под своим именем.
23. Пример работы с динамической базой данных.
Domains
list=integer*
Database – db1 % База данных с именем db1
fact1(integer,string,list)
Database – db2 % База данных с именем db2
fact2(integer,string)
Clauses
/*Факты базы данных описаны как обыкновенные предикаты*/
fact1(1,f1,[1,2,3]).
fact1(2,f2,[1,3]).
fact1(3,f3,[2,2,1]).
fact2(1,],"one").
fact2(1,"one one"]).
fact2(2,"two").
Тогда цель:
Goal fact1(X,Y,Z)
ответит:
X=1 Y=f1 Z=[1,2,3])
X=2 Y=f2 Z=[1,3]).
X=3 Y=f3 Z=[2,2,1]).
3 solutions
Goal rettactall(fact1(X,Y,[_,2|Z])) % удалить факты по образцу
X=1 Y=f1 Z=3
X=3 Y=f3 Z=1
Goal retractall(fact1(X,Y,Z))
X=2 Y=f2 z=[1,3]
Goal retractall(db2) % удалить поименованную базу данных
Yes .
24. Создание базы данных "Таблица умножения".
Domains
list = integer *
Database
mult( integer, integer, integer ) % Непоименованная база данных
Predicates
tabl
numlist( list )
member( integer, list )
Clauses
numlist( [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ] ).
tabl:- numlist( L ),
member( X, L ), member( Y , L ), % X и Y - целые числа из списка L
Z = X * Y,
assertz( mult( X, Y, Z )), fail. % Факт mult добавляется в динамическую базу данных
tabl.
member( X , [ X | _ ] ).
member( X, [ _ | T ] ):- member( X, T ).
Зададим в диалоговом окне следующую цель:
Goal tabl, % Создание базы данных
mult( 2, 5, X ). % Обращение к базе данных
Система ответит:
X = 10 Yes.
Goal mult( 10, 10, X ).
Система ответит
No ,
поскольку в базе данных нет такого факта. Допишем в секцию Clauses пару фактов:
Clauses
mult( 10, 10, 100 ).
mult( 9, 10, 90 ).
Тогда система будет находить эти факты, но не в области динамической базы данных, а фактов программной секции Clauses.
Следующая цель позволит сохранить базу данных на диске под выбранным именем:
Goal tabl,
save( “mytabl.db” ). % Сохранение базы данных на диске
Теперь клозы предиката mult будут сохранены как обычный файл (можете просмотреть его в своем рабочем каталоге), и, следовательно, могут быть загружены в динамическую память при следующем сеансе работы. Для этого следует запустить цель:
Goal
consult( “mytabl.db”). % Загрузка базы данных в динамическую память
Таким образом, динамическая база данных Пролога обеспечивает не только удобный механизм работы с динамической памятью, но также выступает в роли файловой системы, реализуя высокоуровневые операции доступа к внешним файлам. Следует отметить, что в Прологе также имеются низкоуровневые операции доступа к файлам, аналогичные имеющимся в других языках программирования (C, Pascal, см. «Стандартные предикаты»).
Пример. Манипулирование в мире блоков. Состояние мира можно сохранять в динамической БД в виде фактов. Чтобы добавить факты, зададим цель:
Goal assert( ontable( a ) ), assert( ontable( b ) ), assert( ontable( c ) ).
Пусть имеем некоторые предикаты манипулирования:
clear( X ) :- not( on( _ , X ).
pick_up( X, Y ) :- clear( Y ),
retract( ontable( X ) ),
assert( on( X, Y ) ).
Чтобы поместить b на c, зададим вторую цель:
Goal pick_up( b, c ).
В базе данных удалится факт ontable(b) и запишется факт on(b,c).