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



> членсемьи( джим, фокс, дата( 5, май, 1973), неработает) ] ).

Рис. 4.1. Структурированная информация о семье.

Тогда база данных будет состоять из последовательности фактов, подобных этому, и описывать все семьи, представляющие интерес для нашей программы.

В действительности Пролог очень удобен для извлечения необходимой информации из такой базы данных. Здесь хорошо то, что можно ссылаться на объекты, не указывая в деталях всех их компонент. Можно задавать только структуру интересующих нас объектов и оставлять конкретные компоненты без точного описания или лишь с частичным описанием. На рис. 4.2 приведено несколько примеров. Так, а запросах к базе данных можно ссылаться на всех Армстронгов с помощью терма

>семья( членсемьи( _, армстронг, _, _ ), _, _ )

Символы подчеркивания обозначают различные анонимные переменные, значения которых нас не заботят. Далее можно сослаться на все семьи с тремя детьми при помощи терма:

>семья( _, _, [ _, _, _ ])

Чтобы найти всех замужних женщин, имеющих по крайней мере троих детей, можно задать вопрос:

 >?-  семья( _, членсемьи( Имя, Фамилия, _, _ ), [ _, _, _ | _ ]).

Главным моментом в этих примерах является то, что указывать интересующие нас объекты можно не только по их содержимому, но и по их структуре. Мы задаем одну структуру и оставляем ее аргументы в виде слотов (пропусков).

Рис. 4.2. Описания объектов по их структурным свойствам: (а) любая семья Армстронгов; (b) любая семья, имеющая ровно трех детей; (с) любая семья, имеющая по крайней мере три ребенка. Структура (с) дает возможность получить имя и фамилию жены конкретизацией переменных >Имя и >Фамилия.

Можно создать набор процедур, который служил бы утилитой, делающей взаимодействие с нашей базой данных более удобным. Такие процедуры являлись бы частью пользовательского интерфейса. Вот некоторые полезные процедуры для нашей базы данных:

>муж( X) :-     % X - муж

> семья( X, _, _ ).


>жена( X) :-    % X - жена

> семья( _, X, _ ).


>ребенок( X) :- % X - ребенок

> семья( _, _, Дети),

> принадлежит( X, Дети).


>принадлежит( X, [X | L ]).

>принадлежит( X, [Y | L ]) :-

> принадлежит( X, L).


>существует( Членсемьи) :-

> % Любой член семьи в базе данных

> муж( Членсемьи);

> жена( Членсемьи);

> ребенок( Членсемьи).


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


>доход( Членсемьи( _, _, _, работает( _, S) ), S).

> % Доход работающего

>доход( Членсемьи( _, _, _, неработает), 0).

> % Доход неработающего

Этими процедурами можно воспользоваться, например, в следующих запросах к базе данных: