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

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

Жанры

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

Братко Иван

Шрифт:

быстрсорт( L, S) :-

 быстрсорт2( L, S-[] ).

быстрсорт( Спис, УпорСпис) :-

 быстрсорт2( Спис, УпорСпис-[] ).

быстрсорт2( [], Z-Z).

быстрсорт2( [X | Хвост], A1-Z2) :-

 разбиение( X, Хвост, Меньш, Больш),

 быстрсорт2( Меньш, А1-[X | A2] ),

 быстрсорт2( Больш, A2-Z2).

Рис. 9.3. Более

эффективная реализация процедуры
быстрсорт
с использованием разностного представления списков. Отношение
разбиение( X, Спис, Меньш, Больш)
определено, как на рис. 9.2.

Упражнения

9.5. Напишите процедуру слияния двух упорядоченных списков в один третий список. Например:

?- слить( [2, 5, 6, 6, 8], [1, 3, 5, 9], L).

L = [1, 2, 3, 5, 5, 6, 6, 8, 9]

9.6. Программы сортировки, показанные на рис. 9.2 и 9.3, отличаются друг от друга способом представления списков. Первая из них использует обычное представление, в то время как вторая — разностное представление. Преобразование из одного представления в другое очевидно и может быть автоматизировано. Введите в программу рис. 9.2 необходимые изменения, чтобы преобразовать ее в программу рис. 9.3.

9.7. Наша программа

быстрсорт
в случае, когда исходный список уже упорядочен или почти упорядочен, работает очень неэффективно. Проанализируйте причины этого явления.

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

быстрсорт
, а именно: разбить список на два меньших списка, отсортировать их, а затем слить вместе. Итак, для того, чтобы отсортировать список L, необходимо

• разбить L на два списка L1 и L2 примерно одинаковой длины;

• произвести сортировку списков L1 и L2,получив списки S1 и S2;

• слить списки S1 и S2, завершив на этом сортировку списка L.

Реализуйте этот принцип сортировки и сравните его эффективность с эффективностью программы

быстрсорт
.

9.2. Представление множеств двоичными деревьями

Списки часто применяют для представления множеств. Такое использование списков имеет тот недостаток, что проверка принадлежности элемента множеству оказывается довольно неэффективной. Обычно предикат

принадлежит( X, L)
для проверки принадлежности X к L программируют так:

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

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

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

Для того, чтобы найти X в списке L, эта процедура последовательно просматривает список элемент за элементом, пока ей не встретится либо элемент X, либо конец списка. Для длинных списков такой способ крайне неэффективен.

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

Двоичное дерево либо пусто, либо состоит из следующих трех частей:

• корень

• левое поддерево

 правое поддерево

Корень может

быть чем угодно, а поддеревья должны сами быть двоичными деревьями. На рис. 9.4 показано представление множества [а, b, с, d] двоичным деревом. Элементы множества хранятся в виде вершин дерева. Пустые поддеревья на рис. 9.4 не показаны. Например, вершина b имеет два поддерева, которые оба пусты.

Существует много способов представления двоичных деревьев на Прологе. Одна из простых возможностей — сделать корень главным функтором соответствующего терма, а поддеревья — его аргументами. Тогда дерево рис. 9.4 примет вид

а( b, с( d) )

Такое представление имеет среди прочих своих недостатков то слабое место, что для каждой вершины дерева нужен свой функтор. Это может привести к неприятностям, если вершины сами являются структурными объектами.

Рис. 9.4. Двоичное дерево.

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

• Пусть атом

nil
представляет пустое дерево.

• В качестве функтора примем

дер
, так что дерево с корнем
X
, левым поддеревом
L
и правым поддеревом
R
будет иметь вид терма
дер( L, X, R)
(см. рис. 9.5).

В этом представлении дерево рис. 9.4 выглядит как

дер( дер( nil, b, nil), a,

 дер( дер( nil, d, nil), с, nil) ).

Теперь рассмотрим отношение принадлежности, которое будем обозначать

внутри
. Цель

внутри( X, T)

истинна, если

X
есть вершина дерева
T
. Отношение
внутри
можно определить при помощи следующих правил:

X есть вершина дерева T, если

• корень дерева T совпадает с X, или

• X — это вершина из левого поддерева, или

• X — это вершина из правого поддерева.

Рис. 9.5. Представление двоичных деревьев.

Эти правила непосредственно транслируются на Пролог следующим образом:

внутри( X, дер( _, X, _) ).

внутри( X, дер( L, _, _) ) :-

 внутри( X, L).

внутри( X, дер( _, _, R) ) :-

 внутри( X, R).

Очевидно, что цель

внутри( X, nil)

терпит неудачу при любом X.

Посмотрим, как ведет себя наша процедура. Рассмотрим рис. 9.4. Цель

внутри( X, T)

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

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

Шесть тайных свиданий мисс Недотроги

Суббота Светлана
Любовные романы:
любовно-фантастические романы
эро литература
7.75
рейтинг книги
Шесть тайных свиданий мисс Недотроги

Я еще не барон

Дрейк Сириус
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще не барон

Седьмая жена короля

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Седьмая жена короля

Не верь мне

Рам Янка
7. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Не верь мне

Газлайтер. Том 12

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

Жандарм

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

Архонт

Прокофьев Роман Юрьевич
5. Стеллар
Фантастика:
боевая фантастика
рпг
7.80
рейтинг книги
Архонт

Волк 7: Лихие 90-е

Киров Никита
7. Волков
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Волк 7: Лихие 90-е

Целитель

Первухин Андрей Евгеньевич
1. Целитель
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Целитель

Кодекс Охотника. Книга XXIV

Винокуров Юрий
24. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXIV

Менталист. Конфронтация

Еслер Андрей
2. Выиграть у времени
Фантастика:
боевая фантастика
6.90
рейтинг книги
Менталист. Конфронтация

Восход. Солнцев. Книга IX

Скабер Артемий
9. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга IX

Сломанная кукла

Рам Янка
5. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Сломанная кукла

Свет во мраке

Михайлов Дем Алексеевич
8. Изгой
Фантастика:
фэнтези
7.30
рейтинг книги
Свет во мраке