Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программы классификации 49 9 Программа классифи...doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
944.13 Кб
Скачать
      1. База данных с использованием структур.

Создание конкретной структуры и соответствующих этой структуре объектов представляет собой создание еще одной базы данных. Объекты – это записи базы данных, а структура – описание формата такой записи и ее полей. Применение структур продемонстрируем на примере программы, которая представляет базу данных о семьях. Покажем, как извлекается информация из этой базы данных. Удачно выбранное представление облегчает интерпретацию извлеченной информации.

Каждая семья состоит, с точки представления ее логической структуры, из трех объектов: мужа, жены и детей. Поскольку количество детей в разных семьях может быть разным, то их целесообразно представить в виде списка, состоящего из произвольного числа элементов. Информацию о каждом члене семьи, в свою очередь, можно собрать структурой, состоящей из четырех компонент: имени, фамилии, даты рождения и работы. Информация о работе – это или указания кода работы и оклада, или "не работает".

Ясно, что для описания такой базы данных понадобится сложная область определения. Введем следующие структуры, соответствующие соответственно дате рождения члена семьи (число, месяц, год) и работе:

Domains

data = dat( integer, string, integer )

work = worker( string, integer );

notwork

Тогда основная структура, соответствующая описанию каждого члена семьи, может выглядеть таким образом:

Domains

memfam= mem(string,string,data,work);

absent % Член семьи может отсутствовать

list_memfam = memfam *

Информацию о двух семьях можно занести в базу данных с помощью следующих описаний и предложений:

Predicates

family (memfam, memfam, list_memfam)

Clauses

family(mem(jon, kelly, dat(17, may, 1950), worker(bbz, 15000)),

mem(bony, kelly, dat( 29, may, 1951), notwork)),

[mem(pat, kelly, dat(5, april, 1983), notwork),

mem(liz, kelly, dat(10, april, 1960), notwork)).

family(mem(bob, rob, dat(14, may, 1930), worker(pla, 12000)),

mem(sally, rob, dat(5, october, 1931), worker(plt, 11000)), [ ]). % нет детей в семье

Теперь из такой базы данных уже можно извлекать информацию. Так, в запросах к базе данных можно ссылаться на всех kelly с помощью цели:

goal: family(mem( _ , kelly, _ , _ ), _ , X ).

Данная цель вернет значение переменной – список структурированных объектов, содержащий информацию о детях семью Келли:

X = [mem(pat, kelly, dat(5, april, 1983), notwork),

mem(liz, kelly, dat(10, april, 1960), notwork)).

Символы подчеркивания в записи цели обозначают различные анонимные переменные, значения которых нас не интересуют.

Можно найти все семьи с тремя детьми при помощи выражения:

goal: family( X, _ , [ _ , _ , _ ] ).

Здесь переменная X будет конкретизирована структурой, представляющей первый аргумент предиката family.

Чтобы найти имена и фамилии всех женщин, имеющих, по крайней мере, трех детей, можно задать вопрос:

goal: family( _ , mem( Name, Fam, _ , _ ), [ _ , _ , _ | _ ] ).

Главным моментом в этих примерах является то, что указывать интересующие нас объекты можно не только по их содержимому, но и по их структуре, т.е. иметь результат в виде целой структуры или в виде отдельных элементов структур.

Можно также создать набор процедур, который делал бы взаимодействие с базой данных более удобным. Такие процедуры являлись бы частью пользовательского интерфейса. Вот некоторые из них:

husband(X) :– family( X, _ , _ ). % X – муж