7.3. TÉCNICAS PARA LA CONSTRUCCIÓN DE MÁQUINAS DE TURING 121en que Q es {q 0 , q 1 } × {0, 1, B}. El conjunto F es {[q 1 , B]}. La intención es que la primera componente <strong>de</strong>lestado controle la acción, mientras que la segunda recuerda un símbolo. La función δ se <strong>de</strong>fine como:δ([q 0 , B] , 0) = ([q 1 , 0] , 0, D) δ([q 0 , B] , 1) = ([q 1 , 1] , 1, D)δ([q 1 , 0] , 1) = ([q 1 , 0] , 1, D) δ([q 1 , 1] , 0) = ([q 1 , 1] , 0, D)δ([q 1 , 0] , B) = ([q 1 , B] , B, I) δ([q 1 , 1] , B) = ([q 1 , B] , B, I)✷7.3.2 Pistas MúltiplesEs también posible suponer que la cinta <strong>de</strong> la máquina <strong>de</strong> Turing está dividida en un número finito, k, <strong>de</strong>pistas. Por ejemplo, para k = 3̸ C 1 0 1 1B 1 0 0 1 0 1 B B B✻11 $ B BB B B B 1 0 1 B B BPista 1Pista 2Pista 3CONTROLFINITOFigure 7.2: Máquina <strong>de</strong> Turing con pistas múltiplesLos símbolos en la cinta se consi<strong>de</strong>ran k-tuplas, con una componente por cada pista.Ejemplo 86 La cinta <strong>de</strong> la figura 7.2 pertenece a una MT que toma un input binario mayor que 2, escritoen la primera pista y <strong>de</strong>termina si es un número primo. El input esta enmarcado por los símbolos C y $.Por lo tanto los símbolos <strong>de</strong> entrada son las tuplas [C, B, B], [0, B, B], [1, B, B] y [$, B, B]. Estos símbolos sepue<strong>de</strong>n i<strong>de</strong>ntificar con C, 0, 1 y $ respectivamente al verlos como símbolos <strong>de</strong> entrada. El blanco, se i<strong>de</strong>ntificacon [B, B, B]. Para saber si el input es un número primo, la MT primero escribe el número 2 (en binario)en la segunda pista y copia la primera pista en la tercera. Luego, la segunda pista es sustraída tantas vecescomo sea posible <strong>de</strong> la tercera, dividiendo la tercera pista por la segunda y <strong>de</strong>jando en ella el resto.Si el resto es cero, el número en la primera pista, el input, no es primo. Si el resto no es cero, se incrementaen 1 el número <strong>de</strong> la segunda pista. Si ella iguala a la primera, el número era primo, porque no pue<strong>de</strong> serdividido por ningún número entre 1 y sí mismo. Si el número <strong>de</strong> la segunda pista es menor que el <strong>de</strong> laprimera, toda la operación se repite para el nuevo número en la segunda pista.En la figura 7.2 la MT está chequeando si 47 es un primo, lo está dividiendo por 5, el que ya ha sidosustraido dos veces, por lo que el número 37 está en la tercera pista.✷7.3.3 Marcar SímbolosPoner marcas en algunos símbolos es una forma útil <strong>de</strong> visualizar cómo una MT reconoce lenguajes <strong>de</strong>finidospor strings repetidos, tales como{ww/w ∈ Σ ∗ }, {wcy/w e y ∈ Σ ∗ y w ≠ y}, {ww r /w ∈ Σ ∗ }
122ACEPTACIÓN Y GENERACIÓN DE L. ENUMERABLES RECURSIVAMENTE Y RECURSIVOSY también es útil cuando <strong>de</strong>ben compararse longitu<strong>de</strong>s <strong>de</strong> algunos substrings, tales como en los lenguajes{a i b i /i ≥ 1}, {a i b j c k /i ≠ j o j ≠ k}Para ello se usa una segunda pista en la cinta, la que sólo contiene un blanco o un √ (visto). El símbolo√ aparece bajo uno <strong>de</strong> la primera pista, que ya ha sido consi<strong>de</strong>rado por la MT en una <strong>de</strong> las comparaciones.7.3.4 Correr SímbolosUna máquina <strong>de</strong> Turing pue<strong>de</strong> hacer espacio en su cinta al mover todos los símbolos no blancos un númerofinito <strong>de</strong> celdas hacia la <strong>de</strong>recha. Para ello, la cabeza se mueve hacia la <strong>de</strong>recha almacenando repetidamentelos símbolos leídos en celdas <strong>de</strong> más a la izquierda. La MT pue<strong>de</strong> entonces volver a las celdas vaciadas yescribir los símbolos que <strong>de</strong>see. Si hay espacio disponible, también es posible empujar grupos <strong>de</strong> símboloshacia la izquierda <strong>de</strong> manera similar.7.3.5 SubrutinasTal como suce<strong>de</strong> con programas, un diseño modular o “top-down” se facilita al usar subrutinas que <strong>de</strong>finenprocesos elementales. Una máquina <strong>de</strong> Turing pue<strong>de</strong> simular cualquier tipo <strong>de</strong> subrutinas encontradas enlenguajes <strong>de</strong> programación, incluso procedimientos recursivos y cualquiera <strong>de</strong> los métodos conocidos parapasar parámetros. Aquí sólo se <strong>de</strong>scribirá el uso <strong>de</strong> subrutinas sin parámetros y no recursivas, pero aún éstasson bastante po<strong>de</strong>rosas.La i<strong>de</strong>a general es escribir una parte <strong>de</strong> una MT que sirva como subrutina; ella tendrá un estado inicial yuno <strong>de</strong> regreso que momentáneamente no tendrá movidas y que se usará para efectuar el regreso a la rutinaque la llamó. Para <strong>de</strong>signar una MT que “llama” a la subrutina, un conjunto nuevo <strong>de</strong> estados para lasubrutina se llama y se especifica una movida para el estado <strong>de</strong> regreso. La llamada se efectúa entrando alestado inicial <strong>de</strong> la subrutina y el regreso, por la movida <strong>de</strong>finida para el estado <strong>de</strong> regreso.7.4 <strong>Lenguajes</strong> y Funciones ComputablesUn lenguaje aceptado por una máquina <strong>de</strong> Turing se llama enumerable recursivamente (recursively enumerableo r.e., en inglés). El término enumerable <strong>de</strong>riva <strong>de</strong>l hecho que son precisamente estos lenguajescuyos strings pue<strong>de</strong>n ser enumerados (listados) por una máquina <strong>de</strong> Turing. Recursivamente, es un términomatemático previo a la existencia <strong>de</strong> los computadores y su significado es similar a lo que se llama recursiónen ciencia <strong>de</strong> la computación. La clase <strong>de</strong> los lenguajes enumerables recursivamente es muy amplia e incluyecon propiedad a la clase <strong>de</strong> los lenguajes libres <strong>de</strong> contexto.La clase <strong>de</strong> los lenguajes enumerables recursivamente incluye algunos lenguajes para los que no se pue<strong>de</strong><strong>de</strong>terminar pertenencia en forma mecánica. Si L(M) es uno <strong>de</strong> esos lenguajes, entonces cualquier máquina<strong>de</strong> Turing que reconozca L(M) <strong>de</strong>be no <strong>de</strong>tenerse en algunos strings que no pertenecen al lenguaje. Siw ∈ L(M), M se <strong>de</strong>tendrá eventualmente en input w. Sin embargo, mientras M esté ejecutando en algúninput, no es posible saber si parará y aceptará si se la <strong>de</strong>ja ejecutar lo suficiente, o si M no se <strong>de</strong>tendránunca y correrá para siempre.Es conveniente singularizar un subconjunto <strong>de</strong> los conjuntos enumerables recursivamente, llamados losconjuntos recursivos, que son aquellos lenguajes aceptados por al menos una máquina <strong>de</strong> Turing que se<strong>de</strong>tiene en todos sus inputs, ya sea aceptando o no. Posteriormente se verá que los conjuntos recursivosson una subclase propia <strong>de</strong> los conjuntos enumerables recursivamente. Nótese también que por el algoritmoCYK, todo lenguaje libre <strong>de</strong> contexto es un conjunto recursivo.A<strong>de</strong>más <strong>de</strong> ser un dispositivo <strong>de</strong> aceptación, la máquina <strong>de</strong> Turing pue<strong>de</strong> verse como un computador <strong>de</strong>funciones <strong>de</strong> enteros a enteros. La forma tradicional es representar los enteros en unario; es <strong>de</strong>cir, i ≥ 0 serepresenta por el string 0 i . Si una función tiene k argumentos, i 1 , i 2 , . . . , i k , entonces estos enteros se poneninicialmente en la cinta separados por 1’s, como: 0 i1 10 i2 1 . . . 10 i k.