Выборка структурированной информации из базы данных
В данном примере демонстрируются методы представления структурированных объектов данных и манипулирования ими. В нем также показано, что язык Prolog хорошо подходит для оформления запросов к базе данных.
Любую базу данных можно естественным образом представить на языке Prolog в виде множества фактов. Например, базу данных о семьях можно представить таким образом, что для описания каждой семьи будет применяться одно предложение. На рис. 4.1 показано, каким способом может быть структурирована информация о каждой семье. Каждая семья имеет три составляющих: муж, жена и дети. Поскольку в разных семьях имеется различное количество детей, информация о детях представлена в виде списка, который позволяет включать в него любое количество элементов. Информация о каждом человеке, в свою очередь, представлена в виде структуры, состоящей из четырех компонентов: имя, фамилия, дата рождения, место работы. Информация о месте работы может содержать слово "unemployed" (безработный) или указывать организацию, в которой работает данное лицо, и заработную плату. Ин-
формацию о семье, представленную на рис. 4.1, можно записать в базу данных с помощью следующего предложения:
family(
person [ torn, fox, date(7,may,1960) , works (fabc, 15200)), person! arm, foxr date [9,may, 1961) , unemployed), [ person! pat, fox, date ! 5, may, 1983 >, unemployed), person С Jim, fox, date[S,mav, 1983), unemployed) ]).
family
pereon
turn fox date works aim fox date imnmplnyod parson
УГ\ A /l\ /7T\ \
7 may 1960 bbc 15200 9 may 19Б1 pal fox dale unemployed person []
/l\ //W
5 may 1983 loxdale unemployed
//\
5 may 1983 Рис. 4.1. Пример структурного представления информации о семье
Таким образом, рассматриваемая база данных может состоять из последовательности фактов, подобных этому, в которых описаны все семьи, представляющие интерес для данной программы.
Prolog фактически является языком, который очень хорошо приспособлен для выборки требуемой информации из подобной базы данных. Замечательным свойством этого языка является то, что он позволяет ссылаться на объекты, фактически не задавая все компоненты этих объектов. Prolog предоставляет возможность указывать структуру интересующих нас объектов и оставлять конкретные компоненты в этой структуре не заданными или заданными лишь частично. Некоторые примеры этого приведены на рис. 4.2. В частности, можно указать все семьи Армстронг с помощью следующего терма: family ( person (_, armstrong,_, J , _, _)
Символы подчеркивания обозначают различные анонимные переменные; при их использовании можно не беспокоиться о том, как определить их значения. Кроме того, можно обозначить все семьи с тремя детьми с помощью следующего терма:
;) |
[ , |
family(
Чтобы найти всех замужних женщин, имеющих по меньшей мере трех детей, можно сформировать такой вопрос:
?- family [ _, person( Name, Surname, _, _) , [_,_,_!_] Ь
Из этих примеров следует вывод, что интересующие нас объекты можно определять не только по их содержимому, но и путем указания их структуры. Достаточно обозначить структуру этих объектов и оставить их параметры в виде незаполненных ячеек.
Кроме того, существует возможность предусмотреть набор процедур, которые будут служить в качестве утилит, позволяющих повысить удобство взаимодействия с базой данных. Подобные вспомогательные процедуры могут стать частью пользовательского интерфейса. Некоторые полезные вспомогательные процедуры для рассматриваемой базы данных приведены ниже.
Глава 4. Использование структур: примеры программ
husband { X) -.- % X family(X,_, _ ) .
муж
wife £ X) :- i К - жена family(_, X, _ ) .
child ( X) :- \ X - ребенок
family! _, _, Children),
member( X, Children). % X задан в списке Children
exists { Person) :- % Любой человек, описшныВ базе данных husband! Person)
wife( Person) Child! Person). dateofbirth ( person[ salaryt person ( _/_,. salary 1 person! _,_,
Date, _), Date). works [ _, S) ) , S ). I Заработок работающего лица unemployed), 0). % Заработок безработного лица
Family
Ж)
Femily
Person
/ \
— armstrong
Family