La máquina de Turing José M. Sempere Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia David Hilbert (1862, Rusia 1943, Alemania) Matemático que aportó diversos resultados de carácter fundamental (i.e. espacios de Hilbert ) En 1900 durante el Segundo Congreso Internacional de las Matemáticas en Paris formuló su famosa lista de 23 problemas esenciales para el progreso en las matemáticas. Destacamos el problema número 23 que fue un detonante en el progreso en las ciencias de la computación. Podemos expresarlo como sigue Existe alguna formalización efectiva de las matemáticas? Es decir, existe algún sistema que permita expresar cualquier proposición matemática en forma simbólica y que habilite su demostración mediante un puro cálculo?
Kurt Gödel (1906, Aust.Hungria 1978, USA) Matemático. Su principal área de estudio se centra en los sistemas axiomáticos de las matemáticas influenciado por el trabajo de Russell En 1932 publica su resultado más notable: El Teorema de Incompletitud En cualquier sistema axiomático de las matemáticas existen proposiciones que no pueden demostrarse como ciertas o falsas Alonzo Church (1903, USA 1995,USA) Matemático. Su principal área de estudio se centra en la lógica matemática, la teoría de la recursión y la informática teórica ( theoretical computer science ). En 1930 crea el λ-cálculo que fundamenta algunos de los paradigmas de programación actuales. Fue supervisor de doctorado de Kleene y Turing. Su resultado más celebrado es el conocido como Teorema de Church (1936): No existe un procedimiento de decisión para el cálculo proposicional completo
Stephen Kleene (1909, USA 1994, USA) Matemático. Su principal área de estudio se centra en la teoría de los algoritmos y las funciones recursivas. Propone una definición sencilla y fundamental de las funciones recursivas que ayudaron a una mejor comprensión de los sistemas axiomáticos de primer orden de Gödel. Sus resultados más notables permitieron establecer qué funciones podían ser computables y también permitieron establecer grados en las funciones no computables (i.e. la Jerarquía Aritmética ) Emil Post (1897, Polonia 1954, USA) Matemático. Demostró la completitud y consistencia del cáculo proposicional propuesto por Russell y Whitehead en sus Principia Mathematica. Post descubrió con antelación algunos de los resultados que más tarde publicarían Gödel, Church y Turing. En 1936 propone la máquina de Post que incluye la noción de programa en un autómata. En 1947 demuestra como irresoluble el problema de palabras de un semigrupo propuesto por Thue en 1914 dando lugar al famoso Problema de la Correspondencia de Post.
Alan Turing (1912, Inglaterra 1954, Inglaterra) Matemático. Sus áreas de trabajo son múltiples e incluyen los estudios de algunos resultados de Russell y Gödel en relación con el problema 23 de Hilbert. En 1936 publica su famoso trabajo sobre decidibilidad en el que propone su más notable modelo matemático: la máquina de Turing Durante la II Guerra Mundial, Turing trabajó en letchley Park para la Escuela Estatal de Códigos y Cifras. Su trabajo más notable durante esta época fue el criptoanálisis de los códigos de la máquina Enigma alemana. Diseñó una máquina que resolvió con éxito tal problema: la bomba de Turing En 1950 publicó su trabajo sobre Máquinas que Computan e Inteligencia, proponiendo el famoso test de Turing para discernir si un computador puede llegar a ser inteligente. La máquina de Turing: : El modelo determinista (I) a 1 a 2 a 3 a 4 a 5 a 6 cinta de lectura/escritura cabeza de cinta control finito q Un movimiento de la máquina depende del estado del control finito y del símbolo analizado por la cabeza de cinta Un movimiento de la máquina implica: (a) Cambiar el estado del control finito (b) Escribir un símbolo en la celda analizada (c) Mover la cabeza de cinta una celda a la izda. o a la dcha.
La máquina de Turing: : El modelo determinista (II) M = (Q, Σ, Γ, δ, q 0,, F) δ: Q Γ Q Γ {L, R} descripción instantánea α β a 1 a 2 a 3 a 4 a 5 a 6 q α q β = a 1 a 2 a 3 q a 4 a 5 a 6 descripción instantánea α a 1 a 2 a 4 a 5 a 6 q α q β = a 1 a 2 a 4 a 5 a 6 q β a 1 a 2 a 4 a 5 a 6 q α q β = q a 1 a 2 a 4 a 5 a 6
transiciones entre descripciones instantáneas a 1 a 2 a 4 a 5 a 6 q D 1 = a 1 a 2 q a 4 a 5 a 6 a 1 a 2 Y a 5 a 6 p D 2 = a 1 a 2 Y p a 5 a 6 a 1 a 2 Y a 5 a 6 p D 3 = a 1 a 2 p Ya 5 a 6 D 1 D 2 sii δ(q, a 4 ) = (p, Y, R) M D 1 D 3 sii δ(q, a 4 ) = (p, Y, L) M transiciones entre descripciones instantáneas M * es la clausura reflexiva y transitiva de la relación M D i D i+k sii (a) D i = D M * i+k (b) D i+1 D i+2... D i+k-1 1 k D i M D i+1 M D i+2 M... M D i+k-1 M D i+k
Condición de parada Una máquina de Turing M estará en movimiento siempre que pueda aplicar una transición de la función δ o no realice ningún movimiento a la izquierda del límite de la cinta. Asumimos que en la función δ nunca se definen movimientos a partir de estados finales. Descripción instantánea inicial w q 0 w w 1 w 2 w 3...... w n q 0 Lenguaje aceptado por la máquina M M = (Q, Σ, Γ, δ, q 0,, F) L(M) = { w Σ * : q 0 w α q β, q F, αβ Γ * } M * Ejemplo 1 L(M) = { 0 n 1 n : n 1 } M = ({q 0, q 1, q 2, q 3, q 4 }, {0, 1}, {0, 1, X, Y, }, δ, q 0,, {q 4 }) 0 1 X Y q 0 (q 1,X,R) (q 3,Y,R) q 1 (q 1,0,R) (q 2,Y,L) (q 1,Y,R) q 2 (q 2,0,L) (q 0,X,R) (q 2,Y,L) q 3 (q 3,Y,R) (q 4,,R) q 4
La máquina de Turing como calculadora de funciones Trabajamos con funciones parciales enteras f : Z n Z m Codificación de los valores de dominio y rango Dada la tupla de valores enteros positivos (x 1, x 2,..., x n ) Definimos la función de codificación binaria cod(x 1, x 2,..., x n ) = 0 x1 1 0 x2 1... 1 0 xn cod(1,2,3) = 01001000 cod(0,3) = 1000 cod(2,0,3) = 0011000 cod(0,0) = 1 M como calculadora de funciones M = (Q, {0,1}, Γ, δ, q 0,, ) M calcula la función f : Z n Z m sii M para tras la computación q 0 cod(x 1, x 2,..., x n ) α q β αβ = cod(f(x 1, x 2,..., x n )) M * Ejemplo 2 m n si m n resta(m, n) = 0 si m < n M = ({q 0, q 1, q 2, q 3, q 4, q 5, q 6 }, {0, 1}, {0, 1, }, δ, q 0,, ) 0 1 q 0 (q 1,,R) (q 5,,R) q 1 (q 1,0,R) (q 2,1,R) q 2 (q 3,1,L) (q 2,1,R) (q 4,,L) q 3 (q 3,0,L) (q 3,1,L) (q 0,,R) q 4 (q 4,0,L) (q 4,,L) (q 6,0,R) q 5 (q 5,,R) (q 5,,R) (q 6,,R) q 6
Un lenguaje diremos que es Lenguajes y funciones computables recursivamente enumerable si existe una máquina de Turing M tal que L(M) = L. Define la clase L r.e. recursivo si existe una máquina de Turing M tal que L(M)=L y M para ante cualquier entrada. Define la clase L rec L rec L r.e. Una función es computable si puede ser calculada por una máquina de Turing. El conjunto de funciones computables coincide con el de las funciones recursivas Si una función es computable parcial, la máquina que la calcula puede no parar, o parar con una salida indefinida, para aquellos valores en los que la función no esté definida. Técnicas de construcción de máquinas de Turing (I) Almacenamiento en el control finito Se dota al control finito de una memoria finita capaz de almacenar información limitada. (a) Almacenamiento de una tupla de k estados M = (Q k estado [q, Σ, Γ, δ, q 0,, F) 1, q 2,..., q k ] q 0 = [q 0, q 0,..., q 0 ] (b) Almacenamiento de una tupla de k símbolos M = (Q Γ k, Σ, Γ, δ, q 0,, F) estado [q i, a 1,..., a k ] q 0 = [q 0,,..., ] (c) Almacenamiento de otra información Último movimiento aplicado, primer símbolo de la cadena de entrada, etc.
Técnicas de construcción de máquinas de Turing (II) Pistas múltiples (multipistas) La cinta almacena en cada celda un vector k dimensional de símbolos a los que se accede simultáneamente. M = (Q, Σ k-1, Γ k, δ, q 0,, F) w 1 w 2 --- w n --- pista 1 pista 2 --- pista k q 0 δ: Q Γ k Q Γ k {L, R} = [,,..., ] cadena inicial de entrada w = [w 1,,..., ] [w 2,,..., ]... [w n,,..., ] Subrutinas Técnicas de construcción de máquinas de Turing (III) Una subrutina es un subconjunto de movimientos de la función δ que se puede utilizar igual que en algunos lenguajes de programación. Paso de control Se utiliza almacenamiento en el control finito [q act, q in, q fin ] Paso de variables Se utiliza almacenamiento en control finito o bien multipistas Recursividad Una subrutina puede llamarse a sí misma La pila de recursividad puede habilitarse en una pista
Modificaciones equivalentes al modelo determinista básico (I) Cinta infinita en ambos sentidos w w 1 w 2... w n q 0 M = (Q, Σ, Γ, δ, q 0,, F) Configuración instantánea αqβ αβ es el contenido de cinta desde el símbolo no blanco más a la izquierda hasta el símbolo no blanco más a la derecha Carga inicial q 0 w w se carga en cualquier porción de la cinta con la cabeza situada en su símbolo más a la izquierda Teorema Para cualquier máquina de Turing M 1 con cinta infinita en ambos sentidos existe otra equivalente M 2 con cinta limitada por la izquierda w w 1 w 2... w n M 1 q 0 M 1 = (Q, Σ, Γ, δ 1, q 0,, F) w 1 w 2... w n... pista superior U pista inferior D M 2 q 0 M 2 = (Q {U,D} {q 1 }, Σ, Γ (Γ { }), δ 2, q 1, [,], F {U,D}) δ 2 (q 1, [x,]) = ([q i,u], [y, ], R) sii δ 1 (q 0, x) = (q i, y, R) δ 2 (q 1, [x,]) = ([q i,d], [y, ], R) sii δ 1 (q 0, x) = (q i, y, L)
Modificaciones equivalentes al modelo determinista básico (II) Máquina multicinta w 1 w 2... w n cinta 1 x 1 x 2... x m cinta 2 y 1 y 2... y j cinta k q M = (Q, Σ, Γ, δ, q 0,, F) δ: Q Γ k Q Γ k {L, R} k Máquina multicinta Un movimiento de la máquina multicinta depende del estado del control finito y de los símbolos analizados por cada cabeza de cada cinta Un movimiento de la máquina multicinta implica: (a) Cambiar el estado del control finito (b) Escribir un símbolo en cada una de las celdas analizadas (c) Mover cada cabeza de cinta una celda a la izda. o a la dcha. de forma independiente descripción instantánea α 1 q β 1 # α 2 q β 2 #... # α k q β k carga inicial q 0 w# q 0 #... #q 0 w se carga en la cinta 1 y el contenido del resto de las cintas es blanco Para el cálculo de funciones, el valor de la función se almacena en la cinta 1
Teorema Para cualquier máquina de Turing M 1 con k cintas existe otra equivalente M 2 con una sola cinta w 1 w 2... w n cinta 1 x 1 x 2... x m cinta 2 y 1 y 2... y j cinta k w 1 w 2... w n ~... x 1 x 2... x m-1 x m... ~ M 1 = (Q, Σ, Γ, δ 1, q 0,, F) cinta 1 (dos pistas) cinta 2 (dos pistas) y 1 y 2... y j-2... y j-1 y j ~ cinta k (dos pistas) M 2 Teorema Para cualquier máquina de Turing M 1 con k cintas existe otra equivalente M 2 con una sola cinta M 1 = (Q, Σ, Γ, δ 1, q 0,, F) M 2 = (Q Γ k {0,..., k}, Σ 2k-1, (Γ {~}) 2k, δ 2, q 1,, F Γ k 0) q 1 = [q 0,,...,, 0] = [,..., ] Para iniciar la simulación de un movimiento de M 1, la máquina M 2 se sitúa en el símbolo marcado más a la izquierda. La simulación de un movimiento de M 1 consiste en recorrer la cinta de izquierda a derecha almacenando los símbolos marcados y de derecha a izquierda moviendo las marcas de los símbolos y cambiando los símbolos anteriormente marcados.
Modificaciones equivalentes al modelo determinista básico (III) Máquina no determinista M = (Q, Σ, Γ, δ, q 0,, F) δ: Q Γ P(Q Γ {L, R}) δ(q,a) = {(p 1, a 1, z 1 ),..., (p m, a m,z m )} z i {L,R} Llamamos grado de indeterminismo de la máquina M a la aridad máxima de la función δ (el número máximo de elecciones que la máquina pueda tener en cualquier configuración) Las transiciones entre descripciones instantáneas originan la definición de los árboles de computación Árboles de computación M = (Q, Σ, Γ, δ, q 0,, F) grado de indeterminismo n aridad del árbol n w Σ * M acepta w si existe un camino desde la raíz hasta una hoja con estado final q0 w α 1 q 1 β 1 α 2 q 2 β 2 α j q j β j α 11 q 11 β 11 α 1p q 1p β 1p α j1 q j1 β j1 α jm q jm β jm α p β p F α q β q F
Teorema Para cualquier máquina de Turing M 1 no determinista existe otra equivalente M 2 determinista M 1 = (Q 1, Σ, Γ 1, δ 1, q 1,, F 1 ) M 2 = (Q 2, Σ, Γ 2, δ 2, q 2,, F 2 ) (grado de indeterminismo n) Dada una cadena w, para comprobar si w es aceptada por M 1 basta con recorrer en anchura su árbol de computación. Si w es aceptada se llegará a una descripción instantánea de aceptación. Una secuencia de computación será una secuencia finita de dígitos enteros i 1 i 2... i m donde i j {1,.., n}. Cada dígito indica la posible elección de movimiento que se efectúa en M 1 (ej. 12232 significa elegir el movimiento 1, luego el 2, luego el 2, luego el 3 y luego el 2). Una secuencia de computación es factible si todos y cada uno de sus movimientos se pueden aplicar en la máquina M 1. Una secuencia de computación factible es de aceptación si el último estado al que llega la máquina M 1, de acuerdo con la secuencia, es un estado final. En cado contrario la secuencia de computación factible es de rechazo. El orden lexicográfico de las secuencias de computación posibilita el recorrido en anchura del árbol de computación. q 0 w α 1 q 1 β 1 α 2 q 2 β 2 α n q n β n i 0 i 1 Si w es aceptada por M 1 existe una secuencia de computación que conduce a M 1 hacia un estado de aceptación: i 0 i 1 i 2... i n M 2 genera todas las posibles secuencias de computación hasta encontrar aquélla que conduce a M 1 hacia un estado de aceptación. Si no existe, entonces M 2 nunca para. cinta de entrada w secuencia de computación cinta de trabajo α p β i n p F M 2
Modificaciones equivalentes al modelo determinista básico (II) Máquina off-line w 1 w 2 w 3... w n $ x 1 x 2... x m cinta 1 (sólo lectura, limitada) cinta 2 y 1 y 2... y j cinta k q M = (Q, Σ, Γ, δ, q 0,, F) Teorema Para cualquier máquina de Turing M 1 off-line existe otra equivalente M 2 con una sola cinta La máquina M 2 puede efectuar la misma simulación que en el caso multicinta pero limitando los movimientos de la cinta 1 a la izquierda de o a la derecha de $ y reescribiendo siempre los mismos símbolos leídos en esa cinta
La tesis de Church-Turing Cualquier modelo de computación que intente capturar el concepto de lo que es computable debe ser equivalente a la máquina de Turing La noción intuitiva de función computable puede ser identificada con la de función recursiva parcial Otros modelos de computación formulados a lo largo del tiempo Sistemas de Post λ-cálculo Máquina RAM Máquinas cuánticas Cálculo basado en el ADN, etc. Un modelo de cálculo permite hipercomputación si es capaz de resolver algunos problemas que las máquinas de Turing establecen como indecidibles (Ej. máquinas de Turing con oráculos, redes de Siegelman, etc.) La máquina de Turing como enumeradora de conjuntos Una máquina de Turing generadora es una máquina de Turing multicinta con una cinta de salida de sólo escritura. La máquina no necesita cadena de entrada y pierde el concepto de aceptación/rechazo e incluso el de parada M = (Q, Σ, Γ, δ, q 0,, ) # w 1 # w 2 #...# w n #... M w i Σ * G(M) = {w 1, w 2,..., w n,... }
Lema Todo lenguaje generado por una máquina de Turing M 1 es recursivamente enumerable asta con construir una máquina de Turing multicinta M 2 que acepte el lenguaje generado por M 1 w M 1 M 2 M 2 simula a M 1 y, cada vez que se genera una cadena w i, la compara con la cadena de entrada w. Si coinciden, para y acepta y en caso contrario sigue simulando a M 1. L(M 2 ) = G(M 1 ) Lema Todo lenguaje recursivamente enumerable puede ser generado por una máquina de Turing. Sea L = L(M 1 ) un lenguaje recursivamente enumerable M 1 astará con construir una máquina de Turing M 2 que genere sólo aquellas cadenas que M 1 acepte. Problema: cómo se pueden establecer todas las cadenas que acepta M 1 si existe el problema de la parada?
Hecho 1: Dado un alfabeto Σ el conjunto infinito de cadenas de Σ * es enumerable y el orden lexicográfico identifica cada entero con una cadena Ejemplo Σ = {a,b} Σ* = { λ, a, b, aa, ab, ba, bb, aaa, aab,... } Hecho 2: El conjunto infinito formado por los pares de enteros positivos es enumerable 0 1 2... j... 0 (0,0) (0,1) (0,2)... (0,j)... 1 (1,0) (1,1) (1,2)... (1,j)... 2 (2,0) (2,1) (2,2)... (2,j)........................ i (i,0) (i,1) (i,2)... (i,j)........................ Se pueden construir subrutinas en máquinas de Turing que generen Σ * y los pares de enteros (i,j) Σ * (i,j) w i cinta de salida G(M 2 ) = L(M 1 ) M 2 j M 1 (1) Generar (i,j) (2) Generar w i (3) Copiar w i a una cinta (4) Simular M 1 ante w i durante j movimientos (5) Si M 1 acepta, escribir w i en la cinta de salida de M 2. En caso contrario ir a (1)
Lema Todo lenguaje generado por una máquina de Turing M 1 en orden lexicográfico es recursivo Para la siguiente construcción excluiremos el caso de que el lenguaje sea finito. En este último caso se puede construir una máquina que acepte sólo las cadenas del lenguaje y que para el resto pare y rechace (se puede hacer por casos finitos) Si el lenguaje es infinito basta con construir una máquina de Turing multicinta M 2 que acepte el lenguaje generado por M 1 y que pare ante cualquier entrada. Sirve la misma construcción que para el caso de los lenguajes recursivamente enumerables con la siguiente salvedad: M 2 simula a M 1 y, cada vez que se genera una cadena w i, la compara con la cadena de entrada w. Si coinciden, para y acepta y, en caso contrario, si w i > w para y rechaza y si w i < w genera la siguiente cadena. La condición de parada queda garantizada por ser el lenguaje infinito. L(M 2 ) = G(M 1 ) Lema Todo lenguaje recursivo puede ser generado por una máquina de Turing en orden lexicográfico. Sea L = L(M 1 ) un lenguaje recursivo. La máquina M 1 para ante cualquier entrada Σ * w i M 1 M 2 M 1 astará con construir una máquina de Turing M 2 que genere, en orden lexicográfico sólo aquellas cadenas que M 1 acepta. M 2 genera las cadenas de Σ * en orden lexicográfico. La cadena w i se somete al análisis de M 1. Si M 1 acepta w i entonces M 2 la escribe en su cinta de salida. M 2 sólo genera las cadenas de L y además lo hace en orden lexicográfico.
Caracterización de los lenguajes recursivos y recursivamente enumerables (utilización de esquemas) Lenguajes recursivamente enumerables w M S (w L(M)) M <L> (<w 1 #w 2 #...) aceptora L=L(M) generadora L=G(M) Lenguajes recursivos S (w L(M)) w M N (w L(M)) M <L> o.l. (<w 1 #w 2 #...) aceptora L=L(M) generadora L=G(M) Máquinas restringidas equivalentes al modelo básico Máquinas binarias M = (Q, {0,1}, {0,1,}, δ, q 0,, F) Teorema Si L (0+1)* es recursivamente enumerable entonces L es aceptado por una máquina de Turing binaria Sea L = L(M 1 ) con M 1 = (Q 1, {0,1}, Γ, δ 1, q 1,, F 1 ). Construiremos M 2 = (Q 2, {0,1}, {0,1,}, δ 2, q 2,, F 2 ) de forma que L = L(M2) Cada símbolo de Γ se puede codificar con un código binario de k símbolos. Q 2 = Q 1 {0,1,} k F 2 = F 1 k q 2 = [q 1,,,..., ]
w w 1 w 2 w p Γ = {a 1, a 2,, a n } cod(w 1 ) cod(w p ) k celdas k = log 2 n cod(a i ) {0,1} k M 2 M 2 lee la cadena de entrada w y escribe su código en otra cinta. A partir de ese momento la simulación de M 1 se efectúa de la siguiente forma: (1) Leer k celdas de la cinta con la entrada codificada y almacenar sus símbolos en el control finito. (2) Escribir el código del nuevo símbolo de acuerdo con la función δ 1 (3) Cambiar al nuevo estado de acuerdo con la función δ 1 (4) Moverse al comienzo del siguiente código por la derecha o por la izquierda de acuerdo con la función δ 1 Máquinas de Turing y lenguajes de tipo 0 Una gramática de tipo 0 se define por la tupla G=(N,T,P,S) donde las producciones de P son de la forma α β α (N T) + β (N T) * Teorema L es un lenguaje recursivamente enumerable sii L=L(G) donde G es de tipo 0. Relación con la jerarquía de Chomsky L 3 L 2 L 1 L 0 = L r.e.
Autómatas de memoria limitada linealmente y lenguajes de tipo 1 Una gramática de tipo 1 se define por la tupla G=(N,T,P,S) donde las producciones de P son de la forma α β α (N T) + β (N T) * α β S λ sii S no aparece en la parte derecha de ninguna otra producción Un autómata de memoria limitada linealmente (ALL) es una máquina de Turing no determinista monocinta que satisface las dos siguientes condiciones (1) El alfabeto de entrada incluye los limitadores y $ (2) El ALL no mueve su cabeza de cinta fuera de los limitadores ni escribe sobre ellos Se define la clase L ALL Teorema L es un lenguaje sensible al contexto (de tipo 1) sii L es aceptado por un ALL Relación con la jerarquía de Chomsky L 3 L 2 L 1 = L ALL L rec L 0 = L r.e.