- •Лабораторная работа № 4 Работа со списками
- •3.1 Длина строки
- •3.2 Конкатенация строк
- •3.3. Создание подстрок
- •3.4. Преобразование данных
- •3.5. Преобразования, определяемые пользователем
- •3.6 Создание символьных префиксов
- •3.7. Преобразование строк
- •3.8. Формирование атомов из строк
- •Лабораторная работа № 5 Работа с файлами
- •4.1.Предикаты для работы с файлами
- •Описание файлового домена
- •Запись в файл
- •Чтение из файла
- •Модификация существующего файла
- •Дозапись в конец уже существующего файла
- •Лабораторная работа № 6 Структуры
- •Абстракция данных
Абстракция данных
Абстракцию данных можно рассматривать как процесс 1 организации различных фрагментов информации в единые логические единицы (возможно, иерархически), придавая ей при этом некоторую концептуально осмысленную форму. Каждая информационная единица должна быть легко доступна в программе. В идеальном случае все детали реализации такой структуры должны быть невидимы пользователю этой структуры. Самое главное в этом процессе — дать программисту возможность использовать информацию, не думая о деталях ее действительного представления.
Обсудим один из способов реализации этого принципа на Прологе. Рассмотрим снова пример с семьей. Каждая семья — это набор некоторых фрагментов информации. Все эти фрагменты объединены в естественные информационные единицы, такие, как «член семьи» или «семья», и с ними можно обращаться как с едиными объектами. Предположим опять, что информация о семье структурирована так же, как на рис. 117. Определим теперь некоторые отношения, с помощью которых пользователь может получать доступ к конкретным компонентам семьи, не зная деталей рис. 117. Такие отношения можно назвать селекторами, поскольку они позволяют выбирать конкретные компоненты. Имя такого отношения-селектора будет совпадать с именем компоненты, которую нужно выбрать. Отношение будет иметь два аргумента: первый — объект, который содержит компоненту, и второй - саму компоненту:
отношение_селектор(Объект,Выбранная_компонента)
Вот несколько cелекторов для структуры семья:
муж( семья Муж, _, ), Муж).
жена( семья( ,Жена, ), Жена).
дети(семья(_,_, СписокДетей), СписокДетей).
Можно также создать селекторы для отдельных детей семьи:
первыйребенок( Семья, Первый) :-
дети( Семья, [Первый | ).
второйребенок( Семья, Второй) :-
дети( Семья, [_, Второй | ).
…
Можно обобщить этот селектор для выбора N-го ребенка:
nребенок( N,Семья, Ребенок) :-
дети( Семья, СписокДетей),
n_элемент( N, СписокДетей, Ребенок)
/* N-й элемент списка */
Другим интересным объектом является «член семьи». Вот некоторые связанные с ним селекторы, соответствующие рис. 28:
имя(членсемьи( Имя, _,_,_), Имя).
фамилия(членсемьи( _, Фамилия, , _), Фамилия).
датарождения(членсемьи( __, _, Дата), Дата).
Какие преимущества мы можем получить от использования отношений-селекторов? Определив их, мы можем теперь забыть о конкретном виде структуры представления информации. Для пополнения и обработки этой информации нужно знать только имена отношений-селекторов и в оставшейся части программы пользоваться только ими. В случае, если информация представлена сложной структурой, это легче, чем каждый раз обращаться к ней в явном виде. В частности, в нашем примере с семьей пользователь не обязан знать, что дети представлены в виде списка. Например, предположим, мы хотим сказать, что, Том Фоке и Джим Фоке принадлежат к одной семье и что Джим - второй ребенок Тома Используя приведенные выше отношения -селекторы, мы можем определить двух человек, назовем их Человек1 и Человек2 и семью. Следующий список целей приводит к желаемому результату:
имя(Человек1, том), фамилия(Человек1, фокc),
/* Человек1 - Том Фокc */
имя(Человек2, джим), фамилия(Человек1, фокc),
/* Человек2 - Джим Фокс */
муж(Семья, Человек1),
второйребенок(Семья, Человек2)
Использование отношений-селекторов облегчает также и последующую модификацию программ.
Представьте себе, что мы захотели повысить эффективность программы, изменив представление информации. Все, что нужно сделать для этого, — изменить определения отношений-селекторов, и вся остальная программа без изменений будет работать с этим новым представлением.
Задание.
Разработать базу данных с вложенной структурой, соответствующей заданной предметной области и глубины (таблица 6).
Таблица 6
Вариант |
Предметная область |
Глубина вложения |
1 |
Семья |
3 |
2 |
Структура предприятия |
3 |
3 |
Компьютеры |
2 |
4 |
Структура локальной сети |
3 |
5 |
Студенты |
3 |
6 |
Автомобили |
2 |
7 |
Корабли |
2 |
8 |
Самолеты |
2 |
9 |
Телефонный справочник |
4 |
10 |
Страны |
2 |
11 |
Структура сайтов |
3 |
12 |
Структура книг |
3 |
13 |
Футбольная команда |
2 |
14 |
Квартиры |
2 |
15 |
Структура фирмы |
3 |
