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

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

Жанры

Неизвестно

Шрифт:

создспис( Спис) :-

собрать( [запгермания], [ ], Спис ).

собрать( [ ], Закрытый, Закрытый).

% Кандидатов в Закрытый больше нет

собрать( [X | Открытый], Закрытый, Спис) :-

принадлежит( Х | Закрытый), !,

% Х уже собран ?

собрaть(

Открытый, Закрытый, Спис).

% Отказаться от Х

собрать( [X | Открытый], Закрытый, Спис) :-

соседи( X, Соседи),

% Найти соседей Х

конк( Соседи, Открытый, Открытый1),

% Поместить их в Открытый

собрать( Открытый1, [X | Закрытый], Спис).

% Собрать остальные

Отношение конк– как всегда - отношение конкатенации списков.

8. 5. 3. Повышение эффективности конкатенации списков за счет совершенствования структуры данных

До сих пор в наших программах конкатенация была определена так:

конк( [ ], L, L).

конк( [X | L1], L2, [X | L3] ) :-

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

Эта процедура неэффективна, если первый список - длинный. Следующий пример объясняет, почему это так:

?- конк( [а, b, с], [d, e], L).

Этот вопрос порождает следующую последовательность целей:

конк( [а, b, с], [d, e], L)

конк( [b, с], [d, e], L') где L = [a | L']

конк( [с], [d, e], L") где L' = [b | L"]

конк( [ ], [d, e], L'") где L" = [c | L''']

true (истина) где L'" = [d, е]

Ясно, что программа фактически сканирует весь первый список, пока не обнаружит его конец.

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

[а, b, с]

можно представить следующими двумя списками:

L1 = [a, b, c, d, e]

L2 = [d, e]

Подобная пара списков, записанная для краткости как L1-L2, представляет собой "разность" между L1 и L2. Это представление работает

только при том условии, что L2 - "конечный участок" списка L1. Заметим, что один и тот же список может быть представлен несколькими "разностными парами". Поэтому список [а, b, с] можно представить как

[а, b, с]-[ ]

или

[a, b, c, d, e]-[d, e]

или

[a, b, c, d, e | T]-[d, e | T]

или

[а, b, с | Т]-Т

где Т - произвольный список, и т.п. Пустой список представляется любой парой L-L.

Поскольку второй член пары указывает на конец списка, этот конец доступен сразу. Это можно использовать для эффективной реализации конкатенации. Метод показан на рис. 8.1. Соответствующее отношение конкатенации записывается на Прологе в виде факта

конкат( A1-Z1, Z1-Z2, A1-Z2).

Давайте используем конкат для конкатенации двух списков: списка [а, b, с], представленного парой [а, b, с | Т1]-Т1, и списка [d, e], представленного парой [d, e | Т2]-Т2 :

?- конкат( [а, b, с | Т1]-T1, [d, е | Т2]-Т2, L ).

Оказывается, что для выполнения конкатенации достаточно простого сопоставления этой цели с предложением конкат. Результат сопоставления:

T1 = [d, e | Т2]

L = [a, b, c, d, e | T2]-T2

Рис. 8. 1. Конкатенация списков, представленных в виде разностных пар.

L1 представляется как A1-Z1, L2 как A2-Z2 и результат L3– как A1-Z2.

При этом должно выполняться равенство Z1 = А2.

8. 5. 4. Повышение эффективности зa счет добавления вычисленных фактов к базе данных

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

В качестве примера рассмотрим программу вычисления N-го числа Фибоначчи для некоторого заданного N. Последовательность Фибоначчи имеет вид:

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

Франкенштейн: Антология

Шелли Мэри
1. Лучшее
Фантастика:
социально-философская фантастика
научная фантастика
ужасы и мистика
7.43
рейтинг книги
Франкенштейн: Антология

"Зарубежная фантастика 2024-4" Цикл "Люди льда". Компиляция. Книги 1-23

Сандему Маргит
Зарубежная фантастика 2024
Фантастика:
фэнтези
5.00
рейтинг книги
Зарубежная фантастика 2024-4 Цикл Люди льда. Компиляция. Книги 1-23

Точка зрения Всеведущего читателя. Том 1

Sing-Shong
1. Точка зрения Всеведущего читателя
Фантастика:
постапокалипсис
ранобэ
фэнтези
5.00
рейтинг книги
Точка зрения Всеведущего читателя. Том 1

Дюна: Дом Атрейдесов

Андерсон Кевин Джей
1. Прелюдия к Дюне
Фантастика:
научная фантастика
7.00
рейтинг книги
Дюна: Дом Атрейдесов

Дважды одаренный. Том VI

Тарс Элиан
6. Дважды одаренный
Фантастика:
аниме
альтернативная история
фэнтези
фантастика: прочее
5.25
рейтинг книги
Дважды одаренный. Том VI

Дорога ветров

Уильямс Тэд
3. Орден Манускрипта
Фантастика:
фэнтези
7.75
рейтинг книги
Дорога ветров

Хрестоматия по истории СССР. Том 1

Лебедев Владимир Иванович
Научно-образовательная:
история
5.00
рейтинг книги
Хрестоматия по истории СССР. Том 1

Новейший философский словарь. Постмодернизм.

Грицанов Александр Алексеевич
Справочная литература:
словари
6.25
рейтинг книги
Новейший философский словарь. Постмодернизм.

Гарри Поттер и Обитель Бессмертия

akchiskosan
Проект «Поттер-Фанфикшн»
Приключения:
прочие приключения
6.43
рейтинг книги
Гарри Поттер и Обитель Бессмертия

Банковское право

Рождественская Татьяна Эдуардовна
Деловая литература:
банковское дело
5.00
рейтинг книги
Банковское право

Образ врага

Дашкова Полина Викторовна
Детективы:
триллеры
прочие детективы
8.32
рейтинг книги
Образ врага

Годы странствий

Чулков Георгий Иванович
Документальная литература:
биографии и мемуары
6.25
рейтинг книги
Годы странствий

Статьи

Переслегин Сергей Борисович
Документальная литература:
публицистика
5.00
рейтинг книги
Статьи

Второгодка. Книга 2. Око за око

Ромов Дмитрий
2. Второгодка
Фантастика:
героическая фантастика
альтернативная история
фэнтези
5.00
рейтинг книги
Второгодка. Книга 2. Око за око