Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 13
На сайте нет зарегистрированных пользователей

Пользователей: 13,372
новичок: vausoz
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование работы узла коммутации сообщений на GPSS + Пояснительная з...
База данных электронного документооборота на Delphi + бд Intebase
Принадлежит ли точка пересечению двух окружностей на Turbo Pascal + Отче...

Создание динамических баз данных


Динамическая база данныхэто база данных, в которую время от времени требуется вносить изменения, отражающие изменения структуры описываемой системы. Один из методов реализации динамической базы данных заключается в деструктивном редактировании базы данных при необходимости внесения в нее изменений. К сожалению, при деструктивном редактировании исчезает возможность возврата к состоянию базы данных, существовавшему ранее. Это затрудняет анализ изменений базы данных.
Аксиома фреймов является альтернативной концепцией реализацией динамической базы данных. Если необходимо внести изменение, то исходная база данных остается неизменной, а записывается собственно изменение. Текущая форма базы данных получается при использовании ее исходной формы с учетом сделанных изменений. Ниже формулируется аксиома фреймов, в которой U обозначает любое отношение, а состояние S+1 является результатом выполнения действия А в состоянии S.

Аксиома фреймов. Отношение U будет соблюдаться в состоянии S + 1, являющемся результатом выполнения действия А в состоянии S, если U соблюдается в состоянии S, а А не влияет на U.

Иными словами, состояние базы данных унаследует каждую фразу предыдущего состояния, если только эти фразы не были явно изменены при переходе в данное состояние.
В соответствии с аксиомой фреймов для представления динамической базы данных можно воспользоваться механизмом наследования. Начальное состояние базы данных соответствует самому верхнему узлу дерева состояний. Каждое новое состояние базы данных вводится как состояние-потомок предыдущего состояния.
После введения нового состояния базы данных, как потомка существующего состояния, каждая фраза, связанная с существующим состоянием, либо будет унаследована состоянием-потомком (т.е. не изменится), либо будет перекрыта новым значением (т.е. изменится), либо будет опровергнута (т.е. удалена). Помимо этого, в новое состояние могут быть введены новые фразы.
Мир кубиков. Мир кубиков - это пример, часто используемый для того, чтобы проиллюстрировать аксиому фреймов. Для точного описания мира кубиков требуется динамическая база данных, в которой задаются положения кубиков на крышке стола. Метод, употребляемый для представления мира кубиков, можно с успехом применить и в других задачах, где требуется динамическая база данных.
Описываемая версия мира кубиков основывается на базе данных, состоящей из фактов "на/3", при помощи которых задается положение кубиков. Факт «на(5, А, В)» означает, что в состоянии S кубик А находится на верхней части кубика В. Процедура "поместить" позволяет пользователю перемещать кубики, входящие в мир, на другие места, что соответствует переходам к новым состояниям базы данных "на". Начальное состояние базы данных "на" носит название "1", следующее состояние - "2" и т.д.
Характеристики отношения "на". Отношение "на" - это отношение либо между двумя кубиками в некотором состоянии, либо между кубиком и столом. Согласно определению данное отношение несимметрично, нерефлексивно и нетранзитивно. Все кубики имеют одинаковый размер, отношение "на" между двумя кубиками регулируется ограничением вида один-к-одному, обеспечивающим целостность. Иными словами, если кубик А уже находится на кубике В, то на кубике В не может быть никаких других кубиков. На столе может поместиться более одного кубика.
Главной функцией процедуры "поместить" является сбор данных - она собирает у пользователя сведения о необходимых изменениях базы данных. Для защиты базы данных "на" от некорректных изменений в процедуре "поместить" применяются ограничения, обеспечивающие целостность базы данных. К примеру, если кубик А уже находится на кубике В, а пользователь попытается поставить на В кубик С, то процедура "поместить" откажется выполнить предписываемое перемещение и выдаст пользователю предупреждающее сообщение. Тем самым процедура "поместить" следит за тем, чтобы в точке, где пользователь пытается вносить изменения в базу данных, отношение "на" между двумя кубиками имело вид один-к-одному. Процедура "поместить" накладывает и другие ограничения, обеспечивающие целостность, такие как недопущение употребления кубика, отсутствующего в текущем состоянии.
Первоначально база данных, описывающая мир кубиков, состоит из следующих фактов:

на(1, а, стол).
на (1, б, стол).
на(1, в, а).
на(1, г,в).

текущее_состояние (1).




Факт "текущее_состояние" содержит наименование самого последнего состояния базы данных.
Картина состояния. Экранно-ориентированная процедура "отобразить_состояние" строит на экране дисплея изображение кубиков для заданного состояния базы данных. Начальное состояние выглядит так:

?- отобразить_состояние (1).

Г
В
А Б
С Т О Л





Внесение изменений в базу данных при помощи процедуры "поместить". Процедура "поместить" вносит изменение в базу данных, генерируя состояние-потомок текущего состояния. Она добавляет новые данные в состояние-потомок, а затем деструктивно изменяет значение факта "текущее-состояние", превращая его в обозначение потомка. Первым аргументом процедуры "поместить" является обозначение кубика, который нужно передвинуть, а вторым аргументом служит место, куда нужно поставить этот кубик.
Например, если текущее состояние - это "1", то запрос

?- поместить (г, стол). % запрос (1)




вызовет добавление в программу следующих фраз:

текущее-состояние (2).
на (2, г, стол).
опровергнуть (2, на (_,г,в)).




Кроме того, из программы будет удалена фраза «текущее_состояние (1)».
Выяснение того, где находятся кубики. Нижеследующий запрос покажет, где находятся кубики в состоянии "2" базы данных:

?- послать (2, на (_X, Y)).

Х=г
У=стол; %по состоянию «2»

Х=а
У=стол; %по состоянию «1»

Х=б
У=стол; %по состоянию «1»

Х=в
У=стол; %по состоянию «1»

нет




Эта информация будет лучше восприниматься, если ее представить в графическом виде:
?- отобразить_состояние (2).

В
Г А Б
С Т О Л




Посмотрим, как будет выглядеть база данных после внесения еще нескольких изменений.
?- поместить (а, б). % запрос (2)
да
?-поместить (в, г). % запрос (3)
да
? - текущее_состояние (X).
Х=4
? – отобразить_состояние (4).

В А
Г Б
С Т О Л




Реализация процедуры "поместить".

% запретить использование неизвестного кубика:
поместить (Кубик. Куда_поставить) : -
% проверить, отсутствуют ли
% Кубик и Куда_поставить:
( not (на(...; Кубик, _))
;
Куда_поставить \== стол,
not (на(...; Куда_поставить, _))
),
write(‘неверное обращение к кубику’), nl, !.

% запретить изменение, если переменная Куда_поставить обозначает
% кубик, на котором уже стоит другой кубик:
поместить (Кубик. Куда_поставить) : -
Куда_поставить \== стол,
Текущее_состояние(Состояние),
послать(Состояние, на(Занят, Куда_поставить)),
write(Занят),
write(‘ уже находится на ’)
write(Куда_поставить), nl,!.
% здесь база данных изменяется:
поместить (Кубик, Куда_поставить) :-
текущее_состояние (Состояние), %1
НовоеСостояние is Состояние + 1, %2
assert (порождение (НовоеСостояние, Состояние)), %3
%
послать (Состояние, на (Кубик, Под_кубиком)), %4
assert (опровергнуть (НовоеСостояние,
на(_, Кубик, Под_кубиком))), %5
assert (на (НовоеСостояние, Кубик, Куда_поставить)), %6
retract (текущее_состояние (Состояние)), %7
assert (текущее_состояние (НовоеСостояние)), !. %8




