Альтернативы частичным функциям
Альтернативы частичным функциям
Один из технических приемов, используемый в этой лекции, мог вызвать удивление, - применение частичных функций. Он связан с неустранимой проблемой применения в некоторой спецификации не всюду определенных операций. Но являются ли частичные функции лучшим решением этой проблемы?
Конечно, это не единственно возможное решение. Другим способом, который приходит на ум и действительно используется в некоторых работах по АТД, является превращение частичной функции во всюду определенную за счет введения специального значения "ошибка" для случаев применения функции к неподходящим аргументам.
Каждый тип T дополняется значением "ошибка". Обозначим его через wT . Тогда для всякой функции f сигнатура
f: ... Типы входов ... T
определяет, что всякое применение f к объекту, для которого соответствующее вычисление не может быть выполнено, выдаст значение wT.
Хотя этот метод и используется, он приводит к математическим и практическим неудобствам. Проблема в том, что такие специальные значения являются весьма эксцентричными существами, которые могут чрезвычайно осложнить жизнь невинных математических существ.
Предположим, например, что рассматриваются стеки целых чисел - экземпляры типа STACK [INTEGER], где INTEGER - это АТД, экземпляры которого - целые числа. Хотя для нашего примера не требуется полностью выписывать спецификацию INTEGER, этот АТД должен моделировать основные операции (сложение, вычитание, "меньше чем" и т. п.), определенные на математическом множестве целых чисел. Аксиомы этого АТД должны выражать обычные свойства целых чисел. Вот одно из таких типичных свойств: для всякого целого n:
[Z1]
n + 1 n
Пусть теперь n будет результатом запроса верхнего элемента пустого стека, т. е. значением выражения item (new), где new - это пустой стек целых чисел. При этом запросе n должно получить специальное значение wINTEGER . Что же тогда должно быть значением выражения n+1? Если у нас в распоряжении имеются в качестве значений только обычные целые числа и wINTEGER , то в качестве ответа мы вынуждены выбрать wINTEGER:
wINTEGER + 1 = wINTEGER.
Это единственный допустимый выбор. Если присвоить wINTEGER+1 любое другое значение, "нормальное" число q, то это означает, что после попытки доступа к вершине пустого стека и получения в качестве результата ошибочного значения мы можем волшебным образом устранить всякую память об этой ошибке, просто прибавив к результату единицу!
Но, при выборе wINTEGER в качестве значения n + 1 при n равном wINTEGER, нарушается указанное выше свойство Z1. В общем случае, выражение wINTEGER+p будет равно wINTEGER для любого p. Это означает, что для измененного типа данных (INTEGER, дополненные ошибочным элементом) требуется новая система аксиом, объясняющая, что всякая операция над целыми числами возвращает значение wINTEGER, если хоть один из ее аргументов равен wINTEGER. Аналогичные изменения потребуются для каждого типа.
Получившееся усложнение не кажется обоснованным. Мы не можем изменять спецификацию целых чисел только для того, чтобы промоделировать каждую отдельную структуру данных (в нашем случае - стеки). При использовании частичных функций ситуация более простая. Конечно, для всякого выражения, содержащего частичные функции, приходится проверять, что их аргументы удовлетворяют соответствующим предусловиям. После завершения такой проверки, можно беспрепятственно применять аксиомы. При этом не требуется изменять существующие системы аксиом.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
13.4. Альтернативы read() и write()
13.4. Альтернативы read() и write() Несмотря на то что системные вызовы read() и write() как нельзя лучше подходят приложениям для извлечения и хранения данных в файле, все же они не всегда являются самыми быстрыми методами. Они допускают управление отдельными порциями данных; для
Альтернативы DNS
Альтернативы DNS Можно получить информацию об имени и адресе без использования DNS. Типичной альтернативой служат статические файлы со списком узлов (обычно файл /etc/hosts, как мы указываем в табл. 11.2), информационная система сети (Network Information System, NIS) и упрощенный протокол службы
30.2. Альтернативы для клиента TCP
30.2. Альтернативы для клиента TCP Мы уже обсуждали различные способы устройства клиентов, но стоит тем не менее еще раз обратить внимание на относительные достоинства и недостатки этих способов.1. В листинге 5.4 показан основной способ устройства клиента TCP. С этой
Альтернативы ICQ
Альтернативы ICQ Популярность интернет-пейджеров привела к возникновению целого ряда других клиентских программ. Официальный клиент ICQ от Mirabilis претерпел за время своего существования значительные изменения. Этот программный продукт уверенно двигался, если можно так
Всплывающее меню или доступ ко всем функциям Skype
Всплывающее меню или доступ ко всем функциям Skype Мы уже познакомились с основными возможностями Skype — это голосовое общение и чат. Однако в программе имеются и другие полезные функции, доступ к которым организован через всплывающее меню, которое можно вызвать из любого
Повышение цен – альтернативы
Повышение цен – альтернативы Никаких альтернатив! И вот почему. Мало кто из интернет-бизнесменов Рунета верит в действенность высоких цен. Большинство владельцев очень боятся встать на путь их повышения и никогда этого не делали.На самом деле покупатели
Группировка по встроенным функциям и UDF
Группировка по встроенным функциям и UDF Разрешена группировка и использование встроенных функций и UDF.Пример:select sum(vent) from sales group by extract(year from sale
Конечные автоматы и альтернативы
Конечные автоматы и альтернативы Я упомянул, что регулярные выражения могут анализироваться с использованием конечного автомата. В большинстве книг по компиляторам а также в большинстве компиляторов, вы обнаружите, что это применяется буквально. Обычно они имеют
R.11.6 Доступ к виртуальным функциям
R.11.6 Доступ к виртуальным функциям Правила доступа (§R.11) к виртуальной функции определяются ее описанием и на них не влияют правила доступа к к функции, которая позднее будет подавлять ее. Приведем пример:class B {public: virtual f();};class D: public B {private: f();};void f(){ D d; B* pb = &d; D* pd =
Правило 23: Предпочитайте функциям-членам функции, не являющиеся ни членами, ни друзьями класса
Правило 23: Предпочитайте функциям-членам функции, не являющиеся ни членами, ни друзьями класса Возьмем класс для представления Web-браузера. В числе прочих такой класс может предлагать функции, который очищают кэш загруженных элементов, очищают историю посещенных URL и
Правило 35: Рассмотрите альтернативы виртуальным функциям
Правило 35: Рассмотрите альтернативы виртуальным функциям Предположим, что вы работаете над видеоигрой и проектируете иерархию игровых персонажей. В вашей игре будут использоваться разные варианты сражений, персонажи могут подвергаться ранениям или иначе терять
Совет 16. Научитесь передавать данные vector и string функциям унаследованного интерфейса
Совет 16. Научитесь передавать данные vector и string функциям унаследованного интерфейса С момента стандартизации С++ в 1998 году элита С++ настойчиво подталкивает программистов к переходу с массивов на vector. Столь же открыто пропагандируется переход от указателей char* к объектам
ПЕРЕДАЧА ИНФОРМАЦИИ О СТРУКТУРАХ ФУНКЦИЯМ
ПЕРЕДАЧА ИНФОРМАЦИИ О СТРУКТУРАХ ФУНКЦИЯМ Вспомним, что аргументы функции передают значения в функцию. Каждое значение является либо числом типа int или float, либо ASCII-кодом или адресом. Структура гораздо сложнее, чем отдельная переменная, поэтому неудивительно, что саму
Народные альтернативы
Народные альтернативы Автор: Киви БердСексуальные преступники-педофилы наряду с международным терроризмом уже давно выступают в качестве главного жупела, которым власти пугают обывателей и оправдывают всякое новое ограничение прав и свобод в Интернете. Но хотя
Альтернативы депонированию криптоключей
Альтернативы депонированию криптоключей Поддержка депонирования криптоключей — это не единственный способ предоставления государству доступа к информации. Другой подход — это использование слабой криптографии. При этом ключи должны быть достаточно короткими, для
6.4. Альтернативы Internet Explorer
6.4. Альтернативы Internet Explorer Internet Explorer — самый популярный браузер на сегодняшний день, его использует подавляющее большинство пользователей, однако кроме Microsoft есть другие компании, которые занимаются выпуском программ-браузеров. Рассмотрим лишь наиболее известные: Opera,