1 Curso Básico de Computación 7 Máquina de Turing Es este capı́tulo introducimos la Máquina de Turing que es, un modelo matemático simple de una computadora. 7.1 Introducción Hasta ahora no se ha podido demostrar que el modelo de la maquina de Turing es equivalente a nuestra noción intuitiva de una computadora, pero existen argumentos complejos que sugieren esta equivalencia, a esto se le conoce como la hipótesis de Church. La maquina de Turing tiene un poder computacional más grande que cualquier computadora digital actual y no parece factible que pueda ser superada algún dı́a. Al igual que los AFD y los AP, la máquina de Turing es un dispositivo teórico que se utiliza principalmente en estudios de computabilidad y de análisis de complejidad computacional. 7.2 El modelo de la Máquina de Turing Un modelo formal de cómputo efectivo debe tener ciertas propiedades. Primero, cada procedimiento debe poder ser descrito de manera finita. Segundo, el procedimiento debe consistir de pasos separados, y cada uno de ellos debe poderse llevar a cabo de manera mecánica. Este modelo fue introducido por Alan Turing en 1936. Aquı́ presentaremos una variante. El modelo básico que se ilustra en la siguiente figura, a1 a2 ... ai ... an B B ... Control Finito tiene un control finito, una cinta que está dividida en celdas, y una cabeza de la cinta que explora una celda en la cinta a la vez. La cinta tiene una primer celda ubicada en la posición más a la izquierda de la cinta pero es infinita del lado derecho. Cada celda en la cinta puede contener exactamente un sı́mbolo tomado de un alfabeto finito. Inicialmente, las n celdas más a la izquierda, para algún número finito n ≥ 0, contienen la entrada de la máquina, la cual es una cadena de sı́mbolos que se escogen de un alfabeto llamado sı́mbolos de entrada. Todas las celdas restantes (que forman un conjunto infinito) contienen el sı́mbolo blanco, el cual es un sı́mbolo especial que no forma parte del alfabeto de entrada. Feliú Sagols Troncoso Matemáticas-Cinvestav 2 Un movimiento en la Máquina de Turing depende del sı́mbolo explorado por la cabeza de la cinta y del estado de control finito. De manera sintética se hace lo siguiente: 1) dependiendo del sı́mbolo explorado por la cabeza lectora/escritora y del estado en el control finito se cambia de estado, 2) se imprime un sı́mbolo en la celda explorada, reemplazando el sı́mbolo que ésta contenga y 3) se mueve la cabeza de lectura una celda hacia la izquierda o derecha. Note que la diferencia entre la máquina de Turing y un autómata finito de doble vı́a es que la máquina de Turing tiene la habilidad de cambiar los sı́mbolos en la cinta de entrada. Formalmente, una máquina de Turing (MT) se denota por: M = (Q, Σ, Γ, δ, q0 , B, F ), donde Q es un conjunto finito de estados, Γ es un conjunto finito de sı́mbolos, llamado alfabeto de la cinta, B es un sı́mbolo en Γ, y el sı́mbolo blanco, Σ es un subconjunto de Γ que no incluye a B, es el alfabeto de sı́mbolos de entrada, δ es la función que determina los movimientos de la máquina, es una transformación de Q × Γ a Q × Γ × {L, R} (δ puede estar indefinida para algunos argumentos), q0 ∈ Q es el estado inicial, F ⊆ Q es el conjunto de estados finales. Una descripción instantánea (DI) de una máquina de Turing M es una expresión α1 qα2 . Aquı́ q ∈ Q, es el estado actual de M ; α1 α2 es una cadena en Γ∗ y es el contenido de la cinta hasta el sı́mbolo no blanco más a la derecha o el sı́mbolo de la izquierda de la cabeza, cualquiera que este más a la derecha. (Observe que el blanco B puede ocurrir en α1 α2 ). Asumimos que Q y Γ son disjuntos. Finalmente, asumimos que la cabeza de la cinta explora el sı́mbolo más a la izquierda de α2 , o si α2 = , la cabeza explora un blanco. Se define un movimiento en M como: sea X1 X2 · · · Xi−1 qXi · · · Xn una DI. Se supone que δ(q, Xi ) = (p, Y, L), si i − 1 = n, entonces se considera a Xi como 3 Curso Básico de Computación B. Si i = 1 entonces no es posible realizar el movimiento a la izquierda ası́ que no hay DI siguiente porque la cabeza de la cinta no tiene permitido desprenderse del fin izquierdo de la cinta. Si i > 1, entonces escribimos 1) X1 X2 · · · Xi−1 qXi · · · Xn X1 X2 · · · Xi−2 pXi−1 Y Xi+1 · · · Xn Sin embargo, si cualquier sufijo de Xi−1 Y Xi+1 · · · Xn es completamente blanco entonces el sufijo se borra en (1). M Alternativamente si δ(q, Xi ) = (p, Y, R) entonces escribimos: 2) X1 X2 · · · Xi−1 qXi Xi+1 · · · Xn X1 X2 · · · Xi−1 Y pXi+1 · · · Xn Note que en el caso de i − 1 = n, la cadena Xi · · · Xn es vacı́a, y el lado derecho de (2) es más largo que el lado izquierdo. Si dos DI están relacionadas por , decimos que la segunda resulta de la primera por un movimiento. Si una DI resulta de otra por un número finito de movimientos, incluyendo cero movimientos, ellas están relacionadas por el * sı́mbolo . M M M El lenguaje aceptado por M, denotado por L(M ), es el conjunto de las palabras en Σ∗ que causan que M entre a un estado final cuando se colocan al principio de la cinta de M , con M en el estado q0 , y la cabeza de la cinta de M en la celda más a la izquierda. Formalmente, el lenguaje aceptado por M = (Q, Σ, Γ, δ, q0 , B, F ) es {w | w ∈ Σ∗ , q0 w * M α1 pα2 para algún p ∈ F , y α1 , α2 ∈ Γ∗ } Dada una MT que reconoce un lenguaje L, asumimos sin perder generalidad que la M T se para, es decir, no tiene más movimientos, cuando la entrada es aceptada. Sin embargo, para algunas palabras no aceptadas, es posible que la MT nunca pare. Ejemplo: El diseño de una MT que acepte el lenguaje L = {0n 1n | n ≥ 1} es: inicialmente, la cinta de entrada de M contendrá 0n 1n seguido de un número infinito de blancos. Repetidamente, M reemplaza el 0 más a la izquierda por X, mueve hacia la derecha la cabeza de la cinta hasta encontrar el 1 que esté más a la izquierda, reemplazandolo por Y , luego se mueve a la izquierda para encontrar la X más a la derecha, entonces mueve la cabeza una celda hacia la derecha y si encuentra un 0 entonces repite el ciclo. Sin embargo, si cuando se busca un 1, M encuentra un blanco en su lugar, entonces M se para sin aceptar su entrada . Si, después de cambiar un 1 por una Y , M no encuentra más 0’s, entonces M examina que no haya más 1, si no los hay entonces acepta su entrada. Sea Q = {q0 , q1 , q2 , q3 , q4 }, Σ = {0, 1}, Γ = {0, 1, X, Y, B}, y F = {q4 }. Informalmente, cada estado representa una declaración o un grupo de declaraciones en un programa. Al estado q0 se ingresa inicialmente y es el estado previo a cada reemplazo del 0 más a la izquierda por una X. El estado q1 se usa para buscar a la derecha, saltando sobre los 0’s y las Y ’s, hasta encontrar el 1 más a la izquierda. Si M encuentra 1, lo cambia por Y , y entra al estado q2 . Feliú Sagols Troncoso Matemáticas-Cinvestav 4 El estado q2 busca a la izquierda una X y entra en el estado q0 cuando lo encuentra, luego se mueve hacia la derecha hasta el 0 ubicado más a la izquierda. Conforme M busca hacia la derecha en el estado q1 , si B o X aparecen antes de encontrar un 1, entonces la entrada es rechazada; puede que haya demasiados 0’s o la entrada no esta en 0∗ 1∗ . El estado q0 tiene otro papel. Si, después del estado q2 se encuentra la X más a la derecha, existe una Y inmediatamente a su derecha, entonces los 0’s están agotados. Desde q0 , se explora Y , entra el estado q3 para explorar sobre las Y ’s y examina que no haya 1’s restantes. Si las Y ’s están seguidas por B, se entra al estado q4 y la aceptación ocurre; en otro caso, la cadena es rechazada. La función δ es: Estado 0 1 X q0 (q1 , X, R) − − q1 (q1 , 0, R) (q2 , Y, L) − q2 (q2 , 0, L) − (q0 , X, R) q3 − − − q4 − − − Estado q0 q1 q2 q3 q4 Y B (q3 , Y, R) − (q1 , Y, R) − (q2 , Y, L) − (q3 , Y, R) (q4 , B, R) − − La siguiente tabla muestra el cálculo de M para la entrada 0011. q0 0011 Xq1 011 q2 X0Y 1 Xq0 0Y 1 XXq2 Y Y Xq2 XY Y XXY Y q3 XXY Y Bq4 X0q1 11 XXq1 Y 1 XXq0 Y Y Xq2 0Y 1 XXY q1 1 XXY q3 Y 7.3 Lenguajes computables y funciones Un lenguaje que es aceptado por una máquina de Turing se dice recursivamente enumerable (r.e.). El término “enumerable” deriva del hecho de que precisamente estos lenguajes tienen cadenas que pueden ser enumeradas (listadas) por la máquina de Turing. La clase de los lenguajes r.e es muy amplia e incluye propiamente a los LLC. La clase de lenguajes r.e. incluye algunos lenguajes para los cuales no se puede determinar mecánicamente su pertenecia. Si L(M ) es tal lenguaje, entonces cualquier máquina de Turing que reconozca a L(M ) falla y se detiene con alguna entrada que no está en L(M ). Si w ∈ L(M ), M eventualmente se para con la entrada w. Sin embargo, mientras M se mantenga en ejecución, puede que en algún momento pare y acepte su entrada o pueda que se mantenga ası́ por siempre. Es conveniente distinguir una subclase de los conjuntos r.e. llamada conjuntos recursivos, los cuales son los lenguajes aceptados por al menos una máquina de Turing que se para con todas las entradas. 5 Curso Básico de Computación La máquina de Turing como un medio para evaluar funciones enteras La máquina de Turing puede verse como un medio para evaluar funciones de los enteros a los enteros. El método tradicional consiste en representar a los enteros en base 1; ası́ el entero i ≥ 0 se representa por la cadena 0i . Si una función tiene k argumentos, i1 , i2 , ..., ik , entonces estos enteros se colocan inicialmente en la cinta separados por 1’s: 0i1 10i2 1 · · · 10ik . Si la MT se para y la cinta contiene 0m para algún m, entonces se dice que f (i1 , i2 , ..., ik ) = m, donde f es la función de k argumentos calculados por esta máquina de Turing. Note que una máquina de Turing puede calcular una función de un argumento, una función diferente de dos argumentos, y ası́ sucesivamente. También note que si la MT M calcula la función f con k argumentos, entonces f no necesariamente tiene un valor para todas las diferentes k-tuplas de enteros i1 , i2 , ..., ik . Si f (i1 , i2 , ..., ik ) está definida para todas las i1 , i2 , ..., ik , entonces se dice que f es una función recursiva total. Una función f (i1 , i2 , ..., ik ) calculada por la MT se llama función recursiva parcial. En este sentido, las funciones recursivas parciales son análogas a los lenguajes r.e., las funciones recursivas totales corresponden a los lenguajes recursivos. Todas las funciones aritméticas sobre n enteros, como la multiplicación, n!, 22 son funciones recursivas totales. Ejemplo: La sustracción propia se define como m − n para m ≥ n, y 0 para m < n. La MT M = ({q0 , q1 , ..., q6 }, {0, 1}, {0, 1, B}, δ, q0, B, {q6 }) se define como: se inicia con 0m 10n en la cinta, se para con 0m n . M reemplaza repetidamente el primer 0 por blanco, entonces busca a la derecha un 1 seguido de un 0 y cambia el 0 por el 1. Luego, M se mueve hacia la izquierda hasta encontrar un blanco, se mueve hacia la derecha y entonces repite el ciclo. La repetición termina si i) Al buscar hacia la derecha un 0, M encuentra un blanco. Entonces, los n 0’s en 0m 10n han sido todos cambiados por 1’s, y n + 1 de los m 0’s fueron cambiados por B. M reemplaza los n + 1 1’s por un 0 y n B’s, quedando m − n 0’s de la cinta. ii) Comenzando el ciclo, M no encontró un 0 para cambiarlos por un blanco, porque los primeros m 0’s ya fueron cambiados. Entonces n ≥ m, ası́ m n = 0. M reemplaza el resto de todos los 1’s y 0’s por B. La función δ se describe como: 1. δ(q0 , 0) = (q1 , B, R) Comienza el ciclo. Reemplaza el primer 0 por el B. 2. δ(q1 , 0) = (q1 , 0, R) δ(q1 , 1) = (q2 , 1, R) Busca en la derecha, búscando al primer 1. Feliú Sagols Troncoso Matemáticas-Cinvestav 6 3. δ(q2 , 1) = (q2 , 1, R) δ(q2 , 0) = (q3 , 1, L) Busca en la derecha al primer 0 que aparezca después de un 1. Cambia ese 0 por 1. 4. δ(q3 , 0) = (q3 , 0, L) δ(q3 , 1) = (q3 , 1, L) δ(q3 , B) = (q0 , B, R) Se mueve hacia la izquierda hasta encontrar el primer blanco. Entra al estado q0 para repetir el ciclo. 5. δ(q2 , B) = (q4 , B, L) δ(q4 , 1) = (q4 , B, L) δ(q4 , 0) = (q4 , 0, L) δ(q4 , B) = (q6 , 0, R) Si en el estado q2 aparece un sı́mbolo B antes de un 0, se tiene la situación (i) que se describió antes. Entra al estado q4 y se mueve hacia la izquierda, cambiando todos los 1’s por B’s hasta encontrar a B. Esta B se cambia de regreso a 0, se entra al estado q6 , y M se detiene. 6. δ(q0 , 1) = (q5 , B, R) δ(q5 , 0) = (q5 , B, R) δ(q5 , 1) = (q5 , B, R) δ(q5 , B) = (q6 , B, R) Si en el estado q0 aparece un 1 en lugar de un 0, el primer bloque de 0’s ha sido consumido, como en la situación (ii) anterior. M entra al estado q5 para borrar el resto de la cinta, entonces entra al estado q6 y se para. Un cálculo simple de M con la entrada 0010 es: q0 0010 Bq1 010 B0q1 10 B01q2 0 B0q3 11 Bq3 011 q3 B011 Bq0 011 BBq1 11 BB1q2 1 BB11q2 BB1q4 1 BBq4 1 Bq4 B0q6 Con la entrada 0100, M se comporta como: q0 0100 Bq1 100 B1q2 00 Bq3 110 q3 B110 Bq0 110 BBq5 10 BBBq5 0 BBBBq5 BBBBBq6 7.4 Técnicas para la construcción de máquinas de Turing Con el objeto de describir construcciones complicadas de la máquina de Turing es importante contar con herramientas conceptuales de “alto nivel”. 7 Curso Básico de Computación Almacenamiento en el control finito El control finito puede ser usado para almacenar una cantidad finita de información. Ası́, cada estado se escribe como un par de elementos, uno que ejerce el control y el otro almacena un sı́mbolo. Ejemplo: Considere una máquina de Turing M que mira el primer sı́mbolo de entrada, lo registra en su control finito, y verifica que el sı́mbolo no aparezca en otra parte de la entrada. Note que M acepta un conjunto regular, pero M nos sirve para propósitos de demostración: M = (Q, {0, 1}, {0, 1, B}, δ, [q0, B], B, F ) donde Q es {q0 , q1 } × {0, 1, B}. Es decir, Q consiste de los pares [q0 , 0], [q0 , 1],[q1 , 0],[q1 , 1] y [q1 , B]. El conjunto F es {[q1 , B]}. La intención es que el primer componente de un estado de control esté en acción, mientras el segundo componente “recuerde” un sı́mbolo. Se define δ como 1. a) δ([q0 , B], 0) = ([q1 , 0], 0, R), b) δ([q0 , B], 1) = ([q1 , 1], 1, R), Inicialmente, q0 es el componente de control del estado, y M se mueve hacia la derecha. Los primeros componentes de los estado de M se convierten en q1 , y el primer sı́mbolo de entrada es almacenado en la segunda componente. 2. a) δ([q1 , 0], 1) = ([q1 , 0], 1, R), b) δ([q1 , 1], 0) = ([q1 , 1], 0, R), Si M tiene un 0 almacenado y ve un 1 o viceversa, entonces M continua moviendose hacia la derecha. 3. a) δ([q1 , 0], B) = ([q1 , B], B, L), b) δ([q1 , 1], B) = ([q1 , B], B, L), M entra al estado final [q1 , B] si se alcanza un sı́mbolo blanco sin haber encontrado el primero una segunda copia del sı́mbolo más a la izquierda. Si M alcanza un blanco en el estado [q1 , 0] o [q1 , 1], es aceptado. Para el estado [q1 , 0] y el sı́mbolo 0 o para el estado [q1 , 1] y el sı́mbolo 1, δ no está definida. Ası́ si M encuentra sı́mbolos en la cinta almacenados, M se para sin aceptar. En general, podemos permitir que el control finito tenga k componentes y todas, excepto una, almacenen información. Múltiples pistas Feliú Sagols Troncoso Matemáticas-Cinvestav 8 Podemos imaginar que la cinta de la máquina de Turing está dividida en k pistas, para algún k finito. Por ejemplo, para k = 3 estamos hablando de una división como la que se muestra en la siguiente figura c B B 1 B 1 0 B 0 1 B 0 1 1 1 1 0 0 1 1 1 $ B B B B B B B B ... Control Finito Es decir, bajo este esquema los sı́mbolos en la cinta son considerados como un k-tuplas con un componente por cada pista. Ejemplo: La cinta de la figura anterior pertenece a una máquina de Turing que toma una entrada binaria más grande que 2, la escribe en la primera pista, y determina si es un primo. La entrada aparece rodeada por ç y $ en la primera pista. Ası́, las entradas permitidas son [ c ,B, B], [0, B, B], [1, B, B], y [$,B, B]. Estos sı́mbolos pueden ser identificados con c , 0, 1 y $, respectivamente, cuando se examina como entrada. El sı́mbolo blanco es identificado por [B, B, B]. Para probar si esta entrada es un primo, la MT primero escribe el número dos en binario sobre la segunda pista y copia la primer pista en la tercera. Entonces la segunda pista es substraı́da, tantas veces como sea posible, de la tercera pista, efectivamente se divide la tercera pista por la segunda y deja el resto. Si el resto es 0, el número en la primera pista no es un primo. Si el resto no es cero, se incrementa en uno el número de la segunda pista. Si la segunda es igual a la primera, el número en la primera pista es primo, porque no se puede dividir por cualquier otro número propiamente situado entre 1 y el mismo. Si el segundo es menor que el primero, toda la operación se repite para el nuevo número de la segunda pista. En la figura anterior, la MT prueba si 47 es primo. La MT divide por 5, ya que el 5 es substraı́do dos veces, aparece el 37 en la tercera pista. Poniendo marcas de verificación sobre los sı́mbolos Poner marcas de verificación sobre los sı́mbolos es un truco útil para visualizar como una MT reconoce lenguajes definidos por cadenas repetidas, tales como: {ww | w ∈ Σ∗ } {wcy | w, y ∈ Σ∗ , w 6= y} o 9 Curso Básico de Computación {ww R | w ∈ Σ∗ }. Es también útil cuando la longitud de las subcadenas deben ser comparadas, como en los lenguajes {ai bi | i ≥ 1} o {ai bj ck | i 6= j o j 6= k} √ Se introduce una pista extra en la cinta que tenga blancos o (la marca de √ verificación). La marca aparece cuando la MT considera el sı́mbolo que aparece bajo la marca es una de sus comparaciones. Ejemplo: Considere una máquina de Turing M = (Q, Σ, Γ, δ, q0 , B, F ), la cual reconoce el lenguaje {wcw | w ∈ (a + b)+ }. Sea Q = {[q, d] | q = q1 , q2 , ..., q9 ; d = a, b, o B} La segunda componente del estado se usa para almacenar un sı́mbolo de la entrada, Σ = {[B, d] | d = a, b, o c} El sı́mbolo de entrada [B, d] se identifica con d. Recuerde que dos “pistas” son herramientas conceptuales, es decir, [B, d] es otro “nombre” de d: √ Γ = {[X, d] | X = B o ; d = a, b, c, o B} q0 = [q1 , B]; F = {[q9 , B]}; [B, B] es identificado con B, sı́mbolo blanco. Para d = a o b y e = a o b se define δ como: √ 1) δ([q1 , B], [B, d]) = ([q2 , d], [ , d], R) M busca el sı́mbolo explorado en la cinta, almacena el sı́mbolo en el control finito, y se mueve hacia la derecha. 2) δ([q2 , d], [B, e]) = ([q2 , d], [B, e], R) M continua moviendose hacia la derecha, mira hacia c. 3) δ([q2 , d], [B, c]) = ([q3 , d], [B, c], R) Al encontrar c, M entra a un estado con la primer componente q3 . √ √ 4) δ([q3 , d], [ , e]) = ([q3 , d], [ , e], R) M se mueve hacia la derecha sobre sı́mbolos que tengan marcas de verificación. √ 5) δ([q3 , d], [B, d]) = ([q4 , B], [ , d], L) M encuentra un sı́mbolo sin marca de verificación. Si tal sı́mbolo es igual al sı́mbolo almacenado en el control finito. M le pone la marca de verificación y comienza a moverse hacia la izquierda. Si los sı́mbolos son diferentes, M se para sin aceptar su entrada. M también se para si en el estado q3 , alcanza [B, B] antes de encontrar un sı́mbolo sin marcas de verificación. Feliú Sagols Troncoso Matemáticas-Cinvestav 10 √ √ 6) δ([q4 , B], [ , d]) = ([q4 , B], [ , d], L) M se mueve hacia la izquierda sobre sı́mbolos con marcas de verificación. 7) δ([q4 , B], [B, c]) = ([q5 , B], [B, c], L) M encuentra el sı́mbolo c. 8) δ([q5 , B], [B, d]) = ([q6 , B], [B, d], L) Si el sı́mbolo inmediato a la izquierda de c no tiene marca de verificación. M continúa hacia la izquierda para encontrar el sı́mbolo con marca de verificación más a la derecha. 9) δ([q6 , B], [B, d]) = ([q6 , B], [B, d], L) M continúa a la izquierda. √ √ 10) δ([q6 , B], [ , d]) = ([q1 , B], [ , d], R) M encuentra un sı́mbolo con marca de verificación y se mueve hacia la derecha para continuar con otro sı́mbolo para la comparación. El primer componente del estado se convierte otra vez en q1 . √ √ 11) δ([q5 , B], [ , d]) = ([q7 , B], [ , d], R) M podrı́a estar en el estado [q5 , B] inmediatamente después de cruzar c moviendose hacia la izquierda (ver regla 7). Si un sı́mbolo con marca de verificación aparece inmediatamente a la izquierda de c, todos los sı́mbolos a la izquierda de c tienen marcas de verificación. M debe probar si todos los sı́mbolos a la derecha tienen marcas de verificación. Si es ası́, ellos deben haber sido comparados propiamente con los sı́mbolos a la izquierda de c, ası́ M aceptará su entrada. 12) δ([q7 , B], [B, c]) = ([q8 , B], [B, c], R) M se mueve hacia la derecha sobre c. √ √ 13) δ([q8 , B], [ , d]) = ([q8 , B], [ , d], R) M se mueve hacia la derecha sobre los sı́mbolos con marcas de verificación. √ 14) δ([q8 , B], [B, B]) = ([q9 , B], [ , B], L) Si M encuentra [B, B], el blanco, se para y la acepta. Si M encuentra un sı́mbolo sin marca de verificación cuando su primer componente del estado es q8 , se para sin aceptarla. Corrimientos Una máquina de Turing puede hacer un espacio en su cinta para mover todos los sı́mbolos no blancos a un número finito de celdas hacia la derecha. Para hacer esto, la cabeza de la cinta hace una excursión a la derecha, repetidamente almacena los sı́mbolos leı́dos en el control finito y los reemplaza por sı́mbolos leı́dos de celdas de la izquierda. La MT pueden entonces regresar a las celdas 11 Curso Básico de Computación vacantes e imprimir los sı́mbolos escogidos. Si el espacio es suficiente, puede empujar bloques de sı́mbolos a la izquierda de manera similar. Ejemplo: Construir una parte de la MT M = (Q, Σ, Γ, δ, q0 , B, F ), la cual puede ocasionalmente necesitar mover dos celdas de sı́mbolos no blancos a la derecha. Suponemos que la cinta de M no contiene blancos entre no blancos, ası́ que cuando se alcance un blanco se para el proceso de moverse. Supongamos que Q contiene estados de la forma [q, A1 , A2 ] para q = q1 o q2 , y A1 , A2 ∈ Γ. Sea X un sı́mbolo especial no usado por M excepto en el proceso de corrimiento. M comienza el proceso de corrimiento en el estado [q1 , B, B]. Las partes relevantes de la función δ son: 1) δ([q1 , B, B], A1 ) = ([q1 , B, A1 ], X, R) para A1 ∈ Γ − {B, X}. M almacena el primer sı́mbolo leido en la tercera componente del estado. X se imprime sobre la celda explorada, y M se mueve hacia la derecha. 2) δ([q1 , B, A1 ], A2 ) = ([q1 , A1 , A2 ], X, R) para A1 , A2 ∈ Γ − {B, X}. M mueve el sı́mbolo de la tercera componente a la segunda componente, almacena el sı́mbolo que comienza a leer en la tercera componente, imprime X y se mueve hacia la derecha. 3) δ([q1 , A1 , A2 ], A3 ) = ([q1 , A2 , A3 ], A1 , R) para A1 , A2 , A3 ∈ Γ − {B, X}. Ahora M repetidamente lee el sı́mbolo A3 , lo almacena en la tercera componente del estado, mueve el sı́mbolo que previamente estaba en la tercera componente, A2 , a la segunda componente, deposita la segunda componente previa, A1 , en la celda explorada, y se mueve hacia la derecha. Ası́, un sı́mbolo se deposita en dos celdas a la derecha de su posición original. 4) δ([q1 , A1 , A2 ], B) = ([q1 , A2 , B], A1 , R) para A1 , A2 ∈ Γ − {B, X}. Cuando se ve un blanco en la cinta, los sı́mbolos almacenados son depositados en la cinta. 5) δ([q1 , A1 , B], B) = ([q2 , B, B], A1 , L) Después de que todos los sı́mbolos son depositados, M cambia la primer componente del estados a q2 y se mueve hacia la izquierda para encontrar un X, el cual marca la celda vacante más a la derecha. 6) δ([q2 , B, B], A) = ([q2 , B, B], A, L) para A ∈ Γ − {B, X}. M se mueve hacia la izquierda hasta encontrar a X. Cuando se encuentra X, M transfiere el control a un estado donde el autómata reanuda sus funciones. Subrutinas Como en la programación, un diseño “modular o “de arriba a abajo” se facilita al emplear subrutinas para definir procesos elementales. Una máquina Feliú Sagols Troncoso Matemáticas-Cinvestav 12 de Turing puede simular cualquier tipo de subrutinas encontradas en lenguajes de programación, incluyendo procesos recursivos y cualquier mecanismo conocido para transferir parámetros. Aquı́ sólo vamos a describir el uso de subrutinas sin parámetros y no recursivas, pero aún éstas son herramientas en extremo poderosas. La idea general es escribir parte de un programa de una MT como una subrutina; el diseño tiene un estado inicial designado y un estado de retorno también designado el cual temporalmente no tiene definidos movimientos y que se usa para efectuar el regreso a la rutina que lo ha invocado. Para diseñar una MT que “invoque” a la subrutina, se construye un conjunto nuevo de estados para la subrutina, y se especifica el movimiento al estado de retorno. La llamada se lleva a cabo ingresando al estado inicial de la subrutina, y el regreso se lleva a cabo mediante el movimiento al estado de retorno. Ejemplo: El diseño de una MT M que implemente la función “multiplicación” recursiva total es: M comienza con 0m 10n en la cinta y termina con 0mn rodeados por blancos. La idea general es colocar un 1 después de 0m 10n y entonces copiar el bloque de n 0’s sobre la parte final de la derecha m veces, borrando en cada paso uno de los m 0’s. El resultado es 10n 10mn . Finalmente se borra el prefijo 10n 1, y se deja 0mn . El corazón del algoritmo es la subrutina COPIA, que comienza con la DI 0m 1q1 0n 10i y eventualmente genera una DI 0m 1q5 0n 10i+n . COPIA es definida en la siguiente tabla: q1 q2 q3 q4 0 (q2 , 2, R) (q2 , 0, R) (q3 , 0, L) 1 (q4 , 1, L) (q2 , 1, R) (q3 , 1, L) (q5 , 1, R) 2 B (q3 , 0, L) (q1 , 2, R) (q4 , 0, L) En el estado q1 , y con 0 bajo la cabeza de la cinta, M cambia a el 0 a 2 y entra al estado q2 . En el estado q2 , M mueve la cabeza de la cinta hacia la derecha, hasta alcanzar el siguiente sı́mbolo blanco, cambia a este sı́mbolo por 0, e inicia el siguiente movimiento hacia la izquierda en el estado q3 . En el estado q3 , M mueve la cabeza de la cinta hacia la izquierda hasta encontrar el 2. Al alcanzarlo, entra al estado q1 y el proceso se repite hasta encontrar el 1, que indica que el proceso de copiar está completo. El estado q4 se usa para convertir los 2 en 0’s, y la subrutina para en q5 . Para completar el programa de multiplicación, se añaden estados para convertir la DI inicial q0 0m 10n en B0m−1 1q1 0n 1. Es decir, necesitamos las reglas δ(q0 , 0) = (q6 , B, R), δ(q6 , 0) = (q6 , 0, R), δ(q6 , 1) = (q1 , 1, R). Se necesitan algunos estados adicionales para convertir la DI B i 0m−i 1q5 0n 10ni en B i+1 0m−i−1 1q1 0n 10ni , que prepara el entorno para volver a invocar a COPIA, y verifica si i = m, es decir, si todos los m 0’s fueron borrados. En caso que 13 Curso Básico de Computación i = m, se borra el prefijo 10n 1 y el cálculo se detiene en el estado q12 . Los movimientos son: q5 q7 q8 q9 q10 q11 0 (q7 , 0, L) 1 2 B (q8 , 1, L) (q9 , 0, L) (q9 , 0, L) (q11 , B, R) (q10 , B, R) (q0 , B, R) (q11 , B, R) (q12 , B, R)
© Copyright 2024