
- •Лекция 5. Ламбда-исчисление как формализация языка функционального программирования
- •5.2. Аксиомы ламбда-исчисления
- •5.2.1. Конвертируемость
- •6.1. Понятие комбинатора
- •6.2. Комбинаторная логика как формальная система
- •6.2.1. Правила конструирования допустимых для заданного алфавита комбинаторных выражений (термов).
- •6.2.2. Аксиомы комбинаторной логики
- •6.2.3.Умолчания
- •6.2.4. Синтаксис выражений комбинаторной логики
- •6.2.5. Редукция комбинаторных термов
- •6.2.6. Базис термов
- •7.1. Определение типов
- •7.2. Аксиомы вывода типа комбинатора
- •7.3. Типизация выражений в sml
- •7.3.1. Схема типизации
- •7.3.2. Выводимость типов
- •7.3.3. Полиморфная типизация
- •7.4. Преимущества типизации
- •7.5. Применение типизации
- •7.5.1. Статическая типизация
- •7.5.2. Полимофная типизация
- •7.6. Управление типами в технологии .Net
6.2.5. Редукция комбинаторных термов
Напомним, что одной из основных причин возникновения ламбда-исчисления была необходимость исследовать возможность кратчайшей перезаписи выражения (функции) с сохранением эквивалентного значения. Для реализации этой возможности вводилось преобразование редукции ламбда-термов.
В комбинаторной логике наследуется возможность редукции. Поскольку она интересна теоретически (для сокращения выкладок) и полезна практически (для оптимизации программного кода абстрактных машин), рассмотрим ее более подробно.
В ходе исследований выяснилось, что редукция (преобразование для сокращения записи) комбинаторных термов возможна в соответствии с правилами вывода, аналогичными аксиомам (K) и (S).
Пример моделирования механизма редукции следующим
Рассмотрим комбинаторный терм вида
SKKx.
Пользуясь аксиомами (К) и (S), а также правилами вывода, произведем редукцию терма:
SKKx = (по правилу S) Kx(Kx) = (по правилу K) x.
В результате получаем, что SKKx = x, откуда, с учетом аксиом и правила (I), I = SKK.
Как видно из предыдущего примера, одни комбинаторы можно выразить через другие.
6.2.6. Базис термов
Возникает вопрос: существует ли конечный набор комбинаторов, посредством которого можно выразить произвольный терм комбинаторной логики? Оказывается, что ответ на поставленный вопрос утвердителен, причем введенные аксиомы и правила вывода обеспечивают весьма лаконичный набор такого рода.
Необходимость продолжения рассуждений приводит нас к понятию базиса.
Определение 6.3. Базисом (минимальным) называется множество (минимальной мощности) комбинаторов, через элементы которого может быть выражен произвольный комбинатор.
Оказывается, можно доказать, что:
базис термов для комбинаторной логики действительно существует (причем существует бесконечное множество возможных базисов);
для любого базиса справедливо, что он обеспечивает представление произвольного комбинаторного терма (в силу свойства полноты, которым обладает система комбинаторной логики);
минимальный базис состоит всего из двух "инструкций"-комбинаторов, например, {K,S}.
Приведем еще несколько примеров базисов:
{I,K,S}; {I,B,C,S}; {B,W,K}.
Разложение термов в базисе {K,S} для ранее рассмотренных комбинаторов имеет вид:
B = S(KS)K; W = SS(K(SKK)); C = S(BBS)(KK).
Разложение в базисе аналогично программированию на языке базисных инструкций.
В качестве иллюстрации естественности применения формальной системы комбинаторной логики для моделирования языка функционального программирования SML приведем определения функций, реализующих характеристики некоторых из базисных комбинаторов:
fun Ix = x; |
Функция I реализует комбинатор тождества I |
fun Kxy = x; |
функция K - комбинатор-канцелятор K |
fun Sxyz = xz(yz); |
функция S - комбинатор-коннектор S |
Для более подробного самостоятельного ознакомления с тематикой лекции рекомендуется следующий список источников: [32, 43, 44, 76].
Лекція 7. Теория типов и комбинаторная логика
В данной лекции исследуются принципы, математическое основание и выразительные возможности теории типов и типизированной комбинаторной логики - математической формализации, моделирующей типы выражений в языках программирования.
Комбинаторная логика обладает возможностью не только моделировать процесс реализации программного обеспечения на языке функционального программирования, но и прозрачно формализовать процедуру приписывания типов объектам этого языка.
Рассмотрим построение системы типизации на основе комбинаторной логики.