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

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

Жанры

Неизвестно

Шрифт:

внести( X, Список, БольшийСписок) :-

удалить( X, БольшийСписок, Список).

В принадлежит1 мы изящно реализовали отношение принадлежности через конк. Для проверки на принадлежность можно также использовать и удалить. Идея простая: некоторый Х принадлежит списку Список, если Х можно из него удалить:

принадлежит2( X, Список) :-

удалить( X,

Список, _ ).

3. 2. 5. Подсписок

Рассмотрим теперь отношение подсписок. Это отношение имеет два аргумента - список L и список S, такой, что S содержится в L в качестве подсписка. Так отношение

подсписок( [c, d, e], [a, b, c, d, e, f] )

имеет место, а отношение

подсписок( [c, e], [a, b, c, d, e, f] )

нет. Пролог-программа для отношения подсписок может основываться на той же идее, что и принадлежит1, только на этот раз отношение более общо (см. рис. 3.4).

Рис. 3. 4. Отношения принадлежит и подсписок.

Его можно сформулировать так:

S является подсписком L, если

(1) L можно разбить на два списка L1 и L2 и

(2) L2 можно разбить на два списка S и L3.

Как мы видели раньше, отношение конк можно использовать для разбиения списков. Поэтому вышеприведенную формулировку можно выразить на Прологе так:

подсписок( S, L) :-

конк( L1, L2, L),

конк( S, L3, L2).

Ясно, что процедуру подсписок можно гибко использовать различными способами. Хотя она предназначалась для проверки, является ли какой-либо список подсписком другого, ее можно использовать, например, для нахождения всех подсписков данного списка:

?- подсписок( S, [а, b, с] ).

S = [ ];

S = [a];

S = [а, b];

S = [а, b, с];

S = [b];

. . .

3. 2. 6. Перестановки

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

тому, как это делается в следующем примере:

?- перестановка( [а, b, с], Р).

Р = [а, b, с];

Р = [а, с, b];

Р = [b, а, с];

. . .

Рис. 3. 5. Один из способов построения перестановки списка [X | L].

Программа для отношения перестановка в свою очередь опять может основываться на рассмотрении двух случаев в зависимости от вида первого списка:

(1) Если первый список пуст, то и второй список должен быть пустым.

(2) Если первый список не пуст, тогда он имеет вид [Х | L], и перестановку такого списка можно построить так, как Это показано на рис. 3.5: вначале получить список L1 - перестановку L, а затем внести Х в произвольную позицию L1.

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

перестановка( [ ], [ ]).

перестановка( [X | L ], Р) :-

перестановка( L, L1),

внести( X, L1, Р).

Другой вариант этой программы мог бы предусматривать удаление элемента Х из первого списка, перестановку оставшейся его части - получение списка Р, а затем добавление Х в начало списка Р. Соответствующая программа такова:

перестановка2( [ ], [ ]).

перестановка2( L, [X | Р] ) :-

удалить( X, L, L1),

перестановка2( L1, Р).

Поучительно проделать несколько экспериментов с нашей программой перестановки. Ее нормальное использование могло бы быть примерно таким:

?- перестановка( [красный, голубой, зеленый], Р).

Как и предполагалось, будут построены все шесть перестановок:

Р = [ красный, голубой, зеленый];

Р = [ красный, зеленый, голубой];

Р = [ голубой, красный, зеленый];

Р = [ голубой, зеленый, красный];

Р = [ зеленый, красный, голубой];

Р = [ зеленый, голубой, красный];

(нет)

Приведем другой вариант использования процедуры перестановка:

?- перестановка( L, [а, b, с] ).

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

«О» - значит омут

Графтон Сью
Кинси Милхоун
Детективы:
крутой детектив
5.00
рейтинг книги
«О» - значит омут

Кортни. 1-13

Смит Уилбур
Кортни
Приключения:
исторические приключения
прочие приключения
5.00
рейтинг книги
Кортни. 1-13

Я вас люблю

Муравьева Ирина Лазаревна
Семейная сага
Проза:
современная проза
6.25
рейтинг книги
Я вас люблю

Тор. Разрушитель

Хольбайн Вольфганг
1. Асгардская сага
Фантастика:
фэнтези
7.00
рейтинг книги
Тор. Разрушитель

Неучтенный элемент. Том 3

NikL
3. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 3

Война Ретифа (сборник)

Лаумер Кейт Джон
Классика мировой фантастики
Фантастика:
научная фантастика
юмористическая фантастика
7.33
рейтинг книги
Война Ретифа (сборник)

Сборник рассказов

Андреев Леонид Николаевич
Проза:
классическая проза
русская классическая проза
5.00
рейтинг книги
Сборник рассказов

Цвет сверхдержавы - красный 3 Восхождение. часть 1

Сергей Симонов
3. Цвет сверхдержавы - красный
Фантастика:
альтернативная история
5.00
рейтинг книги
Цвет сверхдержавы - красный 3 Восхождение. часть 1

Имперец. Том 5

Романов Михаил Яковлевич
4. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
6.00
рейтинг книги
Имперец. Том 5

Пальмы в снегу

Габас Лус
Проза:
историческая проза
5.00
рейтинг книги
Пальмы в снегу

Матабар IX

Клеванский Кирилл Сергеевич
9. Матабар
Проза:
магический реализм
5.00
рейтинг книги
Матабар IX

Пушкин

Тынянов Юрий Николаевич
Я люблю Пушкина
Документальная литература:
биографии и мемуары
8.00
рейтинг книги
Пушкин

Последний Паладин. Том 13

Саваровский Роман
13. Путь Паладина
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 13

"Фантастика 2023-201. Компиляция. Книги 1-26

Кароль Елена
Фантастика 2023. Компиляция
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Фантастика 2023-201. Компиляция. Книги 1-26