Программирование на языке Пролог для искусственного интеллекта | страница 65



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

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

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

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

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

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

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

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

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


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

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


>...

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

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

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

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

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

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

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

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

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

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