часто, на пути к представлению, будут добавлены и другие.
• Сами функции также определяются неявно. Вместо явных определений используются аксиомы,
задающие свойства этих функций. Здесь тоже ничего не утверждается о полноте: когда вы, в
конце концов, дойдете до реализации этих функций, они приобретут дополнительные свойства.
Эта неявность является ключевым аспектом абстрактных типов данных и, как следствие, - их
будущих аналогов в построении ОО-ПО - классов. Когда мы определяем абстрактный тип данных
или класс, мы всегда сообщаем кое-что об этом типе или классе, просто перечисляя те их свойства,
которые знаем, и берем их в качестве определения. При этом никогда не предполагается, что других
применимых свойств нет.
Неявность также предполагает открытость определений: всегда можно добавить новые свойства
АТД или класса. Основным механизмом для выполнения таких расширений без разрушения уже
существующего первоначального определения является наследование.
Частичные функции
Спецификация всякого реалистичного примера, даже такого простого как стеки, необходимо стал-
кивается с проблемами не всюду определенных операций: некоторые операции применимы не ко
всем возможным элементам исходных множеств. Например, это имеет место для функций remove
и item: нельзя удалить элемент из пустого стека, и у пустого стека нет верхнего элемента.
Решение этой проблемы, использованное в приведенной выше спецификации, состоит в том, чтобы
определить эти функции как частичные. Функция из исходного множества X в результирующее
множество Y является частичной, если она определена не для всех элементов X. Функция, не
являющаяся частичной, называется полной.