Войти  |  Регистрация
Авторизация

Thue



Thue (/ˈtuːeɪ/) — эзотерический язык программирования, разработанный Джоном Колагойя в начале 2000 года. Это мета-язык, который демонстрирует нулевой тип в иерархии Хомского, то есть неограниченную грамматику. Thue позволяет определять любые языки и является полным по Тьюрингу.

Автор описывает его следующим образом: «Thue представляет собой простейшую демонстрацию программирования в ограничениях. Именно за счёт этой парадигмы язык аналогичен языкам URISC императивной парадигмы. Другими словами это Тьюринговская трясина».

Правила

Программа на языке Thue состоит из таблицы правил и начального состояния. Таблица правил состоит из простых определений вида

A ::= B

A и B могут состоять как из отдельных букв и символов так и из их групп. Может существовать множество правил с одинаковым A и разными B. Таблица правил заканчивается пустым правилом:

::=

Начальное состояние представляет собой строку символов, записанную после таблицы правил.

Работа программы состоит в поиске исходных (левых) символов и замене их на правые в соответствии с правилом.

Работа завершается когда к строке нельзя применить ни одного правила.

Таким образом программа на Thue аналогична машине Тьюринга: имеется лента символов и имеется набор правил по которым они заменяются.

Недетерминированность

Одна из ключевых особенностей языка заключается в недетерминированном порядке выбора.

Если в строке имеется несколько символов, к которым может быть применено правило, то оно будет применено к случайно выбранному символу.

Если определено несколько правил для одного символа, то будет применено случайно выбранное правило.

Ввод / вывод

Для реализации ввода и вывода в языке есть особая форма правил. Для вывода символов используется тильда:

A::=~строка символов

Это правило убирает A из строки и выводит все символы, идущие после тильды.

Для ввода три двоеточия:

A::=:::

Это правило заменяет A на строку, прочитанную из ввода.

Примеры программ

«Hello World!» на Thue:

a::=~Hello World! ::= a

В языке нет переменных как понятия. Поэтому для каких-либо вычислений нужно задавать соответствующие системы правил. Следующая программа демонстрирует инкрементацию двоичного числа (увеличение на единицу). Число записано символьно и отмечено по краям знаком подчёркивания:

1_::=1++ 0_::=1 01++::=10 11++::=1++0 _0::=_ _1++::=10 ::= _1111111111_

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

Следующая программа демонстрирует реализацию циклов и недетерминизм правил:

b::=~0 b::=~1 xx::=xbx ::= xbx

Эта программа выводит бесконечную строку единиц и нулей. Цикличность обеспечивается следующим образом: после каждого вывода символ b удаляется из строки xbx, оставшиеся символы xx заменяются на xbx, воспроизводя начальное состояние. Таким образом возможно создание ограниченных циклов, число итераций которых задаётся числом определённых символов или наборов символов в строке:

_x::=i_ i::=~test! ::= _xxxxx

Эта программа 5 раз выведет строку test! Обратите внимание, что порядок замены i и _x при этом неопределён. То есть в процессе выполнения программа может как сразу обрабатывать i по мере их появления, так и выбрать из строки все x сразу.


Добавить комментарий
Ваше Имя:
Ваш E-Mail:
  • bowtiesmilelaughingblushsmileyrelaxedsmirk
    heart_eyeskissing_heartkissing_closed_eyesflushedrelievedsatisfiedgrin
    winkstuck_out_tongue_winking_eyestuck_out_tongue_closed_eyesgrinningkissingstuck_out_tonguesleeping
    worriedfrowninganguishedopen_mouthgrimacingconfusedhushed
    expressionlessunamusedsweat_smilesweatdisappointed_relievedwearypensive
    disappointedconfoundedfearfulcold_sweatperseverecrysob
    joyastonishedscreamtired_faceangryragetriumph
    sleepyyummasksunglassesdizzy_faceimpsmiling_imp
    neutral_faceno_mouthinnocent