Назад | Содержание| Вперёд 4. 2. Абстракция данных Абстракцию ...

Назад | Содержание| Вперёд

4. 2.    Абстракция данных

Абстракцию данных можно рассматривать какпроцесс организации различных фрагментовинформации в единые логические единицы(возможно, иерархически), придавая ей при этомнекоторую концептуально осмысленную форму.Каждая информационная единица должна быть легкодоступна в программе. В идеальном случае вседетали реализации такой структуры должны бытьневидимы пользователю этой структуры. Самоеглавное в этом процессе - дать программистувозможность использовать информацию, не думая одеталях ее действительного представления.

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

доступ к конкретнымкомпонентам семьи,

не зная деталей рис. 4.1.Такие отношения можно назвать

селекторами

,поскольку они позволяют выбирать конкретныекомпоненты. Имя такого отношения-селектора будетсовпадать с именем компоненты, которую нужновыбрать. Отношение будет иметь два аргумента:первый - объект, который содержит компоненту, ивторой - саму компоненту:

        отношение_селектор(Объект,Выбранная_компонента)

Вот несколько селекторов для структуры семья:

        муж( семья( Муж, _, _ ),Муж).

        жена( семья( _, Жена, _), Жена).

        дети( семья( _, _,СписокДетей ), СписокДетей).

Можно также создать селекторы для отдельныхдетей семьи:

        первыйребенок(Семья, Первый) :-

              дети(Семья, [Первый | _ ]).

        второйребенок(Семья, Второй) :-

              дети(Семья, [ _, Второй | _ ]).

        . . .

Можно обобщить этот селектор для выбора N-горебенка:

        nребенок( N,Семья, Ребенок) :-

              дети(Семья, СписокДетей),

              n_элемент(N, СписокДетей, Ребенок)

                                                      % N-й элемент списка

Другим интересным объектом является "членсемьи". Вот некоторые связанные с нимселекторы, соответствующие рис. 4.1:

        имя( членсемьи( Имя,_, _, _ ), Имя).

        фамилия( членсемьи( _,Фамилия, _, _ ), Фамилия).

        датарождения( членсемьи(_, _, Дата), Дата).

Какие преимущества мы можем получить отиспользования отношений-селекторов? Определивих, мы можем теперь забыть о конкретном видеструктуры представления информации. Дляпополнения и обработки этой информации нужнознать только имена отношений-селекторов и воставшейся части программы пользоваться толькоими. В случае, если информация представленасложной структурой, это легче, чем каждый разобращаться к ней в явном виде. В частности, внашем примере с семьей пользователь не обязанзнать, что дети представлены в виде списка.Например, предположим, мы хотим сказать, что ТомФокс и Джим Фокс принадлежат к одной семье и чтоДжим - второй ребенок Тома. Используя приведенныевыше отношения-селекторы, мы можем определитьдвух человек, назовем их Человек1 и Человек2,и семью. Следующий список целей приводит кжелаемому результату:

        имя( Человек1, том),фамилия( Человек1, фокс),

                                                  % Человек1 - Том Фокс

        имя( Человек2, джим),фамилия( Человек1, фокс),

                                                  % Человек2 - Джим Фокс

        муж( Семья, Человек1),

        второйребенок( Семья,Человек2)

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

Упражнение

4. 3.    Завершите определениеотношения nребенок, определивотношение

        n_элемент( N,Список, X)

которое выполняется, если Х является N-мэлементом списка Список.

Посмотреть ответ

Назад | Содержание| Вперёд









Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх