БлуП и ФлуП
BlooP и FlooP ( Ограниченный цикл и Свободный цикл ) — простые языки программирования, разработанные Дугласом Хофштадтером для иллюстрации мысли из его книги «Гедель, Эшер, Бах» . [1] BlooP — это неполный по Тьюрингу язык программирования , основная структура потока управления которого представляет собой ограниченный цикл (т. е. рекурсия не разрешена). [ нужна ссылка ] ). Все программы на языке должны завершаться, а этот язык может выражать только примитивно-рекурсивные функции . [2]
FlooP идентичен BlooP, за исключением того, что он поддерживает неограниченные циклы; это тьюринг-полный язык, который может выражать все вычислимые функции . Например, он может выражать функцию Аккермана , которую (не будучи примитивно-рекурсивной) нельзя написать в BlooP. Заимствуя стандартную терминологию математической логики , [3] [4] Хофштадтер называет неограниченные циклы FlooP MU-петлями. Как и все тьюринг-полные языки программирования, FlooP страдает от проблемы остановки : программы могут не завершаться, и в целом невозможно решить, какие программы завершают работу.
BlooP и FlooP можно рассматривать как модели вычислений , и иногда их используют при обучении вычислимости. [5]
Примеры BlooP [ править ]
Единственными переменными являются OUTPUT
(возвращаемое значение процедуры) и CELL(i)
(неограниченная последовательность переменных натуральных чисел, индексированных константами, как в неограниченной регистровой машине [6] ). Единственные операторы ⇐
( назначение ), +
(добавление), ×
(умножение), <
(меньше, чем), >
(больше чем) и =
(равен).
Каждая программа использует только конечное число ячеек, но числа в ячейках могут быть сколь угодно большими. Структуры данных, такие как списки или стеки, можно обрабатывать, интерпретируя число в ячейке определенным образом, то есть путем нумерации возможных структур по Гёделю.
Конструкции потока управления включают ограниченные циклы, условные операторы , ABORT
выпрыгивает из петель и QUIT
выпрыгивает из блоков. BlooP не допускает рекурсию, неограниченные переходы или что-либо еще, что имело бы тот же эффект, что и неограниченные циклы FlooP. Можно определить именованные процедуры, но они могут вызывать только ранее определенные процедуры. [7]
Факториал [ править ]
DEFINE PROCEDURE FACTORIAL [N]: BLOCK 0: BEGIN OUTPUT ⇐ 1; CELL(0) ⇐ 1; LOOP AT MOST N TIMES: BLOCK 1: BEGIN OUTPUT ⇐ OUTPUT × CELL(0); CELL(0) ⇐ CELL(0) + 1; BLOCK 1: END; BLOCK 0: END.
Функция вычитания [ править ]
Это не встроенная операция и (определяемая для натуральных чисел) никогда не дает отрицательного результата (например, 2 − 3 := 0). Обратите внимание, что OUTPUT
начинается с 0, как и все CELL
s и поэтому не требует инициализации.
DEFINE PROCEDURE MINUS [M,N]: BLOCK 0: BEGIN IF M < N, THEN: QUIT BLOCK 0; LOOP AT MOST M + 1 TIMES: BLOCK 1: BEGIN IF OUTPUT + N = M, THEN: ABORT LOOP 1; OUTPUT ⇐ OUTPUT + 1; BLOCK 1: END; BLOCK 0: END.
Пример FlooP [ править ]
Приведенный ниже пример, реализующий функцию Аккермана , основан на моделировании стека с использованием нумерации Гёделя : то есть на ранее определенных числовых функциях. PUSH
, POP
, и TOP
удовлетворяющий PUSH [N, S] > 0
, TOP [PUSH [N, S]] = N
, и POP [PUSH [N, S]] = S
. Поскольку неограниченное MU-LOOP
используется, это не легальная программа BlooP. QUIT BLOCK
инструкции в этом случае переходят в конец блока и повторяют цикл, в отличие от ABORT
, который выходит из цикла. [3]
DEFINE PROCEDURE ACKERMANN [M, N]: BLOCK 0: BEGIN CELL(0) ⇐ M; OUTPUT ⇐ N; CELL(1) ⇐ 0; MU-LOOP: BLOCK 1: BEGIN IF CELL(0) = 0, THEN: BLOCK 2: BEGIN OUTPUT ⇐ OUTPUT + 1; IF CELL(1) = 0, THEN: ABORT LOOP 1; CELL(0) ⇐ TOP [CELL(1)]; CELL(1) ⇐ POP [CELL(1)]; QUIT BLOCK 1; BLOCK 2: END IF OUTPUT = 0, THEN: BLOCK 3: BEGIN OUTPUT ⇐ 1; CELL(0) ⇐ MINUS [CELL(0), 1]; QUIT BLOCK 1; BLOCK 3: END OUTPUT ⇐ MINUS [OUTPUT, 1]; CELL(1) ⇐ PUSH [MINUS [CELL(0), 1], CELL(1)]; BLOCK 1: END; BLOCK 0: END.
См. также [ править ]
Ссылки [ править ]
- ^ Дуглас Хофштадтер (1979), Гёдель, Эшер, Бах , Basic Books, Глава XIII.
- ^ Стэнфордская энциклопедия философии: вычислимость и сложность
- ↑ Перейти обратно: Перейти обратно: а б Хофштадтер (1979), с. 424.
- ^ Томас Форстер (2003), Логика, индукция и множества , издательство Кембриджского университета, стр. 130.
- ^ Дэвид Микс Баррингтон (2004), CMPSCI 601: Теория вычислений, Массачусетский университет в Амхерсте, Лекция 27 .
- ^ Хофштадтер называет эти ячейки набором «вспомогательных переменных».
- ^ Хофштадтер (1979), с. 413.