Biografía de Alan Mathison Turing

                           

                                Posición                            Estado interno q5
                                                                actual de la
                                                                cabeza lec/esc.

  Observe que las transiciones dependen únicamente del estado actual y del contenido de la celda sobre la que se encuentre la cabeza de lectura/escritura. Por lo tanto, cualquier cadena de entrada se debe presentar a la máquina sobre su cinta. Esto debido a que se requiere que å Í  Γ – { Ѣ } ( y que Ѣ no es un símbolo de entrada).

Consideremos la máquina de Turing definida mediante

 

Q = {q1, q2}

å=(a, b)

Γ=(a, b, Ѣ)

F= {q2 }

s = q1

 

        y  δ dado por:

 

                                       δ (q1, a) = (q1, a, R)

                                       δ (q1, b) = (q1, a, R)

                                       δ (q1, Ѣ ) = (q2, Ѣ, L)

    Esta máquina empieza sus operaciones en el estado q1. Si el contenido de la celda de la cinta sobre la que se encuentra la cabeza de lectura/escritura es a, la transición que se puede aplicar es δ (q1, a) =  (q1, a, R). La máquina de Turing sobrescribirá la a que está en la cinta con otra a (es decir no se producirá ninguna cambio en el contenido de la cinta), se moverá una celda hacia la derecha y permanecerá en el estado q1.

    Cualquiera de la a´s que haya en la cinta ya sea en la nueva posición como en cualquier otra que esté a la derecha, no se cambiará, sin embargo las b´s serán sustituidas por a´s (por medio de la transición δ (q1, b) = (q1, a, R) ). Si la máquina de Turing encuentra un blanco (el símbolo Ѣ), se moverá una celda hacia la izquierda y pasará al estado final q2.

    No hay ninguna transición desde el estado q2, con lo que la máquina de Turing parará una vez que llegue a ese estado.

    Estos gráficos representan las distintas etapas del proceso para la máquina de Turing dada, que empieza con una configuración inicial muy sencilla:

 

A

B

B

A

Ѣ

,

A

B

B

A

Ѣ

,

A

A

B

A

Ѣ

,

          Estado q1                                             Estado q1                                          Estado q1

 

A

A

A

A

Ѣ

,

A

A

A

A

Ѣ

,

A

A

A

A

Ѣ

,

                          Estado q1                     Estado q1                  Estado q2

    Representar las configuraciones de una máquina de Turing de esta forma es bastante pesado.     Cualquier configuración viene determinada por el estado actual, el contenido de la cinta y la posición de la cabeza de lectura/escritura sobre la cinta. A continuación veremos las dos notaciones que más se emplean para representar esta información de una manera más conveniente. La primera representa una configuración como un par (qi, w1 σ w2), donde qi   es el estado actual, w1 es la cadena de la cinta que precede a la celda sobre la que se encuentra la cabeza de entrada/salida, σ  es el símbolo de la cinta sobre el que se encuentra la cabeza de entrada/salida y w2, es la cadena que hay a continuación de la cabeza de entrada/salida. Por tanto, en el ejemplo anterior la configuración inicial de nuestra máquina de Turing podría ser (q1, Ѣabba), la segunda sería (q1, abba) y así  sucesivamente.  Otra  notación  alternativa  viene  dada por una cadena a1a2 ... ak - 1 qi ak ... an, que representa a la configuración (qi, waku); es decir, la cabeza de entrada/salida se coloca sobre la celda que contiene ak y el estado actual es qi.            Obsérvese que la cadena  a1a2 ... ak - 1 qi ak ... an indica que la cabeza de entrada/salida se encuentra sobre el símbolo de la cinta que aparece siguiendo al estado. Por lo tanto, la primera de las dos configuraciones del ejemplo anterior se puede representar como q1abba y aq1bba.              

    Usaremos estas dos notaciones indistintamente. Las configuraciones de una máquina de Turing se conoce como descripciones instantáneas (DIS).

    Sea cual sea la notación que utilicemos, denotaremos el paso de una configuración a otra por medio del símbolo ya familiar . Por lo tanto, en el ejemplo anterior se tiene que

     (q1, abba) ⊢ (q1, abba) ⊢ (q1, aaba) ⊢ (q1, aaaa) (q1, aaaaѢ) ⊢ (q2, aaaa)

