Введение в базы данных в Турбо-Прологе.
Файл базы данных представляет собой набор связанных между собой записей. Файл БД имеет вид простого файла, однако содержащиеся в нем данные имеют свою внутреннюю организацию.
Данные внутри каждой записи имеют одну и ту же структуру.
Часто имеется одна специальная запись, в которой записан способ представления данных в записях. Эта таблица (или схема) играет роль "карты", руководствуясь которой программа СУБД работает с этими данными. Файл - это совокупность записей. В свою очередь запись - это совокупность полей. Каждое поле содержит часть данных.
Основные операции работы с файлами включают добавление новых записей, модификацию старых и запросы к БД. Основывающиеся на правилах средства Турбо-Пролога для работы с базами данных позволяют использовать результаты запросов к базе в качестве новых данных, которые можно поместить в БД в новых записях.
Все записи (в основном) файла БД имеют одинаковую длину, поэтому расположение любой записи в файле определяется без труда. В базе данных на Турбо-Прологе, однако, требование одинаковости длин может и не соблюдаться, так как Турбо-Пролог располагает записи в соответствии с шаблоном.
В Турбо-Прологе имеются специальные средства для организации баз данных. Эти средства рассчитаны на работу с реляционными базами данных, так как Турбо-Пролог особенно хорош для написания диалоговой системы именно для реляционной БД: внутренние унификационные процедуры языка осуществляют автоматическую выборку фактов с нужными значениями известных параметров и присваивают значения еще не определенным. К тому же механизм отката позволяет находить все имеющиеся ответы на сделанный запрос.
Чтобы понять, как в Турбо-Прологе реализуется обращение к БД, рассмотрим запрос
dplayer("Bernie Kosar",Team,Pos).
В этом утверждении Team и Pоs есть переменные, значения которых нужно найти. Когда этот запрос (цель) испытывается, процедуры Турбо-Пролога просматривают утверждения БД на предмет сопоставления с утверждением, содержащим Bernie Kosar.
Так как в базе данных такое утверждение присутствует, то переменной Team присваивается значение Cleveland Browns, а переменной Pos - QB.
Если трактовать dplayer как предикат БД Турбо-Пролог, то отсюда следует с необходимостью такое его описание
database
dplayer(name,team,position)
Раздел database в Турбо-Прологе предназначен для описания предикатов базы данных, таких как dplayer. Все различные утверждения этого предиката составляют динамическую базу данных Турбо-Пролога. База данных называется динамической, так во время работы программы из нее можно удалять любые содержащиеся в ней утверждения, а также добавлять новые. В этом состоит ее отличие от "статических" баз данных, где утверждения являются частью кода программы и не могут быть изменены во время счета. Другая важная особенность динамической базы данных состоит в том, что такая база может быть записана на диск, а также считана с диска в оперативную память.
Иногда бывает предпочтительно иметь часть информации базы данных в виде утверждений статической БД; эти данные заносятся в динамическую БД сразу после активизации программы. (Для этой цели используются предикаты asserta и assertz, которые будут рассмотрены ниже.) В общем, предикаты статической БД имеют другое имя, но ту же самую форму представления данных, что и предикаты динамической. Предикат статической БД, соответствующий предикату dplayer динамической базы данных, есть
Predicates
player(name,team,position)
Clauses
player("Dan Marino","Miami Dolphins","QB").
player("Richart Dent","Chicago Bears","DE").
player("Bernie Kosar","Cleveland Browns","QB").
player("Doug Cosbie","Dallas Cowboy","TE").
player("Mark Malone","Pittsburgh Steelers","QB").
Заметим, что все отличие предиката dplayer по сравнению с player заключается лишь в одной лишней букве терма. Добавление латинской буквы d - обычный способ различать предикаты динамической и статической баз данных.
Правилом для занесения в динамическую БД информации из утверждений предиката player служит
assert_database :-
player(Name,Team,Number),
assertz( dplayer(Name,Team,Number) ),
fail.
assert_database :- !.
В этом правиле применяется уже знакомый вам метод отката после неудачи, который позволяет перебрать все утверждения предиката player.
Дата добавления: 2016-05-05; просмотров: 897;