Ограничения, обеспечивающие целостность, которые накладываются во время сбора данных. Первое правило "поместить" отвергает кубики, которые отсутствуют в мире. Второе правило не разрешает пользователю ставить кубик на другой кубик, место над которым уже занято. Если два первых правила потерпят неудачу, то это будет означать, что ограничения, обеспечивающие целостность базы данных, не будут нарушены при предлагаемом ее изменении. Собственно изменение осуществляется третьим правилом "поместить" Подцели (2) и (3) этого правила устанавливают новое состояние базы данных "порождение". Подцель (4) выясняет текущее местоположение кубика "Кубик", а подцель (5) опровергает это местоположение. Подцель (6) добавляет к новому состоянию новое местоположение кубика "Кубик". В заключение подцели (7) и (8) деструктивно изменяют значение факта "текущее_состояние".
Перемещение колонки кубиков. В рассматриваемой версии программы "поместить" разрешается передвигать за один раз целую колонку кубиков. Иными словами, не запрещается перемещать кубик, если на нем стоит еще один кубик. Это именно то что будет сделано в ответ на приведенный выше запрос (2): «поместить (а, б)». Все кубики, стоящие над перемещаемым, наследуют новое положение этого кубика. Можно было бы добавить еще одно правило, которое реализовывало бы ограничение, обеспечивающее целостность, гарантируя то. что за один раз будет перемещаться только один кубик.
Оценка механизма наследования. Механизм наследования - это практическое воплощение концепции наследования. Он пригоден для представления таких ситуаций, в которых имеется множество состояний знаний, иерархически взаимосвязанных друг с другом. Тем самым механизм наследования создает основу для перевода на Пролог знаний, выраженных при помощи формализма фреймов или объектно-ориентированного формализма. Уже существующую фразу Пролог-программы легко можно адаптировать к этому механизму, просто добавив в заголовок этой фразы дополнительный аргумент, содержащий имя состояния знаний. Примеры данного раздела показывают, что применение механизма наследования позволяет реализовать удобную дня восприятия аксиоматизацию системы, свободную от побочных эффектов управления.
Недостатком механизма наследования является то, что он работает неэффективно, если запросу к процедуре "послать" приходится анализировать длинные цепи состояний. В приведенной форме, механизм наследования позволяет порожденному состоянию иметь более одного родителя. В объектно-ориентированном формализме это называется множественным наследованием. Неэффективность процедуры "послать" возрастает, если состояние, к которому обращен запрос, имеет более одного родителя.
Опубликовал Kest October 16 2010 16:51:23 · 1 Комментариев · 12922 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Ivan May 15 2012 07:17:23
Хорошая статья.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Binary2XMLDemo (Р...
Простой пример ка...
WebReg v1.3
Переработанный пл...
Java 2 - Эффектив...
Работа с картотеками
BIOS
Архив Апгрейтов с...
CoolHints2k
Пятнашки и крести...
Х. М. Дейтел, П. ...
Самоучитель Прогр...
Последнее загруж...
Программирование ...
ИНТЕРНЕТ ПРОГРАММ...
Bitmap [для кнопок]
FilesInfo
Синтаксический ан...
Exe in exe
Delphi 6. Учебный...

Топ загрузок
Приложение Клие... 100793
Delphi 7 Enterp... 98016
Converter AMR<-... 20298
GPSS World Stud... 17059
Borland C++Buil... 14239
Borland Delphi ... 10374
Turbo Pascal fo... 7390
Калькулятор [Ис... 6080
Visual Studio 2... 5228
Microsoft SQL S... 3674
Случайные статьи
Правила техники бе...
Мобильное приложен...
Character expressi...
Обзор букмекера 1xBet
Удаление из файла ...
Связанные списки в...
Реализация модели ...
Оператор цикла repeat
categoryid
Основные понятия О...
8.3. Алгоритм «раз...
Настройка туннельн...
Использование sysl...
Как обратиться к с...
Объединенные связи...
Constant expected
Создание кадровой ...
Подготовка файла A...
Внимание к ключево...
Анализ файловой си...
Выбор параметра в ...
Суммирование двух ...
Полнодуплексные ас...
Играйте в игровые ...
Разделение памяти ...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?