9.1. Представление списков. Сортировка
9.1. Представление списков. Сортировка
9.1.1. Замечания в некоторых альтернативных способах представления списков
В главе 3 была введена специальная система обозначений для списков (специальная прологовская нотация), которую мы и использовали в последующем изложении. Разумеется, это был всего лишь один из способов представления списков на Прологе. Список — это, в самом общем смысле, структура, которая либо
• пуста, либо
• состоит из головы и хвоста, причем хвост должен быть сам списком.
Поэтому для представления этой структуры нам необходимо иметь всего лишь два языковых средства: специальный символ, обозначающий пустой список, и функтор для соединения головы с хвостом. Мы могли бы, например, выбрать
ничего_не_делать
в качестве символа, обозначающего пустой список, и атом
затем
в качестве инфиксного оператора для построения списка по заданным голове и хвосту. Этот оператор мы можем объявить в программе, например, так:
:- op( 500, xfy, затем).
Список
[ войти, сесть, поужинать]
можно было бы тогда записать как
войти затем сесть затем поужинать
затем ничего_не_делать
Важно заметить, что на соответствующем уровне абстракции специальная прологовская нотация и всевозможные альтернативные способы обозначения списков сводятся, фактически, к одному и тому же представлению. В связи с этим типовые операции над списками, такие как
принадлежит ( X, L)
конк( L1, L2, L3)
удалить( X, L1, L2)
запрограммированные нами в специальной прологовской нотации, легко поддаются перепрограммированию в различные системы обозначений, выбранные пользователем. Например, отношение конк транслируется на язык "затем — ничего_не_делать" следующим образом. Определение, которое мы использовали до сих пор, имеет вид
конк( [], L, L).
конк( [X | L1], L2, [X | L3] ) :-
конк( L1, L2, L3).
В новой системе обозначений оно превращается в
конк( ничего_не_делать, L, L).
конк( X затем L1, L2, X затем L3) :-
конк(L1, L2, L3).
Этот пример показывает, как легко наши определения отношений над списками обобщаются на весь класс структур этого типа. Решение о том, какой именно способ записи списков будет использоваться в той или иной программе, следует принимать в соответствии с тем смыслом, который мы придаем списку в каждом конкретном случае. Если, например, список — это просто множество элементов, то наиболее удобна обычная прологовская нотация, поскольку в ней непосредственно выражается то, что программист имел в виду. С другой стороны, некоторые типы выражений также можно трактовать как своего рода списки. Например, для конъюнктов в исчислении высказываний подошло бы следующее спископодобное представление:
• истина соответствует пустому списку,
• & — оператор для соединения головы с хвостом, определяемый, например, как
:- op( 300, xfy, &)
Конъюнкция членов а, b, и с выглядела бы тогда как
а & b & с & истина
Все приведенные примеры базируются, по существу, на одной и той же структуре, представляющей список. Однако в гл. 8 мы рассмотрели существенно другой способ, влияющий на эффективность вычислений. Уловка состояла в том, что список представлялся в виде пары списков, являясь их "разностью". Было показано, что такое представление приводит к очень эффективной реализации отношения конкатенации.
Материал настоящего раздела проливает свет и на то различие, которое существует между применением операторов в математике и применением их в Прологе. В математике с каждым оператором всегда связано некоторое действие, в то время как в Прологе операторы используются просто для представления структур.
Упражнения
9.1. Определите отношение
список( Объект)
для распознавания случаев, когда Объект является стандартным прологовским списком.
9.2. Определите отношение принадлежности к списку, используя систему обозначений, введенную в этой разделе: "затем — ничего_не_делать".
9.3. Определите отношение
преобр( СтандСпис, Спис)
для преобразования списков из стандартного представления в систему "затем — ничего_не_делать". Например:
преобр( [а, b], а затем b затем ничего_не_делать)
ответ
9.4. Обобщите отношение преобр на случай произвольного альтернативного представления списков. Конкретное представление задается символом, обозначающим пустой список, и функтором для соединения головы с хвостом. В отношении преобр придется добавить два новых аргумента:
преобр( СтандСпис, Спис, Функтор, ПустСпис)
Примеры применения этого отношения:
?- пpeoбp( [а, b], L, затем, ничего_не_делать).
L = а затем b затем ничего_не_делать
?- преобр( [а, b, с], L, +, 0).
L = а+(b+(с+0) )
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Параметры списков
Параметры списков Списки среди блочных элементов стоят особняком. В основном, из-за того, что, во-первых, содержат в себе другие блочные элементы (отдельные пункты), а во-вторых, включают маркеры и нумерацию, которые расставляет сам Web-обозреватель. Вот о маркерах и
Параметры списков
Параметры списков Списки среди блочных элементов стоят особняком. В основном, из-за того, что, во-первых, содержат в себе другие блочные элементы (отдельные пункты), а во-вторых, включают маркеры и нумерацию, которые расставляет сам Web-обозреватель. Вот о маркерах и
Содержимое списков
Содержимое списков Для формирования содержимого некоторых списков стандартных диалогов Windows используется ряд стандартных параметров (о ветвях, используемых для формирования списков стандартных диалогов, будет рассказано чуть позже). Эти параметры создаются в дочерних
1.13. Оформление списков
1.13. Оформление списков При оформлении маркированного списка наиболее предпочтительно использовать символ. Знак маркировки должен находиться в начале абзаца. Расстояние от левого края печати до текста в списке должно составлять 0,63 см (что соответствует стандартным
7.5. Обработка списков
7.5. Обработка списков В этом разделе мы рассмотрим некоторые основные предикаты, полезные при работе со списками. Поскольку Пролог позволяет работать с произвольными структурами данных, списки не могут играть в нем той незаменимой роли, какая им отводится в других языках
3. Представление графа списком списков. Алгоритм обхода графа в ширину
3. Представление графа списком списков. Алгоритм обхода графа в ширину Граф можно определить с помощью списка списков следующим образом: Type List = ^Tlist; Tlist = record inf : Byte; next : List; end; Graph = ^TGpaph; TGpaph = record inf : Byte; smeg : List; next : Graph; end; При обходе графа в ширину мы выбираем произвольную
4.5. Создание списков
4.5. Создание списков Очень часто бывает необходимо выделить какие-нибудь части текста визуально (например, при перечислении). Простое выделение абзаца не дает должного эффекта. В этом случае есть смысл воспользоваться маркерами или нумерацией. Маркеры объединяют пункты,
Сортировка слиянием для связных списков
Сортировка слиянием для связных списков Последним алгоритмом, который мы рассмотрим в этой главе, снова будет сортировка слиянием, но в этот раз применительно к связным спискам. Как вы, наверное, помните, несмотря на высокие показатели быстродействия (алгоритм класса O(n
Пример 24-3. Комбинирование "ИЛИ-списков" и "И-списков"
Пример 24-3. Комбинирование "ИЛИ-списков" и "И-списков" #!/bin/bash# delete.sh, утилита удаления файлов.# Порядок использования: delete имя_файлаE_BADARGS=65if [ -z "$1" ]then echo "Порядок использования: `basename $0` имя_файла" exit $E_BADARGS # Если не задано имя файла.else file=$1 # Запомнить имя файла.fi[ ! -f "$file" ]
3.1. Представление списков
3.1. Представление списков Список — это простая структура данных, широко используемая в нечисловом программировании. Список — это последовательность, составленная из произвольного числа элементов, например энн, теннис, том, лыжи. На Прологе это записывается так:[ энн,
6.2.2. Вывод списков
6.2.2. Вывод списков Кроме стандартного прологовского формата для списков существуют несколько других естественных форм их внешнего представления, которые в некоторых ситуациях являются более предпочтительными. Следующая процедуравывспис( L)выводит список L так, что
9.1.2. Сортировка списков
9.1.2. Сортировка списков Сортировка применяется очень часто. Список можно отсортировать (упорядочить), если между его элементами определено отношение порядка. Для удобства изложения мы будем использовать отношение порядкабольше( X, Y)означающее, что X больше, чем Y,
1.13. Оформление списков
1.13. Оформление списков При оформлении маркированного списка наиболее предпочтительно использовать символ «». Знак маркировки должен находиться в начале абзаца. Расстояние от левого края печати до текста в списке должно составлять 0,63 см (что соответствует стандартным
5.11. Оформление списков
5.11. Оформление списков Word позволяет создавать нумерованные и маркированные списки. Нумерация в списках проставляется автоматически и меняется в зависимости от перемещения, добавления или удаления элементов списка.Для форматирования текста в виде списков с различными
13.6.5. Создание списков
13.6.5. Создание списков В документах очень часто используются списки — перечень материалов, действий и т. д. Списки бывают нумерованными и маркированными. Понятно, что в первом случае каждый элемент списка нумеруется, а во втором — обозначается выбранным вами
Сортировка списков данных
Сортировка списков данных Нередко возникает необходимость отсортировать данные в списке, то есть упорядочить записи по значению определенного поля. В Excel 2007 для сортировки данных имеются команды на двух вкладках ленты:? в группе Редактирование вкладки Главная есть