Це погано сформульоване питання, тому спочатку розберемося з цим. Я зроблю це в стилі теорії обчислень. Таким чином, я буду використовувати цифри замість рядків: фрагмент вихідного коду - це число, а не рядок символів. Це неважливо, ви можете замінити на s t r i n g протягом нижче.Nstring
Нехай бути функцією спарювання .⟨m,n⟩
Скажемо, що мова програмування задається такими даними:L=(P,ev)
- вирішується безліч з «діючих програм», іP⊆N
- обчислюваних і часткова функція .ev:P×N→N
Те, що визначається, означає, що існує загальна обчислювальна карта v a l i d : N → { 0 , 1 } така, що v a l i d ( n ) = 1Pvalid:N→{0,1} . Неофіційно ми говоримо, що можна сказати, чи дана строка є дійсним фрагментом коду. Функція e v є істотним перекладачем для нашої мови: e v ( m , n ) виконує код m на вході n - результат може бути невизначеним.valid(n)=1⟺n∈Pevev(m,n)mn
Тепер ми можемо запровадити деяку термінологію:
- Мова є всього , якщо є повною функцією для всіх м ∈ P .n ↦ e v ( m , n )m ∈ P
- Мова інтерпретує мову L 2 = ( Р 2 , е v 2 ) , якщо існує у ∈ Р 1 таким чином, що е v 1 ( U , ⟨ п , м ⟩ ) ≃ е v 2 ( n , m ) для всіх n ∈ PL1= ( Р1, e v1) L2= ( Р2, e v2)u ∈ P1e v1( U , ⟨ п , м ⟩ ) ≃ е v2(n,m)n∈Pі . Тут u - тренажер для L 2, реалізований у L 1 . Він також відомий як універсальна програма для L 2 .m∈NuL2L1L2
Можливі й інші визначення " інтерпретує L 2 ", але дозвольте мені зараз не вникати в це.L1L2
Ми говоримо, що і L 2 рівнозначні, якщо вони інтерпретують один одного.L1L2
Існує "найпотужніша" мова машин Тьюрінга (яку ви називаєте "машиною Тюрінга"), в якій n ∈ N - кодування машини Тьюрінга, а φ ( n , m ) - часткова обчислювальна функція, яка "запускає машину Тюрінга, закодовану n на вході m ". Ця мова може переривати всі інші мови, очевидно, оскільки ми вимагали, щоб e v була обчислена.T=(N,φ)n∈Nφ(n,m)nmev
Наше визначення мов програмування дуже розслаблене. Щоб пройти наступне, вимагаємо ще трьох умов:
- реалізує функцію наступника: є s u c c ∈ P така, що e v ( s u c c , m ) = m + 1 для всіх m ∈ N ,Lsucc∈Pev(succ,m)=m+1m∈N
- реалізує діагональ функція: є d I в г ∈ P такещо е V ( д я г , т ) = ⟨ м , м ⟩ для всіх м ∈ N ,Ldiag∈Pev(diag,m)=⟨m,m⟩m∈N
- закритий за складом функцій: якщо L реалізує f і g, то він також реалізує f ∘ g ,LLfgf∘g
Класичний результат такий:
Теорема: Якщо мова може інтерпретувати себе, то вона не є тотальною.
Доказ. Припустимо , що є універсальна програма для повного LANGAUGE L , реалізованого в L , тобто, для всіх т Е Р і п Е N ,
е V ( U , ⟨ м , п ⟩ ) ≃ е v ( т , п ) .
Як наступник, діагональ і e v ( u , - ) реалізуються в L , так і їх склад k ↦uLLm∈Pn∈N
ev(u,⟨m,n⟩)≃ev(m,n).
ev(u,−)L . Там існує
п 0 ∈ P такещо
е v ( п 0 , до ) ≃ е V ( U , ⟨ до , до ⟩ ) + 1 , а потім
і V ( U , ⟨ п 0 , п 0 ⟩ ) ≃ е v (k↦ev(u,⟨k,k⟩)+1n0∈Pev(n0,k)≃ev(u,⟨k,k⟩)+1
Оскільки існує число не дорівнює його власного наступника, то це означаєщо
L не є повним абощо
L Не брати до уваги себе. QED.
ev(u,⟨n0,n0⟩)≃ev(n0,n0)≃ev(u,⟨n0,n0⟩)+1
LL
Зауважте, що ми могли замінити карту спадкоємця будь-якою іншою картою, що не має фіксованих точок.
Ось невелика теорема, яка, на мою думку, усуне непорозуміння.
Теорема: Кожна загальна мова може бути інтерпретована іншою загальною мовою.
Доказ. Нехай - загальна мова. Ми отримуємо загальний L ', який інтерпретує L , приєднавшись до L його оцінювача e v . Точніше, нехай Р ' = { ⟨ 0 , п ⟩ | п ∈ P } ∪ { ⟨ 1 , 0 ⟩ } і визначимо е V ' , як
і V ' ( ⟨ б , н ⟩ , мLL′LLevP′={⟨0,n⟩∣n∈P}∪{⟨1,0⟩}ev′
Очевидно, що L ' є повнимтому що L є повним. Для того, щоб бачитищо L ' може імітувати L просто взяти у = ⟨ 1 , 0
ev′(⟨b,n⟩,m)={ev(n,m)ev(m0,m1)if b=0,if b=1 and m=⟨m0,m1⟩
L′LL′L , З тих пір
е V ' ( U , ⟨ м , н ⟩ ) ≃ е V ( т , п ) ,мірі необхідності. QED.
u=⟨1,0⟩ev′(u,⟨m,n⟩)≃ev(m,n)
Вправа: [додано 2014-06-27] Мова побудована вище, не закрита за складом. Закріпити доказ теореми , так що L ' задовольняє додаткові вимоги , якщо L робить.L′L′L
LL′L′LLL