Чтение онлайн

на главную - закладки

Жанры

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

Братко Иван

Шрифт:

Год < 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. Абстракция данных

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

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

поскольку они позволяют выбирать конкретные компоненты. Имя такого отношения-селектора будет совпадать с именем компоненты, которую нужно выбрать. Отношение будет иметь два аргумента: первый — объект, который содержит компоненту, и второй — саму компоненту:

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

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

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

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

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

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

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

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

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

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

...

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

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

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

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

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

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

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

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

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

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

Человек1
и
Человек2
, и семью. Следующий список целей приводит к желаемому результату:

имя( Человек1, том), фамилия( Человек1, фокс),

% Человек1 - Том Фокс

 имя( Человек2, джим), фамилия( Человек1, фокс),

% Человек2 - Джим Фокс

 муж( Семья, Человек1),

 второйребенок( Семья, Человек2)

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

Поделиться:
Популярные книги

Лорд Системы 12

Токсик Саша
12. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 12

Младший научный сотрудник 2

Тамбовский Сергей
2. МНС
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Младший научный сотрудник 2

#Бояръ-Аниме. Газлайтер. Том 11

Володин Григорий Григорьевич
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11

Цеховик. Книга 2. Движение к цели

Ромов Дмитрий
2. Цеховик
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Цеховик. Книга 2. Движение к цели

Неестественный отбор.Трилогия

Грант Эдгар
Неестественный отбор
Детективы:
триллеры
6.40
рейтинг книги
Неестественный отбор.Трилогия

Попаданка в семье драконов

Свадьбина Любовь
Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.37
рейтинг книги
Попаданка в семье драконов

Звезда сомнительного счастья

Шах Ольга
Фантастика:
фэнтези
6.00
рейтинг книги
Звезда сомнительного счастья

Беглец

Кораблев Родион
15. Другая сторона
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Беглец

Я – Орк

Лисицин Евгений
1. Я — Орк
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я – Орк

Смерть может танцевать 2

Вальтер Макс
2. Безликий
Фантастика:
героическая фантастика
альтернативная история
6.14
рейтинг книги
Смерть может танцевать 2

Идеальный мир для Лекаря 18

Сапфир Олег
18. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 18

Жандарм

Семин Никита
1. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
4.11
рейтинг книги
Жандарм

Путь Шедара

Кораблев Родион
4. Другая сторона
Фантастика:
боевая фантастика
6.83
рейтинг книги
Путь Шедара

Гром над Империей. Часть 1

Машуков Тимур
5. Гром над миром
Фантастика:
фэнтези
5.20
рейтинг книги
Гром над Империей. Часть 1