o

        q1abba aq1bbaaa q1baaaaq1a aaaa q1Ѣaaa q2a

Construcción de la Máquina de Turing

    Las máquinas de Turing pueden desempeñar muchas actividades además del reconocimiento de lenguajes. De hecho, las máquinas de Turing se toman como modelos teóricos de las computadoras.  Por ahora nos centraremos en la forma de simplificar la construcción de una máquina de Turing.  La idea básica  para simplificar la construcción de una máquina de Turing es construir una colección de máquinas de Turing sencillas y combinarlas de diferentes formas con el fin de crear una más compleja.

    Podemos combinar dos máquinas de Turing permitiendo que compartan la misma cinta y, que cuando una termine su ejecución, la otra empiece. El contenido de la cinta cuando comienza la ejecución de la segunda máquina de Turing, está formado por todo lo que dejó la primera máquina de Turing, y la cabeza de lectura / escritura de la segunda se situará, al comienzo de la ejecución, sobre la celda de la cinta sobre la que terminó la primera.

Ejemplo.

 

 Sea Mdada por

                               Q1 = { q1, q2, q3, q4}  

                                  å = {a}

                                Γ = {a, b}

                                S1 = q1

                                      F1 = {q4}

 

  Con δ1 de la forma siguiente

                               δ1(q1, a) = (q2, a, R)

                               δ1(q1, b) = (q2, b, R)

                               δ1(q2, a) = (q2, a, R)

                                       δ1(q2, b) = (q3, b, L)

                               δ1(q3, b) = (q4, b, R)

                               δ1(q3, a) = (q4, a, R)

 

  Sea M2 dada por

                               Q2 = {p1, p2}

                             å y Γ los mismos de M1

                                       s2 = p1

                               F2= {p2}

 

  Con δ2 como se escribe a continuación

                               δ2(p1, a) = (p2, a, R)

                                       δ2(p1, b) = (p2, a, R)

    Obsérvese que M1 busca el primer blanco que haya a la derecha de donde ha comenzado, mientras que M2 escribe una a y para. (La a se escribe independientemente del contenido de la celda actual).  Al combinar estas dos máquinas de Turing de forma que una computación de M1 vaya seguida por una de M2, obtenemos un dispositivo que primero busca hacia la derecha el primer b y después escribe una a en todas las celdas. Representaremos La combinación de estas dos máquinas de Turing mediante M1M2 para indicar que la computación de M1 va seguida por la computación de M2.

Definición.

    Sean M1 y M2 dos máquinas de Turing sobre el mismo alfabeto de entrada å y el mismo alfabeto de la cinta Γ, donde:

                                                M1 = (Q1, å, Γ, s1, Ѣ, F1, δ1)

y

                                                M2 = (Q2, å, Γ, s2, Ѣ, F2, δ2)

 

    Se supone que Q Ç  Q2 = Æ . La composición de las máquinas de Turing M1 y  M2 es la máquina de Turing M = (Q,  å,  Γ,  s, b, F, δ ) que se denota M1M2, donde:

 

Q = Q1 Q2

s = s1

F = F2

   

    Nos vamos a referir a la máquina de Turing M1 del ejemplo anterior como RѢEs decir, RѢ busca el primer blanco que haya a la derecha de la posición actual de la cabeza.  Consideremos una cinta

 

A

A

A

Ѣ

A

A

Ѣ

Ѣ

Ѣ

 

                                             Posición
                                                            actual de la
                                                            cabeza
 

  La máquina de Turing compuesta RѢRѢ terminaría en la posición:

 

A

A

A

Ѣ

A

A

Ѣ

Ѣ

Ѣ

 

                                                                                   Posición
                                                                                                            de la
                                                                                                            cabeza

mientras que la máquina de Turing compuesta RѢRѢRѢ  terminará en la posición

 

A

A

A

Ѣ

A

A

Ѣ

Ѣ

Ѣ

 

                                                                                          Posición
                                                                                                                     de la
                                                                                                                     cabeza

    Otra forma de especificar las transiciones es el uso de una tabla. La tabla de las transiciones correspondientes a RѢ sería:                    

δ (q, σ)

   σ ¹ Ѣ

   σ = Ѣ

     q1

 (q2, σ,R)

 (q2, Ѣ,R) 

     q2

 (q2, σ,R) 

 (q3, Ѣ,L)

      q3

 (q4, σ,R)

 (q4, Ѣ,R)

Obsérvese que una de las columnas se especifica para un símbolo de la cinta en particular y la otra especifica el resto de símbolos de la cinta. La transición δ (q2, σ) = (q2, σ,R) de la columna etiquetada con  σ ¹ Ѣ indica que para todo símbolo de la cinta σ que sea distinto de Ѣ, la máquina de Turing escribe σ en la cinta, se mueve a la derecha y permanece en el estado q2.  Aunque al principio habíamos especificado RѢ sólo para el alfabeto de la cinta Γ = {a,Ѣ}, ahora hemos especificado RѢ para todo alfabeto de cinta que incluya Ѣ como el blanco.

 

Modificaciones de las Máquinas de Turing

    Hay otras definiciones de las máquinas de Turing que son equivalentes a la nuestra. Algunos de esos modelos alternativos son mucho más complicados aunque todos tienen la misma potencia computacional (o de cálculo).

    Muchas de ellas denotan mayor flexibilidad al diseño de una máquina de Turing que resuelva un problema en particular.  Vamos a ver primero unas pequeñas variaciones de nuestra definición original.

    Recuérdese que la máquina de Turing sencilla LѢ sitúa la cabeza de lectura/escritura sobre el primer Ѣ que haya a la izquierda de la posición actual. Para hacerlo, buscamos fuera de la celda actual y retrocedemos esto es debido a que se requiere que por cada transición se mueva la cabeza de la cinta.

La función de transición estaba definida como:

δ :Q x Γ →   Q x Γ x  {L, R}

y puede ser modificada domo

δ: Q x Γ →   Q x Γ x  {L, R, S}

donde S significa “permanecer”, es decir, no mover la cabeza de lectura/escritura. Por lo tanto δ(q, σ ) = (p, σ’, S) significa que se pasa del estado q al p, se escribe σ’ en la celda actual y la cabeza se queda sobre la celda actual.  Obsérvese que en esta definición está contenida la nuestra, puesto que ésta es una extensión de la máquina de Turing que hemos definido.

 

    Por otro lado, una máquina de Turing para la cual esté definida δ(q, σ ) = (p, σ’, S), se puede simular por medio de una máquina que corresponda a nuestra definición original, añadiéndole simplemente los estados y movimientos de la forma δ(q, σ ) = (p’, σ, R) y δ(p’,τ ) = (p, τ, L) y/o de la forma δ(q, σ ) = (p’, σ, L) y δ(p’,τ ) = (p, τ, R) para todo τ Γ.

 

 

    Otra modificación sencilla de nuestra máquina de Turing  básica es aquella mediante la cual cada celda de la cinta se divide en subceldas. Cada subcelda es capaz de contener un símbolo de la cinta. La cinta

 

 Ѣ

B

B

A

A

B

A

A

 Ѣ

 

tiene cada celda subdividida en tres subceldas. Se dice que esta cinta tiene múltiples pistas. Puesto que cada celda de esta máquina de Turing contiene múltiples caracteres, el contenido de las celdas de la cinta puede ser representado mediante n-uplas ordenadas. En ejemplo anterior, las celdas de la cinta contienen (Ѣ, a , a), (b ,a,a) (b,b, Ѣ). Por lo tanto, los movimientos que realice esta máquina dependerán de su estado actual y de la n-tupla que represente el contenido de la celda actual.

 

    La máquina de Turing multipista no tiene más potencia que la máquina original. Sin embargo, hace que sea más fácil la construcción de máquinas de Turing que resuelvan ciertos problemas.

    Otra modificación sencilla (y bastante común) que puede realizarse en nuestra definición de máquina de Turing es que se use una cinta que se extienda infinitamente en una única dirección.

