Это не общий ответ на ваш вопрос, но по теореме о структурированном программировании все, что нужно, - это умение делать выбор (например, if
в C / C ++) и повторяться (например, while
в C / C ++). Редактировать: как отметил Дейв Кларк в комментариях, теорема о структурном программировании также требует последовательности. Первоначально я не перечислял это, поскольку считал само собой разумеющимся, что читатель поймет, что основные блоки других инструкций, такие как те, которые упоминались позже для чтения и записи в хранилище памяти и т. Д., Также были необходимы). Конечно, лучше быть явным; Вы должны быть в состоянии сделать эти вещи тоже.
Поскольку оба они могут быть реализованы с использованием инструкции условного перехода (например, JNZ
в x86), этого также достаточно для эквивалентности по Тьюрингу.
Обратите внимание, что требуются другие вещи, например, способность записывать неограниченное количество символов (например, биты ... 0 или 1) в некоторый вид внешнего хранилища памяти. В этом смысле реальные компьютеры не являются эквивалентными по Тьюрингу, поскольку ни один из них не имеет бесконечного объема памяти. Однако модель Тьюринга все еще полезна, поскольку объем памяти, как правило, огромен, и хотя любую проблему, которую может решить реальный компьютер, можно решить с помощью детерминированного конечного автомата, использование этой модели вычислений не особенно полезно (поскольку количество штатов было бы нелепо огромным).
Обратите внимание, что это не обязательно противоречит ответу sepp2k; это своего рода другой способ думать об одном и том же вопросе.
РЕДАКТИРОВАТЬ:
Также обратите внимание, что вам не нужно и то, if
и другое while
в C / C ++. Вы можете моделировать, if
используя while
следующие:
bool C;
// some code that sets C
if(C) { /* some other code /* }
// rest of the program
Следующий код всегда эквивалентен:
bool C;
// some code that sets C
bool C2 = C;
while(C2) { /* some other code /* C2 = false; }
// rest of the program
Ну ... конструкция должна работать и быть возможной, если вы осторожны, то есть. Также обратите внимание, что если у вас есть рекурсивные функции, вам в конечном итоге также понадобится выбор; поскольку рекурсивные функции без выделения не могут реально реализовать базовые случаи, поэтому любая рекурсивная функция может привести к бесконечной рекурсии.
РЕДАКТИРОВАТЬ:
Кроме того, что касается вашего вопроса относительно того, является ли способность писать программу, которая не останавливается, достаточной для эквивалентности по Тьюрингу, ответ - нет; это необходимо, но не достаточно. Мы можем решить проблему остановки для программ, написанных на языке, который не может выразить программы, которые не могут остановиться; ответ «программа останавливается» для всех случаев. Однако мы можем определить язык, в котором единственная инструкция заставляет машину войти в бесконечный цикл ... такой язык не эквивалентен по Тьюрингу.