Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Работа с базами данных в оперативной памяти

Поиск

 

Сама форма записи фактов в Прологе наводит на мысль о работе с базой данных (БД). Например, набор фактов

student(“99-231”,“Иванов С.С.”,”АТП”).

student(“99-232”,“Петров А.Г.”,”Технологический”).

student(“99-233”,“Степанов И.А.”,”АТП”).

student(“99-234”,“Иванов А.В.”,”ПМА”).

student(“99-235”,“Демидов С.А.”,”АТП”).

задает таблицу вида

 

Шифр студента (номер зачетной книжки) Фамилия студента Факультет

 

Работу с такими БД легко организовать стандартными средствами Турбо-Пролога. Эти средства удобны для работы и с реляционными базами данных, так как внутренние унификационные процедуры языка осуществляют автоматическую выборку фактов с нужными значениями известных параметров и присваивают значения еще не определенным.

Например, зададим совокупность фактов, определяющих еще одну таблицу с информацией о результатах сдачи экзаменов:

exam ("99-231",”Информатика”,4).

exam ("99-232",”Информатика”,5).

exam ("99-231",”Математика”,5).

exam ("99-233",”Математика”,3).

exam ("99-235",” Информатика ”,5).

Теперь выведем информацию обо всех студентах факультета АТП, сдавших экзамен по информатике с оценкой 5. Для чего зададим цель(Num,,”Информатика”, 5), student(Num, Name, ”АТП”), write(Name), nl, fail.

Пролог-программа просматривает все факты с предикатом exam до тех пор, пока не находит факт exam ("99-235",”Информатика”,5), соответствующий второму предикату правила. В результате чего свободная переменная Num получает значение "99-235". Таким образом, первый предикат цели согласован, и программа переходит к согласованию следующего предиката student("99-235", Name, ”АТП”). Так как в программе имеется факт student(“99-235”,“Демидов С.А.”,”АТП”), предикат оказывается истинен, и в результате переменная Name получает значение “Демидов С.А.”, которое и будет выведено на экран в результате проверки предиката write(Name). Оставшиеся предикаты nl и fail предназначены для просмотра и поиска информации по всему списку студентов.

БД в приведенном примере является частью кода программы и не может быть изменена в процессе ее выполнения, то есть приведенные фрагменты являются примером статической БД.

Однако Пролог предоставляет средства по созданию динамических БД, то есть БД, в которые можно добавлять и удалять записи в процессе работы программы. Для работы с такой БД, ее предикаты необходимо описать в разделе database. Раздел имеет следующий формат:

database [- <имя БД>](...)(...)

.

Например,

database - tabel(symbol,symbol,symbol.)

dexam(symbol,symbol,integer)

Перечисленные здесь предикаты после подстановки в них вместо переменных констант (т. е. превращения их в факты) могут быть помещены и, если потребуется, удалены во время выполнения программы в динамическую базу данных. Делается это с помощью стандартных (встроенных в систему) предикатов: asserta, assertz, retract, save, consult, readterm, findall. В программе можно использовать несколько разделов database, при этом каждому из них нужно назначить уникальное имя. Если имя разделу database не назначено (такой раздел в программе может быть только один), компилятор по умолчанию назначает имя dbasedom.

 

Стандартные предикаты для работы с динамическими БД

 

. Предикат asserta заносит новый факт в базу данных, располагающуюся в оперативной памяти компьютера (резидентная БД). Новый факт помещается перед всеми уже внесенными утверждениями данного предиката. Этот предикат имеет такой синтаксис:

asserta(<факт>)

Таким образом, чтобы поместить в БД утверждение

dstudent(“99-233”,“Степанов И.А.”,”АТП”)

перед уже имеющимся там утверждением

dstudent(“99-234”,“Иванов А.В.”,”ПМА”),

стоящим в настоящий момент в базе данных на первом месте, необходимо следующее предикатное выражение

asserta(dstudent(“99-233”,“Степанов И.А.”,”АТП”)).

2. Предикат assertz так же, как и asserta, заносит новые утверждения в базу данных. Однако он помещает новое утверждение за всеми уже имеющимися в базе утверждениями того же предиката. Синтаксис предиката тот же. Например,

assertz(dstudent(“99-235”,“Демидов С.А.”,”АТП”)).

Замечание: иногда бывает предпочтительно иметь часть информации базы данных в виде утверждений статической БД; эти данные заносятся в динамическую БД сразу после активизации программы. Для этой цели используются предикаты asserta и assertz. В общем, предикаты статической БД имеют другое имя, но ту же самую форму представления данных, что и предикаты динамической. Например,(symbol, symbol, symbol)(code,name,dep)

student(“99-231”,“Иванов С.С.”,”АТП”).(“99-232”,“Петров А.Г.”,”Технологический”).

student(“99-233”,“Степанов И.А.”,”АТП”).

student(“99-234”,“Иванов А.В.”,”ПМА”).

student(“99-235”,“Демидов С.А.”,”АТП”).

Все отличие предиката dstudent по сравнению с student заключается лишь в одной лишней букве терма. Добавление латинской буквы d - обычный способ различать предикаты динамической и статической баз данных.

А правилом для занесения в динамическую БД информации из утверждений предиката student служит

assert_database:- student(Code,Name,Dep),(dstudent(Code,Name,Dep)),fail._database:-!.

. Предикат retract удаляет утверждение из динамической БД (еще раз напомним, что динамическая БД содержит факты, но не правила) Его синтаксис таков:

retract(<факт>).

Например правило

del:- retract(exam (99-231,inf,5)).

удаляет из БД факт exam (99-231,inf,5), а правило

del_all:-retract(_,_,_),fail.

удаляет из нее все факты.

. Предикат findall позволяет собрать все имеющиеся в базе данные в список, который может быть полезен при дальнейшей работе. Синтаксис:

findall(<элемент_списка>,<факт>,<список>)

Так, findall можно использовать для получения списка имен всех студентов, содержащихся в БД. После того, как успешным будет предикат

findall(Name,dstudent(_,Name,_),Student_list)

переменная Student_list будет содержать список имен всех студентов, содержащихся в фактах с термом dstudent.



Поделиться:


Последнее изменение этой страницы: 2020-03-14; просмотров: 130; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 13.59.112.169 (0.008 с.)