Generalmente, se tiene una cinta que se extiende infinitamente hacia la derecha. No está permitido realizar ningún movimiento hacia la izquierda a partir de la celda del extremo izquierdo. Desde luego, cualquier máquina de Turing de esta forma, puede ser simulada por una de las que responden a nuestra definición original.  Para cada computación, simplemente marcaremos una de las celdas de nuestra cinta infinita por los dos lados, como la celda que se encuentra en el límite izquierdo.

 

    Una modificación de nuestra definición, que es mas complicada, es la máquina de Turing multicinta. Esta máquina de Turing tiene varias cintas, cada una de las cuales tiene su propia cabeza de lectura/escritura. Las cabezas de lectura/escritura se controlan independientemente (es decir, al mismo tiempo, no tienen que moverse en la misma dirección, ni realizar el mismo número de movimientos, ni incluso, hacer nada a la vez). En un solo movimiento esta máquina de Turing

 

1.      Cambia de estado dependiendo del estado actual y del contenido de las celdas de todas las cintas, que están analizando actualmente las cabezas de lectura/escritura.

2.      Escribe un nuevo símbolo en cada una de las celdas barridas por sus cabezas de lectura/escritura.

3.      Mueve cada una de sus cabezas hacia la izquierda o hacia la derecha (de forma independiente al resto de las cabezas).

  Por tanto la función de transición para una máquina de Turing con n cintas, es de la forma:

            δ: Q x Γn →   Q x Γn x  {L, R,}n

    Aunque una máquina de Turing multicinta parece bastante distinta y posiblemente más potente que nuestra máquina de Turing definida originalmente, las dos son equivalentes en el sentido de que cada una de ellas puede ser simulada por la otra.

    Otra modificación que se puede hacer en nuestra máquina de Turing original consiste en permitir que la cinta tenga muchas dimensiones. Por ejemplo, una cinta de dos dimensiones que se extienda hacia abajo y hacia arriba, al igual que hacia la derecha y hacia la izquierda. Dependiendo del estado actual de la máquina de Turing y del símbolo analizado, cambia de estado, escribe un símbolo en la celda actual y se mueve a la izquierda, a la derecha, hacia arriba o hacia abajo. Por tanto, la función de transición para esta máquina de Turing  queda de la siguiente forma:

                                  δ : Q x Γ →   Q x Γ x  {L, R, U, D}

    Una máquina de Turing multidimensional simula, fácilmente, a una máquina de Turing estándar. Simplemente realiza todas sus computaciones en una única dimensión. Una máquina de Turing estándar también puede simular una máquina de Turing multidimensional y, por lo tanto, la complejidad y flexibilidad adicional que se debe a su múltiple dimensión, no es una capacidad real. 

    Finalmente, una modificación importante que se puede introducir en la definición original es la eliminación del requerimiento de que la regla de transición  sea una función. Esta máquina de Turing se llamará máquina de Turing no determinista, ya que para un estado actual y el símbolo actual de la cinta, puede haber un número finito de movimientos a elegir. Por lo tanto, la regla de transición, de dicha máquina, satisface

                                                 ∆(q, σ) Í  Q x Γ x  {L, R}

Por ejemplo, si la máquina de Turing tiene una transición

                                   (q1, σ) = {( q1, b, R ), (q2, a, L) }     

entonces los movimientos

                     (q1, abbab) ⊢ (q1, abbbb)   y   (q1, abbab) ⊢ (q2, abbab)   

