En esta seccion compararemos los tres paradigmas de computabilidad efectiva que hemos desarrollado anteriormente. Para esto probaremos que cada uno de dichos paradigmas "vence" al otro en el sentido que incluye por lo menos todas las funciones que incluye el otro en su modelizacion del concepto de funcion ΣΣ-efectivamente computable.
Usando macros podemos ahora probar que el paradigma imperativo de Neumann es por lo menos tan abarcativo como el funcional de Godel. Mas concretamente:
4.3 (Neumann vence a Godel). Si hh es ΣΣ-recursiva, entonces hh es ΣΣ-computable.
Proof. Probaremos por induccion en kk que
(*) Si h∈RΣkh∈RΣk, entonces hh es ΣΣ-computable.
El caso k=0k=0 es dejado al lector. Supongamos (*) vale para kk, veremos que vale para k+1k+1. Sea h∈RΣk+1−RΣk.h∈RΣk+1−RΣk. Hay varios casos
Caso 1. Supongamos h=M(P)h=M(P), con P:ω×ωn×Σ∗m→ωP:ω×ωn×Σ∗m→ω, un predicado perteneciente a RΣkRΣk. Por hipotesis inductiva, PP es ΣΣ-computable y por lo tanto tenemos un macro [IFP(V1,...,V¯n+1,W1,...,Wˉm)GOTOA1][IFP(V1,...,V¯¯¯¯¯¯¯¯¯¯¯¯¯n+1,W1,...,W¯m)GOTOA1] lo cual nos permite realizar el siguiente programa L2[IFP(N¯n+1,N1,...,Nˉn,P1,...,Pˉm)GOTOL1]N¯n+1←N¯n+1+1GOTOL2L1N1←N¯n+1 Es facil chequear que este programa computa h.
Caso 2. Supongamos h=R(f,G), con f:S1×...×Sn×L1×...×Lm→Σ∗Ga:S1×...×Sn×L1×...×Lm×Σ∗×Σ∗→Σ∗, a∈Σ elementos de RΣk. Sea Σ={a1,...,ar}. Por hipotesis inductiva, las funciones f, Ga, a∈Σ, son Σ-computables y por lo tanto tenemos macros [W¯m+1←f(V1,...,Vˉn,W1,...,Wˉm)] [W¯m+3←Gai(V1,...,Vˉn,W1,...,Wˉm,W¯m+1,W¯m+2)], i=1,...,r Podemos entonces hacer el siguiente programa: [P¯m+3←f(N1,...,Nˉn,P1,...,Pˉm)]L¯r+1IFP¯m+1 BEGINS a1 GOTOL1 ⋮IFP¯m+1 BEGINS ar GOTOLˉrGOTOL¯r+2L1P¯m+1← ↷P¯m+1[P¯m+3←Ga1(N1,...,Nˉn,P1,...,Pˉm,P¯m+2,P¯m+3)]P¯m+2←P¯m+2.a1GOTOL¯r+1 ⋮LˉrP¯m+1← ↷P¯m+1[P¯m+3←Gar(N1,...,Nˉn,P1,...,Pˉm,P¯m+2,P¯m+3)]P¯m+2←P¯m+2.arGOTOL¯r+1L¯r+2P1←P¯m+3 Es facil chequear que este programa computa h.
El resto de los casos son dejados al lector.
Un corolario importante de esta batalla es el:
4.12 (Segundo Manatial de Macros). Sea Σ un alfabeto finito. Si f:Df⊆ωn×Σ∗m→ωg:Dg⊆ωn×Σ∗m→Σ∗P:DP⊆ωn×Σ∗m→{0,1} son Σ-recursivas, entonces en SΣ hay macros [V¯n+1←f(V1,...,Vˉn,W1,...,Wˉm)][W¯m+1←g(V1,...,Vˉn,W1,...,Wˉm)][IFP(V1,...,Vˉn,W1,...,Wˉm)GOTOA1]
Cabe destacar que el Segundo Manantial de Macros nos dice que en SΣ hay macros [V¯n+1←f(V1,...,Vˉn,W1,...,Wˉm)][W¯m+1←g(V1,...,Vˉn,W1,...,Wˉm)][IFP(V1,...,Vˉn,W1,...,Wˉm)GOTOA1] para todas las funciones Σ-mixtas y predicados Σ-mixtos que hemos trabajado hasta el momento en la materia ya que todas eran Σ-p.r.. Esto fortalece mucho al lenguaje SΣ ya que ahora tenemos macros para todas las funciones y predicados cotidianos en la matematica, ademas de tener macros para todas las funciones y predicados Σ-computables, debido al Primer Manantial de Macros. Veamos un ejemplo:
4.42. Supongamos S1,S2⊆ωn×Σ∗m son conjuntos Σ-enumerables. Entonces S1∪S2 es Σ-enumerable.
Proof. Podemos suponer que ni S1 ni S2 son vacios ya que de lo contrario el resultado es trivial. Ademas supondremos que n=2 y m=1.
La idea de la prueba es la misma que la que usamos para probar que la union de conjuntos Σ-efectivamente enumerables es Σ-efectivamente enumerable. Daremos usando macros un programa que enumera a S1∪S2 y luego aplicaremos la Caracterizacion de Σ-enumerabilidad. Por hipotesis hay funciones F:ω→ω×ω×Σ∗ y G:ω→ω×ω×Σ∗ tales que F(1), F(2), F(3), G(1), G(2) y G(3) son Σ-computables, Im(F)=S1 y Im(G)=S2. O sea que nuestro Primer Manantial de Macros nos dice que en SΣ hay macros [V2←F(1)(V1)][V2←F(2)(V1)][W1←F(3)(V1)][V2←G(1)(V1)][V2←G(2)(V1)][W1←G(3)(V1)] Ya que el predicado Par=λx[x es par] es Σ-p.r., el Segundo Manantial de Macros nos dice que en SΣ hay un macro: [IF Par(V1) GOTO A1] el cual escribiremos de la siguiente manera mas intuitiva [IF V1 es par GOTO A1] Ya que la funcion D=λx[⌊x/2⌋] es Σ-p.r., el Segundo Manantial de Macros nos dice que hay un macro: [V2←D(V1)] el cual escribiremos de la siguiente manera mas intuitiva [V2←⌊V1/2⌋] Sea P el siguiente programa: [IF N1 es par GOTO L1N1←N1˙−1[N1111←⌊N1/2⌋][N1←G(1)(N1111)][N2←G(2)(N1111)][P1←G(3)(N1111)]GOTO L2L1[N1111←⌊N1/2⌋][N1←F(1)(N1111)][N2←F(2)(N1111)][P1←F(3)(N1111)]L2SKIP Es facil ver que P cumple (a) y (b) de (3) de la Caracterizacion de Σ-enumerabilidad por lo cual S1∪S2 es Σ-enumerable.
En forma analoga a lo hecho recien, se pueden probar, copiando la respectiva idea en el paradigma de la computabilidad efectiva, los siguientes resultados:
- Supongamos S1,S2⊆ωn×Σ∗m son conjuntos Σ-enumerables. Entonces S1∩S2 es Σ-enumerable.
- Sea S⊆ωn×Σ∗m. Si S es Σ-computable, entonces S es Σ-enumerable
O sea que con el uso de nuestros poderosos macros asociados a funciones y predicados Σ-p.r. (gracias al Segundo Manatial) mas los que provee el Primer Manatial podemos simular los procedimientos efectivos realizados dentro del paradigma filosofico con programas concretos del lenguaje SΣ. Pero esto no es del todo asi, ya que los ejemplos vistos recien no hacen uso del concepto de “ejecucion de una cantidad de pasos”, idea que en muchos diseños de nuestros procedimentos efectivos es usada. Por ejemplo si queremos “copiar” dentro del paradigama imperativo la prueba del resultado
- Si f:Df⊆ωn×Σ∗m→ω es una funcion Σ-efectivamente computable, entonces Df es Σ-efectivamente enumerable
notaremos la dificultad de aun no poder hablar de cantidad de pasos en la ejecucion del programa que compute a f. O sea nuestro Primer Manatial nos da un macro de asignacion para f pero no es claro de como correr una expansion de dicho macro una cierta cantidad de veces. Esto lo lograremos usando macros asociados a las funciones Haltn,m, En,m# y En,m∗ las cuales se usan en la batalla Godel vence a Neumann que viene a continuacion. Estas funciones seran clave a la hora de simular con programas a procedimientos efectivos que en su funcionamiento involucran el funcionamiento de otros procedimientos efectivos.
O sea que luego de ambas batallas entre Godel y Neumann, el paradigma imperativo se vera fortalecido sustancialmente. Tambien mas adelante en la Seccion Resultados basicos presentados en paradigma recursivo veremos como los desarrollos hechos en ambas batallas entre Godel y Neumann fortalecen al paradigma funcional. Otro ejemplo de esto ultimo es la Forma Normal de Kleene donde se prueba que toda funcion Σ-recursiva es expresable en la forma g∘M(P) donde g es una funcion Σ-p.r. y P es un predicado Σ-p.r..
Para probar que toda funcion Σ-computable es Σ-recursiva debemos hacer un profundo estudio de la recursividad del lenguaje SΣ. Primero analizaremos la recursividad de la sintaxis de SΣ.
Primero probaremos dos lemas que muestran que la sintaxis de SΣ es (Σ∪Σp)-recursiva primitiva. Recordemos que Sig:Num∗→Num∗ fue definida de la siguiente manera Sig(ε)=1Sig(α0)=α1Sig(α1)=α2Sig(α2)=α3Sig(α3)=α4Sig(α4)=α5Sig(α5)=α6Sig(α6)=α7Sig(α7)=α8Sig(α8)=α9Sig(α9)=Sig(α)0 Y tambien definimos Dec:ω→Num∗ de la siguiente manera Dec(0)=εDec(n+1)=Sig(Dec(n)) Recordemos tambien que para hacer mas agil la notacion escribimos ˉn en lugar de Dec(n).
4.43. Sea Σ un alfabeto cualquiera. La funcion Dec es (Σ∪Σp)-p.r..
Proof. Es facil ver que Dec es Num-p.r.. Ya que tambien es (Σ∪Σp)-mixta, el Teorema 4.2 nos dice que es (Σ∪Σp)-p.r.. En el Lema 4.12 se da una prueba facil de este hecho, sin recurrir al citado teorema.
4.44. Para cada n,x∈ω, tenemos que |ˉn|≤x si y solo si n≤10x−1
4.45. InsΣ es un conjunto (Σ∪Σp)-p.r..
Proof. Para simplificar la prueba asumiremos que Σ={@,▴}. Ya que InsΣ es union de los siguientes conjuntos L1={Nˉk←Nˉk+1:k∈N}L2={Nˉk←Nˉk˙−1:k∈N}L3={Nˉk←Nˉn:k,n∈N}L4={Nˉk←0:k∈N}L5={IFNˉk≠0GOTOLˉm:k,m∈N}L6={Pˉk←Pˉk.@:k∈N}L7={Pˉk←Pˉk.▴:k∈N}L8={Pˉk← ↷Pˉk:k∈N}L9={Pˉk←Pˉn:k,n∈N}L10={Pˉk←ε:k∈N}L11={IFPˉkBEGINS@GOTOLˉm:k,m∈N}L12={IFPˉkBEGINS▴GOTOLˉm:k,m∈N}L13={GOTOLˉm:m∈N}L14={SKIP}L15={Lˉkα:k∈Ny α∈L1∪...∪L14} solo debemos probar que L1,...,L15 son (Σ∪Σp)-p.r.. Veremos primero por ejemplo que L11={IFPˉkBEGINS@GOTOLˉm:k,m∈N} es (Σ∪Σp)-p.r.. Primero notese que α∈L11 si y solo si existen k,m∈N tales que α=IFPˉkBEGINS@GOTOLˉm Mas formalmente tenemos que α∈L11 si y solo si (∃k∈N)(∃m∈N)α=IFPˉkBEGINS@GOTOLˉm Ya que cuando existen tales k,m tenemos que ˉk y ˉm son subpalabras de α, el lema anterior nos dice que α∈L11 si y solo si (∃k∈N)k≤10|α|(∃m∈N)m≤10|α|α=IFPˉkBEGINS@GOTOLˉm Sea P=λmkα[α=IFPˉkBEGINS@GOTOLˉm] Ya que Dλk[ˉk]=ω, tenemos que DP=ω2×(Σ∪Σp)∗. Notese que P=λαβ[α=β]∘[p2,13,f] donde f=λα1α2α3α4[α1α2α3α4]∘[C2,1IFP,λk[ˉk]∘p2,12,C2,1BEGINS@GOTOL,λk[ˉk]∘p2,11] lo cual nos dice que P es (Σ∪Σp)-p.r..
Notese que χ(Σ∪Σp)∗L11=λα[(∃k∈N)k≤10|α|(∃m∈N)m≤10|α|P(m,k,α)] Esto nos dice que podemos usar dos veces el Lema 4.22 para ver que χ(Σ∪Σp)∗L11 es (Σ∪Σp)-p.r.. Veamos como. Sea Q=λkα[(∃m∈N)m≤10|α|P(m,k,α)] Por el Lema 4.22 tenemos que λxkα[(∃m∈N)m≤xP(m,k,α)] es (Σ∪Σp)-p.r. lo cual nos dice que Q=λxkα[(∃m∈N)m≤xP(m,k,α)]∘[λα[10|α|]∘p1,12,p1,11,p1,12] lo es. Ya que χ(Σ∪Σp)∗L11=λα[(∃k∈N)k≤10|α|Q(k,α)] podemos en forma similar aplicar el Lema 4.22 y obtener finalmente que χ(Σ∪Σp)∗L11 es (Σ∪Σp)-p.r..
En forma similar podemos probar que L1,...,L14 son (Σ∪Σp)-p.r.. Esto nos dice que L1∪...∪L14 es (Σ∪Σp)-p.r.. Notese que L1∪...∪L14 es el conjunto de las instrucciones basicas de SΣ. Llamemos InsBasΣ a dicho conjunto. Para ver que L15 es (Σ∪Σp)-p.r. notemos que χ(Σ∪Σp)∗L15=λα[(∃k∈N)k≤10|α|(∃β∈InsBasΣ)|β|≤|α|α=Lˉkβ] lo cual nos dice que aplicando dos veces el Lema 4.22 obtenemos que χ(Σ∪Σp)∗L15 es (Σ∪Σp)-p.r.. Ya que InsΣ=InsBasΣ∪L15 tenemos que InsΣ es (Σ∪Σp)-p.r..
Recordemos que Bas:InsΣ→(Σ∪Σp)∗, fue definida por Bas(I)={Jsi I es de la forma LˉkJ, con k∈N y J∈InsΣIcaso contrario Definamos Lab:InsΣ→(Σ∪Σp)∗ de la siguiente manera Lab(I)={Lˉksi I es de la forma LˉkJ, con k∈N y J∈InsΣεcaso contrario
4.46. Bas y Lab son funciones (Σ∪Σp)-p.r.
Proof. Sea ≤ un orden total sobre Σ∪Σp. Sea L={Lˉk:k∈N}∪{ε}. Dejamos al lector probar que L es un conjunto (Σ∪Σp)-p.r.. Sea P=λIα[α∈InsΣ∧I∈InsΣ∧[α]1≠L∧(∃β∈L) I=βα] Note que DP=(Σ∪Σp)∗2. Dejamos al lector probar que P es (Σ∪Σp)-p.r.. Notese ademas que cuando I∈InsΣ tenemos que P(I,α)=1 sii α=Bas(I). Dejamos al lector probar que Bas=M≤(P) por lo que para ver que Bas es (Σ∪Σp)-p.r., solo nos falta ver que la funcion Bas es acotada por alguna funcion (Σ∪Σp)-p.r. y (Σ∪Σp)-total. Pero esto es trivial ya que |Bas(I)|≤|I|=λα[|α|](I), para cada I∈InsΣ.
Finalmente note que Lab=M≤(λIα[αBas(I)=I]) lo cual nos dice que Lab es (Σ∪Σp)-p.r..
Recordemos que dado un programa P habiamos definido IPi=ε, para i=0 o i>n(P). O sea que la funcion (Σ∪Σp)-mixta λiP[IPi] tiene dominio igual a ω×ProΣ. Notese que usamos notacion lambda respecto del alfabeto Σ∪Σp. Ademas notese que usamos la variable P en la notacion lambda por un tema de comodidad psicologica dado que la expresion Iαi esta definida solo cuando α es un programa pero podriamos haber escrito λiα[Iαi] y sigue siendo la misma funcion.
4.47.
(a) ProΣ es un conjunto (Σ∪Σp)-p.r.
(b) λP[n(P)] y λiP[IPi] son funciones (Σ∪Σp)-p.r..
Proof. Ya que ProΣ=DλP[n(P)] tenemos que (b) implica (a). Para probar (b) Sea ≤ un orden total sobre Σ∪Σp. Sea P el siguiente predicado
λx[Lt(x)>0∧(∀t∈N)t≤Lt(x)∗≤((x)t)∈InsΣ∧
(∀t∈N)t≤Lt(x)(∀m∈N)¬(Lˉm t-final ∗≤((x)t))∨
(∃j∈N)j≤Lt(x)(∃α∈(Σ∪Σp)−Num)Lˉmα t-inicial∗≤((x)j)]
Notese que DP=N y que P(x)=1 sii Lt(x)>0, ∗≤((x)t)∈InsΣ, para cada t=1,...,Lt(x) y ademas ⊂t=Lt(x)t=1∗≤((x)t)∈ProΣ. Para ver que P es (Σ∪Σp)-p.r. solo nos falta acotar el cuantificador (∀m∈N) de la expresion lambda que define a P. Ya que nos interesan los valores de m para los cuales ˉm es posiblemente una subpalabra de alguna de las palabras ∗≤((x)j), el Lema 4.44 nos dice que una cota posible es 10max{|∗≤((x)j)|:1≤j≤Lt(x)}−1. Dejamos al lector los detalles de la prueba de que P es (Σ∪Σp)-p.r.. Sea Q=λxα[P(x)∧α=⊂t=Lt(x)t=1∗≤((x)t)]. Note que DQ=N×(Σ∪Σp)∗. Claramente Q es (Σ∪Σp)-p.r.. Ademas note que DM(Q)=ProΣ. Notese que para P∈ProΣ, tenemos que M(Q)(P) es aquel numero tal que pensado como infinitupla (via mirar su secuencia de exponentes) codifica la secuencia de instrucciones que forman a P. Es decir M(Q)(P)=⟨#≤(IP1),#≤(IP2),...,#≤(IPn(P)),0,0,...⟩ Por (b) del Lema 4.25, M(Q) es (Σ∪Σp)-p.r. ya que para cada P∈ProΣ tenemos que M(Q)(P)=⟨#≤(IP1),#≤(IP2),...,#≤(IPn(P)),0,0,...⟩=n(P)Πi=1pr(i)#≤(IP1)≤|P|Πi=1pr(i)#≤(P) Ademas tenemos que λP[n(P)]=λx[Lt(x)]∘M(Q)λiP[IPi]=∗≤∘g∘[p1,11,M(Q)∘p1,12] donde g=C1,10|{0}×ω∪λix[(x)i], lo cual dice que λP[n(P)] y λiP[IPi] son funciones (Σ∪Σp)-p.r..
Para estudiar la recursividad de la semantica de SΣ deberemos definir varias funciones que tienen que ver con el funcionamiento de un programa y estudiar su recursividad.
Sean n,m≥0 fijos. Definamos entonces las funciones in,m:ω×ωn×Σ∗m×ProΣ→ωEn,m#:ω×ωn×Σ∗m×ProΣ→ω[N]En,m∗:ω×ωn×Σ∗m×ProΣ→Σ∗[N] de la siguiente manera (in,m(0,→x,→α,P),En,m#(0,→x,→α,P),En,m∗(0,→x,→α,P))=(1,(x1,...,xn,0,...),(α1,...,αm,ε,...))(in,m(t+1,→x,→α,P),En,m#(t+1,→x,→α,P),En,m∗(t+1,→x,→α,P))=SP(in,m(t,→x,→α,P),En,m#(t,→x,→α,P),En,m∗(t,→x,→α,P)) Notese que (in,m(t,→x,→α,P),En,m#(t,→x,→α,P),En,m∗(t,→x,→α,P)) es la descripcion instantanea que se obtiene luego de correr P una cantidad t de pasos partiendo del estado ((x1,...,xn,0,...),(α1,...,αm,ε,...)) Es importante notar que si bien in,m es una funcion (Σ∪Σp)-mixta, ni En,m# ni En,m∗ lo son.
Definamos para cada j∈N, funciones En,m#j:ω×ωn×Σ∗m×ProΣ→ωEn,m∗j:ω×ωn×Σ∗m×ProΣ→Σ∗ de la siguiente manera En,m#j(t,→x,→α,P)=j-esima coordenada de En,m#(t,→x,→α,P)En,m∗j(t,→x,→α,P)=j-esima coordenada de En,m∗(t,→x,→α,P) Notese que En,m#(t,→x,→α,P)=(En,m#1(t,→x,→α,P),En,m#2(t,→x,→α,P),...)En,m∗(t,→x,→α,P)=(En,m∗1(t,→x,→α,P),En,m∗2(t,→x,→α,P),...) Nuestro proximo objetivo es mostrar que las funciones in,m, En,m#j, En,m∗j son (Σ∪Σp)-p.r.
Para esto primero debemos probar un lema el cual muestre que una ves codificadas las descripciones instantaneas en forma numerica, las funciones que dan la descripcion instantanea sucesora son (Σ∪Σp)-p.r.. Dado un orden total ≤ sobre Σ∪Σp, codificaremos las descripciones instantaneas haciendo uso de las biyecciones ω[N]→N(s1,s2,...)→⟨s1,s2,...⟩Σ∗[N]→N(σ1,σ2,...)→⟨#≤(σ1),#≤(σ2),...⟩ Es decir que a la descripcion instantanea (i,(s1,s2,...),(σ1,σ2,...)) la codificaremos con la terna (i,⟨s1,s2,...⟩,⟨#≤(σ1),#≤(σ2),...⟩)∈ω×N×N Es decir que una terna (i,x,y)∈ω×N×N codificara a la descripcion instantanea (i,((x)1,(x)2,...),(∗≤((y)1),∗≤((y)2),...)) Definamos s:ω×N×N×ProΣ→ωS#:ω×N×N×ProΣ→ωS∗:ω×N×N×ProΣ→ω de la siguiente manera s(i,x,y,P)=primera coordenada de la codificacion de la descripcion instantaneasucesora de (i,((x)1,(x)2,...),(∗≤((y)1),∗≤((y)2),...)) en P S#(i,x,y,P)=segunda coordenada de la codificacion de la descripcion instantaneasucesora de (i,((x)1,(x)2,...),(∗≤((y)1),∗≤((y)2),...)) en P S∗(i,x,y,P)=tercera coordenada de la codificacion de la descripcion instantaneasucesora de (i,((x)1,(x)2,...),(∗≤((y)1),∗≤((y)2),...)) en P Notese que la definicion de estas funciones depende del orden total ≤ sobre Σ∪Σp.
4.48. Dado un orden total ≤ sobre Σ∪Σp, las funciones s, S# y S∗ son (Σ∪Σp)-p.r..
Proof. Necesitaremos algunas funciones (Σ∪Σp)-p.r.. Dada una instruccion I en la cual al menos ocurre una variable, usaremos #Var1(I) para denotar el numero de la primer variable que ocurre en I. Por ejemplo #Var1(LˉnIFNˉk≠0GOTOLˉm)=k Notese que λI[#Var1(I)] tiene dominio igual a InsΣ−L, donde L es la union de los siguientes conjuntos {GOTO Lˉm:m∈N}∪{Lˉk GOTO Lˉm:k,m∈N}{SKIP}∪{Lˉk SKIP:k∈N} Dada una instruccion I en la cual ocurren dos variables, usaremos #Var2(I) para denotar el numero de la segunda variable que ocurre en I. Por ejemplo #Var2(Nˉk←Nˉm)=m Notese que el dominio de λI[#Var2(I)] es igual a la union de los siguientes conjuntos {Nˉk←Nˉm:k,m∈N}∪{Lˉj Nˉk←Nˉm:j,k,m∈N}{Pˉk←Pˉm:k,m∈N}∪{Lˉj Pˉk←Pˉm:j,k,m∈N} Ademas notese que para una instruccion I tenemos que #Var1(I)=mink(Nˉk← ocu I∨Nˉk≠ ocu I∨Pˉk← ocu I∨PˉkBocu I)#Var2(I)=mink(Nˉk t-final I∨Nˉk+ ocu I∨Nˉk˙− ocu I∨Pˉk t-final I∨Pˉk. ocu I) Esto nos dice que si llamamos P al predicado λkα[α∈InsΣ∧(Nˉk← ocu α∨Nˉk≠ ocu α∨Pˉk← ocu α∨PˉkBocu α)] entonces λI[#Var1(I)]=M(P) por lo cual λI[#Var1(I)] es (Σ∪Σp)-p.r. Similarmente se puede ver que λI[#Var2(I)] es (Σ∪Σp)-p.r.. Sea F˙−:N×N→ω(x,j)→⟨(x)1,....,(x)j−1,(x)j˙−1,(x)j+1,...⟩ Ya que F˙−(x,j)={Q(x,pr(j))si pr(j) divide xxcaso contrario tenemos que F˙− es (Σ∪Σp)-p.r.. Sea F+:N×N→ω(x,j)→⟨(x)1,....,(x)j−1,(x)j+1,(x)j+1,...⟩ Ya que F+(x,j)=x.pr(j) tenemos que F+ es (Σ∪Σp)-p.r.. Sea F←:N×N×N→ω(x,j,k)→⟨(x)1,....,(x)j−1,(x)k,(x)j+1,...⟩ Ya que F←(x,j,k)=Q(x,pr(j)(x)j).pr(j)(x)k tenemos que F← es (Σ∪Σp)-p.r.. Sea F0:N×N→ω(x,j)→⟨(x)1,....,(x)j−1,0,(x)j+1,...⟩ Es facil ver que F0 es (Σ∪Σp)-p.r.. Para cada a∈Σ, sea Fa:N×N→ω(x,j)→⟨(x)1,....,(x)j−1,#≤(∗≤((x)j)a),(x)j+1,...⟩ Es facil ver que Fa es (Σ∪Σp)-p.r.. En forma similar puede ser probado que F↷:N×N→ω(x,j)→⟨(x)1,....,(x)j−1,#≤(↷(∗≤((x)j))),(x)j+1,...⟩ es (Σ∪Σp)-p.r.
Dado (i,x,y,P)∈ω×N×N×ProΣ, tenemos varios casos en los cuales los valores s(i,x,y,P),S#(i,x,y,P) y S∗(i,x,y,P) pueden ser obtenidos usando las funciones antes definidas:
(1) CASO i=0∨i>n(P). Entonces s(i,x,y,P)=iS#(i,x,y,P)=xS∗(i,x,y,P)=y
(2) CASO (∃j∈ω)Bas(IPi)=Nˉj←Nˉj+1. Entonces s(i,x,y,P)=i+1S#(i,x,y,P)=F+(x,#Var1(IPi))S∗(i,x,y,P)=y
(3) CASO (∃j∈ω)Bas(IPi)=Nˉj←Nˉj˙−1. Entonces s(i,x,y,P)=i+1S#(i,x,y,P)=F˙−(x,#Var1(IPi))S∗(i,x,y,P)=y
(4) CASO (∃j,k∈ω)Bas(IPi)=Nˉj←Nˉk. Entonces s(i,x,y,P)=i+1S#(i,x,y,P)=F←(x,#Var1(IPi),#Var2(IPi))S∗(i,x,y,P)=y
(5) CASO (∃j,k∈ω)Bas(IPi)=Nˉj←0. Entonces s(i,x,y,P)=i+1S#(i,x,y,P)=F0(x,#Var1(IPi))S∗(i,x,y,P)=y
(6) CASO (∃j,m∈ω)(Bas(IPi)=IFNˉj≠0GOTOLˉm∧(x)j=0). Entonces s(i,x,y,P)=i+1S#(i,x,y,P)=xS∗(i,x,y,P)=y
(7) CASO (∃j,m∈ω)(Bas(IPi)=IFNˉj≠0GOTOLˉm∧(x)j≠0). Entonces s(i,x,y,P)=minl(Lab(IPl)≠ε∧Lab(IPl) t\textrm{-final} IPi)S#(i,x,y,P)=xS∗(i,x,y,P)=y
(8) CASO (∃j∈ω)Bas(IPi)=Pˉj←Pˉj.a. Entonces s(i,x,y,P)=i+1S#(i,x,y,P)=xS∗(i,x,y,P)=Fa(y,#Var1(IPi))
(9) CASO (∃j∈ω)Bas(IPi)=Pˉj← ↷Pˉj. Entonces s(i,x,y,P)=i+1S#(i,x,y,P)=xS∗(i,x,y,P)=F↷(y,#Var1(IPi))
(10) CASO (∃j,k∈ω)Bas(IPi)=Pˉj←Pˉk. Entonces s(i,x,y,P)=i+1S#(i,x,y,P)=xS∗(i,x,y,P)=F←(y,#Var1(IPi),#Var2(IPi))
(11) CASO (∃j∈ω)Bas(IPi)=Pˉj←ε. Entonces s(i,x,y,P)=i+1S#(i,x,y,P)=xS∗(i,x,y,P)=F0(y,#Var1(IPi))
(12) CASO (∃j,m∈ω)(∃a∈Σ)(Bas(IPi)=IFPˉjBEGINSaGOTOLˉm∧[∗≤((y)j)]1≠a). Entonces s(i,x,y,P)=i+1S#(i,x,y,P)=xS∗(i,x,y,P)=y
(13) CASO (∃j,m∈ω)(∃a∈Σ)(Bas(IPi)=IFPˉjBEGINSaGOTOLˉm∧[∗≤((y)j)]1=a). Entonces s(i,x,y,P)=minl(Lab(IPl)≠ε∧Lab(IPl) t\textrm{-final} IPi)S#(i,x,y,P)=xS∗(i,x,y,P)=y
(14) CASO (∃j∈ω)Bas(IPi)=GOTO Lˉj. Entonces s(i,x,y,P)=minl(Lab(IPl)≠ε∧Lab(IPl) t\textrm{-final} IPi)S#(i,x,y,P)=xS∗(i,x,y,P)=y
(15) CASO Bas(IPi)=SKIP. Entonces s(i,x,y,P)=i+1S#(i,x,y,P)=xS∗(i,x,y,P)=y
O sea que los casos anteriores nos permiten definir conjuntos S1,...,S15, los cuales son disjuntos de a pares y cuya union da el conjunto ω×N×N×ProΣ, de manera que cada una de las funciones s,S# y S∗ pueden escribirse como union disjunta de funciones (Σ∪Σp)-p.r. restrinjidas respectivamente a los conjuntos S1,...,S15. Ya que los conjuntos S1,...,S15 son (Σ∪Σp)-p.r. el Lema 4.19 nos dice que s,S# y S∗ lo son.
Aparte del lema anterior, para probar que las funciones in,m, En,m#j y En,m∗j son (Σ∪Σp)-p.r., nos sera necesario el siguiente resultado. Recordemos que para x1,...,xn∈ω, usabamos ⟨x1,...,xn⟩ para denotar ⟨x1,...,xn,0,...⟩. Ademas recordemos que en el Lema 4.28 probamos que para cada n≥1, la funcion λx1...xn[⟨x1,...,xn⟩] es ∅-p.r.
4.49. Sean fi:S1×...×Sn×L1×...×Lm→ωgi:ωk×ω×S1×...×Sn×L1×...×Lm→ωFi:ω×S1×...×Sn×L1×...×Lm→ω con i=1,...,k, funciones Σ-mixtas. Supongamos que Fi(0,→x,→α)=fi(0,→x,→α)Fi(t+1,→x,→α)=gi(F1(t,→x,→α),...,Fk(t,→x,→α),t,→x,→α) para cada i=1,...,k, t∈ω y (→x,→α)∈S1×...×Sn×L1×...×Lm. Entonces si las funciones f1,...,fk,g1,...,gk son Σ-p.r., las funciones F1,...,Fk lo son.
Proof. Para mayor claridad haremos el caso k=2. Sea F=λt→x→α[⟨F1(t,→x,→α),F2(t,→x,→α)⟩] Es claro que si F es Σ-p.r., entonces lo es cada Fi. Notese que F(0,→x,→α)=⟨f1(→x,→α),f2(→x,→α)⟩F(t+1,→x,→α)=⟨g1((F(t,→x,→α))1,(F(t,→x,→α))2,t,→x,→α),g2((F(t,→x,→α))1,(F(t,→x,→α))2,t,→x,→α)⟩ lo cual nos dice que F=R(f,g) donde f=λ→x→α[⟨f1(→x,→α),f2(→x,→α)⟩]g=λAt→x→α[⟨g1((A)1,(A)2,t,→x,→α),g2((A)1,(A)2,t,→x,→α)⟩]
Ahora usando los dos lemas anteriores podemos probar el siguiente importante resultado.
4.13. Sean n,m≥0. Las funciones in,m, En,m#j, En,m∗j, j=1,2,..., son (Σ∪Σp)-p.r.
Proof. Sea ≤ un orden total sobre Σ∪Σp y sean s, S# y S∗ las funciones definidas previamente al Lema 4.48. Definamos Kn,m#=λt→x→αP[⟨En,m#1(t,→x,→α,P),En,m#2(t,→x,→α,P),...⟩]Kn,m∗=λt→x→αP[⟨#≤(En,m∗1(t,→x,→α,P)),#≤(En,m∗2(t,→x,→α,P)),...⟩] Notese que in,m(0,→x,→α,P)=1Kn,m#(0,→x,→α,P)=⟨x1,...,xn⟩Kn,m∗(0,→x,→α,P)=⟨#≤(α1),...,#≤(αm)⟩in,m(t+1,→x,→α,P)=s(in,m(t,→x,→α,P),Kn,m#(t,→x,→α,P),Kn,m∗(t,→x,→α,P))Kn,m#(t+1,→x,→α,P)=S#(in,m(t,→x,→α,P),Kn,m#(t,→x,→α,P),Kn,m∗(t,→x,→α,P))Kn,m∗(t+1,→x,→α,P)=S∗(in,m(t,→x,→α,P),Kn,m#(t,→x,→α,P),Kn,m∗(t,→x,→α,P)) Por el Lema 4.49 tenemos que in,m, Kn,m# y Kn,m∗ son (Σ∪Σp)-p.r.. Ademas notese que En,m#j=λt→x→αP[(Kn,m#(t,→x,→α,P))j]En,m∗j=λt→x→αP[∗≤((Kn,m∗(t,→x,→α,P))j)] por lo cual las funciones En,m#j, En,m∗j, j=1,2,..., son (Σ∪Σp)-p.r.
Dados n,m∈ω, definamos: Haltn,m=λt→x→αP[in,m(t,→x,→α,P)=n(P)+1] Notese que DHaltn,m=ω×ωn×Σ∗m×ProΣ (ojo que aqui la notacion lambda es respecto del alfabeto Σ∪Σp). Ademas notese que usamos la variable P en la notacion lambda por un tema de comodidad psicologica dado que in,m esta definida solo cuando la ultima coordenada es un programa pero podriamos haber escrito λt→x→αα[in,m(t,→x,→α,α)=n(α)+1] y sigue siendo la misma funcion.
Cabe destacar que Haltn,m tiene una descripcion muy intuitiva, ya que dado (t,→x,→α,P)∈ω×ωn×Σ∗m×ProΣ, tenemos que Haltn,m(t,→x,→α,P)=1 si y solo si el programa P se detiene luego de t pasos partiendo desde el estado ‖x1,...,xn,α1,...,αm‖.
4.50. Haltn,m es (Σ∪Σp)-p.r.
Proof. Notar que Haltn,m=λxy[x=y]∘[in,m,λP[n(P)+1]∘p1+n,m+11+n+m+1].
Ahora definamos Tn,m=M(Haltn,m). Notese que DTn,m={(→x,→α,P):P se detiene partiendo de ‖x1,...,xn,α1,...,αm‖} y para (→x,→α,P)∈DTn,m tenemos que Tn,m(→x,→α,P)= cantidad de pasos necesarios para que P se detenga partiendo de ‖x1,...,xn,α1,...,αm‖. En algun sentido, la funcion Tn,m mide el tiempo que tarda en detenerse P
4.14. Tn,m es (Σ∪Σp)-recursiva
Proof. Es directo del Lema 4.25 ya que Haltn,m es (Σ∪Σp)-p.r.
Para n,m∈ω definamos la funcion Φn,m# de la siguiente manera: DΦn,m#={(→x,→α,P)∈ωn×Σ∗m×ProΣ:(→x,→α)∈DΨn,m,#P}Φn,m#(→x,→α,P)=Ψn,m,#P(→x,→α), para cada (→x,→α,P)∈DΦn,m# Notese que DΦn,m#={(→x,→α,P):P se detiene partiendo de ‖x1,...,xn,α1,...,αm‖} y para cada (→x,→α,P)∈DΦn,m#, se tiene que Φn,m#(→x,→α,P)= valor que queda en la variable N1 cuando P se detiene partiendo de ‖x1,...,xn,α1,...,αm‖.
Similarmente, definamos la funcion Φn,m∗ de la siguiente manera: DΦn,m∗={(→x,→α,P)∈ωn×Σ∗m×ProΣ:(→x,→α)∈DΨn,m,∗P}Φn,m∗(→x,→α,P)=Ψn,m,∗P(→x,→α), para cada (→x,→α,P)∈DΦn,m∗ Notese que Φn,m#=λ→x→αP[Ψn,m,#P(→x,→α)]Φn,m∗=λ→x→αP[Ψn,m,∗P(→x,→α)]
4.4. Las funciones Φn,m# y Φn,m∗ son (Σ∪Σp)-recursivas.
Proof. Veremos que Φn,m# es (Σ∪Σp)-recursiva. Notar que DTn,m=DΦn,m#. Notese que para (→x,→α,P)∈DTn,m=DΦn,m# tenemos que Φn,m#(→x,→α,P)=En,m#1(Tn,m(→x,→α,P),→x,→α,P) lo cual con un poco mas de trabajo nos permite probar que Φn,m#=En,m#1∘[Tn,m,pn,m+11,...,pn,m+1n+m+1] Ya que la funcion En,m#1 es (Σ∪Σp)-p.r. y Tn,m es (Σ∪Σp)-r., tenemos que Φn,m# es (Σ∪Σp)-r.
Ahora nos sera facil probar que el paradigma de Godel es por lo menos tan abarcativo como el imperativo de Von Neumann. Mas concretamente:
4.5 (Godel vence a Neumann). Si f:Df⊆ωn×Σ∗m→O es Σ-computable, entonces f es Σ-recursiva.
Proof. Haremos el caso O=Σ∗. Sea P0 un programa que compute a f. Primero veremos que f es (Σ∪Σp)-recursiva. Note que f=Φn,m∗∘[pn,m1,...,pn,mn+m,Cn,mP0] donde cabe destacar que pn,m1,...,pn,mn+m son las proyecciones respecto del alfabeto Σ∪Σp, es decir que tienen dominio ωn×(Σ∪Σp)∗m. Ya que Φn,m∗ es (Σ∪Σp)-recursiva tenemos que f lo es. O sea que el Teorema 4.2 nos dice que f es Σ-recursiva.
Un corolario interesante que se puede obtener del teorema anterior es que toda funcion Σ-recursiva puede obtenerse combinando las reglas basicas en una forma muy particular.
4.4 (Forma Normal de Kleene). Si f:Df⊆ωn×Σ∗m→O es Σ-recursiva, entonces existe un predicado Σ-p.r. P:N×ωn×Σ∗m→ω y una funcion Σ-p.r. g:N→O tales que f=g∘M(P).
Proof. Supongamos que O=Σ∗. Sea P0 un programa el cual compute a f. Sea ≤ un orden total sobre Σ. Note que podemos tomar P=λt→x→α[Haltn,m((t)1,→x,→α,P0)∧(t)2=#≤(En,m∗1((t)1,→x,→α,P0))]g=λt[∗≤((t)2)] (Justifique por que P es Σ-p.r..)
A continuacion veremos ejemplos naturales de funciones (Σ∪Σp)-recursivas que no son (Σ∪Σp)-recursivas primitivas. Cabe destacar que la prueba se basa en la Proposicion 4.6 (enunciada sin demostracion) la cual nos dice que cualquiera sea el alfabeto finito Σ, siempre hay una funcion que es Σ-recursiva y no es Σ-recursiva primitiva.
4.15. Cualesquiera sean n,m∈ω, se tiene que las funciones Tn,m, Φn,m# y Φn,m∗ no son (Σ∪Σp)-p.r.
Proof. Fijemos n,m∈ω. Probaremos que Φn,m# es (Σ∪Σp)-p.r. sii Φ0,0# es (Σ∪Σp)-p.r.. Sean f1,f2:ωn×Σ∗m→(Σ∪Σp)∗ dadas por f1(→x,→α)=(N1←N1+1)x1...(Nˉn←Nˉn+1)xnf1(→x,→α)=(⊂i=|α1|i=1P1←P1.[α1]i)...(⊂i=|αm|i=1P1←P1.[αm]i) Sea f:ωn×Σ∗m×ProΣ→(Σ∪Σp)∗ dada por f(→x,→α,P)=f1(→x,→α)f1(→x,→α)P Es facil ver que f es (Σ∪Σp)-p.r.. Notese que Φn,m#=Φ0,0#∘f. Ademas notese que Φ0,0#=Φn,m#∘[C0,10,...,C0,10,C0,1ε,...,C0,1ε,p0,11] Ya que f y las funciones C0,10,C0,1ε,p0,11 son (Σ∪Σp)-p.r., tenemos que Φn,m# es (Σ∪Σp)-p.r. sii Φ0,0# lo es.
Supongamos ahora que para algunos k,l∈ω se tiene que Φk,l# es (Σ∪Σp)-p.r.. Llegaremos a un absurdo. Por lo antes probado tenemos que Φn,m# es (Σ∪Σp)-p.r., cualesquiera sean n,m∈ω. Notese que de la prueba del teorema anterior sigue que toda funcion Σ-computable con imagen contenida en ω es de la forma Φn,m#∘[pn,m1,...,pn,mn+m,Cn,mP0], para algunos n,m∈ω y P0∈ProΣ. Pero entonces toda funcion Σ-computable con imagen contenida en ω es (Σ∪Σp)-p.r., lo cual por la batalla Neumann vence a Godel nos dice que toda funcion Σ-recursiva con imagen contenida en ω es (Σ∪Σp)-p.r.. Por el Teorema de Independencia del Alfabeto tenemos que toda funcion Σ-recursiva con imagen contenida en ω es Σ)-p.r., lo cual contradice la Proposicion 4.6.
Ahora supongamos que hay n,m∈ω tales que Tn,m es (Σ∪Σp)-p.r.. Llegaremos a un absurdo. Como ya vimos en la prueba de un teorema reciente, se tiene que Φn,m#=En,m#1∘[Tn,m,pn,m+11,...,pn,m+1n+m+1] Pero entonces ya que En,m#1 es (Σ∪Σp)-p.r., tenemos que Φn,m# es (Σ∪Σp)-p.r., lo cual como ya vimos recien no es cierto. El absurdo nos dice que Tn,m no es (Σ∪Σp)-p.r..
4.5. La minimizacion de un predicado Σ-p.r. no necesariamente es Σ-p.r.
Proof. Por definicion Tn,m=M(Haltn,m).
Aqui veremos, con ejemplos, como ciertos macros nos permitiran dentro de un programa hablar acerca del funcionamiento de otro programa. En este sentido los desarrollos de las dos batallas entre Neumann y Godel nos permiten fortalecer notablemente al paradigma imperativo en su roll modelizador (o simulador) de los procedimientos efectivos. Esto es importante ya que el paradigma mas comodo, amplio e intuitivo es sin duda el filosofico de Leibniz.
Veamos el primer ejemplo. Probaremos que:
- Si f:Df⊆ω→ω es Σ-computable, 0∈Df y f(0)=2, entonces S={x∈Df:f(x)≠0} es Σ-enumerable.
Notese que 0∈S por lo cual S es no vacio asique en virtud de la Caracterizacion de Σ-enumerabilidad deberemos encontrar un programa P∈ProΣ que enumere a S, es decir tal que DomΨ1,0,#P=ω y ImΨ1,0,#P=S. Dicho en palabras, el programa P debera cumplir:
- Siempre que lo corramos desde un estado de la forma ‖x‖, con x∈ω, debe detenerse y el contenido de la variable N1 bajo detencion debera ser un elemento de S
- Para cada s∈S debera haber un x∈ω tal que s es el valor de la variable N1 bajo detencion cuando corremos P desde ‖x‖
Sea P0∈ProΣ un programa que compute a f. Usaremos P0 para diseñar P. A continuacion daremos una descripcion intuitiva del funcionamiento de P (pseudocodigo) para luego escribirlo correctamente usando macros. El programa P comenzara del estado ‖x‖ y hara las siguientes tareas
Etapa 1: si x=0 ir a Etapa 6, en caso contrario ir a Etapa 2.
Etapa 2: calcular (x)1 y (x)2 e ir a Etapa 3.
Etapa 3: si P0 termina desde ‖(x)1‖ en (x)2 pasos ir a Etapa 4, en caso contrario ir a Etapa 6
Etapa 4: si el valor que queda en N1 luego de correr P0 una cantidad (x)2 de pasos, partiendo de ‖(x)1‖, es distinto de 0, entonces ir a Etapa 5. En caso contrario ir a Etapa 6.
Etapa 5: asignar a N1 el valor (x)1 y terminar
Etapa 6: asignar a N1 el valor 0 y terminar
Notese que la descripcion anterior no es ni mas ni menos que un procedimiento efectivo (efectivisable) que enumera a S, y nuestra mision es simularlo dentro del lenguaje SΣ. Para esto usaremos varios macros. Ya que la funcion f=λx[(x)1] es Σ-p.r., el Segundo Manantial de Macros nos dice que hay un macro: [V2←f(V1)] el cual escribiremos de la siguiente manera mas intuitiva: [V2←(V1)1] Similarmente hay un macro: [V2←(V1)2] Tambien, ya que el predicado P=λx[x=0] es Σ-recursivo, hay un macro: [IFP(V1)GOTOA1] el cual escribiremos de la siguiente manera: [IFV1=0GOTOA1] Definamos H=λtx[Halt1,0(t,x,P0)] Notar que DH=ω2 y que H es Σ-mixta. Ademas sabemos que la funcion Halt1,0 es (Σ∪Σp)-p.r. por lo cual resulta facilmente que H es (Σ∪Σp)-p.r.. Por Independencia del Alfabeto tenemos que H es Σ-p.r.. O sea que el Segundo Manatial nos dice que hay un macro de SΣ: [IFH(V1,V2)GOTOA1] Para hacer mas intuitivo el uso de este macro lo escribiremos de la siguiente manera [IFHalt1,0(V1,V2,P0)GOTOA1] Sea g=λtx[E1,0#1(t,x,P0)] Ya que g es Σ-recursiva (por que?), hay un macro: [V3←g(V1,V2)] Para hacer mas intuitivo el uso de este macro lo escribiremos de la siguiente manera [V3←E1,0#1(V1,V2,P0)] Ahora si podemos dar nuestro programa P que enumera a S: IFN1≠0GOTOL1GOTOL2L1[N3←(N1)1][N4←(N1)2][IFHalt1,0(N4,N3,P0)GOTOL3]GOTOL2L3[N5←E1,0#1(N4,N3,P0)][IFN5=0GOTOL2]N1←N3GOTOL4L2N1←0L4SKIP
Ya que los programas de SΣ son palabras del alfabeto Σ∪Σp, nos podemos preguntar cuando un conjunto L de programas es (Σ∪Σp)-enumerable. Daremos un ejemplo. Sea Σ={@,!} y sea L={P∈ProΣ:Ψ1,0,#P(10)=10} Veremos que L es (Σ∪Σp)-enumerable, dando un programa Q∈ProΣ∪Σp que enumere a L, es decir tal que Dom(Ψ1,0,∗Q)=ω y Im(Ψ1,0,∗Q)=L. Cabe destacar que aqui hay en juego dos versiones de nuestro lenguaje imperativo, es decir enumeraremos un conjunto de programas de SΣ usando un programa de SΣ∪Σp. Sea ≤ un orden total sobre el conjunto Σ∪Σp.
A continuacion daremos una descripcion intuitiva del funcionamiento de Q (pseudocodigo) para luego escribirlo correctamente usando macros. Notese que SKIP∈L. El programa Q comenzara del estado ‖x‖ y hara las siguientes tareas
Etapa 1: si x=0 ir a Etapa 6, en caso contrario ir a Etapa 2.
Etapa 2: calcular (x)1, (x)2 y ∗≤((x)1) e ir a Etapa 3.
Etapa 3: si ∗≤((x)1)∈ProΣ y termina partiendo desde ‖10‖ en (x)2 pasos ir a Etapa 4, en caso contrario ir a Etapa 6
Etapa 4: si el valor que queda en N1 luego de correr ∗≤((x)1) una cantidad (x)2 de pasos, partiendo de ‖10‖ es igual a 10, entonces ir a Etapa 5. En caso contrario ir a Etapa 6.
Etapa 5: asignar a P1 la palabra ∗≤((x)1) y terminar
Etapa 6: asignar a P1 la palabra SKIP y terminar
Notese que la descripcion anterior no es ni mas ni menos que un procedimiento efectivo que enumera a L, y nuestra mision es simularlo dentro del lenguaje SΣ∪Σp. Para esto usaremos varios macros. Es importante notar que los macros que usaremos corresponden al lenguaje SΣ∪Σp ya que los usaremos en Q el cual sera un programa de SΣ∪Σp.
Ya que las funciones λx[(x)1] y λx[(x)2] son (Σ∪Σp)-recursivas el Segundo Manantial nos dice que hay macros en SΣ∪Σp asociados a estas funciones los cuales escribiremos de la siguiente manera mas intuitiva: [V2←(V1)2] Ya que el predicado P=λx[x=10] es (Σ∪Σp)-recursivo tenemos en SΣ∪Σp su macro asociado el cual escribiremos de la siguiente manera: [IFV1=10GOTOA1] Por un lema anterior sabemos que ProΣ es un conjunto (Σ∪Σp)-p.r., por lo cual χ(Σ∪Σp)∗ProΣ es (Σ∪Σp)-p.r., y por lo tanto hay un macro [IFχ(Σ∪Σp)∗ProΣ(W1)GOTOA1] el cual escribiremos de la siguiente manera [IFW1∈ProΣGOTOA1] Ya que el predicado Halt1,0 es (Σ∪Σp)-recursivo tenemos un macro asociado a el, el cual escribiremos de la siguiente forma [IFHalt1,0(V1,V2,W1)GOTOA1] Ya que E1,0#1 es (Σ∪Σp)-recursivo tenemos un macro asociado a ella, el cual escribiremos de la siguiente forma [V3←E1,0#1(V1,V2,W1)] Tambien usaremos macros [W1←SKIP] (dejamos al lector hacerlos a mano o tambien se puede justificar su existencia via el Segundo Manantial aplicado a las funciones C0,010 y C0,0SKIP).
Ahora si podemos hacer el programa Q de SΣ∪Σp que enumera a L: IFN1≠0GOTOL1GOTOL2L1[N2←(N1)1][N3←(N1)2][P1←∗≤(N2)][IFP1∈ProΣGOTOL3]GOTOL2L3[N4←10][IFHalt1,0(N3,N4,P1)GOTOL4]GOTOL2L4[N5←E1,0#1(N3,N4,P1)][IFN5=10GOTOL5]L2[P1←SKIP]L5SKIP
Cuando Σ⊇Σp podemos correr un programa P∈ProΣ partiendo de un estado que asigne a sus variables alfabeticas programas (ya que los programas son meras palabras de Σ∗). En particular podriamos correr un programa P desde el estado ‖P‖. Llamaremos A al conjunto formado por aquellos programas P tales que P se detiene partiendo del estado ‖P‖. Es decir A={P∈ProΣ:∃t∈ω tal que Halt0,1(t,P,P)=1} Por ejemplo SKIP∈A. Dicho rapida y sugestivamente A es el conjunto formado por aquellos programas que se detienen partiendo de si mismos. Dejamos al lector hacer un programa que enumere a A. Como veremos mas adelante este conjunto, si bien es Σ-enumerable, no es Σ-computable.
Ahora consiremos el conjunto L={P∈ProΣ:Ψ0,0,∗P(◊)=P} En palabras, un programa P∈ProΣ estara en L si y solo si P termina desde ((0,0,...),(ε,ε,...)) dejando en P1 la palabra P. En algun sentido los elementos de L son programas que se autopropagandean ya que “de la nada ellos terminan dandose a si mismos como salida”. Dejamos al lector la tarea de reflexionar hasta entender que resulta dificil encontrar “a mano” un elemento de L. En algun sentido, para lograr hacer un programa que este en L debemos ir escribiendo instrucciones que a su ves vayan garantizando que ellas mismas vayan quedando en el contenido de la variable P1. Sin embargo el Teorema de la Recursion (de Kleene) nos garantiza que L es no vacio! Dejamos al lector la tarea de hacer un programa que enumere a L (obviamente utilizando un elemento fijo de L).
Consideremos ahora el conjunto S={(P1,P2)∈ProΣ×ProΣ:Ψ0,0,∗P1(◊)=P1P2=Ψ0,0,∗P2(◊)} Note que nuevamente es dificil imaginar como uno programaria un par de programas P1 y P2 de manera que (P1,P2) este en S. El Teorema de la Recursion Doble (de Smullyan) nos garantiza que S es no vacio! Dejamos al lector la tarea de hacer un programa que enumere a L (obviamente utilizando un elemento fijo de S).
Para probar que toda funcion Σ-Turing computable es Σ-recursiva debemos estudiar la recursividad del funcionamiento de las maquinas de Turing. Cabe destacar que tal como se lo explico en la Subseccion [BasicosMaquinasDeTuring] supondremos siempre que el conjunto de estados de una maquina de Turing M=(Q,Σ,Γ,δ,q0,B,F) es un alfabeto disjunto con Γ.
Primero probaremos algunos lemas basicos.
4.51. Sea M=(Q,Σ,Γ,δ,q0,B,F) una maquina de Turing. Entonces
(1) Des es un conjunto (Γ∪Q)-p.r.
(2) St:Des→Q es una funcion (Γ∪Q)-p.r.
Notese que la funcion δ de una maquina de Turing M=(Q,Σ,Γ,δ,q0,B,F) no es (Γ∪Q)-mixta. Sin envargo los siguientes predicados (Γ∪Q)-mixtos contienen toda la informacion de δ: PL:Q×Γ×Q×Γ→ω(p,σ,q,γ)→{1si δ(q,γ)=(p,σ,L)0caso contrario PL:Q×Γ×Q×Γ→ω(p,σ,q,γ)→{1si (p,σ,L)∈δ(q,γ)0caso contrario PR:Q×Γ×Q×Γ→ω(p,σ,q,γ)→{1si δ(q,γ)=(p,σ,R)0caso contrario PK:Q×Γ×Q×Γ→ω(p,σ,q,γ)→{1si δ(q,γ)=(p,σ,K)0caso contrario
4.52. Sea M=(Q,Σ,Γ,δ,q0,B,F) una maquina de Turing. Entonces los predicados PL,PR y PK son (Γ∪Q)-p.r.
Proof. Ya que los tres predicados tienen dominio finito, el Corolario 4.2 nos dice que son (Γ∪Q)-p.r.
Recordemos que dado α∈(Q∪Γ)∗, definimos ⌊α⌋ de la siguiente manera ⌊ε⌋=ε⌊ασ⌋=ασ, si σ≠B⌊αB⌋=⌊α⌋ Es decir ⌊α⌋ es el resultado de remover de α el tramo final mas grande de la forma Bn.
Tambien dada cualquier palabra α definimos ↷α={[α]2...[α]|α|si|α|≥2εsi|α|≤1α↶={[α]1...[α]|α|−1si|α|≥2εsi|α|≤1
4.53. Las funciones λα[⌊α⌋], λα[↷α] y λα[α↶] son (Γ∪Q)-p.r.. (Notar que la notacion λ aqui es respecto del alfabeto Γ∪Q por lo cual las tres funciones tienen dominio igual a (Γ∪Q)∗.)
Notese que dada una maquina de Turing M, la expresion d⊢Md′ fue definida solo en el caso en que d y d′ son descripciones instantaneas. Es decir que el predicado λdd′[d⊢d′] tiene dominio igual a Des×Des.
4.54. El predicado λdd′[d⊢Md′] es (Γ∪Q)-p.r..
Proof. Sea ˜PL:Des×Des×Γ×Γ∗×Γ∗×Q×Q→ω definido por ˜PL(d,d′,σ,α,β,p,q)=1 sii d=αpβ∧(q,σ,L)=δ(p,[βB]1)∧α≠ε∧d′=⌊α↶q[α]|α|σ↷β⌋ Sea ˜PR:Des×Des×Γ×Γ∗×Γ∗×Q×Q→ω definido por ˜PR(d,d′,σ,α,β,p,q)=1 sii d=αpβ∧(q,σ,R)=δ(p,[βB]1)∧d′=ασq↷β Sea ˜PK:Des×Des×Γ×Γ∗×Γ∗×Q×Q→ω definido por ˜PK(d,d′,σ,α,β,p,q)=1 sii d=αpβ∧(q,σ,K)=δ(p,[βB]1)∧d′=⌊αqσ↷β⌋ Se deja al lector la verificacion de que estos predicados son (Γ∪Q)-p.r.. Notese que λdd′[d⊢Md′] es igual al predicado λdd′[(∃σ∈Γ)(∃α,β∈Γ∗)(∃p,q∈Q)(˜PR∨˜PL∨˜PK)(d,d′,σ,α,β,p,q)] lo cual por el Lema 4.22 nos dice que λdd′[d⊢Md′] es (Γ∪Q)-p.r.
4.16. λndd′[dn⊢Md′] es (Γ∪Q)-p.r..
Proof. Sea Q=λdd′[d⊢Md′]∪C0,20|(Γ∪Q)∗2−Des2 es decir Q es el resultado de extender con el valor 0 al predicado λdd′[d⊢Md′] de manera que este definido en todo (Γ∪Q)∗2. Sea ≤ un orden total sobre Γ∪Q y sea Q1:N×Des×Des→ω definido por Q1(x,d,d′)=1 sii
((∀i∈N)i≤Lt(x)∗≤((x)i)∈Des)∧∗≤((x)1)=d∧
∗≤((x)Lt(x))=d′∧((∀i∈N)i≤Lt(x)˙−1Q(∗≤((x)i),∗≤((x)i+1)))
Notese que dicho rapidamente Q1(x,d,d′)=1 sii x codifica una computacion que parte de d y llega a d′. Se deja al lector la verificacion de que este predicado es (Γ∪Q)-p.r.. Notese que λndd′[dn⊢Md′]=λndd′[(∃x∈N)Lt(x)=n+1∧Q1(x,d,d′)] Es decir que solo nos falta acotar el cuantificador existencial, para poder aplicar el lema de cuantificacion acotada. Ya que cuando d1,...,dn+1∈Des son tales que d1⊢Md2⊢M⋯⊢Mdn+1 tenemos que |di|≤|d1|+n, para i=1,...,n una posible cota para dicho cuantificador es n+1∏i=1pr(i)|Γ∪Q||d|+n. O sea que, por el lema de cuantificacion acotada, tenemos que el predicado λndd′[dn⊢Md′] es (Γ∪Q)-p.r.
4.6 (Godel vence a Turing). Supongamos f:S⊆ωn×Σ∗m→O es Σ-Turing computable. Entonces f es Σ-recursiva.
Proof. Supongamos O=Σ∗ y sea M=(Q,Σ,Γ,δ,q0,B,∣,F) una maquina de Turing con unit la cual compute a f. Sea ≤ un orden total sobre Σ. Notese que por el Teorema 4.2, la funcion ∗≤ es (Γ∪Q)-p.r.. Sea P:N×ωn×Σ∗m→ω dado por P(x,→x,→α)=1 sii
(∃q∈Q)⌊q0B∣x1...B∣xnBα1...Bαm⌋(x)1⊢M⌊qB∗≤((x)2)⌋∧
∧(∀d∈Des)|d|≤|∗≤((x)2)|+2¬(⌊qB∗≤((x)2)⌋⊢Md)
Dejamos al lector la prueba de que P es (Γ∪Q)-p.r.. Ya que P es Σ-mixto, el Teorema 4.2 nos dice que P es Σ-p.r.. Notese que f=λ→x→α[∗≤((minxP(x,→x,→α))2)], lo cual nos dice que f es Σ-recursiva.
Probaremos que toda funcion Σ-computable es Σ-Turing computable. Para esto probaremos un resultado general que nos enseñara a simular el comportamiento de un programa con una maquina de Turing. Es importante notar que la simulacion que nos interesa que haga la maquina simuladora no es a nivel de la funcion que computa el programa sino a un nivel mas general, es decir nos interesa que simule a dicho programa como transformador de estados. En particular y usada adecuadamente, la maquina simuladora nos servira para confeccionar una maquina que compute una funcion computada por un programa dado.
Dado P∈ProΣ, definamos N(P)=menor k∈N tal que las variables que ocurren en Pestan todas en la lista N1,...,Nˉk,P1,...,Pˉk Por ejemplo si P es el siguiente programa (aqui Σ={▴,#}) L1N4←N4+1P1←P1.▴IF N1≠0 GOTOL1 entonces tenemos N(P)=4
Sea P un programa y sea k fijo y mayor o igual a N(P). La construccion de la maquina simuladora dependera de P y de k. Notese que cuando P se corre desde algun estado de la forma ‖x1,...,xk,α1,...,αk‖ los sucesivos estados por los que va pasando son todos de la forma ‖y1,...,yk,β1,...,βk‖ es decir en todos ellos las variables con indice mayor que k valen 0 o ε. La razon es simple: ya que en P no figuran las variables N¯k+1,N¯k+2,...P¯k+1,P¯k+2,... estas variables quedan con valores 0 y ε, respectivamente a lo largo de toda la computacion.
La maquina simuladora que construiremos simulara a P en cuanto a su funcionamiento cuando partimos de estados de la forma ‖x1,...,xk,α1,...,αk‖. Necesitaremos tener alguna manera de representar en la cinta los diferentes estados por los cuales se va pasando, a medida que corremos a P. Esto lo haremos de la siguiente forma: al estado ‖x1,...,xk,α1,...,αk‖ lo representaremos en la cinta de la siguiente manera B∣x1...B∣xkBα1...BαkBBBB.... Por ejemplo consideremos el programa P mostrado recien y fijemos k=6. Entonces al estado ‖3,2,5,0,4,2,▴,▴▴,ε,#▴,#,###‖ lo representaremos en la cinta de la siguiente manera B∣∣∣B∣∣B∣∣∣∣∣BB∣∣∣∣B∣∣B▴B▴▴BB#▴B#B###BBBBB.... A lo que queda entre dos blancos consecutivos (es decir que no hay ningun blanco entre ellos) lo llamaremos "bloque", por ejemplo en la cinta de arriba tenemos que los primeros 12 bloques son ∣∣∣ ∣∣ ∣∣∣∣∣ ε ∣∣∣∣ ∣∣ ▴ ▴▴ ε #▴ # ### y despues los bloques siguientes (que son infinitos ya que la cinta es infinita hacia la derecha) son todos iguales a ε.
Una observacion importante es que esta forma de representacion de estados en la cinta depende del k elejido, es decir si tomaramos otro k, por ejemplo k=9, entonces el estado anterior se representaria de otra forma en la cinta. Aqui se ve claramente que la maquina simuladora que construiremos dependera del k elejido.
Construccion de las maquinas simuladoras de instrucciones
Armaremos la maquina simuladora como concatenacion de maquinas las cuales simularan, via la representacion anterior, el funcionamiento de las distintas instrucciones de P. Asumiremos que en P no hay instrucciones de la forma GOTOLˉm ni de la forma Lˉn GOTOLˉm. Esto simplificara un poco la construccion de la maquina simuladora y de hecho lo podemos hacer ya que toda funcion Σ-computable puede ser computada por un programa sin este tipo de instrucciones, tal como lo veremos mas adelante (Lema 4.55).
Para poder hacer concretamente las maquinas simuladoras de instrucciones deberemos diseñar antes algunas maquinas auxiliares. Todas las maquinas descriptas a continuacion tendran a ∣ como unit y a B como blanco, tendran a Σ como su alfabeto terminal y su alfabeto mayor sera Γ=Σ∪{B,∣}∪{˜a:a∈Σ∪{∣}}. Ademas tendran uno o dos estados finales con la propiedad de que si q es un estado final, entonces (q,σ)∉Dδ, para cada σ∈Γ.
Para cada j≥1, sea Dj la siguiente maquina:

Notese que αBβ1Bβ2B...BβjBγ∗⊢αBβ1Bβ2B...BβjBγ ↑↑ q0qf siempre que α,γ∈Γ∗, β1,...,βj∈(Γ−{B})∗. Es decir la maquina Dj lo unico que hace es mover el cabezal desde el blanco de la izquierda de un bloque determinado, exactamente j bloques a la derecha
Analogamente Ij sera una maquina que desplaza el cabezal j bloques a la izquierda del blanco que esta escaneando. Es decir Ij cumplira que αBβjB...Bβ2Bβ1Bγ∗⊢αBβjB...Bβ2Bβ1Bγ ↑↑ q0qf siempre que α,γ∈Γ∗, β1,...,βj∈(Γ−{B})∗. Dejamos al lector la manufactura de esta maquina.
Para j≥1, sea TDj una maquina con un solo estado final qf y tal que αBγ∗⊢αBBγ↑↑ q0qf cada vez que α,γ∈Γ∗ y γ tiene exactamente j ocurrencias de B. Es decir la maquina TDj corre un espacio a la derecha todo el segmento γ y agrega un blanco en el espacio que se genera a la izquierda. Por ejemplo, para el caso de Σ={a} podemos tomar TD3 igual a la siguiente maquina:

Analogamente, para j≥1, sea TIj una maquina tal que αBσγ∗⊢αBγ↑ ↑q0 qf cada vez que α∈Γ∗, σ∈Γ y γ tiene exactamente j ocurrencias de B. Es decir la maquina TIj corre un espacio a la izquierda todo el segmaneto γ (por lo cual en el lugar de σ queda el primer simbolo de γ). Dejamos al lector la construccion de por ejemplo TI3 para Σ={a}.
A continuacion describiremos las distintas maquinas simuladoras de instrucciones (y para algunos casos mostraremos concretamente como pueden ser hechas usando las maquinas anteriores).
Para 1≤i≤k, sea M+i,k una maquina tal que cualesquiera sean x1,...,xk∈ω y α1,...,αk∈Σ∗: B∣x1...B∣xkBα1...Bαk∗⊢B∣x1...B∣xi−1B∣xi+1B∣xi+1...B∣xkBα1...Bαk↑↑q0qf donde q0 es el estado inicial y qf es el unico estado final de M+i,k. Es claro que la maquina M+i,k simula la instruccion Nˉı←Nˉı+1, via la representacion de estados en la cinta con respecto a k.
Para 1≤i≤k, sea M˙−i,k una maquina tal que cualesquiera sean x1,...,xk∈ω y α1,...,αk∈Σ∗: B∣x1...B∣xkBα1...Bαk∗⊢B∣x1...B∣xi−1B∣xi˙−1B∣xi+1...B∣xkBα1...Bαk↑↑q0qf donde q0 es el estado inicial y qf es el unico estado final de M˙−i,k. Es claro que la maquina M˙−i,k simula la instruccion Pˉı←Pˉı˙−1, via la representacion de estados en la cinta con respecto a k.
Para 1≤i≤k y a∈Σ, sea Mai,k una maquina tal que cualesquiera sean x1,...,xk∈ω y α1,...,αk∈Σ∗: B∣x1...B∣xkBα1...Bαk∗⊢B∣x1...B∣xkBα1...Bαi−1BαiaBαi+1...Bαk↑↑q0qf donde q0 es el estado inicial y qf es el unico estado final de Mai,k. Es claro que la maquina Mai,k simula la instruccion Pˉı←Pˉı.a, via la representacion de estados en la cinta con respecto a k. La maquina Mai,k.puede hacerse de la siguiente manera:

Para 1≤i≤k, sea M↷i,k una maquina tal que cualesquiera sean x1,...,xk∈ω y α1,...,αk∈Σ∗: B∣x1...B∣xkBα1...Bαk∗⊢B∣x1...B∣xkBα1...Bαi−1B↷αiBαi+1...Bαk↑↑q0qf donde q0 es el estado inicial y qf es el unico estado final de M↷i,k. Es claro que la maquina M↷i,k simula la instruccion Pˉı← ↷Pˉı, via la representacion de estados en la cinta con respecto a k.
Para 1≤i,j≤k, sea M#,ki←j una maquina tal que cualesquiera sean x1,...,xk∈ω y α1,...,αk∈Σ∗: B∣x1...B∣xkBα1...Bαk∗⊢B∣x1...B∣xi−1B∣xjB∣xi+1...B∣xkBα1...Bαk↑↑q0qf donde q0 es el estado inicial y qf es el unico estado final de M#,ki←j. Es claro que la maquina M#,ki←j simula la instruccion Nˉı←Nˉj, via la representacion de estados en la cinta con respecto a k.
Para 1≤i,j≤k, sea M∗,ki←j una maquina tal que cualesquiera sean x1,...,xk∈ω y α1,...,αk∈Σ∗: B∣x1...B∣xkBα1...Bαk∗⊢B∣x1...B∣xkBα1...Bαi−1BαjBαi+1...Bαk↑↑q0qf donde q0 es el estado inicial y qf es el unico estado final de M∗,ki←j. Es claro que la maquina M∗,ki←j simula la instruccion Pˉı←Pˉj, via la representacion de estados en la cinta con respecto a k. La maquina M∗,ki←j, para el caso Σ={a,b} y i<j puede hacerse de la siguiente manera:

Para 1≤i≤k, sea Mki←0 una maquina tal que cualesquiera sean x1,...,xk∈ω y α1,...,αk∈Σ∗: B∣x1...B∣xkBα1...Bαk∗⊢B∣x1...B∣xi−1BB∣xi+1...B∣xkBα1...Bαk↑↑q0qf donde q0 es el estado inicial y qf es el unico estado final de Mki←0. Es claro que la maquina Mki←0 simula la instruccion Nˉı←0, via la representacion de estados en la cinta con respecto a k.
Para 1≤i≤k, sea Mki←ε una maquina tal que cualesquiera sean x1,...,xk∈ω y α1,...,αk∈Σ∗: B∣x1...B∣xkBα1...Bαk∗⊢B∣x1...B∣xkBα1...Bαi−1BBαi+1...Bαk↑↑q0qf donde q0 es el estado inicial y qf es el unico estado final de Mki←ε. Es claro que la maquina Mki←ε simula la instruccion Pˉı←ε, via la representacion de estados en la cinta con respecto a k.
Sea MSKIP=({q0,qf},Γ,Σ,δ,q0,B,∣,{qf}), con Dδ={(q0,B)} y δ(q0,B)=(qf,B,K). Es claro que la maquina MSKIP simula la instruccion SKIP, via la representacion de estados en la cinta con respecto a k (cualquiera sea el k).
Para 1≤j≤k, sea IFj,k una maquina con estado inicial q0 y dos estados finales qsi y qno tal que cualesquiera sean x1,...,xk∈ω y α1,...,αk∈Σ∗, si xj≠0, entonces B∣x1...B∣xkBα1...Bαk∗⊢B∣x1...B∣xkBα1...Bαk↑↑q0qsi y si xj=0, entonces B∣x1...B∣xkBα1...Bαk∗⊢B∣x1...B∣xkBα1...Bαk↑↑q0qno
Para 1≤i≤k y a∈Σ, sea IFaj,k una maquina con estado inicial q0 y dos estados finales qsi y qno tal que cualesquiera sean x1,...,xk∈ω y α1,...,αk∈Σ∗, si αj comienza con a, entonces B∣x1...B∣xkBα1...Bαk∗⊢B∣x1...B∣xkBα1...Bαk↑↑q0qsi y en caso contrario B∣x1...B∣xkBα1...Bαk∗⊢B∣x1...B∣xkBα1...Bαk↑↑q0qno La maquina IFaj,k puede hacerse de la siguinete manera:

Ejemplo de maquina simuladora de un programa
A continuacion veremos un ejemplo de como se arma la maquina simuladora de un programa dado. Sea Σ={▴,#} y sea P el siguiente programa L3N4←N4+1P1← ↷P1IF P1 BEGINS ▴ GOTOL3P3←P3.# Tomemos k=5. Es claro que k≥N(P)=4. A la maquina que simulara a P respecto de k, la llamaremos Msim y sera la siguiente maquina:

Veamos con un ejemplo como Msim simula a P. Supongamos que corremos P desde el estado ‖2,1,0,5,3,#▴##,ε,▴▴,#▴,#‖ Tendremos entonces la siguiente sucesion de descripciones instantaneas: (1,‖2,1,0,5,3,#▴##,ε,▴▴,#▴,#‖)(2,‖2,1,0,6,3,#▴##,ε,▴▴,#▴,#‖)(3,‖2,1,0,6,3,▴##,ε,▴▴,#▴,#‖)(1,‖2,1,0,6,3,▴##,ε,▴▴,#▴,#‖)(2,‖2,1,0,7,3,▴##,ε,▴▴,#▴,#‖)(3,‖2,1,0,7,3,##,ε,▴▴,#▴,#‖)(4,‖2,1,0,7,3,##,ε,▴▴,#▴,#‖)(5,‖2,1,0,7,3,##,ε,▴▴#,#▴,#‖) Si hacemos funcionar a Msim desde q0B∣2B∣BB∣5B∣3B#▴##BB▴▴B#▴B#B obtendremos una sucesion de descripciones instantaneas dentro de la cual estara la siguiente subsucesion que se corresponde con las descripciones instantaneas de la computacion anterior. q0B∣2B∣BB∣5B∣3B#▴##BB▴▴B#▴B#Bq1B∣2B∣BB∣6B∣3B#▴##BB▴▴B#▴B#Bq2B∣2B∣BB∣6B∣3B#▴##BB▴▴B#▴B#Bq3B∣2B∣BB∣6B∣3B▴##BB▴▴B#▴B#Bq4B∣2B∣BB∣6B∣3B▴##BB▴▴B#▴B#BqsiB∣2B∣BB∣6B∣3B▴##BB▴▴B#▴B#Bq0B∣2B∣BB∣6B∣3B▴##BB▴▴B#▴B#Bq1B∣2B∣BB∣7B∣3B▴##BB▴▴B#▴B#Bq2B∣2B∣BB∣7B∣3B▴##BB▴▴B#▴B#Bq3B∣2B∣BB∣7B∣3B##BB▴▴B#▴B#Bq4B∣2B∣BB∣7B∣3B##BB▴▴B#▴B#BqnoB∣2B∣BB∣7B∣3B##BB▴▴B#▴B#Bq5B∣2B∣BB∣7B∣3B##BB▴▴B#▴B#Bq6B∣2B∣BB∣7B∣3B##BB▴▴#B#▴B#B Dejamos al lector ver en detalle el paralelismo que hay entre las dos sucesiones de descripciones instantaneas arriba expuestas.
La contruccion de la maquina simuladora
A continuacion describiremos en general como hacer la maquina simuladora de P, respecto de k. Supongamos que P=I1...In. Para cada i=1,...,n, llamaremos Mi a la maquina que simulara el efecto que produce la instruccion Ii, es decir tomemos
- Mi=M+j,k, si Bas(Ii)=Nˉj←Nˉj+1
- Mi=M˙−j,k, si Bas(Ii)=Nˉj←Nˉj˙−1
- Mi=Maj,k, si Bas(Ii)=Pˉj←Pˉj.a
- Mi=M↷j,k, si Bas(Ii)=Pˉj← ↷Pˉj
- Mi=M#,kj←m, si Bas(Ii)=Nˉj←Nˉm
- Mi=M∗,kj←m, si Bas(Ii)=Pˉj←Pˉm
- Mi=Mkj←0, si Bas(Ii)=Nˉj←0
- Mi=Mkj←ε, si Bas(Ii)=Pˉj←ε
- Mi=MSKIP, si Bas(Ii)=SKIP
- Mi=IFj,k, si Bas(Ii)=IFNˉj≠0 GOTOLˉm, para algun m
- Mi=IFaj,k, si Bas(Ii)=IFPˉjBEGINSaGOTOLˉm, para algun m
Ya que la maquina Mi puede tener uno o dos estados finales, la representaremos como se muestra a continuacion:

entendiendo que en el caso en que Mi tiene un solo estado final, este esta representado por el circulo de abajo a la izquierda y en el caso en que Mi tiene dos estados finales, el circulo de abajo a la izquierda corresponde al estado final qno y el circulo de abajo a la derecha corresponde al estado qsi. Para armar la maquina que simulara a P hacemos lo siguiente. Primero unimos las maquinas M1,...,Mn de la siguiente manera:

Luego para cada i tal que Bas(Ii) es de la forma αGOTOLˉm, ligamos con una flecha de la forma B,B,K→ el estado final qsi de la Mi con el estado inicial de la Mh, donde h es tal que Ih es la primer instruccion que tiene label Lˉm.
A continuacion enunciaremos en forma de lema la existencia de la maquina simuladora y de las propiedades esenciales que usaremos luego para probar que toda funcion Σ-computable es Σ-Turing computable.
4.55. Sea P∈ProΣ y sea k≥N(P). Supongamos que en P no hay instrucciones de la forma GOTOLˉm ni de la forma Lˉn GOTOLˉm. Para cada a∈Σ∪{∣}, sea ˜a un nuevo simbolo. Sea Γ=Σ∪{B,∣}∪{˜a:a∈Σ∪{∣}}. Entonces hay una maquina de Turing con unit M=(Q,Γ,Σ,δ,q0,B,∣,{qf}) la cual satisface
(1) (qf,σ)∉Dδ, para cada σ∈Γ.
(2) Cualesquiera sean x1,...,xk∈ω y α1,...,αk∈Σ∗, el programa P se detiene partiendo del estado ‖x1,...,xk,α1,...,αk‖ sii M se detiene partiendo de la descripcion instantanea ⌊q0B∣x1B...B∣xkBα1B...BαkB⌋
(3) Si x1,...,xk∈ω y α1,...,αk∈Σ∗ son tales que P se detiene partiendo del estado ‖x1,...,xk,α1,...,αk‖ y llega al estado ‖y1,...,yk,β1,...,βk‖ entonces ⌊q0B∣x1B...B∣xkBα1B...BαkB⌋∗⊢M⌊qfB∣y1B...B∣ykBβ1B...BβkB⌋
Cabe destacar que si bien la veracidad de este lema es sustentada en las explicaciones anteriores, una prueba formal rigurosa del mismo resultaria extremadamente larga y tediosa. La ventaja de que sea un resultado intuitivamente claro nos permite aceptarlo y seguir adelante en nuestro analisis.
En lo que sigue usaremos la existencia de la maquina simuladora de un programa para probar que toda funcion Σ-computable es Σ-Turing computable. Antes un lema.
4.56. Si f:Df⊆ωn×Σ∗m→Σ∗ es Σ-computable, entonces hay un programa Q el cual computa a f y el cual cumple con las siguientes propiedades
(1) En Q no hay instrucciones de la forma GOTOLˉı ni de la forma Lˉj GOTOLˉı
(2) Cuando Q termina partiendo de un estado cualquiera dado, el estado alcansado es tal que las variables numericas tienen todas el valor 0 y las alfabeticas tienen todas exepto P1 el valor ε.
Proof. Sea P un programa que compute a f. Sea r∈N tal que r>N(P),n,m. Sea ˜P el resultado de reemplazar en P cada instruccion de la forma αGOTOLˉı con α∈{ε}∪{Lˉj:j∈N} por αIF Nˉr≠0 GOTOLˉı. Ahora sea Q el siguiente programa Nˉr←Nˉr+1˜PN1←0⋮Nˉr←0P2←ε⋮Pˉr←ε Es facil ver que Q tiene las propiedades (1) y (2).
Por supuesto, hay un lema analogo para el caso en que f llega a ω en lugar de llegar a Σ∗. Ahora si, el anunciado teorema:
4.7 (Turing vence a Neumann). Si f:Df⊆ωn×Σ∗m→O es Σ-computable, entonces f es Σ-Turing computable.
Proof. Supongamos O=Σ∗. Por el Lema 4.56 existe P∈ProΣ el cual computa f y tiene las propiedades (1) y (2). Sea k=max{n,m,N(P)} y sea Msim la maquina de Turing con unit que simula a P respecto de k. Como puede observarse, la maquina Msim, no necesariamente computara a f. Sea M1 la siguiente maquina:

(Cuando n=0 debemos interpretar que D0=({q0,qf},Γ,Σ,δ,q0,B,∣,{qf}), con Dδ={(q0,B)} y δ(q0,B)=(qf,B,K). Notese que M1 cumple que para cada (→x,→α)∈ωn×Σ∗m, ⌊q0B∣x1B...B∣xnBα1B...BαmB⌋∗⊢⌊qfB∣x1B...B∣xnBk−nBα1B...BαmB⌋ Sea M2 la siguiente maquina

Notese que M2 cumple que para cada α∈Σ∗, ⌊q0Bk+1α⌋∗⊢⌊qfBα⌋ Sea M la siguiente maquina:

A continuacion veremos que M computa a f. Supongamos que (→x,→α)∈(ωn×Σ∗m)−Df. Deberemos ver que M no termina partiendo de
(*) ⌊q0B∣x1B...B∣xnBα1B...BαmB⌋
Primero notemos que, ya que P computa a f, tenemos que P no termina partiendo de ‖x1,...,xn,α1,...,αm‖ por lo cual P no termina partiendo de ‖x1,...,xn,k−n⏞0,...,0,α1,...,αm,k−m⏞ε,...,ε‖ lo cual implica (Lema 4.55) que
(**) Msim no termina partiendo de ⌊q0B∣x1B...B∣xnBk−nBα1B...BαmB⌋
Ahora notese que si hacemos funcionar a M desde la descripcion instantanea dada en (*), llegaremos (via la copia de M1 dentro de M) indefectiblemente (ya que M es deterministica) a la siguiente descripcion instantanea ⌊q2B∣x1B...B∣xnBk−nBα1B...BαmB⌋ Luego entonces (**) nos dice que al seguir trabajando M (ahora via la copia de Msim dentro de M), la maquina M nunca terminara.
Para terminar de ver que M computa a f, tomemos (→x,→α)∈Df y veamos que ⌊q0B∣x1B...B∣xnBα1B...BαmB⌋∗⊢M⌊q5Bf(→x,→α)⌋ y que la maquina M se detiene en ⌊q5Bf(→x,→α)⌋. La maquina M se detiene en ⌊q5Bf(→x,→α)⌋ ya que q5 es el estado final de una copia de M2 y por lo tanto no sale ninguna flecha desde el. Ya que P computa a f y tiene la propiedad (2) del Lema 4.56, tenemos que P termina partiendo de ‖x1,...,xn,α1,...,αm‖ y llega al estado ‖f(→x,→α)‖, o lo que es lo mismo, P termina partiendo de ‖x1,...,xn,k−n⏞0,...,0,α1,...,αm,k−m⏞ε,...,ε‖ y llega al estado ‖k⏞0,...,0,f(→x,→α),k−1⏞ε,...,ε‖ Pero entonces el Lema 4.55 nos dice que
(***) ⌊q0B∣x1B...B∣xnBk−nBα1B...BαmB⌋∗⊢Msim⌊qfBk+1f(→x,→α)⌋
Como ya lo vimos, si hacemos funcionar a M desde ⌊q0B∣x1B...B∣xnBα1B...BαmB⌋, llegaremos (via la copia de M1 dentro de M) indefectiblemente a la siguiente descripcion instantanea ⌊q2B∣x1B...B∣xnBk−nBα1B...BαmB⌋ Luego (***) nos dice que, via la copia de Msim dentro de M, llegaremos a ⌊q3Bk+1f(→x,→α)⌋ e inmediatamente a ⌊q4Bk+1f(→x,→α)⌋. Finalmente, via la copia de M2 dentro de M, llegaremos a ⌊q5Bf(→x,→α)⌋, lo cual termina de demostrar que M computa a f