Встроенные предикаты для работы с базами даннях.
Пролог-программу можно рассматривать как реляционную базу данных, т.е. описание некоторого множества отношений. Описание отношений присутствует либо в явном виде (факты), либо в неявном виде (правила).
Встроенные предикаты дают возможность корректировать эту базу данных (БД) в процессе выполнения программы. Это делается:
1) добавлением к программе (в процессе вычислений) новых фактов;
2) вычеркиванием из нее уже существующих фактов.
Следующие цели (предикаты) выполняют операции над БД:
1. Цель assert(d) всегда успешна и добавляет факт d к базе данных;
2. Цель retract(d) удаляет факт, сопоставимый с d;
3. asserta(d) - обеспечивает запись в базу данных нового факта перед имеющимися фактами для заданного отношения;
4. assertz(d) - обеспечивает запись в базу данных нового факта после всех имеющихся фактов для заданного отношения.
Объявление динамической базы данных, в которую факты могут добавляться во время выполнения программы или выбираться из файла посредством предиката consult, осуществляется посредством ключевого слова database.
Создание баз данных в Турбо-Прологе.
Рассмотрим следующий пример статической БД.
Пример 1.
Domains
tip,fun=symbol
x,kol=integer
Database
ms(tip,fun,x,kol)
/* tip - тип микросхемы; fun - реализуемая функция;
x - число входов; kol - число элементов */
Clauses
ms(k155la3,i_ne,2,4). ms(k155la4,i_ne,3,3). ms(k155la1,i_ne,4,2).
ms(k155ln1,ne,1,6). ms(k155le1,ili,2,4). ms(k155li3,i,3,3).
Ввод строки assertz(ms(k155ir1,rg,4,4)) приводит к добавлению факта s(k155ir1,rg,4,4) в базу данных.
Ввод строки retract(ms(Q,i_ne,W,E)) приведет к удалению из БД всех объектов для элементов типа i_ne.
Для сохранения БД на диске в заданном файле (например, mybase.dba) необходимо ввести строку
save("mybase.dba").
Затем в этой же или в другой программе на основе полученного файла можно создать новую БД. Для этого необходимо ввести строку
consult("mybase.dba").
В результате существующая БД дополняется объектами из файла mybase.dba.
Для сохранения поименованной БД используется предикат
save(DosFileName,DataBaseName).
Для создания поименованной БД из фактов, расположенных в файле, используем предикат
consult(DosFileName,DataBaseName).
Накопление в базе данных ответов на вопросы.
Одним из полезных применений предиката asserta является накопление уже вычисленных ответов на вопросы. Пусть, например, в программе определен предикат
solve(Problem,Solution).
Мы можем теперь задать вопрос и потребовать, чтобы ответ на него был запомнен для того, чтобы облегчить получение ответов на будущие вопросы:
solve(Problem,Solution), asserta(solve(Problem,Solution)).
Если в первой из приведенных целей будет успех, ответ (Solution) будет сохранен, а затем использован так же, как и любое другое пр ложение, при ответе на дальнейшие вопросы. Преимущество такого "запоминания" состоит в том, что на дальнейшие вопросы, сопоставимые с добавленным фактом, ответ будет получен, как правило, значительно быстрее, чем в первый раз. Ответ теперь будет получен как факт, а не как результат вычислений, требующих, возможно, длительного времени.
Задание итерации.
Цель repeat порождает новую ветвь вычислений. Для этого она должна быть определена в программе следующим образом
repeat.
repeat :- repeat.
Дата добавления: 2016-05-05; просмотров: 692;