Введение

Логический формализм, использующий комбинаторы вместо переменных.

Комбинаторная логика — это нотация, позволяющая избежать необходимости использования квантифицированных переменных в математической логике. Она была предложена Моисеем Шенфинкелем и Хаскеллом Карри и в последнее время находит применение в информатике как теоретическая модель вычислений, а также в качестве основы для разработки функциональных языков программирования. Она базируется на комбинаторах, которые Шенфинкель ввёл в 1920 году с целью предложить аналогичный способ построения функций и исключить упоминание переменных, особенно в логике предикатов. Комбинатор — это функция высшего порядка, которая для получения результата из своих аргументов использует только применение функций и ранее определённые комбинаторы.

В математике

Комбинаторная логика изначально задумывалась как "предварительная логика", призванная прояснить роль квантифицированных переменных в логике, по сути, путем их исключения. Другой способ исключения квантифицированных переменных – логика предикативных функторов Куйна. Хотя выразительная сила комбинаторной логики обычно превосходит выразительную силу логики первого порядка, выразительная сила логики предикативных функторов идентична выразительной силе логики первого порядка (Куин, 1960, 1966, 1976). Первооткрыватель комбинаторной логики, Моисей Шёнфинкель, после своей оригинальной статьи 1924 года больше ничего не публиковал по комбинаторной логике. Хаскелл Карри заново открыл комбинаторы, работая преподавателем в Принстонском университете в конце 1927 года. В конце 1930-х годов Алонзо Чёрч и его студенты в Принстоне разработали конкурирующий формализм для функциональной абстракции – лямбда-исчисление, которое оказалось более популярным, чем комбинаторная логика. В итоге, из-за этих исторических обстоятельств, до тех пор, пока теоретическая информатика не проявила интерес к комбинаторной логике в 1960-х и 1970-х годах, почти все работы в этой области выполнялись Хаскеллом Карри и его учениками или Робертом Фейсом в Бельгии. Обзор ранней истории комбинаторной логики представлен в работах Карри и Фейса (1958) и Карри с соавторами (1972). Более современное изложение комбинаторной логики и лямбда-исчисления можно найти в книге Барендрегта, в которой рассматриваются модели, разработанные Даной Скоттом для комбинаторной логики в 1960-х и 1970-х годах.

В вычислительной технике

В информатике комбинаторная логика используется как упрощенная модель вычислений, применяемая в теории вычислимости и теории доказательств. Несмотря на свою простоту, комбинаторная логика отражает многие существенные черты вычислений. Комбинаторную логику можно рассматривать как вариант лямбда-исчисления, в котором лямбда-выражения (представляющие функциональную абстракцию) заменяются ограниченным набором комбинаторов – примитивными функциями без свободных переменных. Лямбда-выражения легко преобразуются в комбинаторные выражения, а редукция комбинаторов значительно проще, чем редукция лямбда-выражений. Поэтому комбинаторная логика использовалась для моделирования некоторых нестрогих функциональных языков программирования и аппаратного обеспечения. Наиболее чистым воплощением этого подхода является язык программирования Unlambda, единственными примитивами которого являются комбинаторы S и K, дополненные операциями ввода/вывода символов. Хотя Unlambda не является практичным языком программирования, он представляет определенный теоретический интерес. Комбинаторная логика допускает различные интерпретации. Многие ранние работы Карри показали, как переводить аксиоматические системы обычной логики в уравнения комбинаторной логики. Дана Скотт в 1960-х и 1970-х годах продемонстрировала, как объединить теорию моделей и комбинаторную логику.

Комбинатные вычисления

Поскольку абстракция — единственный способ определения функций в лямбда-исчислении, что-то должно заменить её в комбинаторном исчислении. Вместо абстракции комбинаторное исчисление предоставляет ограниченный набор примитивных функций, из которых можно строить другие функции.

Расчет CLK против CLI

Следует различать CLK, как описано в этой статье, и исчисление CLI. Это различие соответствует различию между λK и λI исчислениями. В отличие от λK исчисления, λI исчисление ограничивает абстракции выражением вида λx. E, где x имеет хотя бы одно свободное вхождение в E. Как следствие, комбинатор K отсутствует в λI исчислении и в исчислении CLI. Константами CLI являются I, B, C и S, которые образуют базис, из которого можно составить все термы CLI (с точностью до равенства). Любой терм λI может быть преобразован в эквивалентный комбинатор CLI по правилам, аналогичным представленным выше для преобразования термов λK в комбинаторы CLK. См. главу 9 в Barendregt (1984).

Неразрешимость комбинаторного исчисления

Нормальная форма — это любой комбинаторный термин, в котором примитивные комбинаторы, если они присутствуют, не применены к достаточному числу аргументов для возможности упрощения. Неразрешимо, имеет ли общий комбинаторный термин нормальную форму, эквивалентны ли два комбинаторных термина и так далее. Это можно доказать аналогично соответствующим задачам для лямбда-термов.

Сборник функциональных языков

Дэвид Тернер использовал свои комбинаторы для реализации языка программирования SASL. Кеннет Иверсон использовал примитивы, основанные на комбинаторах Карри, в своем языке программирования J, являющемся преемником APL. Это позволило ему реализовать то, что Иверсон назвал неявным программированием, то есть программирование с помощью функциональных выражений, не содержащих переменных, а также мощные инструменты для работы с такими программами. Оказывается, неявное программирование возможно в любом языке, подобном APL, с пользовательскими операторами.