Программирование на языке Пролог для искусственного интеллекта | страница 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).
> % Доход неработающего
Этими процедурами можно воспользоваться, например, в следующих запросах к базе данных: