ПОЛИМОРФНАЯ СИСТЕМА ТИПОВ λ2 В СОДЕРЖАНИИ ОБУЧЕНИЯ ТЕОРЕТИЧЕСКОМУ ПРОГРАММИРОВАНИЮ

И. А. Кудрявцева

ПОЛИМОРФНАЯ СИСТЕМА ТИПОВ Л2 В СОДЕРЖАНИИ ОБУЧЕНИЯ ТЕОРЕТИЧЕСКОМУ ПРОГРАММИРОВАНИЮ

Автором проведён логико-семиотический анализ содержания одного из разделов обучения теоретическому программированию «полиморфная система типов X2» (демонстрирующая зависимость термов от типов). Построена сводная таблица о разрешимости (наличия алгоритма решения) классических задач системы X2 в слабом и сильном полиморфизме произвольного ранга, а также в слабом полиморфизме с let-правилом в стиле Карри и в стиле Чёрча. В результате сформулированы компетенции, приобретаемые обучаемыми по итогам изучения полиморфной системы типов X2.

Ключевые слова: теоретическое программирование, Х-куб, полиморфная система типов, изоморфизм Карри-Говарда, интуиционистская пропозициональная логика второго порядка (Prop2).

I. Kudryavtseva

POLYMORPHIC TYPE SYSTEM Л2 IN THE CONTENT OF STUDYING THEORETICAL PROGRAMMING

The author carried out a logical and semiotic analysis of the of one of the sections of studying theoretical programming «The polymorphic type system X2» (showing dependence of terms from types). Built a summary table on the solvability of (solution algorithm) classical tasks of the X2 system in strong and weak arbitrary rank polymorphism, as well as in weak polymorphism with let-rule-style in style of the Curry and in Church style. The competences acquired by trainees following the results of study ofpolymorphic type system ofX2 are as a result formulated.

Keywords: theoretical programming, Х-cube, polymorphic type system, Curry-Howard isomorphism, intuitionistic propositional logic of the second order (Prop 2).

Раскрытие содержания полиморфной системы типов Х2 в обучении теоретическому программированию осуществим через логико-семиотический анализ.

Теоретическое программирование, как раздел математической науки, имеет в обозрении модели программ, представляющие концепции для разработки языков программирования. Отметим теории, в которых обнаруживаются такие модели программ и которые послужили основой для развития современных функциональных языков программирования: Х-исчисление, теория комбинаторов, теория типов, теория категорий, семантическая теория языков программирования.

Введение понятия типа в Х-исчисление и языки программирования основано (по [11]):

1) с точки зрения логики на преодолении парадокса Рассела, препятствующего попыткам построить непротиворечивое расширение лямбда-исчисления теорией множеств. Связано это с циклической системой приёма вычисления — применения функции к самой себе;

2) с точки зрения программирования на применении типизации в языках программирования, в том числе отличных от функциональных. Связано это с эффективностью порождаемого компилятором кода и рациональностью распределения памяти

при наличии информации о допустимых способах использования переменной;

3) с точки зрения теоретического программирования на выявлении инструмента типизации как:

- ограниченной статической проверки корректности программ (выявление ошибок, концептуальных просчётов на этапе компиляции программы);

документации текста программы; улучшения модульности программ и скрытия информации при помощи определения различных структур данных, которые явно разделены на интерфейс и подробности реализации.

Несмотря на то, что типизация накладывает определённые ограничения на стиль программирования (что выражается более детальным описанием вычислительного процесса), развитие типизированных языков программирования прогрессирует.

Современные функциональные языки программирования имеют в основе разнообразные системы типов, полученные из теории типизированных Х-исчислений. Возможные зависимости между типами и выражениями формального языка Х-термов отображены в системах, которые Х. Ба-рендрегт (1991) классифицировал и представил структурой Х-куба. Рассмотрим одну из систем Х-куба — типизированное полиморфное Х-исчисление (Х2, система F), на которой основаны такие языки программирования, как Haskell ML.

Структура логико-семиотического анализа позволит отобразить в содержании (по [3, с. 223]) следующие компоненты:

1) семиотический (с помощью явного выделения метаязыка, предметного языка, синтаксиса, семантики);

2) формально-логический (с помощью явного выделения формальных систем, формальных языков, формальных и содержательных аксиоматических теорий);

3) алгоритмический (с помощью явного выделения вычислительных моделей, алго-

ритмов и их реализации с помощью вычислительных систем).

I. Семиотический компонент содер->^юан ия.

Предметный язык: язык типизации X-термов.

Метаязык: язык канторовской (наивной) теории множеств, язык интуиционистской пропозициональной логики второго порядка (Ргор2) и язык типизированного Х-исчисления Х^.

II. Формально-логический компонент содержания.

Формальные системы: типизированное полиморфное Х-исчисление в стиле Х. Кар-ри и в стиле А. Чёрча.

Формальная система включает описание двух компонентов (по [6, с. 324-326]): язык в алфавите (класс исходных символов, правильные слова в алфавите, формулы) и исчисление (аксиомы, правила вывода).

1. Язык в алфавите.

а) Класс исходных символов (алфавит):

1) V={x,y,z,... } — множество предметных (термовых) переменных;

2) ^урт = {а,Р,у,...,х,у,ю} — множество типовых переменных (неинтерпретируе-мые базовые типы);

3) —V — синтаксические конструкторы типа;

4) = — двухместный предикатный символ;

5) X и Л — логические символы;

б) (,),. — вспомогательные символы;

6) класс правильных слов в алфавите.

Множество типов определяется следующей формальной грамматикой (по [10]):

• в сильном полиморфизме

• в слабом полиморфизме

Тш::=Т-> Т->::=V

Wtype - Т

Т->-*Т-> (тип для мономорфной системы Л->) Область действия знака «.» начинается с места его расположения, и простирается вправо от этого знака до окончания записи

типа. Например, записи следующего вида являются синонимами:

Ун., она, (V«. а-«), Ук. (она).

Предтермы (псевдотермы) имеют вид (по [10]):

• в стиле Чёрча (Лт):

• в стиле Карри (Л): Л^У|ЛЛ|Я¥.Л

V1 — множество термовых переменных, каждый элемент которого аннотирован типом.

В системе А. Чёрча тип предметной переменной указывается в её аннотации; при этом разрешено изменять тип, указанный в аннотации, что осуществляется с помощью указания символа «Л» (читается: «большая лямбда») в записи Х-терма и использования следующего расширения в-редукции (ЭД — Х-терм, а, в — типовые переменные):

Например: (Лп.Ах:а.х)р-ъАх:р.х

Самоприменением называется Х-терм вида Х£

let-терм (^-конструкция) — это запись вида Ш х=М ¿гг №КАх.ЮМ.

Утверждение о типизации в Х2 имеет вид

• в стиле Чёрча:

• в стиле Карри:

Тип т называют предикатом, а Х-терм — субъектом утверждения;

в) класс формул.

Формулами полиморфного типизированного Х-исчисления называются слова вида М = N где М, N — Х-термы одного типа;

г) свойства типизированных Х-термов.

Понятия «свободная переменная» и

«связанная переменная» и «замкнутый Х-терм» для системы Х2 вводятся аналогично соответствующим понятиям для

бестипового Х-исчисления; понятия {{свободная типовая переменная» и «связанная типовая переменная» для системы Х2 вводятся аналогично понятиям для языка второго порядка; понятие «нормальная форма» аналогично определению в бестиповом Х-исчислении.

Длина типизированного Х-терма (по [4, с. 548]) — это количество (Х+let)-подтермов.

let-высота (глубина) (Х+Ш)-терма M (по [4, с. 548]) — это количество его Х-подтермов наибольшей длины, не содержащих let-выражений.

Х-терм N является let-нормальной формой (Х+Ш)-терма M (по [4, с. 548]), если N является Х-термом (не содержащим let), полученным из M неоднократной let-редукцией;

д) операции над Х-термами. Операция «подстановка» (M)xN определяется для типизированных Х-термов точно так же, как и для бестиповых Х-термов, за исключением того, что x и N должны иметь один и тот же тип; в том случае, если x и N имеют разные типы, подстановка (M)xN не определена.

Редукция на Х-термах M и N (в стиле Чёрча) определяется так:

Для типизированных Х-термов в стиле Чёрча определяется операция «подстанов-ка» типов для возможного изменения типа, указанного в аннотации предметной переменной Х-терма.

(Х+Ш)-терм M let-редуцируем к (Х+let)-терму N, если можно получить N' из M' неоднократным применением let-правила к подтермам и переименованием связанных переменных (а-конверсией).

let-правилом называется следующее правило:

Переменная x имеет полиморфный тип о, то есть «скрыто» выполняется подстановка полиморфного типа.

Применение let-правила — это способ фактически использовать полиморфные по о редексы:

Стирающее отображение |о|:Лт ^ Л

е) основные теоремы и леммы.

Из многочисленных лемм и теорем приведём основные.

Лемма (о контекстах) (по [8]):

1) (Утончение, англ. thinning) Расширение контекста не влияет на выводимость утверждения о типизации;

2) свободные переменные типизированного Х-терма должны присутствовать в контексте;

3) сужение контекста до множества свободных переменных Х-терма не влияет на выводимость утверждения о типизации.

Теорема (о типизируемости подтерма).

Если Х-терм имеет тип, то есть то каждый его подтерм также имеет тип.

Теорема (о единственности типов) не имеет места для Х2 в стиле Карри.

Леммы (о сохранении типов при подстановке термов) [10]; (о подстановке типа) [8; 10].

Теорема (о редукции субъекта) [8].

Теорема (о сильной нормализации) [7].

Система Х2 является SN-системой.

Если

то М является сильно нормализуемым, то есть любая последовательность Р-редукций приводит Х-терм к нормальной форме за конечное число шагов.

Теорема (о типизации самоприменения) [10]:

Для Х-терма Хf. ff верны следующие утверждения:

Ti=Vtt.tt-tttsVtt

T2=Vot.rt - пустой тип

Теорема (по [4, с. 548]).

Пусть M — произвольный бестиповый (Х+е)-терм.

Существует Х-терм N (свободный от let), в котором каждая максимальная последовательность let-редукций из M завершается в N.

Таким образом, можно утверждать, что не существует бесконечной последовательности let-редукций. let-нормальная форма существует и единственна.

2. Исчисления.

Типизированные исчисления в стиле Чёрча и в стиле Карри отличаются лишь записью правила обработки абстракции, в остальном они схожи и представимы в терминах моносукцедентного секвенциального исчисления.

Приведём аксиомы и правила вывода типизированных Х-термов, предварительно введя понятия «контекст», «тип, выводимый из контекста» и правила построения допустимого контекста.

Контекстом называется следующий кортеж объявлений типов:

,ctp: *,xi: 11,х2: ts,... ,xr: tr _i \_

Г= Й1:*,Й2:*,

-V- -V

где:

1) аь а 2,..., а р — свободные типовые переменные (с типом *);

2) ^Дг,...,^ — типы, которые должны содержать вхождения хотя бы одного из типов а1, а 2,..., а р;

3) х1:11, х2:1;2,...,хг:1г — типизированные переменные.

Областью определения контекста Г называется множество

> Jo

... ,ИР,Х1,Х2

,Xrj.

Тип о выводим из контекста Г (по [10]):

если все свободные переменные а принадлежат Г.

Правила построения допустимого контекста (по [10]):

1) пустой контекст (контекст, не содержащий компонентов) является допустимым;

2) если контекст Г является допустимым, то допустим контекст Ги{а:*}, где а.£ (1от(Г);

3) если тип а выводим из Г (то есть все свободные переменные а входят в Г), то при х^£/ода(Г) допустим контекстГи{х:о}.

Для постулирования некоторых правил вывода типизированных Х-термов необходимо устанавливать выводы типов из контекста. В этом процессе помогут правила

конструирования типов, выводимых из контекста.

Правила конструирования типов таковы (по [10]):

1) если тип а:* €Г, то тип а:* выводим из контекста Г;

2) если типы а:* и т:* выводимы из контекста Г, то тип о—>-т:* выводим из Г;

3) если тип а:* выводим из контекста Г, а: *, то тип Уа. а:* выводим из Г.

Утверждением, выводимым в контексте Г, называется утверждение М:т, вывод которого выполняется по правилам типизации системы Х2.

По изоморфизму Карри-Говарда:

1) формулы в логической системе Prop2 — это типы в системе Х2;

2) доказательства в логической системе Prop2 — это термы в системе Х2.

Правила типизации системы 12

Таблица 1

Система Ш {гильбертаский ва'риатд

Система ?тор2 (гильбертовсхий

Г,х:61— х:б;

Ги{6}|- 6;

правила вывода-.

Г|- М:б-*Т Г|— Ы:6

!

в сшле Карри

Ги{х:6} |— М^

!

в сшле Чёрча

Г, х: б |— М: -С Г |— Лх:б.М:б-т

6еТ-> для 12 (Тш), беТ для 12 (Т);

Ги{б}|- т Г|- 6-п '

Г,й: * |— М:б

!

Г |- М:У«.б

Г,й: * |— М:б

!

Г |— Лй.И:Уа.б

гЬб

Г|- Уй.б'

СГ);

Г |— -с: * Г|— М:Уй.6

!

Г |— М: 6 [«: —с]

Г |— -с: * Г|— М:Уй.6

!

Г |— Мт: 6 [а: =т]

теТ-> для Ш СТШ), теТ для 1а (Т).

ж) определение понятия «вывод».

Понятие «древесный вывод утверждения М:т в контексте Г» определим подобно [2, с. 31]: древесным выводом секвенции Г |— M : t (выводом секвенции в виде дерева В) называется дерево секвенций D, всякая начальная секвенция которого является доказуемой секвенцией, заключительной секвенцией является секвенция Г|— М:т, а переходы являются применениями правил типизации системы Х2.

Дерево секвенций определим индуктивно [2, с. 28]:

1) деревом секвенций является всякая секвенция;

2) если ii,..., — деревья секвенций, а S — секвенция, то

¿>2

I

также является деревом секвенций.

Доказуемая секвенция (по: 2, с. 27-28]) — это секвенция, для которой существует последовательность секвенций, где каждая секвенция либо является аксиомой, либо получается из предшествующих секвенций при помощи правила типизации системы Х2.

3. Интерпретация.

При программистском подходе (в практическом программировании) Х-термы интерпретируются как программы, а типы — как их частичные спецификации.

При логическом подходе (в теории типов) типы интерпретируются как формулы некоторого логического языка (интуиционистской пропозициональной логики второго порядка), а Х-термы — как доказательства этих формул.

III. Алгоритмический компонент содержания.

Важнейшими задачами в системе Х2 являются:

1) задача проверки типа (TCP, от англ. «Type Checking Problem») — проверка соответствия заданному Х-терму заданного типа.

Решение задачи TCP осуществляется путём построения дерева вывода заданного Х-терма с помощью правил типизации системы Х2;

2) задача синтеза (реконструкции) типа (TSP, от англ. «Type Synthesis Problem») — восстановление типа по заданному Х-терму.

Решение задачи TSP осуществляется путём построения дерева вывода заданного Х-терма снизу вверх (с изначальным обозначением типа какой-либо типовой переменной) с помощью правил типизации системы Х2. По мере выстраивания дерева вывода будет формироваться система равенств типов, которую затем можно решить с помощью алгоритма Робинсона [1, с. 98-99] и получить конкретизацию введённой типовой переменной;

3) задача обитаемости типа (TIP, от англ. «Type Inhabitation Problem»») — восстановление Х-терма по заданному типу.

Для решения задачи TIP сформулируем правила вывода в стиле фигур натурального вывода, опираясь на правила типизации системы Х2.

При этом нумерация правил соответствует правилам типизации для Х2(Т№) и Х2(Т) в стиле Карри (о,т=Т^).

А. Правила, используемые при построении вывода в направлении снизу вверх:

• в стиле^ Чёрча

• в стиле^ Карри

Б. Правила, используемые при построении вывода в направлении сверху вниз:

• в стиле Чёрча

• в стиле Карри

Восстановление Х-терма по заданному типу осуществляется путём построения вначале обратного вывода в направлении снизу вверх (при котором выделяются подтермы данного терма), затем — прямого вывода в направлении сверху вниз (при котором подтермы собираются в единый Х-терм с помощью операции «подстановка»).

Для систем Х2(Т№), Х2(Т(1)) (система типов ранга 1), Х2(Т), Х2(Т(2)) (система типов ранга 2) установлены следующие результаты о разрешимости приведённых выше задач — наличия алгоритмов решения (по [5; 8; 10; 12]) (табл. 2):

Заметим (по [13, с. 9]), что

1) неразрешимость TCP и TSP для Х2 в стиле Карри доказана в [14];

2) разрешимость TSP для Х2(Т№) с let-правилом в стиле Карри доказана в [9].

Для решения задачи TSP с let-правилом в стиле Карри существует алгоритм Дама-са-Милнера [1, с. 104-105], в котором уравнения на типах (получаемых при построении дерева вывода Х-терма) решаются по мере добавления в систему.

Также отметим, что для некоторого класса нетипизируемых Х-термов — Х-термов в слабой заголовочной нормальной форме (начинающиеся с абстракции) с рекурсивным типом — нами определён метод решения задачи TSP в системе Х2(Т(к)) (k=1,2,...) в стиле Карри, который будет представлен в соответствующей отдельной статье. Метод основывается на двухэтап-ном алгоритме Дамаса-Милнера (Хиндли-Милнера).

В заключение выделим основные понятия предшествующего учебного материала, задействованные в изучаемом разделе.

Семиотика.

Знать понятия: формальный язык, формальная система, интерпретация, синтаксис и семантика формальных языков.

Таблица2

Разрешимость классических задач системы 12

——^^^^ Задача TCP Т&Р TIP

Система типов ———

12(Tw) в стиле Карри разрешима разрешима разрешима

12(Tw) в стиле Чёрча разрешима разрешима разрешима

ЩТ(1)) разрешима разрешима разрешима

12(Tw) с let-правилом в стиле Карри неразрешима разрешима неразрешима

12(Tw) с let-правилом в стиле Чёрча неразрешима разрешима неразрешима

12(Т) в стиле Карри неразрешима неразрешима неразрешима

12(Т) в стиле Чёрча разрешима разрешима неразрешима

ЩТ(2)) разрешима

ЩТ(к)), k>2 неразрешима

Дискретная математика:

1) слова в алфавите. Знать понятия: алфавит, буква, слово в алфавите, операция и результат приписывания буквы (слова) к слову, подслово, вхождение (буквы) подслова в слово, операция и результат замены подслова исходного слова на слово, операция и результат подстановки слова вместо буквы в исходном слове. Уметь: осуществлять операцию замены подслова исходного слова на другое слово; осуществлять операцию под -становки вместо буквы исходного слова на другое слово;

2) формальные грамматики Хомского. Знать понятия: формальная грамматика, порождающая грамматика; отношение непосредственной выводимости; вывод цепочки; выводимая цепочка; терминальная цепочка, порождаемая грамматикой; язык, порождаемый формальной грамматикой. Уметь: выводить терминальную цепочку, порождаемую грамматикой.

Комбинаторная логика:

1) язык в алфавите бестипового X-исчисления. Знать: алфавит бестипового Х-исчисления; понятия: Х-терм, Х-формула бестипового Х-исчисления, Х-подтерм. Уметь: определять, является ли слово Х-термом, Х-формулой бестипового Х-ис-числения; доказывать, что слово является Х-термом, Х-формулой бестипового Х-ис-числения; опускать и восстанавливать скобки в записях Х-термов.

2) язык типизированного Х-исчисления Х^. Знать: алфавит типизированного Х-исчисления; понятия: тип, типизированный Х-терм, утверждение о типизации в Х^ в стиле Чёрча и в стиле Карри. Уметь: определять, является ли слово типизированным Х-термом; опускать и восстанавливать скобки в записях Х-термов и типов.

Математическая логика:

1) синтаксис языка первого порядка. Знать: язык в алфавите языка первого порядка; понятия «терм», «формула»; язык формальной системы первого порядка.

Уметь: определять связанное и свободное вхождение переменной в формулу;

2) подсистема гильбертовского исчисления второго порядка, содержащая только символы «—» и «V» (Ргор2) — интуиционистская пропозициональная логика второго порядка. Знать: подмножества формул языка второго порядка, содержащие только логическую связку (импликация) и квантор всеобщности «V»; подмножества правил гильбертовского исчисления (удаление дедукция, правило универсального обобщения, правило универсальной конкретизации); подмножества правил натурального вывода (дедукция, modus ponens, введение V, удаление V). Уметь: доказывать формулы в исчислении Prop2;

3) исчисление дедуктивных эквивалент-ностей. Знать понятия: дедуктивно эквивалентные формулы, универсальная формула (У-формула); доказуемые формулы гильбертовского исчисления, содержащие логическую связку (эквиваленция) и квантор всеобщности «V». Уметь: приводить формулу к универсальной формуле;

Логическое программирование: алгоритмы унификации термов.

Знать понятия: конкретизация, унификация; подстановка, композиция подстановок; унифицируемые термы, наиболее общий унификатор термов; рекурсивный и итеративный алгоритм унификации термов. Уметь: находить наиболее общий унификатор термов, используя рекурсивный и итеративный алгоритм унификации Робинсона; применять композицию подстановок к терму.

Выводы

Проведён логико-семиотический анализ содержания раздела «Полиморфная система типов Х2» в учебном курсе «Теоретическое программирование», в результате которого можно определить компетенции, которые представим в виде следующих типов задач (под компетенциями понимаются способы преобразования знаний в умения).

0. Вспомогательные задачи:

1) определение выводимости типа из контекста;

2) построение типа в заданном контексте;

3) доказательство выводимости типа из контекста;

4) приведение с помощью дедуктивных эквивалентностей формулы к универсальной формуле.

1. Классические задачи системы Х2:

Среди Х-термов в стиле Чёрча рассматриваются в том числе те, семантика которых определяет: логические связки и кванторы, булевы типы и логические операции, упорядоченные пары, нумералы, списки, примитивную рекурсию на нумералах.

2. Задачи на программирование :

1) Работа с программой M. Grabmueller (2006) [7], написанной на языке Haskell, в которой реализован алгоритм W, предложенный Р. Милнером (1978) (по некоторым источникам и Л. Дамасом), по выводу полиморфного типа в языке Haskell: запись Х-терма с помощью let-констру-кции и определение его типа при запуске программы.

2) Работа с программной моделью метода решения системы равенства типов с рекурсивным типом, получаемых при по -строении дерева вывода Х-терма в процессе решения задачи TSP в системе X2(T(k)) (k=1,2,...) в стиле Карри, реали-зованной нами на языке программирования Haskell:

а) получение типа заданного Х-терма в стиле Карри, предварительно вводя в программу систему равенства типов, составленную при «ручном» построении дерева вывода заданного Х-терма;

б) преобразование системы равенств типов, содержащих неоднозначное определение одного и того же типа (в том числе и рекурсивного) к виду, пригодному для решения с помощью алгоритма Робинсона [1, с. 98-99];

в) осуществление унификации двух типов с обработкой равенства типов, содержащего рекурсию;

3) Работа с интерпретатором GHCi-6.10.3, в который встроен механизм проверки типа для заданного Х-терма: запись в файл типизированного утверждения, например:

{-В LANGUAGE RankNTypes В-}

и решение задачи TCP для терма, указанного в файле:

> ghci.exe Exampls.hs

Загрузка главного модуля Main будет являться подтверждением того, что тип Х-терма соответствует.

4) Реализация алгоритма, определяющего длину типизированного Х-терма.

5) Реализация алгоритма, определяющего let-высотa (глубита) (X+le^-терма.

6) Реализация алгоритма стирания типа Х-терма.

7) Реализация двухэтапного алгоритма Дамаса-Милнера (Хиндли-Милнера) для решения задачи TSP в стиле Карри в системе Х2(Т).

8) Реализация алгоритма Дамаса — Мил-нера с немедленным разрешением.

9) Реализация алгоритма W (по [5, с. 360]), который приспособлен для «чистой реконструкции типов», то есть присвоения типов совершенно нетипизирован-ным термам в стиле ML (let-полиморфизм).

10) Компьютерная реализация экспоненциальной регрессии для длины Х-терма и, соответственно, его типа с возрастанием вложенных let-выражений при выполнении let-редукции. Проблема вывода «патологического» типа термов с вложенными let-выражениями была продемонстрирована независимо H. G. Mairson (1990) и группой исследователей A. J. Kfoury, J. Assaf, J. Tiu-ryn, P. Urzyczyn (1990).

СПИСОК ЛИТЕРАТУРЫ

1. ДовекЖ., ЛевиЖ.-Ж. Введение в теорию языков программирования. М.: ДМК Пресс, 2013. 134 с.

2. ЕршовЮ. Л., Палютин Е. А. Математическая логика. М.: Наука, 1979. 320 с.; 1987. 336 с.

3. Лаптев В. В., Рыжова Н. И., Швецкий М. В. Методическая теория обучения информатике. Аспекты фундаментальной подготовки. СПб.: Изд-во С.-Петерб. ун-та, 2003. 352 с.

4. Митчелл Дж. Основания языков программирования. М.; Ижевск: НИЦ «Регулярная и хаотическая динамика», 2010. 720 с.

5. Пирс Б. Типы в языках программирования. М.: Лямбда пресс; Добросвет, 2012. 656 с.

6. Френкель А., Бар-Хиллел И. Основания теории множеств. М.: Мир, 1966. 555 с.

7. Algorithm WStep by Step. [Электронный ресурс] // Home Comics Posts Publications Talks Misc About RSS. Электрон. дан. Режим доступа: http://catamorph.de/publications/2007-09-01-algorithm-w-step-by-step.html (дата обращения: 13.07.2015).

8. Barendregt H. Lambda calculi with types / Handbook of logic in computer science. Vol. 2. Oxford University Press, 1993.

9. Damas L., Milner R. Principal Type-schemes for Functional Programs // Principles of Programming Languages. ACM. 1982. Р. 207-212.

10. Geuvers H. Introduction to Type Theory / Alfa Lernet summer school, Uruguay, 2008.

11. Harrison J. Introduction to Functional Programming. Cambridge University, 1996/1997.

12. Kfoury A. J., Wells J. B. Principality and decidable type inference for finite-rank intersection types // ACM Symposium on Principles of Programming Languages (POPL), 1999. Р. 161-174.

13. Severi P. G. Normalization in Lambda Calculus and its relation to Type Inference // Thesis Technische Universiteit Eindhoven, 1996.

14. Wells J. B. Typeability and Type Checking in the Second Order Х-calculas are Equivalent Science // IEEE, 1994. Р. 176-185.

REFERENCES

1. DovekZh., Levi Zh.-Zh. Vvedenie v teoriyu yazykov programmirovaniya. M.: DMK Press, 2013. 134 s.

2. Ershov YU. L., Palyutin E. A. Matematicheskaya logika. M.: Nauka, 1979. 320 s.; 1987. 336 s.

3. Laptev V. V., Ryzhova N. I., SHveckij M. V. Metodicheskaya teoriya obucheniya informatike. Aspekty fundamental'noj podgotovki. SPb.: Izd-vo S.-Peterb. un-ta, 2003. 352 s.

4. Mitchell Dzh. Osnovaniya yazykov programmirovaniya. M.; Izhevsk: NIC «Regulyarnaya i haotich-eskaya dinamika», 2010. 720 s.

5. Pirs B. Tipy v yazykah programmirovaniya. M.: Lyambda press; Dobrosvet, 2012. 656 s.

6. Frenkel'A., Bar-HillelI. Osnovaniya teorii mnozhestv. M.: Mir, 1966. 555 s.

7. Algorithm W Step by Step. [Ehlektronnyj resurs] // Home Comics Posts Publications Talks Misc About RSS. Ehlektron. dan. Rezhim dostupa: http://catamorph.de/publications/2007-09-01-algorithm-w-step-by-step.html (data obrashcheniya: 13.07.2015).

8. Barendregt H. Lambda calculi with types / Handbook of logic in computer science. Vol. 2. Oxford University Press, 1993.

9. Damas L., Milner R. Principal Type-schemes for Functional Programs // Principles of Programming Languages, ACM, 1982. Р. 207-212.

10. Geuvers H. Introduction to Type Theory / Alfa Lernet summer school, Uruguay, 2008.

11. Harrison J. Introduction to Functional Programming. Cambridge University, 1996/1997.

12. Kfoury A. J., Wells J. B. Principality and decidable type inference for finite-rank intersection types // ACM Symposium on Principles of Programming Languages (POPL), 1999. Р. 161-174.

13. Severi P. G. Normalization in Lambda Calculus and its relation to Type Inference // Thesis Technische Universiteit Eindhoven, 1996.

14. Wells J. B. Typeability and Type Checking in the Second Order Х-calculas are Equivalent Science // IEEE, 1994. Р. 176-185.