Esta é uma pergunta mal formulada, então vamos entender melhor. Eu vou fazer o estilo da teoria da computabilidade. Assim, usarei números em vez de cadeias: um código-fonte é um número, em vez de uma cadeia de símbolos. Realmente não importa, você pode substituir por s t r i n gNstring abaixo.
Deixe ser uma função de emparelhamento⟨m,n⟩ .
Digamos que uma linguagem de programação seja fornecida pelos seguintes dados:L = ( P, E v )
- um conjunto decidível P⊆ N de "programas válidos" e
- um calculável e parcial função .e v : P× N → N
O fato de ser decidível significa que existe um mapa computável total v a l i d : N → { 0 , 1 } tal que v a l i d ( n ) = 1Pv a l i d: N → { 0 , 1 } . Informalmente, estamos dizendo que é possível dizer se uma determinada string é um pedaço de código válido. A função e v é essencialmente um intérprete para a nossa linguagem: e v ( m , n ) executa o código m na entrada nv a l i d(n)=1⟺n∈Pevev(m,n)mn - o resultado pode ser indefinido.
Agora podemos introduzir alguma terminologia:
- Um idioma é total se for uma função total para todos os m ∈ Pn↦ev(m,n)m∈P .
- Uma linguagem de interpreta língua L 2 = ( P 2 , e v 2 ) se existe u ∈ P 1 de tal modo que e v 1 ( u , ⟨ n , m ⟩ ) ≃ e v 2 ( n , m ) para todos os n ∈ PL1=(P1,ev1) L2=(P2,ev2)u∈P1ev1(u,⟨n,m⟩)≃ev2(n,m)n∈Pe . Aqui u é o simulador para L 2 implementado em L 1 . Também é conhecido como programa universal para L 2 .m∈NuL2L1L2
Outras definições de " interpreta L 2 " são possíveis, mas não permita que eu entre nisso agora.L1L2
Dizemos que e L 2 são equivalentes se eles se interpretarem.L1L2
Existe a "linguagem mais poderosa" das máquinas de Turing (que você chama de "máquina de Turing") na qual n ∈ N é uma codificação de uma máquina de Turing e φ ( n , m ) é a função computável parcial que "executa a máquina de Turing codificada por n na entrada m ". Esse idioma pode interceptar todos os outros idiomas, obviamente, uma vez que exigimos e vT=(N,φ)n∈Nφ(n,m)nmev ser computável.
Nossa definição de linguagens de programação é muito descontraída. Para o seguinte, vamos exigir mais três condições:
- L implements the successor function: there is succ∈P such that ev(succ,m)=m+1 for all m∈N,
- L implements the diagonal function: there is diag∈P such that ev(diag,m)=⟨m,m⟩ for all m∈N,
- L is closed under composition of functions: if L implements f and g then it also implements f∘g,
A classic result is this:
Theorem: If a language can interpret itself then it is not total.
Proof. Suppose u is the universal program for a total langauge L implemented in L, i.e., for all m∈P and n∈N,
ev(u,⟨m,n⟩)≃ev(m,n).
As successor, diagonal, and
ev(u,−) are implemented in
L, so is their composition
k↦ev(u,⟨k,k⟩)+1. There exists
n0∈P such that
ev(n0,k)≃ev(u,⟨k,k⟩)+1, but then
ev(u,⟨n0,n0⟩)≃ev(n0,n0)≃ev(u,⟨n0,n0⟩)+1
As there is no number equal its own successor, it follows that
L is not total or that
L does not interpret itself. QED.
Observe that we could replace the successor map with any other fixpoint-free map.
Here is a little theorem which I think will clean up a misunderstanding.
Theorem: Every total language can be interpreted by another total language.
Proof. Let L be a total language. We get a total L′ which interprets L by adjoining to L its evaluator ev. More precisely, let P′={⟨0,n⟩∣n∈P}∪{⟨1,0⟩} and define ev′ as
ev′(⟨b,n⟩,m)={ev(n,m)ev(m0,m1)if b=0,if b=1 and m=⟨m0,m1⟩
Obviously,
L′ is total because
L is total. To see that
L′ can simulate
L just take
u=⟨1,0⟩, since then
ev′(u,⟨m,n⟩)≃ev(m,n), as required. QED.
Exercise: [added 2014-06-27] The language L′ constructed above is not closed under composition. Fix the proof of the theorem so that L′ satisfies the extra requirements if L does.
In other words, you never need the full power of Turing machines to interpret a total language L – a slightly more powerful total language L′ suffices. The language L′ is strictly more powerful than L because it interprets L, but L does not interpret itself.