Кодировка Могенсена – Скотта - Mogensen–Scott encoding
В Информатика, Кодирование Скотта это способ представить (рекурсивные) типы данных в лямбда-исчисление. Церковная кодировка выполняет аналогичную функцию. Данные и операторы образуют математическую структуру, которая встроенный в лямбда-исчислении.
В то время как кодирование Черча начинается с представления основных типов данных и строится на нем, кодирование Скотта начинается с простейшего метода составления алгебраические типы данных.
Кодировка Могенсена – Скотта расширяет и немного изменяет кодировку Скотта, применяя кодировку к Метапрограммирование. Эта кодировка позволяет представить лямбда-исчисление термины, как данные, которые будут использоваться метапрограммой.
История
Кодировка Скотта впервые появляется в наборе неопубликованных лекций автора Дана Скотт[1]чья первая цитата встречается в книге Комбинаторная логика, том II[2]. Мишель Париго дал логическую интерпретацию и решительно нормализация рекурсор для чисел в кодировке Скотта,[3] ссылаясь на них как на представление чисел «Тип стека».Торбен Могенсен позже расширил кодировку Скотта для кодирования лямбда-терминов как данных.[4]
Обсуждение
Лямбда-исчисление позволяет хранить данные как параметры функции, которая еще не имеет всех параметров, необходимых для приложения. Например,
Может рассматриваться как запись или структура, где поля были инициализированы значениями . Затем к этим значениям можно получить доступ, применив термин к функции ж. Это сводится к
c может представлять конструктор для алгебраического типа данных на функциональных языках, таких как Haskell. Теперь предположим, что есть N конструкторы, каждый с аргументы;
Каждый конструктор выбирает другую функцию из параметров функции. . Это обеспечивает ветвление в потоке процесса на основе конструктора. У каждого конструктора может быть свой арность (количество параметров). Если конструкторы не имеют параметров, то набор конструкторов действует как перечислить; тип с фиксированным количеством значений. Если у конструкторов есть параметры, можно создавать рекурсивные структуры данных.
Определение
Позволять D быть типом данных с N конструкторы, , такой что конструктор имеет арность .
Кодирование Скотта
Кодировка конструктора Скотта типа данных D является
Кодировка Могенсена – Скотта
Mogensen расширяет кодировку Скотта для кодирования любого нетипизированного лямбда-термина как данных. Это позволяет представить лямбда-член в виде данных в рамках лямбда-исчисления. мета программа. Мета-функция mse преобразует лямбда-член в соответствующее представление данных лямбда-члена;
«Лямбда-член» представлен как помеченный союз с тремя корпусами:
- Конструктор а - Переменная (арность 1, не рекурсивный)
- Конструктор б - применение функции (арность 2, рекурсивно в обоих аргументах),
- Конструктор c - лямбда-абстракция (арность 1, рекурсивная).
Например,
Сравнение с церковной кодировкой
Кодировка Скотта совпадает с Церковная кодировка для логических значений. Парное кодирование Чёрча можно обобщить на произвольные типы данных путем кодирования из D выше как[нужна цитата ]
сравните это с кодировкой Могенсена Скотта,
При таком обобщении кодировки Скотта и Черча совпадают для всех перечисленных типов данных (таких как логический тип данных), поскольку каждый конструктор является константой (без параметров).
Что касается практичности использования кодировки Черча или Скотта для программирования, существует симметричный компромисс.[5]: Цифры в кодировке Чёрча поддерживают операцию сложения с постоянным временем и имеют не лучше, чем операция предшественника с линейным временем; Числа в кодировке Скотта поддерживают операцию предшественника с постоянным временем и имеют не лучше, чем операция сложения с линейным временем.
Определения типов
Данные в кодировке Чёрча и операции над ними можно вводить в система F, но данные и операции в кодировке Скотта явно не типизируются в системе F. По-видимому, требуются универсальные, а также рекурсивные типы,[6].Так как сильная нормализация не выполняется для неограниченно рекурсивных типов[7]для установления завершения программ, манипулирующих данными в кодировке Скотта, путем определения правильной типизации требуется, чтобы система типов обеспечивала дополнительные ограничения на формирование рекурсивно типизированных терминов.
Смотрите также
Заметки
- ^ Скотт, Дана, Система функциональной абстракции (1968). Лекции, прочитанные в Калифорнийском университете в Беркли (1962 г.)
- ^ Карри, Хаскелл (1972). Комбинаторная логика, Том II. Издательская компания Северной Голландии. ISBN 0-7204-2208-6.
- ^ Париго, Мишель (1988). «Программирование с доказательствами: теория типа второго порядка». Европейский симпозиум по программированию. Конспект лекций по информатике. 300: 145–159. Дои:10.1007/3-540-19027-9_10. ISBN 978-3-540-19027-1.
- ^ Могенсен, Торбен (1994). «Эффективная самоинтерпретация в лямбда-исчислении». Журнал функционального программирования. 2 (3): 345–364. Дои:10.1017 / S0956796800000423.
- ^ Париго, Мишель (1990). «О представлении данных в лямбда-исчислении». Международный семинар по компьютерной логике. Конспект лекций по информатике. 440: 209–321. Дои:10.1007/3-540-52753-2_47. ISBN 978-3-540-52753-4.
- ^ См. Примечание «Типы чисел Скотта» Мартин Абади, Лука Карделли и Гордон Плоткин (18 февраля 1993 г.).
- ^ Мендлер, Накс (1987). «Рекурсивные типы и ограничения типов в лямбда-исчислении второго порядка». Симпозиум по логике в компьютерных науках (2): 30–36.
использованная литература
- Непосредственно рефлексивное метапрограммирование
- Торбен Могенсен (1992). Эффективная самоинтерпретация в лямбда-исчислении[постоянная мертвая ссылка ]. Журнал функционального программирования.