
- •Введение
- •1. Математика и современная информатика
- •2. Алгоритмы перевода высказываний с естественного языка на язык математики
- •3. Алгоритм, его свойства, типы и способы записи
- •4. Информация. Формы ее представления, виды и свойства
- •5. Информационные процессы
- •Классификация информационных процессов
- •Когнитивные информационные процессы
- •6. Аналоговая информация
- •7. Дискретная информация
- •8. Количество информации, единицы измерения информации
- •9. Высказывательные логические связки
- •Алгебраические и функциональные языки
- •Классификация функциональных языков
- •Определение атд
- •Синтаксически-ориентированное конструирование
- •Примеры описания атд
- •Атд в языке программирования Haskell
- •Общий вид определения атд в языке Haskell
- •Сопоставление с образцом
- •Классификация атд
- •Атд в других языках программирования
- •11. Системы счисления, используемые в вычислительной технике
- •12. Семантические категории. Логические структуры
- •13. Двоичное кодирование информации
- •Двоичное кодирование символьной (текстовой) информации
- •18. Теория информации и кодирования
- •19. Система кодирования
- •20. Импликация - логическая константа
- •25. Правило де Моргана
- •26. Двоичная система счисления. Операции в двоичной системе счисления
- •27. Восьмеричная система счисления. Операции в восьмеричной системе счисления
- •28. Кванторы общности и существования
- •29. Составные формулы
- •30. Порядок выполнения логических операций
- •Порядок выполнения логических операций в сложном логическом выражении:
- •31. Свойства логических операций
- •6. Законы поглощения:
- •7. Другие (1):
- •35. Закон исключения третьего
- •36. Кодирование изображений
- •37. Кодирование звуков
- •38. Классификационное кодирование
- •39. Кодирование текста
- •Способы кодирования информации.
- •Кодирование символьной (текстовой) информации.
- •Кодирование числовой информации.
- •Кодирование графической информации.
- •Кодирование звуковой информации.
Определение атд
Алгебраический тип данных неформально можно определить как множество значений, представляющих собой некоторые контейнеры, внутри которых могут находиться значения каких-либо иных типов (в том числе и значения того же самого типа — в этом случае имеет место рекурсивный АТД). Множество таких контейнеров и составляет сам тип данных, множество его значений.
Алгебраический тип данных — размеченное объединение декартовых произведений множеств или, другими словами, размеченная сумма прямых произведений множеств.
С теоретической точки зрения алгебраическим типом данных является размеченное объединение множеств (иначе называемое «дизъюнктным объединением»)7, под которым понимается видоизменённая классическая операция объединения — такая операция приписывает каждому элементу нового множества метку (или индекс), по которой можно понять, из какого конкретно множества элемент попал в объединение. Соответственно, каждый из элементов размеченного объединения в свою очередь является декартовым произведением некоторых иных множеств.
Пусть есть набор множеств Ai, i ∈ I, из которых создаётся их размеченное объединение. В этом случае под размеченным объединением понимается объединение пар:
|
|
Ai = |
|
{ (x, i) ∣ x ∈ Ai }. |
Здесь (x, i) — упорядоченная пара, в которой элементу x приписан индекс множества, из которого элемент попал в размеченное объединение. В свою очередь каждое из множеств Ai канонически вложено в размеченное объединение, то есть пересечения канонических вложений Ai* всегда пусты, даже в случаях, когда пересечения исходных множеств содержат какие-либо элементы. Другими словами, каноническое вложение имеет вид:
Ai* = { (x, i) ∣ x ∈ Ai }, |
а потому
∀ i, j ∈ I, i ≠ j : Ai* ⋂ Aj* = ∅. |
Итак, АТД — это размеченное объединение, то есть элементы такого типа с математической точки зрения представляют собой пары (x, i), где i — индекс множества (метка типа), откуда взят элемент x. Но чем являются сами элементы x? Теория говорит о том, что эти элементы являются декартовыми произведениями множеств, которые содержатся внутри контейнеров Ai. То есть, каждое множество Ai, из которых собирается размеченное объединение, является декартовым произведением некоторого (возможно, нулевого) числа множеств. Именно эти множества и считаются «вложенными» в контейнер АТД, вложение обеспечивает операция декартова произведения.
Другими словами, каждое множество Ai представляет собой декартово произведение:
Ai = Ai1 × Ai2 × … × Ain, |
где множества Aik, k = 1, n являются произвольными (в том числе нет ограничений на рекурсивную вложенность). Поскольку элементами декартова произведения множеств являются кортежи вида
x = (x1, x2, … xn), |
в целом АТД можно записать как
|
|
Ai = |
|
{ ((x1, x2, … xni), i) }. (1) |
В общем случае декартово произведение вообще может быть представлено пустым кортежем. Тогда считается, что соответствующий контейнер Ai не содержит никаких значений внутри себя, а в размеченное объединение канонически вкладывается единственный элемент этого множества — ((), i). Данная ситуация возможна тогда, когда в АТД включается метка i ради самой себя, то есть в АТД содержится нуль-арное каноническое множество Ai*, имеющее единственный элемент. Обычно это требуется для определения перечислений (эта ситуация и её реализация будут продемонстрированы далее в статье).
Для лучшего понимания того, что представляет собой АТД, можно представить общую формулу произвольного АТД в виде диаграммы. Сообразуясь с формулой 1, произвольный АТД можно изобразить так, как показано на рис. 1.
Рис. 1: Схема произвольного АТД |
В качестве примера АТД в математической нотации можно рассмотреть тип Tree, введённый ранее:
data Tree α = Leaf α
| Node (Tree α) (Tree α)
Данный тип есть размеченное объединение двух множеств Leaf и Node, так что A1 ≡ Leaf, A2 ≡ Node. Множество A1 есть декартово произведение одного произвольного множества a. Значения этого множества «упаковываются» в контейнер A1. Соответственно, множество A2 есть декартово произведение двух одинаковых множеств Tree(a), то есть налицо рекурсивное определение АТД.