Программирование на языке Пролог для искусственного интеллекта | страница 64
• Найти имена всех людей из базы данных:
>?- существует( членсемьи( Имя,Фамилия, _, _ )).
• Найти всех детей, родившихся в 1981 году:
>?- ребенок( X), датарождения( X, дата( _, _, 1981) ).
• Найти всех работающих жен:
>?- жена( членсемьи( Имя, Фамилия, _, работает( _, _ ))).
• Найти имена и фамилии людей, которые не работают и родились до 1963 года:
>?- существует членсемьи( Имя, Фамилия, дата( _, _, Год), неработает) ),
> Год < 1963.
• Найти людей, родившихся до 1950 года, чей доход меньше, чем 8000:
>?- существует( Членсемьи),
> датарождения( Членсемьи, дата( _, _, Год) ),
> Год < 1950,
> доход( Членсемьи, Доход),
> Доход < 8000.
• Найти фамилии людей, имеющих по крайней мере трех детей:
>?- семья( членсемьи( _, Фамилия, _, _ ), _, [ _, _, _ | _ ]).
Для подсчета общего дохода семья полезно определить сумму доходов людей из некоторого списка в виде двухаргументного отношения:
>общий( Список_Людей, Сумма_их_доходов)
Это отношение можно запрограммировать так:
>общий( [], 0). % Пустой список людей
>общий( [ Человек | Список], Сумма) :-
> доход( Человек, S),
> % S - доход первого человека
> общий( Список, Остальные),
> % Остальные - сумма доходов остальных
> Сумма is S + Остальные.
Теперь общие доходы всех семей могут быть найдены с помощью вопроса:
>?- семья( Муж, Жена, Дети),
> общий( [Муж, Жена | Дети], Доход).
Пусть отношение длина подсчитывает количество элементов списка, как это было определено в разд. 3.4. Тогда мы можем найти все семьи, которые имеют доход на члена семьи, меньший, чем 2000, при помощи вопроса:
>?- семья( Муж, Жена, Дети),
> общий( [ Муж, Жена | Дети], Доход),
> длина( [ Муж, Жена | Дети], N),
> Доход/N < 2000.
4.1. Напишите вопросы для поиска в базе данных о семьях.
(а) семей без детей;
(b) всех работающих детей;
(с) семей, где жена работает, а муж нет,
(d) всех детей, разница в возрасте родителей которых составляет не менее 15 лет.
4.2. Определите отношение
>близнецы( Ребенок1, Ребенок2)
для поиска всех близнецов в базе данных о семьях.
4.2. Абстракция данных
Абстракцию данных можно рассматривать как процесс организации различных фрагментов информации в единые логические единицы (возможно, иерархически), придавая ей при этом некоторую концептуально осмысленную форму. Каждая информационная единица должна быть легко доступна в программе. В идеальном случае все детали реализации такой структуры должны быть невидимы пользователю этой структуры. Самое главное в этом процессе - дать программисту возможность использовать информацию, не думая о деталях ее действительного представления.