begin
OLDDEP = 0; NEWDEP = X
while NEWDEP
OLDDEP do begin
OLDDEP = NEWDEP
for каждая F- зависимость W -> Z в F do
if NEWDEP
W then
NEWDEP = NEWDEP
Z
end
return(NEWDEP)
end
Пример работы алгоритма MEMBER
Пусть F = {НОМЕР_РЕЙСА, ДАТА_ВЫЛЕТА -> КОЛИЧЕСТВО_МЕСТ,
НОМЕР_РЕЙСА -> ПУНКТ_ОТПРАВЛЕНИЯ, НОМЕР_РЕЙСА, ДАТА_ВЫЛЕТА -> ПИЛОТ} и необходимо установить F |= НОМЕР_РЕЙСА -> ПИЛОТ
Используем для этого алгоритм MEMBER
Обращение к нему будет выглядеть так: MEMBER (F,НОМЕР_РЕЙСА -> ПИЛОТ).
Результатом работы алгоритма будет истина, если будет истинным выражение Y
CLOSURE(X,F), или с учетом данных примера ПИЛОТ
CLOSURE(НОМЕР_РЕЙСА,F). Выполним поэтапно работу алгоритма CLOSURE как показано в таблице. В результате будет возвращено значение НОМЕР_РЕЙСА. ПУНКТ_ОТПРАВЛЕНИЯ. Атрибут ПИЛОТ не является подмножеством результата работы CLOSURE, поэтому F не влечет за собой НОМЕР_РЕЙСА -> ПИЛОТ, т.е. эту функциональную зависимость нельзя вывести из F.
| Шаг
| NEWDEP
| OLDDEP
| Зависимость из F
| Пояснения
|
|
| НОМЕР_РЕЙСА
|
|
| Начальные значения переменных, если они не равны, то OLDDEP= NEWDEP
|
|
| НОМЕР_РЕЙСА
| НОМЕР_РЕЙСА
| НОМЕР_РЕЙСА, ДАТА_ВЫЛЕТА -> КОЛИЧЕСТВО_МЕСТ
| НОМЕР_РЕЙСА, ДАТА_ВЫЛЕТА не является подмножеством содержимого NEWDEP поэтому следующая зависимость из F
|
|
| НОМЕР_РЕЙСА
| НОМЕР_РЕЙСА
| НОМЕР_РЕЙСА -> ПУНКТ_ОТПРАВЛЕНИЯ
| НОМЕР_РЕЙСА подмножество NEWDEP поэтому добавим к NEWDEP ПУНКТ_ОТПРАВЛЕНИЯ
|
|
| НОМЕР_РЕЙСА.
ПУНКТ_ОТПРАВЛЕНИЯ
| НОМЕР_РЕЙСА
| НОМЕР_РЕЙСА, ДАТА_ВЫЛЕТА -> ПИЛОТ
| НОМЕР_РЕЙСА, ДАТА_ВЫЛЕТА не является подмножеством NEWDEP и это последняя зависимость из F. NEWDEP не равно OLDDEP поэтому присваиваем OLDDEP значение NEWDEP и повторяем цикл
|
|
| НОМЕР_РЕЙСА.
ПУНКТ_ОТПРАВЛЕНИЯ
| НОМЕР_РЕЙСА.
ПУНКТ_ОТПРАВЛЕНИЯ
|
| Повторяя перебор зависимостей из F убедимся, что NEWDEP не изменится, поэтому после окончания цикла окажется, что NEWDEP= OLDDEP и алгоритм CLOSURE возвращает значение НОМЕР_РЕЙСА.
ПУНКТ_ОТПРАВЛЕНИЯ
|