учебники, программирование, основы, введение в,

 

Абстрактные машины и категориальная комбинаторная логика

Рассмотрим особенности моделирования абстрактных машин средствами формальной системы категориальной комбинаторной логики.
Абстрактной машиной (abstract machine) в рамках данного курса будем называть математическую формализацию, которая моделирует правила выполнения программы (или, иначе, алгоритмы) для реальной вычислительной машины (компьютера).
В настоящее время при практической реализации различных классов языков программирования, в частности функциональных и объектно-ориентированных языков, широко используются аналоги абстрактных машин в форме так называемых виртуальных машин (virtual machine).
Виртуальные машины представляют собой средство создания промежуточного (следующего за текстом программы на высокоуровневом языке программирования) кода (именуемого в различных реализациях Java-кодом, MSIL-кодом и т.д.), который затем транслируется в машинный код. Заметим, что последний пример промежуточного кода, а именно, MSIL (Microsoft Intermediate Language), представляет собой ни что иное, как код виртуальной машины, реализованной корпорацией Microsoft для технологической платформы .NET.
Отметим также то обстоятельство, что абстрактные машины позволяют адекватно моделировать различные подходы и стратегии вычислений, включая ранее рассмотренные рекурсивные вычисления, а также вычисления по необходимости (иначе известные как «ленивые»), которые будут рассматриваться в ходе курса.
Уточнив понятия об абстрактных и виртуальных машинах, перейдем к исследованию особенностей различных классов рассматриваемых формализаций, проиллюстрировав выделенные классы необходимыми примерами из математической теории и практики программирования.
Прежде всего, следует отметить то обстоятельство, что практически все без исключения абстрактные модели вычислительных машин оперируют понятием состояния, изменения которого и отражают ход выполнения программы.
При этом следует, во-первых, выделить ранние, «наивные» формализации на состояниях, которые не были практически поддержаны ни языками программирования, ни собственно компьютерами. К ранним абстрактным машинам можно отнести известные из истории математики машины Тьюринга и Поста. Первая абстрактная машина характеризовалась бесконечной лентой для хранения «инструкций», а также считывающей и записывающей головкой, передвигающейся по ней; вторая машина действовала подобно первой.
Несмотря на объективные трудности практической реализации, ранние абстрактные машины, безусловно, были весьма значимыми для развития computer science, т.к. предвосхитили появление и обозначили ряд этапов развития реальных компьютеров и языков программирования для них.
Кроме того, следует отдельно рассмотреть более поздние, зрелые формализации машин, основанные на состояниях. К ним в первую очередь относятся упомянутая ранее SECD-машина П. Лендина, а также категориальная абстрактная машина.
Как уже отмечалось, в 60-х годах, уже в эпоху высокоуровневых языков программирования, П. Лендином (Peter J. Landin) была разработана так называемая SECD-машина, а именно, математическая формализация для вычисления ламбда-выражений.
При этом SECD-машина была предназначена для редукции ламбда-выражений и использовала механизм передачи параметров при вызове функции по значению (call-by-value), в отличие от других типов передачи параметра (например, по имени или call-by-name).
Свое название SECD-машина получила от аббревиатур имен своих основных четырех элементов, а именно:

  • Stack – стек, т.е. последовательность атомарных ламбда-выражений (переменных и констант), а также ламбда-абстракций;
  • Environment – среда, т.е. хранилище значений, которые связываются с переменными в ходе вычислений;
  • Control – управление, т.е. последовательность «инструкций», управляющих работой SECD-машины;
  • Dump – дамп, т.е. хранилище состояния SECD-машины (обычно пуст либо содержит прежнее состояние).

Именно перечисленная четверка элементов в полной мере характеризует состояние SECD-машины в произвольный момент вычислений.
Заметим, что именно SECD-машина стала прообразом для более поздних формализаций, на которых реализованы ML-машины, в частности категориальная абстрактная машина (КАМ).

Перейдем к обсуждению теоретического фундамента, на котором основана категориальная абстрактная машина, а конкретно, к формальной системе категориальной комбинаторной логики (ККЛ).
Как уже отмечалось, своим названием категориальная абстрактная машина обязана тому обстоятельству, что множество ее возможных состояний принадлежит пространству так называемых декартово замкнутых категорий (или, сокращенно, д.з.к.).
Формальная система с декартово замкнутыми категориями должна удовлетворять следующим условиям:

  1. определена функция тождества или тождественное преобразование (имеющее в комбинаторной логике аналог в форме комбинатора тождества I);
  2. определена операция композиции или построения сложной функции (имеющая в комбинаторной логике аналог в форме комбинатора тождества B);
  3. определена операция образования упорядоченной пары объектов < . , . >;
  4. определена операция взятия первого элемента из упорядоченной пары объектов;
  5. определена операция взятия второго элемента из упорядоченной пары объектов;
  6. определена операция преобразования терма из алгебраической формы в аппликативную;
  7. определена операция аппликации или применения функции к аргументу.

Проанализируем смысл сформулированных условий для категорий.
Условия существования тождественного преобразования и построения сложных функций являются основополагающими и необходимы для формирования категорий произвольного типа.
Условия существования операции образования упорядоченной пары объектов, а также операций взятия первого и второго элементов из упорядоченной пары необходимы для построения декартовых категорий, т.е. категорий, оснащенных операцией прямого (или, иначе, декартова) произведения и соответствующих ему проекций.
Наконец, условия существования операций аппликации и преобразования терма из алгебраической формы в аппликативную необходимы для формирования декартово замкнутых категорий.
Заметим, что последняя операция называется каррированием, а обратная ей – декаррированием по имени основоположника комбинаторной логики Х. Карри (Haskell B. Curry).
Кроме перечисленных выше условий, для построения декартовых категорий необходимо дополнительно потребовать существования функционального пространства или операции экспоненцирования.
Для реализации категориального расширения комбинаторной логики (известного также как категориальная комбинаторная логика, или, сокращенно, ККЛ), добавим к известным нам комбинаторам

(I) Ia = a;
(K) Кab = a;
(S) Sabc = ac(bc);
(B) Babc = a(bc);
(C) Cabc = acb
следующие комбинаторы, выступающие в роли «машинных инструкций» категориальной абстрактной машины:

(D) D = λxy.[x,y] = λxyr.rxy;
(S) S = CIS;
(Λ) Λ = λx.(λz.x[y,z]);
(‘) ‘ = K = λx.(λy.x).
Заметим, что характеристическое соотношение (D) представляет собой операцию образования упорядоченной пары, соотношение (Λ) – каррирование, а соотношение (‘), ранее известное нам как характеристика комбинатора-канцелятора K – операцию взятия первой проекции для упорядоченной пары элементов, которую можно также понимать как цитирование.
Продолжим построение формальной системы категориальной комбинаторной логики.
Рассмотрим семантический аспект данной системы, основываясь на функции вычисления значения выражения категориальной комбинаторной логики, соотнесенной, вообще говоря, с той или иной средой.
Введем одноместную функцию вычисления значения выражения для произвольного выражения, которую обозначим как || ||. Скажем, значение терма M в таком случае будет иметь вид || M ||.
Далее добавим бесконечное множество комбинаторов n! со следующей семантической характеристикой: ||n|| = n!.
Продолжим семантические равенства следующим соотношением, характеризующим значения констант: ||с|| = ‘с.
Как следует из приведенного соотношения, для вычисления значения константы используется комбинатор цитирования (что хорошо согласуется с практикой, принятой в языках функционального программирования, в частности в языке LISP).
Значения упорядоченной пары и ламбда-абстракции, как выясняется, задаются с помощью ранее рассмотренных комбинаторов S и Λ:
||M,N|| = S [||M||,||N||];
||λx.M|| = Λ(M).
Продолжим построение формальной системы категориальной комбинаторной логики.
Заметим, что благодаря введению дополнительных комбинаторов
(D) D = λxy.[x,y] = λxyr.rxy;
(S) S = CIS;
(Λ) Λ = λx.(λz.x[y,z]);
(‘) ‘ = K = λx.(λy.x)
перечисленные выше синтактико-семантические соотношения сводятся к чисто синтаксическим равенствам, которые имеют следующий вид:
0! [x,y] = y;
(n+1)! [x,y] = n!x;
S[x,y]z = xz(yz);Λ(x)yz = x[y,z].
Отметим, что последние два соотношения, означающие, соответственно, декаррирование и каррирование, необходимы для завершения перехода от формальной системы комбинаторной логики к формальной системе ККЛ.
Продолжим построение формальной системы категориальной комбинаторной логики.
Для того чтобы формализация приняла более строгий и удобный вид, необходимо ввести в рассмотрение двухместный комбинатор образования пары, который определяется ламбда-выражением следующего вида:
< . , . > = λt.[ . t, . t].
При этом комбинаторная характеристика вновь введенного комбинатора образования пары имеет следующий вид:
<f,g> = λt.λz.(ft)(gt) = λt.[ft,gt].
Кроме того, комбинатор образования пары характеризуется следующим семантическим равенством:
||M,N|| = <||[M]||,||[N]||>.
Продолжим построение формальной системы категориальной комбинаторной логики.
После задания операции образования упорядоченной пары функций для завершения формализации операции прямого или декартова произведения необходимо определить операции взятия первого и второго элементов упорядоченной пары, или первой и второй проекций.
Согласно общепринятой алгебраической практике, оснастим вновь введенную операцию декартова произведения комбинаторами первой и второй проекций с комбинаторными характеристиками следующего вида:
Fst = CIK = (n+1)!
Snd = CI(KI) = (0)!
Отметим, что вновь введенные комбинаторы Fst для первой проекции и Snd для второй проекции имеют следующие характеристические соотношения:
Fst [x,y] = x;
Snd [x,y] = y;
<x,y> z = [xz,yz].
Последнее соотношение определяет связь между комбинатором образования упорядоченной пары и так называемой парой функций, т.е. такой функцией, которая в результате дает совокупность результатов своих функций-компонентов x:A→B и y:A→C в виде функции w:A→BxC.
Продолжим построение формальной системы категориальной комбинаторной логики.
Заметим, что введенная система комбинаторов Fst, Snd, (n+1)!, 0!, S, Λ является избыточной.
Избыточность системы комбинаторов устраняется введением комбинатора композиции
o = B,
который принимается тождественно равным ранее определенному комбинатору композиции B.
Теперь явно введем комбинатор аппликации ε.
Выведем соотношения, которые позволят устранить избыточность системы комбинаторов:
S(xyt) = xt(yt) = ε[xt,yt] = (ε o<x,y>)t.
Отсюда,
(i)     S = λxy.(εo<x,y>).
Положим Fstn+1=FstoFstn, для n>1 и Fst1=Fst. Тогда получим, что
(ii)    n!=SndoFstn, для n>0, а 0!=Snd.
Завершим построение формальной системы категориальной комбинаторной логики.
С учетом устранения избыточных комбинаторов из рассматриваемой формальной системы, получим окончательный перечень характеристических соотношений категориальной комбинаторной логики:
(ass)   (xoy) z = x(yz);
(fst)   Fst[x,y] = x;
(snd)   Snd[x,y] = y;
(dpair) <x,y>z = [xz,yz];     
(ac)    ε[Λ(x)y,z] = x[y,z];  
(quote) (‘x)y = x.
Заметим, что соотношение (ass) устанавливает связь аппликации и композиции, соотношение (dpair) – спаривания и формирования совокупности, а соотношение (ac) – каррирования и апплицирования.
Напомним, что соотношения (fst) и (snd) характеризуют операции взятия первой и второй проекций для упорядоченной пары объектов, а (quote) – цитирование.
Приведенные соотношения (ass), (fst), (snd), (dpair), (ac) и (quote) адекватно, то есть полно и непротиворечиво, формализуют систему категориальной комбинаторной логики.

 

 
На главную | Содержание | < Назад....Вперёд >
С вопросами и предложениями можно обращаться по nicivas@bk.ru. 2013 г.Яндекс.Метрика