Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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; просмотров: 130; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 13.59.112.169 (0.008 с.) |