| |||
The Emissia.Offline Letters Электронное научное издание (научно-педагогический интернет-журнал) | |||
Издается с 7 ноября 1995 г. Учредитель: Российский государственный педагогический университет им. А.И.Герцена. ISSN 1997-8588 | |||
| |||
Кудрявцева Ирина Андреевна Использование эзотерического языка Unlambda в процессе обучения теоретическому программированию студентов IT-специальностей
Аннотация:
Ключевые слова:
В данной статье обоснуем возможность включения языка программирования Unlambda в процесс обучения теоретическому программированию, которое связано с рассмотрением математических моделей программ, представляющих собой исчисления, рассматриваемые в математической логике, а именно: λ-исчисление и исчисление комбинаторов; часто в теоретическое программирование включают теорию типов и семантическую теорию языков программирования. Более того, метаязыком, используемым при описании математических моделей программ, является теория категорий. Язык Unlambda был изобретён Д.Мэдором [1] как эзотерический функциональный язык, основанный на комбинаторном исчислении в базисе {S,K} без использования операции абстракции (отсюда и название языка - Unlambda). Представим основные сущности языка Unlambda, которые выражают его функциональность и эзотеричность.
Отметим, что комбинаторы K и S, выраженные в языке соответствующими функциями k и s, представляют собой достаточный набор для того, чтобы сделать язык Unlambda замкнутым по Тьюрингу. Данный факт отражает мощь комбинаторного языка. Использование в написании программ только двух комбинаторов делает язык Unlambda трудным и непонятным для непосвящённых, поэтому его относят к эзотерическим языкам программирования. Прилагательное в названии семейства языков происходит от гр. esoterikos - внутренний, тайный, скрытый, предназначенный для посвящённых [2].
Для применения функции к нескольким аргументам требуется произвести каррирование этой функции. Каррингом (каррированием) (по [3,с.107]) называется явление, при котором для функции нескольких аргументов появляется возможность зафиксировать несколько первых из них: сам процесс фиксации аргументов и подготовка функции к возможности их фиксации. Каррированные функции "предполагают", что их можно применять к неполному числу аргументов (частичное применение), и результатом такого применения будут новые функции, которые "ожидают" на свой вход оставшиеся аргументы. Приведём пример применения операции аппликации для комбинаторов K и S. Вначале вспомним строение и комбинаторную характеристику базисных комбинаторов бестипового λ-исчисления: В языке Unlambda это записывается так: ``kxy=x;
В языке Unlambda это записывается так: ```sxyz=``xz`yz. Операция аппликации в языке Unlambda способствует каррингу и придаёт ещё большую "функциональность" программам на этом языке.
Помимо функций, составляющих ядро языка Unlambda, существуют дополнительные функции [4], которые называются встроенными функциями (заметим, что отсутствуют функции, определяемые пользователем). Перечислим достоинства языка Unlambda с позиции его рассмотрения в обучении теоретическому программированию.
Отметим, что существует высокоуровневый язык Haskell, на котором можно программировать с помощью встроенных комбинаторов K, I, B, C, а также известных комбинаторов λ-исчисления (например, S, W, Y), легко моделирующихся на данном языке.
Известно, что бестиповое λ-исчисление можно трактовать как язык программирования. Примитивами для программирования выступают замкнутые λ-термы, находящиеся в нормальной форме; базовые операции над примитивами также представляются замкнутыми λ-термами, находящимися в нормальной форме, а исполнение программ сводится к последовательности β-преобразований. Функциональные возможности интерпретатора λ-термов приведены в нашей статье [5]. Поскольку комбинатор - это замкнутый λ-терм, то для программирования на языке Unlambda достаточно иметь транслятор для перевода замкнутого λ-терма в комбинатор базиса {S,K,I}. Рассмотрим подробно процесс исключения абстракции (англ. unlambdaification) в языке Unlambda, опираясь на рекомендации, приведённые в статье [4]. Пусть λ - абстракция, обозначаемая далее по тексту в программной реализации символом "^", а $x - символ с переменным значением: (1) если F - встроенная функция Unlambda, то ^xF является постоянной функцией со значением F; поскольку
(2) если F=$x, то ^xF является значением $x; поскольку
(3) если F=`GM, то ^xF является результатом применения аппликации G к M; поскольку
Таким образом, процесс исключения абстракции можно автоматизировать. Просматривая выражение F с абстракцией (^x) слева направо и встречая: (1) символ '`' - заменяем его на ``s; (2) переменную $x (совпадающую по названию с переменной абстракции) - заменяем её на i; (3) встроенную или любую другую переменную, отличную от $x, - приписываем к ней префикс `k. Приведём пример преобразования нумерала Чёрча, выраженного замкнутым λ-термом, в комбинатор базиса {S,K,I}:
Теперь продемонстрируем результаты трансформации λ-термов в комбинаторы языка Unlambda для моделирования элементов потока управления, а также арифметических функций над нумералами Чёрча: (а) построим функцию для вывода нумерала n в виде последовательности n символов '*' по λ-терму, представляющему собой композицию встроенных функций Unlambda [4]:
(б) построим функцию для умножения двух нумералов на языке λ-термов:
Доказательство утверждения ‘’s’’s’ksk’ki=i
В результате последовательности трансформаций программа на языке Unlambda будет выглядеть так (# - однострочный комментарий):
При запуске программы на экран будут выведены два символа '*'; (в) построим функцию организации ветвления алгоритма на языке λ-термов:
В результате последовательности трансформаций программа на языке Unlambda будет выглядеть так:
При запуске программы на экран выведется символ '*' (нумерал 1). Если в программе поменять значение "Истина" на значение "Ложь"
то на экран будут выведены два символа '*' (нумерал 2). В заключение упомянем организацию циклических процессов. Известно, что в теории бестипового λ-исчисления существуют комбинаторы неподвижной точки для организации процесса рекурсии. Поэтому, имея реализацию рекурсивной функции на языке λ-термов, можно с помощью транслятора получить программу на языке Unlambda. 3. Автоматический вывод программ на языке Unlambda из соответствующих λ-термов, а также знание строения некоторых комбинаторов позволит пополнять набор равенств комбинаторов и впоследствии упрощать программы на языке Unlambda. Например, приведённые выше выкладки по преобразованию нумерала one в комбинатор базиса {S,K,I} привели к результату, отличному от результата, приведённого в [4]. Итак, появляется утверждение
которое требует доказательства:
Теперь доказанным утверждением можно пополнить базу равенств комбинаторов в программе по упрощению программ на Unlambda. Подводя итоги, отметим, что язык Unlambda: (1) является концептуальным низкоуровневым языком теоретического программирования; (2) является (как эзотерический язык) хорошей проверкой знаний элементов бестипового λ-исчисления: программирование в терминах λ-термов и построение доказательств λ-формул; (3) представляет собой реальный язык программирования при наличии набора комбинаторов, полученных из примитивов и операций бестипового λ-исчисления; (4) имеет множество реализаций на разных языках программирования (CAML, Java, Perl, Scheme, SML) [4], одна из которых представлена на языке C (D.A.Madore,1999). Кроме этого, нами [6,с.418-422] написан транслятор на языке Haskell по преобразованию λ-термов в комбинаторы базиса {S,K,I} и упрощению полученных комбинаторов в соответствии с базой равенств комбинаторов. Литература
Рекомендовано к
публикации:
Irina A.
Kudryavtseva
Use Unlambda esoteric language in the learning process of theoretical programming students IT-specialties The author allocates advantages of programming language Unlambda with positions of training to theoretical programming. The basic are considered essence of language Unlambda, expressing its functionality and esoteric. As a result, stated justifications for the use of language in the learning process Unlambda theoretical programming.
Key words Literature
| |||
| |||
Copyright (C) 2015, Письма в
Эмиссия.Оффлайн (The Emissia.Offline Letters) ISSN 1997-8588. Свидетельство о регистрации СМИ Эл № ФС77-33379 (000863) от 02.10.2008 от Федеральной службы по надзору в сфере связи и массовых коммуникаций При перепечатке и цитировании просим ссылаться на " Письма в Эмиссия.Оффлайн ". Эл.почта: emissia@mail.ru Internet: http://www.emissia.org/ Тел.: +7-812-9817711, +7-904-3301873 Адрес редакции: 191186, Санкт-Петербург, наб. р. Мойки, 48, РГПУ им. А.И.Герцена, корп.11, к.24а |