7.6. HIPÓTESIS DE CHURCH 129especial <strong>de</strong> una máquina con varias cintas y, por lo tanto, no es más po<strong>de</strong>rosa que ninguno <strong>de</strong> los mo<strong>de</strong>losvistos. Al revés, una MT off-line pue<strong>de</strong> simular cualquier MT, M, usando una cinta más que M. Lo primeroque hará es copiar su input en esta cinta extra y simular a M como si ella fuera el input <strong>de</strong> M.7.6 Hipótesis <strong>de</strong> ChurchLa suposición <strong>de</strong> que la noción intuitiva <strong>de</strong> “función computable” pue<strong>de</strong> i<strong>de</strong>ntificarse con la clase <strong>de</strong> funcionesrecursivas parciales, es conocida como la Hipótesis <strong>de</strong> Church o la Tesis <strong>de</strong> Church-Turing.Aún cuando no se pue<strong>de</strong> esperar tener una “prueba” <strong>de</strong> la hipótesis <strong>de</strong> Church, al menos mientras lanoción informal <strong>de</strong> “computable” permanezca como noción informal, es sin embargo posible dar evi<strong>de</strong>ncia<strong>de</strong> porqué es una suposición rezonable.Si nuestra noción intuitiva <strong>de</strong> “computable” no posee límite en el número <strong>de</strong> pasos o la cantidad <strong>de</strong>almacenamiento necesaria, parece que las funciones recursivas parciales son (intuitivamente) computables.Aún cuando alguien podría argüir que una función no es “computable”, a menos que se pueda limitar lacomputación <strong>de</strong> antemano, o al menos saber si ella terminará o no.Lo que es más discutible es si la clase <strong>de</strong> funciones recursivas parciales incluye a todas las funcionescomputables. Los lógicos-matemáticos han presentado muchos otros formalismos, como el cálculo-λ, sistemas<strong>de</strong> Post y funciones recursivas generales. Para todos ellos se ha <strong>de</strong>mostrado que <strong>de</strong>finen la misma clase <strong>de</strong>funciones, es <strong>de</strong>cir las funciones recursivas parciales. A<strong>de</strong>más, mo<strong>de</strong>los abstractos <strong>de</strong> los computadores comola RAM (Random Access Machine) dan también lugar a las funciones recursivas parciales.La RAM consiste <strong>de</strong> un número infinito <strong>de</strong> palabras <strong>de</strong> memoria, numeradas <strong>de</strong>s<strong>de</strong> 0, cada una <strong>de</strong> lascuales pue<strong>de</strong> almacenar un número entero; y un número finito <strong>de</strong> registros aritméticos, también capaces<strong>de</strong> almacenar un entero. Los enteros pue<strong>de</strong>n ser <strong>de</strong>codificados como instrucciones en la forma usual <strong>de</strong> loscomputadores. No se <strong>de</strong>finirá la RAM más formalmente, pero <strong>de</strong>biera ser claro que si se escoge un conjuntoa<strong>de</strong>cuado <strong>de</strong> instrucciones, la RAM pue<strong>de</strong> simular cualquier computador existente.Teorema 39 Una máquina <strong>de</strong> Turing pue<strong>de</strong> simular una RAM, provisto que las instrucciones <strong>de</strong> la RAMpuedan ser simuladas por una MT.Demostración : Se usa una MT, M, <strong>de</strong> varias cintas para hacer la simulación. Una cinta <strong>de</strong> M tiene laspalabras <strong>de</strong> memoria <strong>de</strong> la RAM, a las que se les ha dado valores. La cinta se ve como#0 ∗ v 0 #1 ∗ v 1 #10 ∗ v 2 # . . . #i ∗ v i # . . .en que v i es el contenido, en binario, <strong>de</strong> la i- ésima palabra. En todo momento, habrá algún número finito <strong>de</strong>palabras <strong>de</strong> la RAM que han sido usadas y M sólo necesita mantener los valores hasta la palabra <strong>de</strong> númeromayor que se haya usado.La RAM tiene un número finito <strong>de</strong> registros aritméticos. M usa una cinta para almacenar el contenido<strong>de</strong> cada registro; otra cinta contiene el “contador <strong>de</strong> posición”, que contiene el número <strong>de</strong> la palabra <strong>de</strong>memoria <strong>de</strong> don<strong>de</strong> se <strong>de</strong>be tomar la próxima instrucción y una cinta “memory address register” en que sepue<strong>de</strong> poner el número <strong>de</strong> una palabra <strong>de</strong> memoria.Supóngase que los primeros 10 bits <strong>de</strong> una instrucción <strong>de</strong>notan una <strong>de</strong> las operaciones estándar en loscomputadores, como load, store, add, etc., y que los bits restantes <strong>de</strong>notan la dirección <strong>de</strong>l operando. Sibien no se discutirá los <strong>de</strong>talles <strong>de</strong> implementación para todas las instrucciones estándar, un ejemplo <strong>de</strong>bieraponer las cosas claras. Supóngase que la cinta con el contador <strong>de</strong> posición tiene el número i en binario. Mbusca en su primera cinta <strong>de</strong>s<strong>de</strong> la izquierda, buscando #i∗. Si se encuentra un blanco antes <strong>de</strong> encontrar#i∗, no hay instrucción en la palabra i y, por lo tanto, la RAM y M se <strong>de</strong>tienen. Si #i∗ es encontrado, losbits que siguen a *, hasta el siguiente # (v i ) se examinan. Suponga que los primeros 10 bits están codificadospara add al registro 2 y los bits restantes son un cierto número j en binario. M agrega 1 a i en el contador<strong>de</strong> posición y copia j en la “memory address register”. Luego M busca #j∗ en la primera cinta, comenzando<strong>de</strong>s<strong>de</strong> la izquierda (#0∗ marca el final por la izquierda). Si #j∗ no se encuentra, se supone que j tiene 0 y
130ACEPTACIÓN Y GENERACIÓN DE L. ENUMERABLES RECURSIVAMENTE Y RECURSIVOSse sigue con la próxima instrucción <strong>de</strong> la RAM. Si #j ∗ v j # es encontrado, v j es sumado al registro 2, queestá en su propia cinta, y se continúa con la próxima instrucción.Obsérvese que aún cuando la simulación <strong>de</strong> la RAM hizo uso <strong>de</strong> una MT con varias cintas, por teorema35, una MT con una cinta sería mucho más compleja.7.7 Máquinas <strong>de</strong> Turing como GeneradoresSe ha visto a las máquinas <strong>de</strong> Turing como reconocedoras <strong>de</strong> lenguajes y como computadoras <strong>de</strong> funcionesen los enteros no negativos. Hay una tercera visión útil <strong>de</strong> las MT, como dispositivos generadores. Consi<strong>de</strong>reuna MT, M, que usa una cinta como cinta <strong>de</strong> output, en la cual un símbolo, una vez escrito, no pue<strong>de</strong> sercambiado y cuya cabeza (escritora en este caso) nunca se mueve a la izquierda. Suponga también que en lacinta <strong>de</strong> output M escribe strings sobre algún alfabeto Σ, separados por un símbolo especial #. Se pue<strong>de</strong><strong>de</strong>finir G(M), el lenguaje generado por M, como el conjunto <strong>de</strong> w ∈ Σ ∗ , tal que w es eventualmente escritoentre un par <strong>de</strong> #’s en la cinta <strong>de</strong> output <strong>de</strong> M.Nótese que a menos que M no pare, G(M) es finito. Tampoco se requiere que las palabras sean generadasen algún or<strong>de</strong>n en particular, o que cualquier palabra sea generada una sola vez. Si L es G(M) para algunaMT, M, entonces L es un conjunto enumerable recursivamente y viceversa. Los conjuntos recursivos tambiéntienen una caracterización en términos <strong>de</strong> generadores; ellos son exactamente los lenguajes cuyas palabraspue<strong>de</strong>n ser generadas en or<strong>de</strong>n creciente <strong>de</strong> tamaño.Lema 11 Si L es G(M 1 ) para alguna MT, M 1 , entonces L es un conjunto enumerable recursivamente.Demostración : Se construye una MT, M 2 , con una cinta más que M 1 . M 2 simula a M 1 usando todo exceptola cinta <strong>de</strong> entrada <strong>de</strong> M 2 . Cada vez que M 1 imprime un # en su cinta <strong>de</strong> output, M 2 compara su input conel string recién generado. Si son el mismo, M 2 acepta; si no, sigue simulando a M 1 . Obviamente M 2 aceptaun string X, si y sólo si X ∈ G(M 1 ). Por lo tanto, L(M 2 ) = G(M 1 ) = L es enumerable recursivamente.El converso <strong>de</strong> este lema es algo más difícil. Suponga que M 1 reconoce a L ⊆ Σ ∗ . Nuestro primer (ypoco exitoso) intento para diseñar un generador para L pue<strong>de</strong> ser generar palabras en Σ ∗ , en algún or<strong>de</strong>n,w 1 , w 2 , . . ., hacer correr a M 1 en w 1 y si M 1 acepta, generar w 1 en la cinta <strong>de</strong> output. Luego hacer correr aM 1 en w 2 , generándolo si M 1 acepta, etc. Este método funciona si M 1 está garantizado <strong>de</strong> parar en todoslos inputs. Sin embargo, como se verá en el próximo capítulo, hay lenguajes enumerables recursivamenteque no son recursivos. En esos casos, aparece la posibilidad que M 1 nunca se <strong>de</strong>tenga en algún w i . LuegoM 2 nunca consi<strong>de</strong>rará w i+1 , w i+2 , . . . y no pue<strong>de</strong> generarlas aún cuando M 1 las aceptase.Debe, por lo tanto, evitarse la simulación in<strong>de</strong>finida <strong>de</strong> M 1 en alguna palabra. Para ello se fija un or<strong>de</strong>n enque enumerar strings en Σ ∗ . Luego se <strong>de</strong>sarrolla un método para generar todos los pares <strong>de</strong> enteros positivos(i, j). La simulación proce<strong>de</strong> generando un par (i, j) y simulando a M 1 en la i-ésima palabra durante j pasos.Se fija un or<strong>de</strong>n canónico para Σ ∗ como sigue. Se listan los strings en or<strong>de</strong>n <strong>de</strong> tamaño, con palabras<strong>de</strong>l mismo largo en “or<strong>de</strong>n numérico”. Esto es, sea Σ = {a 0 , a 1 , . . . , a k−1 }, e imagine que a i es el dígito i enbase k. Es <strong>de</strong>cir, las palabras <strong>de</strong> largo N son los números 0 a k N − 1, escritos en base k. El diseño <strong>de</strong> unamáquina <strong>de</strong> Turing que genere palabras en or<strong>de</strong>n canónico no es difícil y se <strong>de</strong>ja como ejercicio.Ejemplo 88 Si Σ = {0, 1}, el or<strong>de</strong>n canónico es ε, 0, 1, 00, 01, 10, 11, 000, 001, . . .Nótese que el or<strong>de</strong>n aparentemente más simple en que usualmente se generan las representaciones áscortas <strong>de</strong> los números en base k, 0, 1, 2, . . . , no sirve pues nunca se generan strings como a 0 a 0 a 1 , que tienenceros a<strong>de</strong>lante.✷✷✷