Закрытие языков, не содержащих Тьюринга

Проблема с остановкой не может быть решена для полных языков Turing, и ее можно решить тривиально для некоторых не-TC-языков, таких как регулярные выражения, где он всегда останавливается.

Мне было интересно, есть ли какие-либо языки, которые имеют как возможность останавливаться, так и не останавливаться, но допускают алгоритм, который может определить, останавливается ли он.

Ответ 1

Да. Одним из важных классов такого рода являются примитивно-рекурсивные функции. Этот класс включает в себя все основные вещи, которые вы ожидаете от числа чисел (добавление, умножение и т.д.), А также некоторые сложные классы, такие как @adrian (регулярные выражения/конечные автоматы, контекстно-свободные грамматики/автоматы). Однако существуют функции, которые не являются примитивными рекурсивными, например функция Ackermann.

На самом деле довольно легко понять примитивно-рекурсивные функции. Это функции, которые вы могли бы получить на языке программирования, у которого не было истинной рекурсии (поэтому функция f не может вызывать себя непосредственно или путем вызова другой функции g, которая затем вызывает f и т.д.) И не имеет никаких циклов while, вместо этого были ограничены для циклов. Ограниченный for-loop является одним из "для я от 1 до r", где r - переменная, которая уже была вычислена ранее в программе; также, я не могу быть изменен внутри цикла for. Точка такого языка программирования заключается в том, что каждая программа останавливается.

Большинство программ, которые мы пишем, на самом деле примитивно рекурсивные (я имею в виду, их можно перевести на такой язык).

Ответ 2

Проблема останавливается на языках. Скорее, он действует на машины (т.е. программ): он задает вопрос о том, останавливается ли данная программа на заданном входе.

Возможно, вы хотели спросить, можно ли его решить для других моделей вычисление (например, регулярные выражения, которые вы упоминаете, но также push-down automata).

Отключение может вообще обнаруживаться в моделях с ограниченными ресурсами (например, регулярных выражений или, что то же самое, конечных автоматов, имеющих фиксированную количество состояний и внешнее хранилище). Это легко осуществить перечисляя все возможные конфигурации и проверяя, входит ли машина одна и та же конфигурация дважды (с указанием бесконечного цикла); с конечным ресурсов, мы можем установить верхнюю границу времени, прежде чем мы должны увидеть повторная конфигурация, если машина не останавливается.

Обычно модели с бесконечными ресурсами (например, неограниченные ТМ и КПК) не могут быть остановлены, но было бы лучше исследовать модели и их открытые проблемы индивидуально.

(Извините за все ссылки в Википедии, но на самом деле это очень хороший ресурс для этот вопрос).

Ответ 3

Короткий ответ - да, и такие языки могут даже быть чрезвычайно полезными.

Об этом несколько месяцев назад об обмане обсуждали: http://lambda-the-ultimate.org/node/2846