Я знаю, що в імперативних мовах програмування цикл time-do є достатнім як конструкція потоку управління, щоб зробити мову Turing-повною (що стосується потоку управління - звичайно, нам також потрібна необмежена пам'ять і певні оператори ...) . Суть мого питання полягає в тому: чи цикл do-while має таку ж обчислювальну потужність, що і цикл while-do? Іншими словами, чи може бути мовою Тюрінг повною, якщо неможливо повністю пропустити інструкції.
Я розумію, що частина семантики тут може бути дещо неоднозначною, тому дозвольте сформулювати власне питання на конкретному прикладі:
Brainfuck (BF) - це Тарріт Тюрінга, де єдиним керуючим потоком є цикл "time-do", позначений як [...]
(у нижній частині питання є повна специфікація мови, якщо ви не знайомі з Brainfuck). Давайте визначимо нову мову BF *, де ,.+-<>
мають ту саму семантику, що й у BF, але замість цього []
ми маємо, {}
що позначає цикл do-while. Тобто, єдиною відмінністю BF є те, що кожен цикл виконується принаймні один раз, перш ніж можна пропустити подальші ітерації.
Чи завершено BF * Turing? Якщо це так, мені було б цікаво, як я міг би перевести 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 [.
[]
не точно визначає цикл "while do" в BF. як у вашій таблиці лівий і правий дужки оцінюють поточну комірку нуль / нуль. так що точний опис відповідної {}
логіки оцінки брекетів? запропонуйте подальший діалог / обговорення в чаті з інформатики . також ваші "спостереження" більше схожі на "постулати" або "пропозиції" без доказів.
{}
буде змусити {
взагалі нічого не робити і }
таким же, як ]
. У наступних кількох днів у мене не буде багато часу, але я приєднаюся до вас у чаті, коли знайду якийсь час.
{}
та відніманням []
, BF * Turing завершений. з розумінням того, що BF []
- це конструкт лише щось на зразок / аналогічне циклу while-do в Turing повних мовах.