Любой язык, не являющийся полным по Тьюрингу, не может написать для себя интерпретатор. Я понятия не имею, где я это прочитал, но я видел, что это использовалось несколько раз. Кажется, что это порождает своего рода «окончательный» нетуринговский законченный язык; те, которые могут толькоинтерпретироваться машиной Тьюринга. Эти языки не обязательно будут способны вычислять все полные функции от натуральных до натуральных, и при этом они не обязательно будут изоморфными (то есть, возможно, конечные языки A и B существуют так, что существует функция F, которую A может вычислять, но B не может). Агда может интерпретировать систему Т Годеля, а Агда является тотальной, так что такой конечный язык должен быть строго более мощным, чем могло бы показаться системе Т Годеля. Мне кажется, что такой язык был бы по крайней мере таким же мощным, как и агда (хотя у меня нет доказательств, только догадка).
Было ли проведено какое-либо исследование в этом направлении? Какие результаты известны (а именно такой «конечный» язык известен)?
Бонус: я обеспокоен тем, что существует патологический случай, который не может вычислить функции, которые System T Годеля еще может интерпретировать только машиной Тьюринга, поскольку она позволяет вычислять некоторые действительно странные функции. Так ли это, или мы можем знать, что такой язык сможет вычислять все, что может вычислить Godel System T?
Ответы:
Это плохо сформулированный вопрос, поэтому давайте сначала разберемся с ним. Я собираюсь сделать это в стиле теории вычислимости. Таким образом, я буду использовать числа вместо строк: часть исходного кода является числом, а не строкой символов. Это действительно не имеет значения, вы можете заменить с й т г я н г в течение ниже.N ы т г I п г
Пусть быть функцией спаривание .⟨ М , н ⟩
Допустим, что язык программирования задается следующими данными:L = ( P, е v )
Тот факт, что разрешимо, означает, что существует полное вычислимое отображение v a l i d : N → { 0 , 1 } такое, что v a l i d ( n ) = 1п V A L I D: N → { 0 , 1 } . Неформально мы говорим, что можно определить, является ли данная строка допустимым фрагментом кода. Функция e v по сути является интерпретатором для нашего языка: e v ( m , n ) выполняет код m на входе n - результат может быть неопределенным.V A L I D( n ) = 1⟺n ∈ P е v e v ( м , н ) м N
Теперь мы можем ввести некоторую терминологию:
Возможны и другие определения « интерпретирует L 2 », но позвольте мне не вдаваться в подробности.L1 L2
Мы говорим, что и L 2 эквивалентны, если они интерпретируют друг друга.L1 L2
Существует «самый мощный» язык машин Тьюринга (который вы называете «машиной Тьюринга»), в котором n ∈ N - это кодировка машины Тьюринга, а φ ( n , m ) - частично вычислимая функция, которая «запускает машину Тьюринга, кодирующую n на входе m ». Этот язык может интерпретировать все другие языки, очевидно, так как мы требовали, чтобы e v была вычислимой.T= ( N , φ ) n ∈ N φ ( н , м ) N м е v
Наше определение языков программирования очень расслаблено. Чтобы выполнить следующее, давайте потребуем еще три условия:
Классический результат таков:
Теорема: если язык может интерпретировать сам себя, то он не тотален.
Доказательство. Предположим , что является универсальная программа для полного LANGAUGE L , реализованного в L , то есть, для всех т Е Р и п Е N , е V ( U , ⟨ м , п ⟩ ) ≃ е v ( т , п ) . Как преемник, диагональ, и e v ( u , - ) реализованы в L , так же как и их композиция k ↦u L L m∈P n∈N
Заметьте, что мы могли бы заменить карту-преемник любой другой картой без фиксированной точки.
Вот небольшая теорема, которая, я думаю, устранит недоразумение.
Теорема. Каждый общий язык может быть интерпретирован другим общим языком.
Доказательство. Пусть тотальный язык. Мы получаем итоговое значение L ′, которое интерпретирует L , присоединяя к L его вычислитель e v . Точнее, пусть Р ' = { ⟨ 0 , п ⟩ | п ∈ P } ∪ { ⟨ 1 , 0 ⟩ } и определим е V ' , как е V ' ( ⟨ б , н ⟩ , мL L' L L е v п'= { ⟨ 0 , п ⟩ | п ∈ P} ∪ { ⟨ 1 , 0 ⟩ } е v'
Очевидно, что L ' является полнымпотому что L является полным. Для того, чтобы видетьчто L ' может имитировать L просто взять у = ⟨ 1 , 0
Упражнение: [добавлено 2014-06-27] Построенный выше язык не замкнут по составу. Закрепить доказательство теоремы , так что L ' удовлетворяет дополнительные требования , если L делает.L' L' L
Другими словами, вам никогда не понадобится вся мощь машин Тьюринга для интерпретации общего языка - достаточно более мощного общего языка L ′ . Язык L ′ строго более мощный, чем L, потому что он интерпретирует L , но L не интерпретирует себя.L L' L' L L L
источник
is_total
, что в противном случае некомпьютеризуемо, но не может реализовать оценку (потому что вам также придется вычислять бит результирующей функции). В общем, я бы сказал, что это не язык программирования, если вы не можете даже реализовать для него парсер.Это утверждение неверно. Рассмотрим язык программирования, в котором семантикой каждой строки является «Игнорировать ваш ввод и немедленно остановиться». Этот язык программирования не является полным по Тьюрингу, но каждая программа является интерпретатором языка.
источник