son posibles.                                                  

    Ya que cualquier máquina de Turing determinista es también no determinista, es lógico que una máquina de Turing determinista se puede simular mediante una no determinista. También una máquina de Turing determinista puede simular una no determinista. Por tanto, no se gana ninguna potencia adicional a causa del no determinismo.

 

    En esta sección hemos descrito varias modificaciones a realizar sobre la máquina de Turing original, ninguna de las cuales tiene mayor o menor potencia que la original. Entonces cabe preguntarse porque nos hemos molestado en estudiarlas si ninguna de ellas aporta ninguna ganancia en cuanto a capacidad computacional, o por que no nos hemos centrado en la mas sencilla de todas ellas.  Una de las razones es que, a partir de ahora, conocemos formas distintas de resolver problemas mediante la máquina de Turing. Si una de ellas resolviera un problema de forma más fácil que la original entonces, sin temor a perder generalidad, usaremos dicha variante.

    Otra razón aún más profunda para el estudio de estas modificaciones y sus equivalencias con el original, es que con esto se comprende aún más la actualidad de las máquinas de Turing. 

Lenguajes Recursivos y Recursivamente Enumerables

    Recordaremos que una cadena w sobre algún alfabeto es aceptada por una máquina de Turing M, cuando una computación que empezó con w en la cinta de M y con M en su estado inicial, termina con M en un estado final. Por otro lado, w  se puede rechazar de dos formas, ya sea porque M para en algún estado que no es de aceptación o porque M nunca para. Los dos métodos de rechazo de cadenas no son equivalentes. Por tanto, hemos definido los lenguajes recursivamente enumerables como los lenguajes que son aceptados por una máquina de Turing (de alguna forma) y los lenguajes recursivos como los lenguajes aceptados por alguna máquina de Turing que siempre para sobre alguna entrada.  Formalmente, daremos la siguiente definición

 

 

Definición:

    Un lenguaje L sobre un alfabeto å se dice que es recursivamente enumerable si es aceptado por alguna máquina de Turing. Es decir, L es recursivamente enumerable si para alguna máquina de Turing M tenemos que:

L = (w å* | qw *   upv  para p F y u, v Γ *)

(donde q es el estado inicial de M y F es el conjunto de estados finales de M).

    Un lenguaje L es recursivo si L es recursivamente enumerable y hay alguna máquina de Turing que para sobre todas las entradas que acepta L.

    De esta definición se deduce que todo lenguaje que es recursivo, también es recursivamente enumerable.

Teoremas

*      Si L es un lenguaje regular, entonces L también es un lenguaje recursivo.

 

*      Si L es un lenguaje independiente del contexto, entonces L es un lenguaje recursivo.

 

*      Si L1 y L2 son lenguajes recursivos, entonces L1 Ç  L2 también lo es.

 

*      Si L es un lenguaje recursivo, entonces å* - L es un lenguaje recursivo.

*      (Esta es una propiedad que, en general, no se cumple para los lenguajes recursivamente enumerables).

*      Supongamos que å es un alfabeto. Ya que S* es numerable, podemos enumerarlo como S* = {w1,w2,w3,...}.  Por lo tanto  se puede listar todas las máquinas de Turing  sobre S como M1, M2,... Sea

 

                                 L = {wi ,| wi  es aceptado por M i }

 

Este lenguaje es recursivamente enumerable, pero su complemento no.  Hay un lenguaje recursivamente enumerable L para el cual å* - L no es recursivamente enumerable.

Obsérvese que el lenguaje L descrito aquí no puede ser recursivo porque, si lo fuera, su complemento también lo sería y, por lo tanto, L sería recursivamente enumerable. Luego tendremos un lenguaje recursivamente enumerable que no es recursivo. Por consiguiente, la inversa de la sentencia que dice que todo lenguaje recursivo también es recursivamente enumerable no es cierta.

 

*      Si L1 y L2 son lenguajes recursivamente enumerables, entonces L1 È L2 también es recursivamente enumerable.

 

*      Si L es un lenguaje recursivamente enumerable para el cual  å* - L también es recursivamente enumerable, entonces L es un lenguaje recursivo.

 

*      Un lenguaje L es recursivamente enumerable si y sólo si L es enumerado por alguna máquina de Turing.

 

Por tanto, la capacidad de ser enumerado por una máquina de Turing, caracteriza completamente a los lenguajes recursivamente enumerables.