9.1.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 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Автоматизация некоторых действий с помощью Мастеров
Автоматизация некоторых действий с помощью Мастеров Как мы уже могли убедиться, процесс создания веб-страниц в программе CatsHtml довольно прост: нужно лишь грамотно пользоваться соответствующими инструментами, и при необходимости вручную вносить требуемые корректировки
Ввод альтернативных вариантов заголовка и описания сайта
Ввод альтернативных вариантов заголовка и описания сайта Для продолжения ввода данных нажмите кнопку
О некоторых опциях команды zpool
О некоторых опциях команды zpool Команда zpool поддерживает ещё множество субкоманд, предназначенных для экспорта и импорта пула, добавления к нему устройств и изъятия оных, и так далее. Но сейчас я расскажу о некоторых опциях, которые могут оказаться необходимыми при
Поддержка альтернативных сетевых протоколов
Поддержка альтернативных сетевых протоколов Несмотря на то что семейство протоколов TCP/IP, обеспечивающее работу глобальной сети Internet, пользуется широкой популярностью, в системе Linux также реализованы другие стеки протоколов. Опции, включающие поддержку различных
§ 121. Об употреблении некоторых топонимов
§ 121. Об употреблении некоторых топонимов 20 ноября 2005По-русски правильно писать Таллин (а не Таллинн), Алма-Ата (а не Алматы), Белоруссия (Беларусь — это трактор), поехать на Украину (а не в Украину), независимо от того, что думают по этому поводу жители указанных
Использование некоторых ключей реестра
Использование некоторых ключей реестра Добавление элементов в контекстное меню "Создать"1. Создать новый документ, поместить его в папку Windows/ShellNew2. В редакторе реестра найти расширение этого файла, добавить новый подключ, добавить туда строку: FileName в качестве значения
ПРИЛОЖЕНИЕ Г Решения некоторых упражнений
ПРИЛОЖЕНИЕ Г Решения некоторых упражнений Глава 1 1. В обоих процессах нужно лишь указать флаг O_APPEND при вызове функции open или режим дополнения файла при вызове fopen. Ядро гарантирует, что данные будут дописываться в конец файла. Это самая простая форма синхронизации
О некоторых настройках Excel
О некоторых настройках Excel В процессе работы мы неоднократно обращались к диалоговому окну Параметры Excel. Напомним, что данное диалоговое окно вызывают кнопкой Параметры Excel в меню Кнопки «Office».Диалоговое окно Параметры Excel содержит несколько категорий, которые выбирают
Пример 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" ]
Блокировка некоторых возможностей
Блокировка некоторых возможностей Рассмотрим в данном разделе некоторые параметры реестра, с помощью которых можно заблокировать те или иные поля окна, вызываемого командой Сервис ? Параметры.• Вкладка Уведомления, флажок Запрашивать уведомления о прочтении для всех
О некоторых опциях команды zpool
О некоторых опциях команды zpool Команда zpool поддерживает ещё множество субкоманд, предназначенных для экспорта и импорта пула, добавления к нему устройств и изъятия оных, и так далее. Но сейчас я расскажу о некоторых опциях, которые могут оказаться необходимыми при
Подключение некоторых кабелей
Подключение некоторых кабелей Снимите крышку корпуса, открутив крепежные винты.Перед тем как закреплять материнскую плату внутри корпуса, подсоедините к ней провода, которые идут от индикаторов на передней панели, от кнопок Reset и Power, а также от динамика (многие
6 альтернативных бесплатных аудиоплееров для Mac OS X Олег Нечай
6 альтернативных бесплатных аудиоплееров для Mac OS X Олег Нечай Опубликовано 26 марта 2014 В операционной системе OS X есть встроенный медиаплеер iTunes, который одновременно служит и библиотекой, и веб-радиоприёмником, и приложением для доступа в
Глава 4 Самостоятельная диагностика некоторых неисправностей
Глава 4 Самостоятельная диагностика некоторых неисправностей Довольно часто неопытных пользователей «разводят» на новые комплектующие, например заявляют, что «винт посыпался», хотя на самом деле можно было пометить все «битые» секторы (если они вообще есть) и дальше
7 альтернативных браузеров для iPad Олег Нечай
7 альтернативных браузеров для iPad Олег Нечай Опубликовано 15 мая 2014 Строго говоря, для iOS существует только один полноценный браузер — Safari. Все альтернативы — это фактически графические надстройки и наборы Java-скриптов для движка с открытым