Кодирование Чёрча
Кодирование Чёрча ― способ представления данных, не являющихся функциями и переменными, в лямбда-исчислении, к примеру, натуральных чисел и других констант. Метод назван в честь Алонзо Чёрча, разработавшего лямбда-исчисление.
Термы, которые в других формальных системах обычно являются примитивами, такие как целые числа, булевы значения, пары и списки, с помощью кодирования Чёрча представляются в лямбда-исчислении как функции высшего порядка. В одной из своих формулировок тезис Чёрча — Тьюринга утверждает, что в кодировке Чёрча может быть представлен любой вычислимый оператор (и его операнды). В чистом (бестиповом) лямбда-исчислении единственным примитивным типом данных являются функции, а все остальные сущности конструируются при помощи кодирования Чёрча.
Кодирование Чёрча, как правило, не используется для практической реализации примитивных типов данных, а только для демонстрации того, что любые вычисления могут быть сведены исключительно к функциям и переменным в бестиповом лямбда-исчислении, а другие примитивные типы данных не обязательны.
Числа Чёрча
Представления натуральных чисел в кодировке Чёрча называются числами Чёрча. Число Чёрча, соответствующее натуральному числу n, определяется как функция от двух параметров и , применяющая к n раз — другими словами, число Чёрча отображает функцию в её n-кратную композицию:
значит «не применять функцию к вообще», значит «применять функцию 1 раз» и т. д.:
| Число | Определение нумерала | Лямбда-выражение |
|---|---|---|
| 0 | ||
| 1 | ||
| 2 | ||
| 3 | ||
| ⋮ | ⋮ | ⋮ |
Вычисления над числами Чёрча
Арифметические операции над числами можно представить в лямбда-исчислении, как функции над числами Чёрча.
Булеаны Чёрча
Представление булевых значений (Шаблон:Lang-en), то есть «истина» (Шаблон:Lang-en) и «ложь» (Шаблон:Lang-en) в кодировке Чёрча называется булеанами Чёрча. Некоторые языки программирования, такие как Smalltalk и Pico, используют их в качестве модели реализации для булевой арифметики.
Булева логика может рассматриваться как выбор из двух вариантов. Кодировки Чёрча булевых значений являются функциями от двух аргументов:
- true из двух аргументов выбирает первый ― .
- false из двух аргументов выбирает второй ― .
Это определение позволяет использовать предикаты (функции, возвращающие логические значения) как условия в условных выражениях:
вычисляется как ветвь-то, если х-предикат выдаёт истинное значение, и как ветвь-иначе, если х-предикат выдаёт ложное.
Над true и false могут быть реализованы стандартные логические операторы (AND, OR, NOT, XOR, if).
Несколько примеров:
Предикаты
Предикатами называются функции, возвращающие логическое значение.
Одним из базовых предикатов является , который возвращает , если его аргумент является числом Чёрча , и , если его аргумент является любым другим:
Предикат проверяет, меньше или равен его первый аргумент второму:
- ,
Из тождества получается предикат проверки на равeнство :
Пары Чёрча
Представление в кодировке Чёрча пар, то есть наборов из двух элементов, называется парами Чёрча. Пара представляется как функция, которая применяет свой единственный аргумент к обоим элементам пары и , получая в результате .
Определение в лямбда-исчислении функции , возвращающей пару из двух элементов, и функций и , возвращающих соответственно первый и второй элемент пары:
Пример:
Списки Чёрча
(Неизменяемый) список состоит из нескольких элементов. Ниже приводятся основные операции, которые должны быть реализованы для списка:
| Функция | Описание |
|---|---|
| nil | Возвращает пустой список. |
| isnil | Проверяет, является ли список пустым. |
| cons | Вставляет переданное значение в начало (возможно пустого) списка. |
| head | Возвращает первый элемент списка. |
| tail | Возвращает весь список, кроме первого элемента. |
С их помощью, например, можно реализовать функцию вычисления длины списка :
Ниже даются четыре различных представления списков:
- Через создание каждого элемента списка из двух пар.
- Через создание каждого элемента списка из одной пары.
- Представление списка через функцию свёртки справа.
- Представление списка с использованием кодирования Скотта.
Представление в виде двух пар
Непустой список может быть реализован парой Чёрча;
- Первый элемент содержит первый элемент списка.
- Второй содержит оставшиеся элементы («хвост» списка).
Однако, таким способом не получится выразить пустой список. Для этого мы можем обернуть пару в другую пару:
- Первый элемент — является ли список пустым.
- Второй элемент ― пара из первого элемента списка и хвоста списка.
Используя эту идею, базовые операции со списками можно выразить следующим образом:[1]
| Функция | Описание |
|---|---|
| Первый элемент пары true означает пустоту списка. | |
| Возвращает первый элемент пары, который и означает, является ли список пустым. | |
| Создаём новый непустой список из первого элемента (головы списка) h и хвоста t. | |
| Первый элемент пары во втором элементе — голова списка. | |
| Второй элемент пары во втором элементе — хвост списка. |
В пустом списке доступ ко второму элементу никогда не применяется, поскольку к нему не применимы понятия головы и хвоста списка.
Представление в виде одной пары
В качестве альтернативы, списки можно определить следующим образом ( соответствует пустому списку, непустые задаются парой головы и хвоста):[2]
где последнее определение — пример более общей функции:
Представление списка через функцию свёртки справа
В качестве альтернативы кодированию с использованием пар Чёрча список можно закодировать, отождествив его с функцией свёртки справа. Например, список из трёх элементов x, y и z может быть закодирован функцией высшего порядка, которая при применении к комбинатору c и значению n возвращает .
Представление списка с использованием кодирования Скотта
Ещё одним альтернативным представлением является представление списков через кодирование Скотта, которое использует идею продолжения и может привести к упрощению кода[3]. (см. также Шаблон:Iw). В этом подходе используется факт, что списки можно обрабатывать путём сопоставления с образцом.
См. также
- Система F — пример использования кодирования Чёрча.
- Шаблон:Iw
- Определение порядковых чисел по фон Нейману — способ представления натуральных чисел как множества.