Есть ли язык, который может выразить свой собственный компилятор Тьюринга?

12

Комментарий к tex.SE заставил меня задуматься. Утверждение по существу:

Если я могу написать компилятор для языка X на языке X, то X полон по Тьюрингу.

В терминах вычислимости и формальных языков это:

Если решает , L L T M и M L , то F L = R E .MLLTMMLFL=RE

Здесь обозначает язык всех машины Тьюринга кодирования и F L обозначает множество функций , вычисленных машин в L .LTMFLL

Это правда?

Рафаэль
источник
близко, подумайте / согласитесь, должен быть какой-то реальный смысл, близкий к этому, например, любой "нетривиальный" или "достаточно сложный" язык, который может выразить свой собственный симулятор, является ТМ полным. Компилятор обычно является частью симулятора. это действительно «шаблон проектирования», встречающийся во многих доказательствах полноты ТМ, но, возможно, он не был обобщен / формализован. Может быть, тема для дальнейшего анализа / обсуждения в чате информатики . подозрение / гипотеза, есть еще кое-что интересное, например, «каждый нетривиальный / достаточно сложный рекурсивный и рекурсивно перечислимый язык может быть отображен / приведен к любому другому».
vzn
1
Я создал эзотерический язык под названием InterpretMe, который ничего не может сделать, кроме как выразить свой собственный интерпретатор, поэтому он определенно не завершен по Тьюрингу.
неконтекстовое правописание
Можете ли вы объяснить второе утверждение? Что такое ? Как это утверждение связано с первым? M
reinierpost
@reinierpost , как правило , обозначает число М , учитывая некоторые (допустимо) кодирование. Следовательно, L Т М = { М | М  представляет собой машину Тьюринга } . Через F L я обозначаю множество функций, вычисленных языком L машин Тьюринга. MMLTM={MM is a Turing machine}FLL
Рафаэль
Лучший способ заявить требование будет: «Если есть ТМ с M L и L M = L , то Р л = Р Е .MMLLM=LFL=RE
Рафаэль

Ответы:

13

Неформальное утверждение не соответствует действительности, как показано на следующем языке программирования. Любая строка, скажем, символов ASCII, является допустимой программой, и смысл каждой программы: «Вывести программу, которая просто выводит копию своего ввода». Таким образом, каждая программа на этом языке является компилятором для языка, но язык не является тьюрингово-полным.

M2xxMLMFL


(ϕi)i0Q(x,y)pϕpyQ(p,y)Qx=ypϕp(y)=Q(p,y)ϕpp

Дэвид Ричерби
источник
1
В каком смысле каждая программа на этом языке является компилятором для этого языка? Каждая программа - это программа, которая вводит программу на этом языке и выводит другую программу на этом языке, да, но квинны обычно не считаются компиляторами.
user253751
1
cc(P)={xreturn P}P(x)=Pc
1
@immibis Я (запоздало) думаю, что ты прав. Кажется, что я хотел написать, это то, что семантика каждой программы - это просто «вывод вашей информации». Это кажется достаточно близким к тому, что я написал, что это было, вероятно, то, что я хотел сказать в первую очередь. Или, может быть, мне очень повезло, что расстояние редактирования от моего неправильного ответа до правильного ответа было таким маленьким. :-)
Дэвид Ричерби
1
Ответ теперь говорит: «игнорирует ввод и выводит копию ввода» - вы не можете сделать и то, и другое.
user253751
@immibis Я приду снова .
Дэвид Ричерби