BlooP и FlooP - BlooP and FlooP
BlooP и FlooP просты языки программирования разработано Дуглас Хофштадтер чтобы проиллюстрировать точку в его книге Гедель, Эшер, Бах.[1] BlooP - это неполный по Тьюрингу язык программирования основная структура потока управления которой является ограниченным петля (т.е. рекурсия не допускается). Все программы на этом языке должны завершаться, и этот язык может только выражать примитивные рекурсивные функции.[2]
FlooP идентичен BlooP, за исключением того, что он поддерживает неограниченные циклы; это полный по Тьюрингу язык и может выразить все вычислимые функции. Например, он может выражать Функция Аккермана, который (не будучи примитивно рекурсивным) не может быть записан в BlooP. Заимствуя стандартную терминологию в математическая логика,[3][4] Хофштадтер называет неограниченные петли FlooP MU-петлями. Как и все языки программирования, полные по Тьюрингу, FlooP страдает от проблема остановки: программы могут не завершаться, и, как правило, невозможно решить, какие программы завершаются.
BlooP и FlooP можно рассматривать как модели вычислений, и иногда использовались при обучении вычислимости.[5]
Примеры BlooP
Единственный переменные находятся выход
(возвращаемое значение процедуры) и клетка(я)
(неограниченная последовательность натуральных чисел, индексированная константами, как в Неограниченный регистр машины[6]). Единственный операторы находятся ⇐
(назначение ), +
(добавление), ×
(умножение), <
(меньше, чем), >
(больше чем) и =
(равно).
Каждая программа использует только конечное количество ячеек, но числа в ячейках могут быть сколь угодно большими. Структуры данных, такие как списки или стеки, можно обрабатывать, интерпретируя число в ячейке определенным образом, т. Е. Гёделевская нумерация возможные конструкции.
Конструкции потока управления включают ограниченные циклы, условные утверждения, ABORT
выпрыгивает из петель, и ПОКИДАТЬ
выпрыгивает из блоков. BlooP не допускает рекурсии, неограниченных переходов или чего-либо еще, что могло бы иметь тот же эффект, что и неограниченные циклы FlooP. Именованные процедуры могут быть определены, но они могут вызывать только ранее определенные процедуры.[7]
Факториальная функция
ОПРЕДЕЛЕНИЕ ПРОЦЕДУРЫ ФАКТОРИАЛ [N]: БЛОК 0: НАЧАЛО ВЫВОДА ⇐ 1; ЯЧЕЙКА (0) ⇐ 1; ЦИКЛ НА БОЛЬШИНСТВЕ N РАЗ: БЛОК 1: НАЧАЛО ВЫХОДА ⇐ ВЫХОД × ЯЧЕЙКА (0); ЯЧЕЙКА (0) ⇐ ЯЧЕЙКА (0) + 1; БЛОК 1: КОНЕЦ; БЛОК 0: КОНЕЦ.
Функция вычитания
Это не встроенная операция и (будучи определена для натуральных чисел) никогда не дает отрицательного результата (например, 2–3: = 0). Обратите внимание, что ВЫХОД
начинается с 0, как и все КЛЕТКА
s и поэтому не требует инициализации.
ОПРЕДЕЛЕНИЕ ПРОЦЕДУРЫ МИНУС [M, N]: БЛОК 0: НАЧАТЬ, ЕСЛИ MПример FlooP
Пример ниже, который реализует Функция Аккермана, полагается на моделирование стека с помощью Гёделевская нумерация: то есть на ранее определенных числовых функциях
ТОЛКАТЬ
,Поп
, иВЕРХ
удовлетворениеPUSH [N, S]> 0
,TOP [НАЖАТЬ [N, S]] = N
, иPOP [PUSH [N, S]] = S
. Поскольку безграничныйMU-LOOP
используется, это незаконная программа BlooP. ВВЫЙТИ БЛОК
инструкции в этом случае переходят к концу блока и повторяют цикл, в отличие отABORT
, который выходит из цикла.[3]ОПРЕДЕЛЕНИЕ ПРОЦЕДУРЫ АККЕРМАН [M, N]: БЛОК 0: НАЧАЛО ЯЧЕЙКИ (0) ⇐ M; ВЫХОД ⇐ N; ЯЧЕЙКА (1) 0; MU-LOOP: BLOCK 1: BEGIN IF CELL (0) = 0, THEN: BLOCK 2: BEGIN OUTPUT ⇐ OUTPUT + 1; ЕСЛИ CELL (1) = 0, ТО: ПРЕРЫВАТЬ ЦИКЛ 1; ЯЧЕЙКА (0) ⇐ ВЕРХНЯЯ [ЯЧЕЙКА (1)]; ЯЧЕЙКА (1) ⇐ POP [ЯЧЕЙКА (1)]; ВЫЙТИ БЛОК 1; БЛОК 2: КОНЕЦ, ЕСЛИ ВЫХОД = 0, ТО: БЛОК 3: НАЧАЛО ВЫХОДА ⇐ 1; ЯЧЕЙКА (0) ⇐ МИНУС [ЯЧЕЙКА (0), 1]; ВЫЙТИ БЛОК 1; БЛОК 3: КОНЕЦ ВЫХОДА ⇐ МИНУС [ВЫХОД, 1]; ЯЧЕЙКА (1) ⇐ НАЖАТЬ [МИНУС [ЯЧЕЙКА (0), 1], ЯЧЕЙКА (1)]; БЛОК 1: КОНЕЦ; БЛОК 0: КОНЕЦ.Смотрите также
Рекомендации
- ^ Дуглас Хофштадтер (1979), Гедель, Эшер, Бах, Основные книги, Глава XIII.
- ^ Стэнфордская энциклопедия философии: вычислимость и сложность
- ^ а б Хофштадтер (1979), стр. 424.
- ^ Томас Форстер (2003), Логика, индукция и множества, Cambridge University Press, стр. 130.
- ^ Дэвид Микс Баррингтон (2004), CMPSCI 601: Теория вычислений, Массачусетский университет, Амхерст, Лекция 27.
- ^ Хофштадтер называет эти ячейки набором «вспомогательных переменных».
- ^ Хофштадтер (1979), стр. 413.
внешняя ссылка