Программирование на языке Пролог для искусственного интеллекта | страница 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. Абстракция данных

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