В процессе работы с базой данных может возникнуть необходимость в ее модификации, т. е. в добавлении новых ключей, полей или отношений. Указанные операции можно выполнить с помощью встроенных отношений add, delete и edit, но при этом необходимо располагать полными сведениями о содержимом базы данных. В связи с этим такой способ скорее всего будет сопровождаться многочисленными ошибками. Нам же необходима программа, которая после получения от пользователя соответствующей команды сможет выполнить все операции по модификации базы данных автоматически.
Сначала рассмотрим случай, когда либо новая информация добавляется в базу данных, либо производится модификация данных, уже имеющихся в базе. Варианты, возможные в этом случае, приведены в табл. 5.2.
Таблица 5.2. Варианты типов запросов для изменения базы данных
Каждая строка табл 5.2 соответствует какому-либо варианту запроса. Если запрос изменяет ключ, поле или отношение, то в соответствующей его позиции стоит "да". В противном случае эта позиция помечается словом "нет". Можно создать отношение, которое из" меняло бы базу данных по описанным выше запросе, но операции модификации в этом случае выполнялись бы очень медленно. Разобъем все процедуры изменения базы данных на два класса: к первому отнесем те из них, в которых изменению подлежат уже существующие Поля базы данных, а ко второму - все остальные. В соответствии с этими двумя классами создадим два отношения: addf (для добавления нового поля) и update (для добавления новых ключей, отношений, а также модификации существующих записей). Указанные отношения представлены в программе 5.6. С помощью данной программы можно модифицировать любую базу данных, созданную с использованием модуля BEGIN.
Программа 5.6
addf X if
(fields Y) delete and
(X new field) is-told and
APPEND CY(X)Z) and
(fields Z) add and
(zeroes x) delete and
APPEND (x( ∅)y) and
(zeroes y) add and
/
update (X Y Z) if
(key X relation Y and new data Z) is-told and
updatel(XYZ) updatel(XYZ)if
X key and
(either Y rel and / or (rels x) delete and APPEND (x (Y) y) and (xels у_) add and /) and
(X Y x) delete and
(X Y Z) add and
updatel(X Y Z)if
not X key and
(X Y Z)add and
(keys x) delete and
APPEND (x(X)y) and
(keys y) add and
(either Y rel and / or (rels z) delete and APPEND (* (Y) XI) and (rels XI) add and /) and
X key if
keys Y and
X ON Y
X rel if
rels Y and
X ON Y
X field if
fields Y and
X ON Y
X elixn Y if
(X key and У rel) is-told and
(X Y Z) delete and
/
&.
а программа содержит предложения keys (ключи), fields (поля), zeroes (нули) и rels (отношения). Отношение addf (добавить-поле) позволяет добавлять новые поля и при этом производить соответствующие изменения в списках полей, а также заносит куш в добавленные поля.
Для добавления и изменений ключей и отношений предяазв что отношение update (перезаписать). Данное отношение обеспечивает необходимые изменения в записях базы данных, а также осуществляет замену старых предложений программы на новые.
Отношение elim (исключить) позволяет исключать предложения из любого отношенья в программе пользователя. Отметим, что при использовании данного отношения номер уничтожаемого предложения указывать не надо. В этом заключается его преимущество перед встроенным отношением микроПролога delete. Для более эффективного использования программы 5.6 ее необходимо оформить в виде модуля. Для этой цели к тексту программы следует добавить предложение
Module (update-mod (addf update elim
key field rel) (add delete is-told ON APPEND fields zeroes keys rels))
Затем необходимо загрузить модуль MODULES и сохранить сформированный модуль в "файле с именем UPDATE. Ниже приводится пример базы данных типа той, что предлагалось сгенерировать в упражнении 5.6, но которую теперь можно создать с помощью модуля BEGIN. Пусть в результате генерации была получена база данных следующего вида:
fields (sand cement bricks)
zeroes ( ∅ ∅ ∅)
McDoo keys
in rels out
McDoo in ( ∅ ∅ ∅)
McDoo out ( ∅ ∅ ∅)
После окончания работы модуля BEGIN его следует удалить из памяти, выполнив команду KILL begin-mod, после чего ввести команду load UPDATE и приступить к заполнению базы данных, например, следующим образом:
all (: update x)
key X relation Y and new data Z ans McDoo in (14 6 7 ∅ ∅)
key X ... и т. д. ? ans McDoo out (5 2 12 ∅)
key X ... и т. д. ? ans Fee in (55 2 ∅ 5 ∅ ∅ ∅)
key X ... и т. д. ? just Fee out (17 6 6 ∅ ∅)
No (more) answers
Теперь, если вывести программу на экран, можно убедиться, что две старые записи с данными о хозяйстве фермера McDoo изменились, добавились записи для фермера Fee, а отношение keys теперь содержит список (McDoo Fee).
Следующий пример диалога показывает, как могут быть одновременно добавлены новый ключ и новое отношение:
all (: update x)
key X relation Y and new data Z? just Home stock (9 ∅ ∅ 5 ∅ 6∅∅∅)
No (more) answers
Если теперь вывести программу на экран, можно обнаружить новое предложение для фермера Ноте, а предложения со списками ключей (keys) и отношений (rels) выглядят следующим образом:
keys (McDoo Fee Home)
rels (in out stock)
Далее приведен пример добавления нового поля:
all (х : addf x)
X new field ? just blocks
blocks
No (more) answers
В результате списки в предложениях fields и zeroes будут выглядеть так:
fields (sand cement bricks blocks)
zeroes ( ∅ ∅ ∅ ∅)
Отметим, что для удаления предложения не нужно знать его положение в программе.
Упражнение 5.8
Попрактикуйтесь в применении модуля UPDATE к базам данных, построенным в упражнении 5.7.