Я знаю, что в императивных языках программирования цикла while-do достаточно в качестве конструкции потока управления, чтобы сделать язык Тьюринга завершенным (что касается потока управления - конечно, нам также нужна неограниченная память и некоторые операторы ...) , Суть моего вопроса такова: имеет ли цикл do-while ту же вычислительную мощность, что и цикл while-do? Другими словами, может ли язык быть полным по Тьюрингу, если невозможно полностью пропустить инструкции.
Я понимаю, что некоторая семантика здесь может быть немного двусмысленной, поэтому позвольте мне сформулировать реальный вопрос на конкретном примере:
Brainfuck (BF) - это тарпит Тьюринга, где единственным потоком управления является цикл while-do, обозначенный как [...]
(в конце вопроса есть полная языковая спецификация, если вы не знакомы с Brainfuck). Давайте определим новый язык BF *, который ,.+-<>
имеет ту же семантику, что и в BF, но вместо этого []
мы имеем {}
обозначение цикла do-while. То есть единственное отличие от BF состоит в том, что каждый цикл выполняется по крайней мере один раз, прежде чем можно будет пропустить дальнейшие итерации.
Является ли BF * Turing-complete? Если это так, мне было бы интересно, как я могу перевести BF на BF *. Если это не так, как мне доказать это?
Некоторые мои собственные наблюдения:
- Не каждая программа BF может быть переведена на BF *. Например, невозможно написать программу на языке BF *, которая может или не может читать или печатать значение - если программа потенциально печатает одно или несколько значений, она всегда будет печатать хотя бы одно. Однако может существовать полное по Тьюрингу подмножество BF, которое можно перевести в BF *.
- Мы не можем просто перевести
[f]
(гдеf
произвольная программа Brainfuck состоит только из+-[]<>
) в (в попытке отменить эффект первой итерации), потому что а) не каждая вычислимая функция имеет вычислимую обратную и б), даже если бы она имела, не обязательно иметь меньше циклов, чем рекурсивное, поэтому применение этого шага не гарантированно завершится.f-1{f}
f-1
f
Вот краткий обзор языка Brainfuck. Brainfuck работает на бесконечной ленте, где каждая ячейка содержит байтовые значения, изначально равные нулю. Переполнения оборачиваются вокруг, поэтому приращение 255 дает 0 и наоборот. Язык состоит из 8 инструкций:
+ Increment the current cell.
- Decrement the current cell.
> Move tape head to the right.
< Move tape head to the left.
, Input a character from STDIN into the current cell.
. Output the current cell as a character to STDOUT.
[ If the current cell is zero, jump past the matching ].
] If the current cell is non-zero, jump back to just behind the matching [.
[]
точно не определяет цикл "пока делай" в BF. как и в вашей таблице, левая и правая скобки оценивают текущую ячейку ноль / ненулевое значение. так каково точное описание соответствующей {}
логики оценки фигурных скобок? предложить дальнейший диалог / обсуждение в информатическом чате . также ваши «наблюдения» больше похожи на «постулаты» или «предложения» без доказательств.
{}
было бы {
вообще ничего не делать и так }
же, как ]
. У меня не будет много времени в течение следующих нескольких дней, но я присоединюсь к вам в чате, когда найду время.
{}
и удалением []
является BF * Turing завершенным. с пониманием того, что BF []
является конструкцией, которая является чем-то вроде / аналогичным циклу while-do в полных языках Тьюринга.