Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Абстракцию данных можно рассматривать как процесс организации различных фрагментов информации в единые логические единицы (возможно, иерархически), придавая ей при этом некоторую концептуально осмысленную форму. Каждая информационная единица должна быть легко доступна в программе. В идеальном случае все детали реализации такой структуры должны быть невидимы пользователю этой структуры. Самое главное в этом процессе - дать программисту возможность использовать информацию, не думая о деталях ее действительного представления.
Обсудим один из способов реализации этого принципа на Прологе. Рассмотрим снова пример с семьей из предыдущего раздела. Каждая семья — это набор некоторых фрагментов информации. Все эти фрагменты объединены в естественные информационные единицы, такие, как "член семьи" или "семья", и с ними можно обращаться как с едиными объектами. Предположим опять, что информация о семье структурирована так же, как на рис. 4.1. Определим теперь некоторые отношения, с помощью которых пользователь может получать доступ к конкретным компонентам семьи, не зная деталей рис. 4.1. Такие отношения можно назвать селекторами, поскольку они позволяют выбирать конкретные компоненты. Имя такого отношения-селектора будет совпадать с именем компоненты, которую нужно выбрать. Отношение будет иметь два аргумента: первый — объект, который содержит компоненту, и второй — саму компоненту:
отношение_селектор(Объект, Выбранная_компонента)
Вот несколько селекторов для структуры семья:
муж(семья(Муж, _, _), Муж).
жена(семья(_, Жена, _), Жена).
дети(семья(_, _, СписокДетей), СписокДетей).
Можно также создать селекторы для отдельных детей семьи:
первыйребенок(Семья, Первый):-
дети(Семья, [Первый | _ ]).
второйребенок(Семья, Второй):-
дети(Семья, [ _, Второй | _ ]).
...
Можно обобщить этот селектор для выбора N-го ребенка:
n ребенок(N, Семья, Ребенок):-
дети(Семья, СписокДетей),
n _элемент(N, СписокДетей, Ребенок)
% N-й элемент списка
Другим интересным объектом является "член семьи". Вот некоторые связанные с ним селекторы, соответствующие рис. 4.1:
имя(членсемьи(Имя, _, _, _), Имя).
фамилия(членсемьи(_, Фамилия, _, _), Фамилия).
датарождения(членсемьи(_, _, Дата), Дата).
Какие преимущества мы можем получить от использования отношений-селекторов? Определив их, мы можем теперь забыть о конкретном виде структуры представления информации. Для пополнения и обработки этой информации нужно знать только имена отношений-селекторов и в оставшейся части программы пользоваться только ими. В случае, если информация представлена сложной структурой, это легче, чем каждый раз обращаться к ней в явном виде. В частности, в нашем примере с семьей пользователь не обязан знать, что дети представлены в виде списка. Например, предположим, мы хотим сказать, что Том Фокс и Джим Фокс принадлежат к одной семье и что Джим — второй ребенок Тома. Используя приведенные выше отношения-селекторы, мы можем определить двух человек, назовем их Человек1 и Человек2, и семью. Следующий список целей приводит к желаемому результату:
имя(Человек1, том), фамилия(Человек1, фокс),
% Человек1 - Том Фокс
имя(Человек2, джим), фамилия(Человек1, фокс),
% Человек2 - Джим Фокс
муж(Семья, Человек1),
второйребенок(Семья, Человек2)
Использование отношений-селекторов облегчает также и последующую модификацию программ. Представьте себе, что мы захотели повысить эффективность программы, изменив представление информации. Все, что нужно сделать для этого, — изменить определения отношений-селекторов, и вся остальная программа без изменений будет работать с этим новым представлением.
Дата публикования: 2015-10-09; Прочитано: 246 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!