![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Работа с базами данных в оперативной памятиСодержание книги
Поиск на нашем сайте
Сама форма записи фактов в Прологе наводит на мысль о работе с базой данных (БД). Например, набор фактов 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; просмотров: 135; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.219.123.56 (0.01 с.) |