237

Introduccion a la teoria de la computabilidad

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Introduccion a la teoria de la computabilidad
Page 2: Introduccion a la teoria de la computabilidad

INTRODUCCIÓN A LA TEORÍADE LA COMPUTABILIDAD

Page 3: Introduccion a la teoria de la computabilidad

This page intentionally left blank

Page 4: Introduccion a la teoria de la computabilidad

DOMINGO GALLARDO LÓPEZPILAR ARQUES CORRALES

IGNACIO LESTA PELAYO

INTRODUCCIÓN A LA TEORÍADE LA COMPUTABILIDAD

PUBLICACIONES DE LA UNIVERSIDAD DE ALICANTE

Page 5: Introduccion a la teoria de la computabilidad

Publicaciones de la Universidad de AlicanteCampus de San Vicente s/n

03690 San Vicente del [email protected]

http://publicaciones.ua.esTeléfono: 965903480

Fax: 965909445

© Domingo Gallardo López,Pilar Arques Corrales,

Ignacio Lesta Pelayo, 2003de la presente edición: Universidad de Alicante

I.S.B.N.: 84-7908-763-3Depósito Legal: MU-1878-2003

2" edición

Diseño de portada: candela + alendaImpresión y encuademación: Compobell, S.L.

C/. Palma de Mallorca, 4 - bajo30009 Murcia

Reservados todos los derechos. No se permite reproducir, almacenar en sistemas de recuperación de la información nitransmitir alguna parte de esta publicación, cualquiera que sea el medio empleado —electrónico, mecánico, fotocopia,

grabación, etc.—, sin el permiso previo de los titulares de los derechos de la propiedad intelectual.

Page 6: Introduccion a la teoria de la computabilidad

PRÓLOGO A LA SEGUNDA EDICIÓN

En esta segunda edición del libro, hemos querido aplicar las modificacio-nes que la experiencia docente de la asignatura «Modelos Abstractos deCálculo», posteriormente denominada «Computabilidad», nos han aportado.

Hemos creído conveniente aumentar el número de ejercicios en práctica-mente todos los capítulos, y especialmente en el capítulo «Un programaUniversal» y en el capítulo en el que se habla de «Decidibilidad e Indecidibi-lidad» de modo que estos ejercicios ayuden a nuestros alumnos a comprendermejor estos dos temas.

También hacemos especial hincapié en el capítulo de «Funciones RecursivasPrimitivas», ampliándolo con la notación matemática.

Page 7: Introduccion a la teoria de la computabilidad

This page intentionally left blank

Page 8: Introduccion a la teoria de la computabilidad

Prólogo

El objetivo fundamental de la Teoría de la Computabilidad es formalizar yestudiar el concepto de computación. Esta teoría surge en los años treinta, muchoantes de que se construyeran los primeros computadores eléctricos. En esas fechasya existía un tipo de computadores que se utilizaban en laboratorios y univer-sidades, pero no eran máquinas, sino personas que llenaban una sala y que sededicaban a realizar durante días tediosas operaciones y a pasarse los resultadosunos a otros hasta concluir cálculos que hoy en día se realizarían en décimas desegundo1.

Para evitar equívocos y malentendidos, querernos dejar claro desde el comienzoque vamos a formalizar en concreto la computación desde el punto de vista delcálculo de funciones matemáticas sobre números naturales mediante ejecución deun algoritmo secuencial. Entendemos un algoritmo (después lo definiremos conmás precisión) como un cálculo realizado sobre un conjunto de datos de entraday que produce un dato de salida. Sin embargo, no trataremos el problema de lacomputación concurrente, en la que diferentes procesos computan funciones enparalelo, se comunican datos, y los resultados finales dependen del momento enel que los procesos se comunican. La formalización de este tipo de computaciónes materia de investigación en la actualidad.

Este texto tiene su origen en las notas y apuntes que hemos elaborado parala asignatura Modelos Abstractos de Cálculo, una asignatura cuatrimestral decuatro créditos y medio de segundo curso de las titulaciones de Informática de laUniversidad de Alicante. En los años en que la hemos venido impartiendo hemosconfigurado un temario y un estilo de explicar los contenidos que consideramosplenamente adecuado para las titulaciones informáticas.

El texto está por ello principalmente orientado a alumnos de estas titulaciones,haciéndose especial énfasis en relacionar la mayoría de conceptos de la Teoría dela Computabilidad con la experiencia en lenguajes de programación que tienenestos alumnos. Sin embargo, no es necesario en absoluto dominar ninguno para

1Para dar una idea del enorme salto que se ha dado en poder de computación presentamosla siguiente anécdota. El problema de calcular los movimientos de tres planetas sometidos aatracción gravitatioria fue resuelto en 1929, después de que 56 científicos calcularan las solucionesa las ecuaciones durante 15 (!) años. Hoy en día, esos mismos cálculos apenas ocuparían unashoras de procesamiento de un potente PC.

Page 9: Introduccion a la teoria de la computabilidad

comprender el contenido del texto.En un primer capítulo se repasan los preliminares matemáticos necesarios,

como son los conceptos más importantes de la teoría de conjuntos, los métodosde demostración y la numerabilidad. En el segundo capítulo se explica el modelode Máquina de Turing y sus variantes, se demuestra la equivalencia entre ellas, sedefinen los conceptos de lenguaje recursivo y recursivamente enumerable y, porúltimo, se enuncia la Tesis de Church. A partir de este capítulo abandonamoslas máquinas de Turing y damos un giro al texto. Introducimos el lenguaje L2,un mínimo lenguaje de programación (únicamente tiene cuatro instrucciones), ybasamos todo el estudio sobre la Teoría de la Computabilidad en el estudio formalde este lenguaje, de sus posibilidades y de sus limitaciones. En el capítulo tresse introduce, por tanto, este lenguaje de programación para calcular funciones denúmeros naturales, se describe su sintaxis y su semántica. En el capítulo cuatrose presenta otro lenguaje, el lenguaje R, con el que también es posible definirfunciones matemáticas, las funciones recursivas primitivas. Comprobaremos queeste lenguaje es menos potente que el lenguaje L, en el sentido de que cualquierfunción que se puede definir en R puede ser definida en L, pero no al contrario.En el capítulo cinco se explica cómo codificar programas y estados de programasen ejecución mediante números naturales, y se introducen una serie de funcionesque hace muy sencilla la explicación del Programa Universal, uno de los conceptosmás importantes del texto. Por último, en el capítulo final se presenta la teoríade la decidibilidad e indecidibilidad, definiendo primero los conjuntos recursivos yrecursivamente enumerables, siguiendo con la demostración de la indecidibilidadde varios problemas (como el del Castor Afanoso o el Problema de la Parada) yterminando con el Teorema de Rice. Cerramos el texto con las soluciones de losproblemas que se han ido planteando a lo largo de los capítulos.

Esperamos con ilusión que este libro sea un manual útil para todo aquel quedesee iniciarse en los conceptos básicos de la Teoría de la Computabilidad. Yagradecemos profundamente las numerosas recomendaciones de los estudiantesque han venido utilizando las versiones iniciales de este texto y que han enrique-cido enormemente su contenido.

Los autores.Alicante, septiembre de 1997.

2Hemos implementado un intérprete de este lenguaje, y del lenguaje R que presentamosmás adelante, que puede ser usado por cualquier lector. Se encuentra en la dirección Inter-net ftp://ftp.dtic.ua.es/pub/soft/mac/interp.tgz. Consultar el fichero README del mismodirectorio para comprobar sobre qué plataformas es ejecutable.

8

Page 10: Introduccion a la teoria de la computabilidad

índice general

1. Preliminares 131.1. Conjuntos 131.2. Tupias 181.3. Funciones 191.4. Predicados 211.5. Alfabetos, cadenas y lenguajes 241.6. Métodos de demostración 27

1.6.1. Reducción al absurdo 271.6.2. Demostración por inducción 28

1.7. Codificación 301.7.1. Codificación de pares de números 30

1.8. Numerabilidad 331.9. Diagonalización 361.10. Problemas 38

2. Máquinas de Turing 412.1. Introducción 412.2. El problema de definir un lenguaje 42

2.2.1. Expresiones regulares 422.3. El modelo conceptual de Máquina de Turing 43

2.3.1. Funcionamiento de una MT 442.3.2. Representación de una MT 452.3.3. Definición formal de una MT 46

2.4. Equivalencia de modelos de MT 502.4.1. Máquina de Turing multipista 502.4.2. Máquina de Turing con registro acotado de memoria . . . . 512.4.3. Máquina de Turing multicinta 542.4.4. Máquina de Turing no determinista 56

2.5. Lenguajes computables y funciones 582.5.1. Lenguajes recursivamente enumerables y recursivos 582.5.2. Las MT como computadores de funciones de naturales ... 59

2.6. Caracterización de lenguajes con MT generadoras 60

Page 11: Introduccion a la teoria de la computabilidad

10 ÍNDICE GENERAL

2.6.1. Caracterización de los lenguajes recursivos 622.6.2. Caracterización de los lenguajes r.e 63

2.7. Problemas 64

3. Funciones L-computables 673.1. Introducción de un lenguaje programación 67

3.1.1. El lenguaje L 673.1.2. Algunos ejemplos de programas 69

3.2. Definiciones formales 713.2.1. Notación BNF 723.2.2. Definición de L usando la notación BNF 733.2.3. Semántica de L 73

3.3. Definición de macros 773.4. Ejemplos de programas 803.5. Funciones L-computables 833.6. Macros genéricas 85

3.6.1. Asignación 853.6.2. Comparación 86

3.7. Tesis de Church aplicada al lenguaje L 873.8. Problemas 88

4. Funciones recursivas primitivas 914.1. Definición de las funciones recursivas primitivas mediante la no-

tación matemática 914.2. Introducción al lenguaje R 934.3. Definición formal de R 98

4.3.1. Sintaxis del lenguaje R 994.3.2. Semántica del lenguaje R 994.3.3. Funciones recursivas primitivas 101

4.4. Constructores avanzados 1024.4.1. Predicados 1024.4.2. Iteradores acotados 1054.4.3. Cuantificadores acotados 1064.4.4. Minimización acotada 107

4.5. Una función L-computable total no recursiva primitiva 1114.5.1. Minimización no acotada 1134.5.2. Funciones recursivas-u

4.6. Problemas 114

5. Un programa universal 1195.1. Numeración de Gódel 119

5.1.1. Función de codificación 1205.1.2. Función de descodificación 121

114

Page 12: Introduccion a la teoria de la computabilidad

ÍNDICE GENERAL 11

5.2. Codificación de programas L 1225.2.1. Codificación de instrucciones 1235.2.2. Codificación y descodificación de programas 124

5.3. Codificación de ejecuciones de programas 1285.3.1. Codificación de instantáneas 1285.3.2. La función Inst 130

5.4. El programa universal 1335.4.1. El predicado PASOS 1335.4.2. El programa universal 134

5.5. Problemas 136

6. Decidibilidad e indecidibilidad 1416.1. El problema de la parada 1416.2. El castor afanoso 1436.3. Conjuntos decidibles e indecidibles 147

6.3.1. Conjuntos recursivos 1476.3.2. Conjuntos recursivamente enumerables 1486.3.3. Conjuntos recursivos y recursivamente enumerables 1506.3.4. Conjuntos recursivamente enumerables y funciones 153

6.4. Conjuntos no recursivos 1556.4.1. El conjunto K 155

6.5. Conjuntos no recursivamente enumerables 1576.5.1. El conjunto K 1576.5.2. El conjunto TOT 158

6.6. Reducción 1596.6.1. El conjunto KQ no es recursivo 1616.6.2. El conjunto NO_VACíO no es recursivo 1626.6.3. El conjunto VACÍO no es r.e 1646.6.4. El conjunto FINITO no es r.e 165

6.7. Teorema de Rice 1666.8. Problemas 168

A. Soluciones 171A.l. Preliminares 171A.2. Máquinas de Turing 182A.3. Funciones L—computables 190A.4. Funciones recursivas primitivas 201A.5. Un programa universal 208A.6. Indecidibilidad 219

Page 13: Introduccion a la teoria de la computabilidad

This page intentionally left blank

Page 14: Introduccion a la teoria de la computabilidad

Capítulo 1

Preliminares

Para definir la computación de forma matemática vamos a necesitar una colec-ción de conceptos que presentamos en este capítulo. De todos ellos los fundamen-tales serán los conceptos de conjuntos de números naturales y de lenguajes, conlos que podremos definir formalmente un algoritmo.

También tocaremos de pasada en este capítulo el concepto de infinito. Alguienpuede comenzar a preguntarse por qué es necesario utilizar conjuntos infinitos paracaracterizar la computación. De hecho nuestros computadores siempre tendráncaracterísticas finitas: su memoria estará limitada, y sus cálculos se completaránen un tiempo finito. La necesidad de utilizar el infinito (suponer, por ejemplo,que el modelo de computador va a tener una memoria infinita) se comprendesi entendemos este concepto en su acepción de no limitado. Si limitáramos lascapacidades de los ordenadores (en memoria o tiempo de ejecución) existiríanproblemas que no podrían ser resueltos precisamente por causa de estos límites,porque necesitarían más recursos. Al suponer capacidades infinitas no imponemoslímites al tamaño de los problemas que vamos a tratar. En capítulos posterioresveremos que, aun con esta suposición, habrá problemas que serán imposibles deresolver.

1.1. Conjuntos

Uno de los retos fundamentales de la teoría de la computabilidad es el deencontrar mecanismos para representar efectivamente conjuntos de objetos, posi-blemente infinitos, de forma que podamos decidir si un determinado objeto es ono un elemento del conjunto definido. A lo largo del texto exploraremos distintascuestiones sobre la definición y representación computacional de conjuntos, comoqué tipos de conjuntos son susceptibles de ser representados, qué formas de re-presentación finita pueden utilizarse para codificar conjuntos infinitos y si existenconjuntos imposibles de ser definidos computacionalmente.

Para comenzar, pues, es interesante partir de la noción de conjunto.

Page 15: Introduccion a la teoria de la computabilidad

14

Definición 1.1 Llamaremos conjunto a toda agrupación de objetos bien definidosy diferenciables unos de otros. Utilizaremos la palabra clase como sinónimo deconjunto.

Normalmente utilizaremos letras mayúsculas, como R, 5, T, [7,... para nom-brar conjuntos, y letras minúsculas, como x, y, z,... para representar elementosde los conjuntos.

En los capítulos siguientes definiremos algunos conjuntos, como por ejemploPARES, KQ, Wx o VACÍO, cuyos nombres representaremos en negrita. Estanegrita indicará que el conjunto está definido para todo el texto1 y servirá paradistinguirlos de nombres de conjuntos genéricos, como los vistos anteriormente.ñ, 5, T, [7, que utilizaremos como variables libres cuya definición tendrá el alcancede un teorema o una definición.

Definición 1.2 Para indicar que un elemento x pertenece a un conjunto S es-cribimos x € 5. Al contrario, x ^ S denotará que el elemento x no pertenece alconjunto S.

Los conjuntos fundamentales con los que vamos a trabajar en este texto sonconjuntos de números naturales y conjuntos de cadenas (lenguajes). Más adelantedefiniremos el concepto de lenguaje.

Definición 1.3 Denominaremos N al conjunto de números naturales.

0 ,1 ,2 ,3 ,4 ,5 , . . .

Siempre que se utilice la palabra número tendremos que entender que nosestamos refiriendo a número natural, salvo que se diga lo contrario. Por defecto, enlas definiciones de conjuntos, las variables ar, y, z representarán números naturales,siempre que no se diga lo contrario.

Definición 1.4 Llamaremos conjunto vacío al conjunto que no tiene elementos,y lo denotamos con el símbolo 0.

La noción de conjunto vacío nos va a ser muy útil para simplificar notacionesy eliminar casos especiales en teoremas y demostraciones.

Definición 1.5 El cardinal de un conjunto es el número de elementos del mismo.Denotamos por \S\ al cardinal del conjunto S.

Por ejemplo, el cardinal del conjunto vacío es O, |0| — 0.

1Todos los conjuntos, funciones, predicados, nombres de programa, etc., que se utilicen enmás de una ocasión aparecen en el índice de materias, situado al final del libro, para que seasencilla la localización de sus definiciones.

CAPÍTULO 1. PRELIMINARES

Page 16: Introduccion a la teoria de la computabilidad

1.1. CONJUNTOS

Definición 1.6 Diremos que un conjunto es finito cuando tiene un número finitode elementos. La forma usual de expresar conjuntos que contienen un númerofinito de elementos es mediante una enumeración de dichos elementos.

Ejemplo 1.1

Podemos escribir R = {0,1,2, 3,4} para representar el conjunto de los númerosnaturales menores que 5.

En un conjunto no distinguimos ni el orden ni las repeticiones de elemen-tos. Así, las expresiones {1,3,5}, {3,1,5} y {5,3,1} están denotando al mismoconjunto.

Al intentar, sin embargo, representar conjuntos infinitos^, no son válidas ex-presiones como las anteriores. Como hemos mencionado antes, el problema derepresentar conjuntos infinitos de una forma finita es uno de los problemas cen-trales de la teoría de la computabilidad.

Definición 1.7 Diremos que un conjunto es infinito cuando tiene un númeroinfinito de elementos.

Una notación muy utilizada para representar conjuntos infinitos es la siguiente,

IMPARES - {1 ,3 ,5 , . . . } ,

donde los tres puntos simbolizan una lista infinita, en este caso la formada portodos los números impares. Evidentemente, las limitaciones de esta notación sonenormes. Por un lado deja al lector toda responsabilidad de interpretar cuál es elconjunto que se define y por otro sólo sirve para representar conjuntos elemen-tales ya conocidos. Otra forma de representar estos conjuntos, más relacionadacon técnicas de notación que avanzaremos posteriormente, es la que utiliza unpredicado o una propiedad que deben cumplir aquellos elementos que pertenezcanal conjunto.

Ejemplo 1.2

IMPARES = {x | x no es divisible por 2}

denota el mismo conjunto de todos los números impares.

2El símbolo O significa que se ha alcanzado el final de un ejemplo, de una demostración o deun teorema.

3No vamos a dar aquí una definición formal de conjunto infinito, ya que tal definición va másallá del alcance del presente libro. Consultar [?].

15

o2

Page 17: Introduccion a la teoria de la computabilidad

16 CAPÍTULO1.PRELIMINARES

Definición 1.8 Diremos que dos conjuntos R y S son iguales, y lo denotamospor R = S, cuando tienen exactamente los mismos elementos.

Cuando existe algún elemento que pertenece a uno de ellos y no al otro, decimosque son conjuntos distintos, R ^ S.

Definición 1.9 Decimos que un conjunto R es subconjunto de otro S, y se de-nota R C S, cuando todos los elementos de R pertenecen también a S.

Así, R = S sii4 R C S y S C -ñ, por lo que para demostrar que R = Sdebemos demostrar las dos inclusiones.

Hay que hacer notar que para cualquier conjunto R se cumple que 0 C R yRCR.

Definición 1.10 Diremos que un conjunto R es un subconjunto propio de S,cuando R C S y R / 5.

Dos conjuntos pueden combinarse para dar lugar a otro conjunto medianteoperaciones de conjuntos.

Definición 1.11 Dados dos conjuntos R y S definimos su unión, que se escribecomo R U 5, como el conjunto de aquellos elementos que pertenecen a R, a S o aambos:

Ejemplo 1.3

Definición 1.12 Dados dos conjuntos R y S definimos su intersección, que sedenota por R(~]S, como el conjunto formado por aquellos elementos que pertenecena R y a S al mismo tiempo:

Ejemplo 1.4

4Traducción literal del inglés iff. Es una abreviatura de la expresión si y sólo si.

{1,2,3,4} n {4,5,6,7} = {4}.

Page 18: Introduccion a la teoria de la computabilidad

1.1. CONJUNTOS 17

Definición 1.13 Dados dos conjuntos R y S definimos su diferencia, escritacomo R — S, como el conjunto formado por aquellos elementos que pertenecen aR y no pertenecen a S.

Así, R- S = R-(RnS}.

Hay que hacer notar que la diferencia de conjuntos no es una operación simétri-ca, con lo que R — S ^ S — R.

Ejemplo 1.5

PARES = N- IMPARES.

Normalmente, todos los conjuntos con los que trabajemos estarán definidosdentro de un determinado dominio o universo, esto es, todos ellos serán subcon-juntos de un conjunto dado D. Siempre que no se diga lo contrario, el dominio deun conjunto será N.

Definición 1.14 Definimos la operación complementario de un conjunto R, y loescribimos como R, como el conjunto de aquellos elementos que pertenecen a Dy no pertenecen a R, esto es, R = D — R.

Ejemplo 1.6

Otra forma de definir el conjunto de los números pares es PARES=IMPARES.

Ya que se definen los conjuntos como colecciones de elementos, sin hacer ningu-na salvedad sobre el tipo de elementos que podemos considerar, es posible formarconjuntos que tengan otros conjuntos como elementos.

Definición 1.15 Llamaremos colecciones a aquellos conjuntos cuyos elementosson otros conjuntos5.

5El problema que sufren este tipo de conjuntos es que su utilización puede dar lugar aparadojas o contradicciones. Una de las más conocidas es definir S como la colección de aquellosconjuntos que no pertenecen a si mismos. La paradoja aparece al intentar determinar si Spertenece a si mismo o no.

Page 19: Introduccion a la teoria de la computabilidad

18 CAPÍTULO 1. PRELIMINARES

Utilizando colecciones de conjuntos es posible definir uniones e interseccionesde más de un conjunto.

Definición 1.16 Si S es una colección de conjuntos, definimos \JS como el con-junto formado por todos los elementos que pertenecen a los conjuntos de S.

De forma análoga se define f| S como el conjunto formado por todos los ele-mentos que pertenecen a todos y cada uno de los conjuntos de S al mismo tiempo.

Ejemplo 1.7

Si definimos

S = {{O, 2,4, 6}, {1, 3, 5}, {10,12,16}, {11,13,15}},

entonces

Definición 1.17 Denominamos conjunto potencia o partes de S, y denotamos2 o P(S) a la colección de todos los posibles subconjuntos de un conjunto S.

Ejemplo 1.8

P({1,2}) = {0,{1},{2},{1,2}}.

Hay que hacer notar que el conjunto vacío y el propio conjunto siempre sonelementos de cualquier conjunto potencia.

1.2. Tupias

A diferencia de los conjuntos, en las tupias sí que importa el orden en que loselementos están definidos.

Page 20: Introduccion a la teoria de la computabilidad

1.3. FUNCIONES 19

Definición 1.18 Representamos una n-tupla como una lista de n elementos en-cerrados entre paréntesis, en lugar de entre llaves:

Es posible que existan elementos repetidos dentro de las n-tuplas.

Por ejemplo, una 4-tupla correctamente definida sería (1, 2, 2, 1). Las 2-tuplasse denominan pares ordenados y denominaremos a las 3-tuplas tripletas ordenadas.Una 1-tupla no se distinguirá del elemento propiamente dicho, a diferencia de losconjuntos.

Definición 1.19 Decimos que dos n-tuplas son iguales,

su£ i = 2 / i , #2 = 2/2, • • - , xn = yn.

Definición 1.20 Dados n conjuntos Si,S<¿,...,Sn, representamos por S\ x 52 x. . . x Sn a el conjunto formado por todas las n-tuplas (#1, # 2 , . . . , xn) tal que

Este conjunto se denomina producto cartesiano de S\,S-2,,...,Sn.En caso de que Si — 82 = • • • — Sn, denominamos Sn al producto cartesiano

Si x S2 x . . . x Sn-

Ejemplo 1.9

Si 5 = (0,1, 2} y R = (2,3}, entonces

1.3. Funciones

Uno de los conceptos que utilizaremos más frecuentemente es el de función.

5 X j R = {(0 ,2) , (0 ,3) , ( l ,2) , ( l ,3) , (2 ,2) , (2 ,3)} .

(ari,x2,...,arn).

(xi,X2,...,Xn) = (2/l,y2,-..,2/n),

Page 21: Introduccion a la teoria de la computabilidad

20 CAPÍTULO 1. PRELIMINARES

Definición 1.21 Definimos una función / como un subconjunto de pares orde-nados (x, y) de D x R, donde D se denomina el dominio, u origen, de f y Rel rango, o imagen, de f , tal que cumplen la propiedad de que un elemento delconjunto origen no puede tener dos imágenes:

Se suele denotar una función f con dominio D y rango R como

En la notación usual para funciones, decimos que f ( x ) — y para significar que( x , y ) € f .

De aquí en adelante restringiremos las funciones que estudiemos a aquellas enlas que el dominio y el rango es el conjunto de números naturales (/ : N -> N).Esto no limita el alcance de los resultados que obtengamos, ya que, mediante unacodificación adecuada, es posible expresar cualquier función definida sobre objetosarbitrarios como una función sobre naturales. Veremos más adelante ejemplos detales codificaciones.

Ejemplo 1.10

Como ejemplo de función, podemos considerar / como el conjunto de paresordenados ( x , x2) para x £ N. En esta función para cada x E ./V, f ( x ) = x2.

En general manejaremos también funciones definidas sobre más de una varia-ble, (/ : TV x N x . . . TV —> N] denotándolas por /(ni , . . . , n¿). Estas funciones sedicen que son fc-arias. Como notación particular, las funciones I-arias y 2-arias sedenominan uñarías y binarias. En ciertas partes del libro utilizaremos la notaciónf^ para hacer ver que la función / es fc-aria.

Definición 1.22 Si el dominio de f es D y escogemos un x E D tal que (#, /(#)) £/, decimos que f ( x ) está definido, y escribimos f ( x ) =|. Para todos los x G Dtal que ( x , f ( x ) ) £ / decimos que f ( x ) no está definido, y escribimos f ( x ) =t-

Definición 1.23 Decimos que una función es parcial, cuando no está definidapara algunos valores de D, esto es, no está definida para ciertos elementos de sudominio.

Page 22: Introduccion a la teoria de la computabilidad

1.4. PREDICADOS 21

Ejemplo 1.11

Un ejemplo de una función parcial es la función f ( x ) = ^/x, definida para elconjunto de cuadrados perfectos, pero no definida para el resto (recordemos quelas funciones que manejamos son de N en TV).

En el caso de f ( x ) = >/#,

Definición 1.24 Denominamos función total, a una función definida para todoslos valores de D.

Cuando hablemos de funciones, en general, no estaremos especificando si sonparciales o totales y los enunciados que realicemos serán aplicables a ambas. Lasdefiniciones anteriores son fácilmente aplicables a funciones fc-arias.

Podemos definir los siguientes tipos de funciones.

Definición 1.25 Decimos que una función f : D —)• R es inyectiva cuandono existen valores del dominio que tengan imágenes repetidas, esto es, para todapareja de valores x,y G D, f ( x ) — f(y) implica que x = y.

Decimos que una función / es suprayectiva cuando para todo y E R existe unx tal que f ( x ) = y.

Por ultimo, decimos que una función es biyectiva cuando es inyectiva y suprayec-tiva.

Ejemplo 1.12

La función f ( x ) = x mod 7, donde a cada número x le corresponde el restode su división por 7 no es inyectiva, ya que, por ejemplo, /(10) = /(24) = 3.

La función f ( x ) = x2 es inyectiva, pero no es suprayectiva, ya que, por ejemplo,el 5 no es la imagen de ningún x.

La función f(x) — x es biyectiva.

1.4. Predicados

Definición 1.26 Definimos como predicado sobre un conjunto S a una funcióntotal P : 5 —> {0,1}; de forma que para cada a E S, o bien

Page 23: Introduccion a la teoria de la computabilidad

22 CAPÍTULO 1. PRELIMINARES

P(a) = 1 o P(a) = O,

donde 1 y O se definen como valores de verdad, y equivalen a VERDADERO ya FALSO, respectivamente. Normalmente, se dirá que el número a satisface Pcuando P(a) — 1 y que a no satisface P cuando P(a) = 0.

De esta forma, un predicado es una clase especial de funciones con valores sobre{0,1}. Normalmente el conjunto S al que se refiere la definición también será N.Utilizaremos las letras mayúsculas P, Q, R para denotar predicados genéricos.

Ejemplo 1.13

Como ejemplos de predicados, podemos citar los siguientes

x < 5, definido por la función

Par (o;), definido por la función

Definición 1.27 Dados una pareja de predicados P, Q, definimos las operacionesbásicas sobre ellos: negación, disyunción y conjunción, denotadas por ->P, P V Qy P A Q según la siguiente tabla de verdad

P II -P \\P\\Qi0

0i

ii00

1010

P V Q ||_P A Q

1110

1000

Ejemplo 1.14

Podemos utilizar los predicados vistos en el ejemplo anterior para construirnuevos predicados:

Menorlgual5(x) =1 si x = 0,1, 2, 3,4, 5O en otro caso

Par(z) =1 si existe t/ G -/V tal que x — 2yO en otro caso

Page 24: Introduccion a la teoria de la computabilidad

Comentábamos anteriormente la importancia de poder caracterizar formal-mente conjuntos infinitos, de forma que: a) dado un número, podamos decidirsi pertenece al conjunto y b) podamos listar aquellos números naturales quepertenecen al mismo. Las siguientes definiciones remarcan el papel de los predi-cados en la caracterización de conjuntos.

Definición 1.28 Decimos que el predicado P es la función característica del con-junto R, cuando R es el conjunto de todos los naturales para los cuales P(a) = 1.Escribiremos que

Ejemplo 1.15

El predicado Par (o?) es la función característica del conjunto PARES.

Definición 1.29 De forma contraria, dado un predicado P, diremos que R es elconjunto asociado a P, si R es el conjunto de aquellos naturales para los que elpredicado P es cierto.

Ejemplo 1.16

El conjunto PARES es el conjunto asociado al predicado Par(x).

-< Menor Igual5(:c) = 0 si x = 0,1,2,3,4,51 en otro caso

Menorlgual5(^) A Par(x) =1 si z = 2,4O en otro caso

Menorlgual5(rc) V Par(x) =1 si existe y G N tal que x = 2y o x = O,1,3, 5O en otro caso

P(x) =1 si x € RO en otro caso

R = {x£N\ P(x}}

1.4. PREDICADOS 23

Page 25: Introduccion a la teoria de la computabilidad

24 CAPÍTULO 1. PRELIMINARES

1.5. Alfabetos, cadenas y lenguajes

Alfabetos, cadenas y lenguajes son algunos de los objetos esenciales sobre losque, históricamente, se construye la teoría de la computabilidad. Esto es debidoa que son los objetos con los que trabajan gramáticas y máquinas de Turing. Sinembargo, siempre será posible utilizar números naturales y conjuntos de naturalesen su lugar, ya que es muy sencilla la conversión de cadenas en números naturalesy viceversa.

Definición 1.30 Definimos un alfabeto E, como un conjunto finito de objetosllamados símbolos.

Normalmente utilizaremos como símbolos de alfabetos las letras a, 6, c , . . . losdígitos 0,1,2,. . . 9 y algún símbolo especial como $ o #. Cuando sea necesarioutilizar un alfabeto con número n indefinido de símbolos, utilizaremos los símbolos«1,^2, • • • ian-

Definición 1.31 Denominaremos cadena o palabra a una n-tupla de símbolos deE.

En lugar de escribir (x\, #2, • • • , xn) escribiremos simplemente x\x^ ... xn. Lalongitud de la palabra u = x\x<¿ ... xn es n, y se denota como |w| = n. Existeuna palabra de longitud O, que denominaremos A y llamaremos cadena vacía.Normalmente utilizaremos las letras w, v, u>, x,y,z y las letras griegas a, /3,7,...para denotar palabras.

A diferencia de los conjuntos, no distinguiremos el símbolo a G S de la cadenade longitud 1 formada por ese símbolo.

Definición 1.32 Si u,v son dos cadenas del alfabeto S, denominamos concate-nación de u y v a la cadena de S formada por colocar la cadena v a continuaciónde u, y denominamos a esta cadena u • v o, simplemente, uv.

Ejemplo 1.17

Si S = {a, 6, c}, u — aabb y v = cbc, entonces

uv = aabbcbc y vu = cbcaabb.

Para cualquier u se cumple que

Page 26: Introduccion a la teoria de la computabilidad

1.5. ALFABETOS, CADENAS Y LENGUAJES 25

y que, para cualquier v,w adicional

u(vw) — (uv}w.

También se cumple que si uv = uw y vu — wu, entonces v = w.

Definición 1.33 Una cadena u es una subcadena de v si y sólo si existen doscadenas x, y tales que v = xuy.

Tanto x como y pueden ser A, por lo que un cadena es una subcadena de simisma.

Si únicamente x = A, decimos que u es un prefijo de v.Si únicamente y = A, se dice que u es un sufijo de v.

Ejemplo 1.18

La cadena aa es un prefijo de aaba y un sufijo de baa.

Definición 1.34 Definimos la exponenciación sobre cadenas. Si u es una cadena,denotamos por un, donde n£Nyn>Qala cadena obtenida por concatenar nveces la cadena u consigo misma, esto es,

Si n = O entonces un — A.

Definición 1.35 Otra operación sobre cadenas es la inversión, denotada por UR.Podemos obtener el inverso de una cadena u, UR, escribiendo u en sentido inverso;esto es, si u = aia>¿ ... an, entonces UR = an ... a^ai. Se cumple que \R = A yque, para toda cadena de E, (uv)R = VRUR. Denominamos palíndromos a aquellascadenas que cumplen que u = UR.

Ejemplo 1.19

Son palíndromos las cadenas 00100, 101 y O, definidas sobre el alfabeto {0,1}.

Definición 1.36 Un lenguaje sobre E o un lenguaje con alfabeto E es cualquierconjunto L de cadenas de E.

Page 27: Introduccion a la teoria de la computabilidad

26 CAPÍTULO 1.PRELIMINARES

Ejemplo 1.20

Dado £ = {0,1} podemos definir los siguientes lenguajes de S :

LI = {0,01,011,0111,...}

L2 = {01,0011,000111,...}

L3 = {10,11,101,111,1011,...}

donde LI es el conjunto de todas las cadenas que comienzan por O y tienen acontinuación O o más unos, L2 es el conjunto de las cadenas de forma Onln y, L%es el conjunto de los códigos binarios de números primos.

Uno de los problemas fundamentales en Teoría de la Computabilidad es laespecificación de lenguajes. Un lenguaje finito puede especificarse listando todassus cadenas. Veremos más adelante métodos para especificar lenguajes genéricos.

Al ser los lenguajes conjuntos, podemos aplicar operaciones booleanas a loslenguajes.

Definición 1.37 Sean LI y L2 dos lenguajes cualesquiera. Denotamos su unióncomo LI U L2, su intersección como LI fl L2 y su diferencia como LI — L2.

La concatenación de dos lenguajes se define como la concatenación de todaslas palabras que pertenecen a ellos.

Definimos, por último, la cerradura estrella y la cerradura.

Definición 1.38 Dado un lenguaje L, denominamos cerradura estrella de L (yse denota por L*) al conjunto de todas las cadenas que se pueden formar conca-tenando cadenas de L con otras cadenas de L un número finito de veces

y denominamos cerradura positiva de L (y se denota por L+) al conjunto

Utilizando esta operación, £*, es el conjunto de todas las palabras posiblesgenerables con el alfabeto E, incluyendo la cadena vacía. Y E+ denota al conjuntode todas las cadenas no vacías

Page 28: Introduccion a la teoria de la computabilidad

1.6. MÉTODOS DE DEMOSTRACIÓN 27

Ejemplo 1.21

Por ejemplo, supongamos que L — {a}, entonces

Si S ={a,b}, entonces

1.6. Métodos de demostración

Uno de los elementos propios de las matemáticas es su rigor. La corrección delas proposiciones que se realizan, que son llamadas teoremas (y también corola-rios y lemas) deben ser demostradas de forma general. La necesidad de utilizardemostraciones rigurosas aparecerá clara en el siguiente ejemplo.

Consideremos la proposición

n2 — n + 41 es primo para todo n E N.

Para comprobar si la proposición es cierta o falsa, deberíamos comprobarlapara todo número natural. No vale probar para unos pocos números naturales.De hecho, la expresión es falsa, pero es verdadera para los valores n < 40. Lastécnicas de demostración pretenden resolver estos problemas y permitir comprobaraserciones que afectan a un número infinito de objetos.

En una demostración se parte de una proposición cuya corrección es admitidapor todos (que se denomina formalmente un axioma) y, mediante la aplicación deun conjunto de reglas de inferencia válidas se llega a la proposición que se quieredemostrar. La rama de las matemáticas que se ocupa de estudiar los sistemasformales de demostración es la Lógica. Al no ser este un texto sobre lógica, novamos a ser demasiados estrictos en la aplicación de estos sistemas formales, sinoque vamos a tratar de guardar un equilibro entre la claridad y el rigor en lasdemostraciones.

Repasaremos en este apartado los métodos de demostración que van a ser másusados en el resto del libro, a saber, el método de la reducción al absurdo y elmétodo de la inducción.

1.6.1. Reducción al absurdo

Comencemos con el método de la reducción al absurdo. En este método sesupone que la proposición que se intenta demostrar como verdadera es falsa.

Page 29: Introduccion a la teoria de la computabilidad

28 CAPÍTULO 1. PRELIMINARES

Entonces utilizamos su negación como punto de partida de una derivación deproposiciones que deben dar lugar a una contradicción. En su forma más sencilla,una contradicción es una pareja de proposiciones una de las cuales es la negaciónde la otra. Ya que ambas proposiciones no pueden ser ciertas, se demuestra en-tonces que el punto de partida de la derivación es falso, por lo que la proposiciónque queremos demostrar es cierta.

Para explicar mejor el método veamos un ejemplo.

Teorema 1.1 Sea x € {a, b}* una cadena que cumple que xa = ax. Entoncesx = an, siendo n E N.

DemostraciónSiguiendo el método de reducción al absurdo, negamos la proposición e inten-

tamos derivar una contradicción a partir de ella. Esto es, suponemos que xa — ax,pero x contiene la letra 6. Supongamos que el símbolo b aparece en x en la posicióni. Entonces podemos expresar x como al~lbw, siendo w una cadena cualquiera.Si la cadena x cumple el teorema, debe cumplir que

a(al~lbw] ~ (al~lbw}a,

albw = a1 lbwa.

O sea,

abw — bwa,

lo cual es una contradicción, ya que una cadena no puede comenzar tanto por acomo por b. Y esta contradicción demuestra el teorema.

1.6.2. Demostración por inducción

La técnica de la demostración por inducción se utiliza para los casos en losque una determinada proposición P, que depende de n, es cierta para todo valorfinito de n. Los pasos a seguir para aplicar la técnica son los siguientes:

1. Caso base. Debemos demostrar que P es cierto para n — 0.

2. Hipótesis de inducción. Suponemos que la proposición P es cierta paran = 1 , . . . , / ? .

esto es,

Page 30: Introduccion a la teoria de la computabilidad

1.6. MÉTODOS DE DEMOSTRACIÓN 29

3. Paso de inducción. Usando la hipótesis de inducción, debemos de demostrarque P es cierta para n = k + 1.

Un ejemplo de utilización de la inducción es el siguiente teorema

Teorema 1.2 Para todo n E N se cumple que

DemostraciónCaso base. El caso base, n = O, se demuestra trivialmente, ya que la proposi-

ción establece simplemente que 1 = I2.Hipótesis de inducción. Supongamos entonces que el resultado se cumple para

n = k. O sea, que

Paso de inducción. Entonces debemos demostrar que, suponiendo cierta laexpresión anterior, la ecuación se satisface para n — k + 1

que es el resultado al que deseábamos llegar para k + 1.

Otro ejemplo es la siguiente proposición.

Teorema 1.3 Para cualquier conjunto S se cumple que \P(S)\ = 2'5L

DemostraciónCaso base. Si \S\ = O entonces S = 0. En este caso, P(0) = {0}, cuyo cardinal

es 1. Lo cual es consistente con la proposición, ya que 2° = 1.Hipótesis de inducción. Suponemos que la proposición es cierta para |5| < &.

Estoes, que |P(5)| =2 l 5 LPaso de inducción. Sea 5 cuyo cardinal es k + 1. Al ser |5| > 1, podemos

afirmar que 5 = TU{SI}, siendo si algún elemento del conjunto 5 y T el conjuntoS— {si}. El conjunto T cumple la propiedad, ya que su cardinal es k. Así, podemosafirmar, utilizando la hipótesis de inducción, que |P(T)| = 2fc.

Page 31: Introduccion a la teoria de la computabilidad

30 CAPÍTULO 1. PRELIMINARES

También podemos asegurar que el conjunto potencia de S puede dividirse endos subcolecciones con el mismo número de elementos: la colección de aquellosconjuntos de P(S) que no contienen el elemento si y la colección de aquellos quesí que lo contienen. El primero de ellos es P(T), y el segundo es precisamente elresultado de añadir s\ a cada uno de los conjuntos de P(T). Formalmente,

1.7. Codificación

En capítulos siguientes vamos a necesitar codificar elementos de un determi-nado conjunto en elementos de otro conjunto. Por ejemplo, veremos que es posiblecodificar programas definidos en un determinado lenguaje mediante números na-turales , o que es posible codificar como un número natural cualquier tupia denaturales de cualquier longitud.

Definición 1.39 Decimos que codificamos un conjunto Si mediante un conjunto82 cuando podemos definir una función codificadora, / : 5i —>• 82, y una funcióndecodificadora, g : 82 —>• Si, tal que para todo x £ Si se cumple que g(f(x)) = x.Para ello, f y g deben cumplir las siguientes propiedades:

1. Ambas funciones son inyectivas, esto es, para un elemento x de Si sóloexiste un elemento y de 82 tal que f ( x ) — y, y para un elemento y de 82sólo existe un elemento x de Si tal que g(y) = x.

2. Además, la función f debe ser total, esto es, debe estar definida para todoelemento de S\.

1.7.1. Codificación de pares de números

Veamos, por ejemplo, cómo codificar pares de números naturales, N x TV,mediante números naturales. Esto es, queremos encontrar una forma de asignara cada par de números naturales (a, 6) un número c de forma que se cumplan lascondiciones anteriores.

Por ejemplo, una función que no serviría como función que codifica estos paresde números naturales sería la siguiente

De esta forma, y ya que se cumple que

Page 32: Introduccion a la teoria de la computabilidad

1.7. CODIFICACIÓN 31

/(o, 6) = 0 + 6,

ya que, según esta función codificadora, los pares (1,2) y (2,1) (y, por extensión,cualquier par de tupias (0,6), (6,0)) tendrían la misma codificación.

Definición 1.40 Definimos la función codificación de pares de números de lasiguiente forma

/(o, 6) =< (o, 6) >=< o, 6 >= 2°(26 + !)-!.

Ejemplo 1.22

La codificación del par (3,2) sería

<3 ,2 >=2 3 (2- 2 + 1) -1 = 39.

La función < a, b > es biyectiva, ya que para pares de números distintosse obtienen códigos distintos y, además, no existe ningún natural que no sea lacodificación de un par de números. Una justificación informal de esta biyecciónpuede verse en la figura 1.1.

En la tabla a) aparece la función 2°(26 + 1) (esto es, < a, b > -fl) y sepuede comprobar con ella cómo se construye la función codificadora. Para a = O,cuando b toma los valores desde O en adelante, la función codificadora devuelvelos números impares. Para a = 1 en adelante, el resultado de la función se obtienemultiplicando por 2 la fila anterior. Por ejemplo, la fila de a = 3 (8,24,40,56,72,...)se obtiene multiplicando por 2 la fila correspondiente a a = 2 (4,12,20,28,36,...).

De esta forma justificamos que la codificación de pares de números distintosda lugar a códigos también distintos.

En la tabla b) se representa otra forma de entender la función. En cada filase ha recuadrado los números escogidos para codificar los pares (O, 6),(1, 6),(2,6)y (3,6). En la primera fila se observa que se escogen números alternativos paracodificar los pares (O, 6) con b desde O en adelante. En la segunda fila aparecen losnúmeros no usados en la primera (los números pares) y se comprueba que vuelvena escogerse de forma alternativa los códigos que codifican los pares (1,6). Laoperación se repite indefinidamente, de forma que se puede asegurar que cualquiernúmero natural corresponde a un código de un par de números.

Definición 1.41 Tenemos dos funciones decodificadoras que, a partir del númerox =< a, 6 > (el número x que codifica el par (a, b}) obtienen los números a y

Page 33: Introduccion a la teoria de la computabilidad

32 CAPÍTULO 1. PRELIMINARES

Figura 1.1: Función codificadora de pares de números.

b. Llamamos a estas funciones, respectivamente, l(x] y r(x), y las definimos acontinuación

Ejemplo 1.23

< a, 6 > +1

a0123

b

01248

1361224

25102040

37142856

49183672

Page 34: Introduccion a la teoria de la computabilidad

1.8. NUMERABILIDAD 33

1.8. Numerabilidad

Numerabilidad y computabilidad son conceptos muy relacionados. Veamos eneste apartado las nociones básicas sobre numerabilidad.

Definición 1.42 Se dice que un conjunto R es infinito numerable si es posibleestablecer una biyección entre R y los números naturales.

Ejemplo 1.24

El conjunto IMPARES es numerable, ya que la función

/(n) = 2n+l .

establece una biyección entre dicho conjunto y N.

La mayoría de las veces es difícil encontrar una formulación algebraica de labiyección que numera un determinado conjunto. La siguiente definición es equi-valente a la anterior, y es la que utilizaremos normalmente.

Definición 1.43 Un conjunto numerable es aquel cuyos elementos pueden sernumerados: dispuestos en una lista con una primera componente, una segundacomponente, etc., de forma que todos los elementos del conjunto aparezcan tardeo temprano en la lista.

Ejemplo 1.25

El conjunto N de los naturales se numera con la lista

¿ = (0,1,2,3,4, . . . )

y el conjunto IMPARES impares se puede numerar con la lista

¿ = (1,3,5,7, . . . )

R = { a1, a2, a3, ...}

N = { 1, 2, 3, ...}

Page 35: Introduccion a la teoria de la computabilidad

34 CAPÍTULO 1. PRELIMINARES

La definición de conjunto numerable mediante una lista es equivalente a la deconjunto numerable con una biyección. Esto es porque una lista infinita determinauna función que toma el conjunto de los naturales (posiciones de los elementos enla lista) como argumentos y toma los elementos del conjunto como valores.

Ejemplo 1.26

La lista

£, = (1,3,5 ,7 , . . . )

que numera el conjunto de los naturales impares determina una función / en laque

Y, de forma contraria, también la función / determina la lista.

Puntualicemos sobre qué cosas pueden ser listas infinitas numerables y cuálesno.

1. Los números naturales pueden ser numerados por una lista infinita de laforma vista previamente, pero la siguiente lista no es una forma aceptablede numerar N

¿ = (1,3,5,7, . . . ,0,2,4, 6,8,. . .)

Aquí se listan primero todos los impares positivos y después todos los pares.Esto no es admisible. En una lista aceptable, cualquier elemento debe apare-cer tarde o temprano en el lugar n de la lista, para algún n finito. En la listaprevia, sin embargo, ninguno de los números pares aparece de esta forma,sino que están situados, por decir algo, en la posición oo + 1, oo + 2, etc.

2. Al numerar un conjunto listando sus elementos, está permitido que algunode estos elementos aparezca más de una vez en la lista. El requisito esque cada elemento aparezca al menos una vez. No importa si la lista esredundante; todo lo que se requiere es que sea completa. Claramente, unalista redundante se puede convertir en una no redundante. Para ello bastacon examinar cada posición, comparando el elemento con la lista finita deelementos que le precede y borrar el elemento si ya aparece en esa listafinita.

/(!) = !, /(2) = 3, /(3) = 5, /(4) = 7,

Page 36: Introduccion a la teoria de la computabilidad

1.8. NUMERABILIDAD 35

3. También es perfectamente correcto que la lista tenga huecos, ya que po-dríamos construir a partir de ésta otra lista que no los tuviera.

Ejemplo 1.27

Una lista que numeraría correctamente los naturales es

1, , ¿, , o, — , 4, , • • •

La función h definida por la lista asigna valores a los números 1,3, 5, . . .,pero no tiene ningún valor definido para 2 ,4 ,6 , . . . . La función h se diceque es una función parcial, esto es, está definida únicamente para algunosnaturales. Podríamos definirla como sigue

Ejemplo 1.28

Un ejemplo interesante de numerabilidad es la demostración de que el conjuntoN x N, que contiene todas las parejas de números naturales, es numerable.

Para demostrar que N x N es numerable construimos la siguiente lista infinitanumerable en donde se enumeran todos y cada uno de sus elementos:

L = ((0,0), (0,1), (1,0), (O, 2), (1,1), (2,0), (O, 3), (1,2), (2,1), (3 ,0 ) , . . . ) .

La lista L se construye de la siguiente forma. Primero se enumeran las parejasde números ( i , j ) tales que i + j = O (únicamente la pareja (0,0)), a continuaciónlas parejas tales que i + j = l (las parejas (0,1) y (1,0)), después las parejas talesque i + j = 2 (las parejas (O, 2), (1,1) y (2,0)), y así sucesivamente.

Es fácil argumentar que cualquier pareja (¿,j) estará en una posición finita dela lista, ya que los números de esta pareja sumarán una cantidad finita i + j = k,con lo que la pareja se encontrará enumerada en el grupo de parejas de númerosque suman k. Ya que se cumple que para cualquier m el número de parejas denúmeros que suman m es un número finito, también lo será el conjunto de losk — 1 grupos que existen antes de llegar al grupo de la pareja (¿,j).

Otra posible lista que enumera las parejas de números es

L = ( ( / ( 0 ) , r ( 0 ) ) , ( Z ( l ) , r ( l ) ) , ( / ( 2 ) , r ( 2 ) ) , . . . ) ,

h(n) =indefinido en otro caso

si n es impar

Page 37: Introduccion a la teoria de la computabilidad

36 CAPÍTULO 1. PRELIMINARES

siendo las funciones l(x) y r(x) las funciones decodificadoras de parejas de númerosvistas anteriormente.

Por último, decir que no es necesario que el dominio de la biyección que numeraun conjunto sea N, ya que cualquier otro conjunto numerable también es válido.Por ejemplo, si hemos demostrado que el conjunto de los números racionales, Q, esun conjunto numerable, podemos demostrar que algún conjunto S es numerableencontrando una función s : Q — >• 5.

1.9. Diagonalización

No todos los conjuntos son numerables: algunos son demasiado grandes. Unejemplo de estos conjunto es el conjunto de partes de A/", P(N), el conjunto detodos los posibles conjuntos de números naturales.

P(N) = {0, N, PARES, IMPARES, {0, 1, 2, 3, 4}, . . .}

El matemático alemán Georg Cantor demostró que P(N) no era numerablemediante un método, conocido como método de la diagonal o de diagonalización,que ha sido aplicado, posteriormente, como técnica general de demostración aotros problemas similares.

Este método se puede aplicar, en general, a cualquier conjunto R no numerable,para demostrar su no numerabilidad. Consiste en una reducción al absurdo sobrela afirmación de que R es numerable:

1. Para empezar, supongamos que R es numerable. Por ello, es posible definirla lista en la que se numeran sus elementos

L= (n,r2 , r3 , . . . )

2. Ahora debemos (y ésta es la parte más complicada de la diagonalización) ,basándonos en la ordenación impuesta en R por esta supuesta lista, definirun elemento, al que llamaremos r*, que pertenezca al conjunto R pero quesea distinto de todos y cada uno de los elementos de la lista

Esto genera una contradicción, ya que se supone que en L se numeran todoslos elementos de R y hemos encontrado un elemento r* que, perteneciendoa R, no se encuentra en ninguna posición de la lista.

Page 38: Introduccion a la teoria de la computabilidad

1.9. DIAGONALIZACIÓN 37

Vamos a aplicar este método a la demostración de que P(N] no es numerable.

Teorema 1.4 El conjunto P(N] no es numerable.

DemostraciónSupongamos que el conjunto P(N] es numerable, y que existe una lista

L = (5i,52,...)

que lo numera. No nos importa el orden en el que los conjuntos 5¿ aparezcan en lalista, ya que la demostración que sigue a continuación es independiente de dichoorden. Supongamos, como ejemplo, que

5i = PARES, 52 = IMPARES, S3 = {3,4,5}, ...

A partir de la lista L construimos un conjunto 5*, definido de la siguienteforma: para cada número natural n, n pertenece a 5* si y solo si n no pertenecea <bn.

La composición de 5* depende de la composición de la lista L, por lo que di-ferentes listas producirán diferentes conjuntos 5*, pero esto no es relevante parala demostración. En el caso de la lista anterior, por ejemplo, el número 1 sí quepertenecería a 5*, ya que 1 ̂ 5i, el número 2 también pertenecería a 5*, ya que2 ^ 62, pero el número 3 no pertenecería a S* porque 3 E S$.

Al definir de esta forma 5* hemos conseguido que sea distinto de todos y cadauno de los subconjuntos de L, ya que, como mínimo, tendrá un elemento distintode cada uno de ellos. Para demostrar formalmente que el conjunto S* no formaparte de L realizaremos otra reducción al absurdo.

Supongamos que S* pertenece a L en la posición m-ésima, por lo que 5* sepuede identificar con el conjunto Sm de L. Veamos, entonces, si el natural rapertenece a 5*. Por definición de 5*,

pero es entonces cuando nos encontramos con la contradicción: como S* es elconjunto ra—ésimo (Sm), entonces,

o sea, dicho número debe pertenecer y no pertenecer a la vez a S*. Esto es unacontradicción, por lo que la suposición de la que hemos partido debe ser falsa, estoes, 5* no puede pertenecer a L. Pero sin embargo 5* es un conjunto bien definidode números naturales, por lo que pertenece a -P(AT), con lo que la suposición inicialde que L lista todos los elementos de P(N) es falsa.

Page 39: Introduccion a la teoria de la computabilidad

38 CAPÍTULO 1.PRELIMINARES

1.10. Problemas

1. Determinar si las siguientes expresiones son verdaderas falsas:

2. Calcular las siguientes expresiones:

3. Contestar las siguientes preguntas:

a) Existe algún conjunto A tal que | P(A) |= 48?

b) Si A = {a}. Quién es P(P(A))7

4. Demostrar, utilizando el método de inducción, que para todo número naturaln > 1 se verifica que:

5. Un palíndromo puede definirse como una cadena que se lee igual hacia de-lante y hacia atrás, o si y sólo si cumple las siguientes propiedades:Pl: A es palíndroma.P2: Si a| = 1 entonces a es palíndromo.P3: Si a es cualquier símbolo y a es palíndroma, entonces aaa es palíndro-ma.Demostrar por inducción que las dos definiciones son equivalentes.

6. Demostrar que el conjunto Z de todos los enteros: . . . — 2, —1, O, 1, 2 , . . . ,es numerable. Hacerlo de las dos formas siguientes:

Page 40: Introduccion a la teoria de la computabilidad

1.10. PROBLEMAS 39

a) Encontrando una disposición de todos los números de Z en una listaaceptable.

6) Definiendo una función, expresada de forma matemática, de Z+ =N - {0} en Z.

7. Demostrar que el conjunto de los números racionales positivos Q+ es nume-rable. Hacerlo de las dos formas vistas en el ejercicio anterior.

8. Demostrar que el conjunto de todos los números racionales (positivos, ne-gativos y cero) es numerable. Probarlo, igualmente, de las dos formas vistasen el ejercicio anterior. (Para el apartado (b), utilizar el conjunto Z, que yase ha demostrado que es numerable).

9. Demostrar que el conjunto de todas las cadenas finitas formadas con lossímbolos + y — es numerable describiendo una lista que las enumere.

10. Demostrar que el conjunto de todos los conjuntos finitos de números natu-rales es numerable, describiendo una forma en la que las cadenas finitas de+ y — puedan codificar esos conjuntos.

11. Demostrar que los siguientes conjuntos son numerables: (sobre un alfabetoinfinito numerable A — {ai, a<2,03,04, • • •} ).

a) L2: Conjunto de las palabras de dos letras.

6) L3: Conjunto de las palabras de tres letras.

c] Ln: Conjunto de las palabras de n letras, para un n fijo arbitrario.

d) L*: Conjunto de todas las palabras de cualquier longitud finita (L* =^ U L ^ Í ^ U - - - ) .

12. Demostrar que la unión numerable de infinitos conjuntos numerables es nu-merable.

13. Para las siguientes listas (infinitas) de conjuntos, hallar5* = {n | n <£ Sn}:

a] 5i = {1,2}, 52 = {2,3}, S3 = {3,4}, 54 = {4,5}, 55 = {5,6},...

b] Si = {2}, S2 = {3}, 53 = {4}, 54 - {5}, S5 = {6},...

c) Si = {2}, S2 = {3}, S3 = {3,4}, 54 = {4, 5}, 55 = {5, 6},...

d) Si = 0, 52 = {2}, S3 = 0, 54 = {4}, S5 = 0, 56 = {6}, . . .

Page 41: Introduccion a la teoria de la computabilidad

40 CAPÍTULO 1.PRELIMINARES

14. Dada una lista L de conjuntos: Si, 6*2, 63,... , definíamos el conjunto 5* dela forma siguiente:

a) Construir una lista con todos los conjuntos finitos de números natura-les, incluyendo el conjunto 0.

b) Para esta lista, ¿Qué conjunto es el que define 5*?

c] ¿Pertenece S* a L?.

d] ¿Qué conjunto es el definido por 5* = {n \ n 6 5n}?

15. Utilizando el argumento de la diagonal, demostrar que el producto carte-siano infinito de conjuntos infinitos numerables no es numerable.

16. Utilizando el argumento de la diagonal, demostrar que el conjunto de númerosreales en el intervalo (0,1) no es numerable.

17. Demostrar, utilizando el argumento de la diagonal, que el conjunto de todaslas funciones totales con dominio y rango en los naturales no es numerable.

18. Demostrar que el conjunto de todas las aplicaciones (funciones totales) deN en {0,1} no es numerable.

Page 42: Introduccion a la teoria de la computabilidad

Capítulo 2

Máquinas de Turing

2.1. Introducción

En 1900 el matemático inglés David Hilbert presentó en el Congreso Interna-cional de Matemáticas de París el problema de la decisión; planteaba si podríaexistir un algoritmo para determinar si una fórmula lógica podía o no satisfa-cerse, o declararse verdadera. La solución de este problema llevó a la comunidadmatemática directamente al problema fundamental de la Teoría de la Computa-bilidad: ¿qué se entiende por algoritmo?.

Hasta entonces, el concepto de algoritmo se había dado por descontado, nadiese había preocupado de darle una definición formal. En respuesta a este problema,el matemático inglés Alan M. Turing propone en 1936 una formalización del con-cepto general de computación (algoritmo), mediante una máquina consistente enuna cinta de longitud ilimitada dividida en celdas, y un dispositivo de lectura conun número finito de estados, en lo que se ha denominado Máquina de Turing(MT).A lo largo del capítulo se revisará este modelo.

Actualmente la MT se acepta como una correcta formalización del conceptode algoritmo. No se puede demostrar que el concepto de MT es equivalente alconcepto intuitivo de algoritmo pero existen muchos argumentos de peso que nospermiten realizar dicha afirmación (Tesis de Church-Turing). Entre ellos, el másimportante es que la MT ha resultado tener la misma capacidad computacional(puede reconocer los mismos lenguajes o computar las mismas funciones) quecualquier otro modelo formal de algoritmo (lambda-cálculo, sistema de reescriturade Post, funciones recursivas, etc.). En este texto veremos otros dos modeloscomputacionales, las funciones recursivas (capítulo 4) y el lenguaje L (capítulo3). En el capítulo 5 demostraremos que todos estos modelos son equivalentes.

Aquí estudiaremos principalmente el modelo de MT desde el punto de vistade definición de lenguajes de cadenas y al final del capítulo veremos, brevemente,cómo es posible utilizar la MT para computar funciones.

Page 43: Introduccion a la teoria de la computabilidad

42 CAPÍTULO 2. MÁQUINAS DE TURING

2.2. El problema de definir un lenguaje

Veíamos en el capítulo de preliminares la definición del concepto de lenguajede cadenas y la posibilidad de que dichos lenguajes sean infinitos. Presentábamoslos siguientes ejemplos de lenguajes infinitos sobre el alfabeto £ = {0,1}.

LI = {0,01,011,0111,...}

L2 = {01,0011,000111,...}

L3 = {10,11,101,111,1011,...}

donde LI es el conjunto de todas las cadenas que comienzan por O y tienen acontinuación O o más unos, 1/2 es el conjunto de las cadenas de forma Onln y, Z/ses el conjunto de los códigos binarios de números primos.

Comencemos por una cuestión léxica. La expresión definir un lenguaje, queestamos usando en este apartado, no es muy común en la informática teórica. Ensu lugar se utiliza la expresión reconocer un lenguaje, debido a que los formalis-mos usados son normalmente autómatas que terminan en un estado de aceptacióncuando la cadena que están reconociendo pertenece al lenguaje (veremos que laMT funciona igual). Nosotros utilizaremos ambas expresiones de forma intercam-biable.

¿Cómo definir formalmente estos lenguajes (y cualquier otro que se nos puedaocurrir)? ¿Tienen todos los métodos formales de definición de lenguajes la mismapotencia, o algunos métodos pueden definir lenguajes imposibles de definir conotros? ¿Es posible definir todos los lenguajes existentes sobre un alfabeto, o e-xisten lenguajes que no pueden ser definidos por ningún método formal? Las dosprimeras preguntas se contestan desde el campo denominado Teoría de Lenguajesy Autómatas, y, aunque no es materia de este libro, veremos en este apartado unapequeña colección de conceptos relacionados con el asunto. La contestación de latercera pregunta es materia de la Teoría de la Computabilidad, y sobre ella enconcreto trata la última parte del libro.

2.2.1. Expresiones regulares

Veamos como ejemplo de método formal de definición de lenguajes infinitos lanotación de expresiones regulares, una de las notaciones más sencillas.

Comencemos denotando por 1) a al lenguaje formado por el símbolo a ({a}),2) a + b al lenguaje {a} U {&}, 3) ab al lenguaje {a&}, 4) a* al lenguaje {a}*({A, o, aa, aaa,...}) y 5) a+ al lenguaje {a}+ ({a, aa, aaa,...}).

Definimos el orden de precedencia como: * primero, la concatenación el si-guiente y + el último.

Definición 2.1 Una expresión regular sobre un alfabeto S se define de formarecursiva con las siguientes reglas:

Page 44: Introduccion a la teoria de la computabilidad

2.3. EL MODELO CONCEPTUAL DE MÁQUINA DE TURING 43

1. 0 y A son expresiones regulares.

2. a es una expresión regular para todo a E S.

3. Si r y s son expresiones regulares, entonces r + s, rs y r* también lo son.

Ejemplo 2.1

Por ejemplo, utilizando la notación de expresiones regulares, ya es posibledefinir formalmente el conjunto L\ = {0,01,011,0111,...} como 01*.

Otros ejemplos de lenguajes definidos por expresiones regulares son los si-guientes

0+ + 1+ = {0,1,00,11,000,111,...}

(01)* = {A, 01,0101,010101,...}

0*1* = {A, 0,1,00, 01,11,000,001,...}

¿Qué potencia computacional tiene la notación de las expresiones regulares?Salta a la vista que poca, ya que existen lenguajes bastante sencillos de serdefinidos informalmente, pero que no se pueden formalizar con esa notación. Unejemplo sería el lenguaje L>¿ = Onln de cadenas que tienen igual número de Os alcomienzo que de Is al final.

Se demuestra, aunque queda fuera del alcance del texto, que la MT sí quepuede definir ese lenguaje en concreto y, en general, cualquier otro lenguajedefinible por cualquier otro formalismo propuesto hasta el momento. Es por elloque la tesis de Church-Turing sostiene que la MT modela formalmente el conceptointuitivo de algoritmo.

2.3. El modelo conceptual de Máquina de Turing

Un modelo formal que caracterice el concepto de algoritmo debe cumplir,básicamente, dos propiedades:

ha de tener una descripción finita, y

debe estar formado por operaciones discretas, cada una de las cuales puedaser ejecutada mecánicamente .

Ya que la MT es capaz de reconocer cualquier lenguaje reconocible por unalgoritmo, debe cumplir estas propiedades genéricas.

Page 45: Introduccion a la teoria de la computabilidad

44 CAPÍTULO 2. MÁQUINAS DE TURING

2.3.1. Funcionamiento de una MT

A continuación se expone una variante del modelo teórico propuesto por Tu-ring. Este modelo estará formado por una cinta de entrada y de trabajo divididaen celdas, una cabeza de lectura/escritura, y una unidad de control finita (unidadde ejecución).

La cinta es infinita por ambos extremos, conteniendo un número infinito nu-merable de celdas. Cada celda contiene un único símbolo1 perteneciente a unalfabeto, denominado alfabeto de la cinta.

Por defecto, todas las cintas contienen un símbolo especial (B), denominadocarácter blanco, que marca las celdas que no contienen símbolos de la cadena deentrada. Los datos de entrada (símbolos distintos de B) ocupan n celdas, siendosiempre n > O finito. El cabezal de lectura/escritura se posiciona en la primeracinta distinta de B, y recorre la cinta, pasando por las celdas de una en una yaccediendo al contenido de las mismas.

Dependiendo del estado actual y del símbolo leído por el cabezal, la MT:

1. Cambia de estado.

2. Imprime un símbolo sobre la celda leída, que reemplaza al que se había leído.

3. Desplaza el cabezal de lectura/escritura a la derecha o a la izquierda de laposición actual.

Figura 2.1: Estructura básica de una MT.

Esta secuencia de acciones componen lo que se denomina paso de ejecucióno movimiento. La MT continúa realizando pasos de ejecución hasta que lee unsímbolo para el que no hay definida ninguna acción. Puede darse el caso de quela MT no se detenga nunca, entrando en una especie de "bucle infinito".

1Se hablará indistintamente de símbolo o carácter para referirse a los elementos de un alfa-beto.

Page 46: Introduccion a la teoria de la computabilidad

2.3. EL MODELO CONCEPTUAL DE MÁQUINA DE TURING 45

2.3.2. Representación de una MT

Existen diversas formas de representar una MT. Como ejemplo vamos a utilizaruna MT diseñada para reconocer el lenguaje L = {On | n es impar}. Este lenguajeno es complicado, de hecho podría reconocerse con una expresión regular (0(00)*),pero puede valer como primer ejemplo.

• Representación de una MT mediante una tabla que define la función detransición.

La tabla tiene las columnas encabezadas por el símbolo leído por el cabezal,y las filas por el estado en que se encuentra la máquina. Las componentes dela tabla representan la operación a realizar: estado al que pasa la máquina,símbolo a escribir y movimiento del cabezal (I=izquierda y D—derecha). Porejemplo, si la máquina se encuentra en el estado qi leyendo un O, pasará alestado ¿70, escribirá un O y moverá el cabezal a la derecha.

El estado q<¿ es un estado final, o de aceptación.

Representación de una MT mediante un autómata.

En este caso, los círculos representan estados en los que se encuentra lamáquina, y las flechas cambios de estado cuando se lee un símbolo. Eti-quetando las flechas se encuentran el símbolo leído, el símbolo escrito y elmovimiento del cabezal.

Representación mediante un conjunto de tupias.

Donde cada tupia está formada por: estado actual, símbolo leído, símboloescrito, desplazamiento en la cinta y estado siguiente.

Veamos cómo la máquina acepta la cadena 000:

1. Inicialmente, el cabezal está posicionado en el primer O, y el estado inicial es<?o. Tras consultarse la función de transición, se comprueba que, estando en<7o leyendo un O, la máquina debe pasar al estado <?i, escribir un O y moverel cabezal a la derecha.

(9o,0,0,D,gi)(gi,0,0,J[>,9o)(qi,B,B,D,q2)

Estado4oqi

0

(9i,0,£>)too, o,0)

B

(<?2,£,£>)

Page 47: Introduccion a la teoria de la computabilidad

46 CAPÍTULO 2. MÁQUINAS DE TURING

2. Ahora la máquina se encuentra leyendo el segundo O de la cadena y en elestado q\. La función de transición hace que pase al estado <?o, escriba un Oy mueva el cabezal a la derecha.

3. La máquina lee el último O encontrándose en el estado QQ. Para el estado qoy el símbolo leído O hemos visto que la máquina pasa al estado gi, escribeun O y mueve el cabezal a la derecha.

4. Ahora la máquina está en q\ leyendo un blanco. En esa situación la máquinapasa a <?2 que es un estado final o de aceptación, para el que no hay definidaninguna acción.

2.3.3. Definición formal de una MT

Veamos más formalmente la definición de una MT.

Definición 2.2 Una MT se define como una tupia

donde

Q es el conjunto finito de estados de la unidad de control,

F es el conjunto finito de todos los símbolos permitidos sobre la cinta,

B es el símbolo que representa la celda vacía, B € F.

E es un subconjunto de F que no incluye el símbolo B, denominado alfabetode entrada.

S es la función próximo estado o función de transición, que no tiene porqueser total y que se define

qo es el estado inicial de la MT, q$ £ Q

F es el conjunto de estados finales, F C Q.

Definición 2.3 Denominamos descripción instantánea (DI) de una MT M auna cadena Oi-^qa^, donde q € Q es el estado actual de M y 0:10:2 es una cadenade F*. La cadena OL\ está formada por el contenido de la cinta desde el primersímbolo no-blanco más a la izquierda del cabezal hasta el símbolo anterior al queestá leyendo el cabezal. La cadena 0:2 está formada por el contenido de la cintadesde el cabezal hasta el último símbolo no-blanco más a su derecha.

Page 48: Introduccion a la teoria de la computabilidad

2.3. EL MODELO CONCEPTUAL DE MÁQUINA DE TURING 47

Hay que observar que la cadena 0:10:2 puede contener símbolos blancos B.Suponemos, para evitar confusiones, que F y Q son disjuntos.

Finalmente, se conviene que el cabezal, en esa configuración, está leyendo elprimer símbolo por la izquierda de 02, o un blanco si «2 = A.

Ejemplo 2.2

Por ejemplo, la DI correspondiente a la figura 2.2 sería 100.B<?il01.

Figura 2.2: Configuración ejemplo.

Definición 2.4 Definimos movimiento o paso de ejecución (PE) de una MTde la siguiente forma. Sea X\X<2 . . . Xi-\qXi . . . Xn una DI de la máquina M.Supongamos primero una transición con movimiento del cabezal hacia la izquierda6(q,Xi) = (p, Y, /). La DI resultante, después de sustituir el símbolo Xi por el Yy mover el cabezal a la izquierda será:

Para la otra opción, movimiento hacia la derecha, S(q,Xi) = (p,Y,D) el re-sultado será :

Ejemplo 2.3

Un paso de ejecución en la MT propuesta inicialmente, sería:

OO^oO HM OOOgí

XiX2 ... Xi_iqXi... X n \~M XiX% • • • Xi-zpXi-iYXi+i... Xn.

X\X<¿ ... Xi-iqXi... Xn hjvf XiX2 • • • Xi-iYpXi+i... Xn.

Page 49: Introduccion a la teoria de la computabilidad

48 CAPÍTULO 2. MÁQUINAS DE TURING

Cuando estamos en el estado <?o Y el símbolo leído de la cinta es un cero, im-primimos un cero en la cinta, desplazamos el cabezal hacia la derecha, y pasamosal estado q\.

Si dos DI están relacionadas mediante el operador \~M diremos que la segundaresulta de la primera mediante un movimiento o PE de la máquina M. Si unaDI resulta de otra mediante un número finito de PE, incluido el cero, diremos

*que están relacionadas mediante el símbolo (\~M)- Cuando no haya posibilidad deconfusión se suprimirá el subíndice M.

Supondremos que la MT siempre empieza en un estado inicial qo. Siempre quela MT alcance un qi E F diremos que ha terminado en un estado de aceptación,y si por el contrario se detiene en un estado <?¿ ^ F, diremos que ha terminado enun estado de no aceptación.

Definición 2.5 Decimos que una MT se encuentra en la configuración inicialcuando está en el estado QQ y los datos de entrada están alineados a la derechadel cabezal.

Ejemplo 2.4

La configuración inicial de la MT anterior, para la cadena de entrada 000, sería:

goOOO

Definición 2.6 Definimos el lenguaje aceptado por M, como L(M) y viene de-terminado por el conjunto de cadenas de S* que provocan que M llegue a unestado final cuando parte de la configuración inicial.

Formalmente, el lenguaje aceptado por M es:

Ejemplo 2.5

El lenguaje aceptado por la MT anterior, son todas las cadenas con un númeroimpar de ceros: L(M) = {On \ n es impar}

Page 50: Introduccion a la teoria de la computabilidad

2.3. EL MODELO CONCEPTUAL DE MÁQUINA DE TURING 49

Hay que hacer notar que siempre que una MT acepta una cadena de entradala máquina se detiene. Sin embargo, una cadena puede no ser aceptada por ésta,o bien porque se detiene en un estado que no es de aceptación, o bien porquela MT entra en un bucle infinito y no se detiene nunca. En este último caso nopodemos saber que la MT rechaza la cadena.

Ejemplo 2.6

Sea Q = {9o,9i,92,í3,í4};S = {0,1};T = {O, l,X,y,B}; F - {g4} y lafunción de transición viene dada por la siguiente tabla.

Estado

9o9i92

93

[g4~|

0 1 X Y( q i , X , D ) — — (q$,Y,D](gi,0,I>) (92, Y, /) — (91,^,7))(ft ,0,/) — (qo,X,D) fe, Y,/)

— — — (93, Y, D]— — — —

B———

(qi,B,D)—

La máquina de Turing anterior acepta el lenguaje L — {Onln n > 1}.

Una cadena de entrada aceptada por esta MT, podría ser la cadena 000111cuya secuencia de descripciones instantáneas es la siguiente:

Una cadena de entrada no aceptada por esta MT, podría ser la cadena Olí,cuya secuencia de descripciones instantáneas es la siguiente:

Esta cadena no es aceptada por la MT, ya que no existe ninguna transiciónpara el estado q$ cuando el símbolo leído es el 1, con lo que la MT se detiene,pero no en un estado final.

goOll h Xq^l h ^2^^1 H ^^o^l H ^"^93!

goOOOlll h XqiWlll h XOgiOlll h XWqilll h XQq2QYll h A^OOYll hgoOOOlll h XqiWlll h XOgiOlll h XWqilll h XQq2QYll h A^OOYll hgoOOOlll h XqiWlll h XOgiOlll h XWqilll h XQq2QYll h A^OOYll hgoOOOlll h XqiWlll h XOgiOlll h XWqilll h XQq2QYll h A^OOYll hgoOOOlll h XqiWlll h XOgiOlll h XWqilll h XQq2QYll h A^OOYll h

Page 51: Introduccion a la teoria de la computabilidad

50 CAPÍTULO 2. MÁQUINAS DE TURING

2.4. Equivalencia de modelos de MT

El modelo básico de MT puede complicarse, añadiéndole diferentes caracterís-ticas adicionales. Vamos a ver varios ejemplos y a comprobar que, en todos loscasos, el modelo resultante tiene la misma capacidad computacional que la MTbásica, esto es, es capaz de reconocer y definir exactamente los mismos lenguajes.

2.4.1. Máquina de Turing multipista

Definición 2.7 Una MT multipista es aquella en la que solamente existe uncabezal de lectura-escritura y una cinta de datos, que está dividida en k pistas,para cualquier valor k finito (ver figura 2.3).

Para esta MT la función de transición la definimos de la siguiente manera:

Figura 2.3: MT multipista, con 4 pistas.

La MT multipista lee una tupia de k símbolos, consulta la función de transicióny realiza la transición correspondiente: cambia de estado, escribe la nueva tupiade símbolos y mueve el cabezal.

Veamos con el siguiente teorema que la máquina así definida no es más potenteque la MT básica, esto es, que reconoce los mismos lenguajes.

Teorema 2.1 Un lenguaje L es aceptado por una MT multipista M sii L esaceptado por una MT básica M'.

Page 52: Introduccion a la teoria de la computabilidad

2.4. EQUIVALENCIA DE MODELOS DE MT 51

DemostraciónPara demostrar la equivalencia de dos modelos de MT partiremos de la MT

que estemos definiendo (a la que siempre llamaremos M) y daremos unas reglaspara, a partir de ella, construir una MT equivalente (a la que llamaremos M') quereconozca el mismo lenguaje. En este caso partimos de una MT multipista M yexplicaremos cómo construir la máquina básica equivalente M'.

Hemos visto que los símbolos existentes en la cinta de la MT multipista son^-tupias. Podemos definir a partir de Fk el nuevo alfabeto correspondiente a M',que llamaremos I". Este alfabeto tendrá un número finito de símbolos (veremosque será |r|fc) que denominaremos {ai, 02, • • • , an}. Codificaremos entonces cadafc-tupla de Tk como un símbolo de I".

Por ejemplo, para una MT multipista con 2 pistas, si F = {5,0,1}, en-tonces T2 = {55,50,51,05,15,00,01,10,11}, el nuevo alfabeto sería T ={ai, 0,2, as , . . . , ag} y la codificación sería la siguiente:

55 50 51 05 15 00 01 10 11

ai 02 03 04 a§ ÜQ aj a§ ag

La función de transición 5' de la MT básica M' se obtiene sustituyendo lastupias de símbolos de 6 por su simbolo correspondiente. Por ejemplo, si leyendo00 en OQ M escribe 11, mueve el cabezal a la izquierda y pasa a 02,

entonces la función de transición ó' de M' se define como

donde se ha sustituido las tupias 00 y 11 por sus símbolos correspondientes(a6,a9).

De esta forma, cualquier cadena inicial aceptada por M, sería aceptada porM' y viceversa.

2.4.2. Máquina de Turing con registro acotado de memoria

Definición 2.8 Una MT con registro acotado de memoria extiende la MT básicaañadiéndole un contador que puede ser incrementado o decrementado. El contadortendrá un valor máximo, que denominamos cota. Formalmente:

donde k es la cota.

Page 53: Introduccion a la teoria de la computabilidad

52 CAPÍTULO 2. MÁQUINAS DE TURING

La función de transición se define como:

donde se toma como entrada el estado actual, el símbolo leído y el valor actualdel contador y {+,—,=} definen las operaciones de incrementar, decrementar ono modificar el contador.

Hay que hacer notar que si el contador de la máquina vale O y la función detransición manda hacer un decremento el valor del contador permanecerá cons-tante. También permanecerá constante el contador cuando valga k (cota) y lafunción de transición mande hacer un incremento.

Por ejemplo, si la máquina M con contador acotado está leyendo el símbolo1, en el estado <?2> su contador está a 3 y la función de transición se define como

entonces M incrementaría su contador a 4 (siempre y cuando su cota no fuera 3).

Teorema 2.2 Un lenguaje L es aceptado por una MT con contador acotado Msii L es aceptado por una MT básica M' .

DemostraciónPartimos de la definición de M, la MT con contador acotado por el número k

, para construir la nueva MT básica M' de la siguiente forma:Si M tiene p estados, definimos M1 con (k+l)p estados, siendo k la cota de M.

Los estados adicionales simularán el comportamiento de M con el contador. Paraello, cuando la máquina M se encuentre en el estado <?¿ y el valor de su contadorsea m, la máquina M' se encontrará en el estado g¿, siendo / = i(k + 1) + m.

Por ejemplo, supongamos que M tiene 5 estados (q^,..., «74) y que la cota desu contador es 9 (el contador tendrá 10 valores diferentes: del O a 9). Para simularM con una máquina básica M' la construiremos entonces con 50 estados, de formacada estado de M' representa una configuración de M de la siguiente forma:

los estados qo,..., #9 de M' codifican las configuraciones de M en las queésta se encuentra en el estado qo con su contador valiendo de O a 9,

los estados <?io, • • . , qig codifican las configuraciones de M en las que ésta seencuentra en el estado q\ con su contador valiendo de O a 9, . . .

los estados ^40 , . . . , #49 codifican las configuraciones de M en las que ésta seencuentra en el estado q¿ con su contador valiendo de O a 9.

Page 54: Introduccion a la teoria de la computabilidad

2.4. EQUIVALENCIA DE MODELOS DE MT 53

donde g¿ y q¿ son estados de M, a es un símbolo leído por M, 6 es un símboloescrito, S es un movimiento cualquiera del cabezal y T es un valor de incrementodel contador (puede ser +,— o =), entonces la función de transición de M' serála siguiente:

1. Si T — + y m < k (cota de M) entonces se define la siguiente transición

2. SiT = — y r a > 0 entonces

3. En otro caso,

Por ejemplo, si M tiene como cota del contador 5, y un valor de su función detransición es

esto es,

De esta forma, todas las acciones realizadas por M serán simuladas de lamisma forma por M' y, si la primera llega a un estado de aceptación también lohará la segunda (y también al contrario).

Para ello, cuando la función de transición de M tenga la siguiente forma

entonces se añade a la función 5' el valor

5(g¿,o,m) = (g¿,&,S,T),

?a

¿(g0,1,0) = (93,0, £>,+),

í ;(«o,l) = (9i9,0,I>).

S'(<?¿(fc+i)+m) = (Qj(k+i)+m+iib,S).

S'(<?¿(fc+i)+m) = (Qj(k+i)+m+iib,S).

S'(<?¿(fc+i)+m) = (Qj(k+i)+m+iib,S).

^(90(5+1)+0>1) = (93(5+l)+0+l»0>-D)>

Page 55: Introduccion a la teoria de la computabilidad

54 CAPÍTULO 2. MÁQUINAS DE TURING

2.4.3. Máquina de Turing multicinta

Definición 2.9 Una MT multicinta consta de un control finito con k cintas y kcabezales de lectura-escritura (ver figura 2.4).

Un paso de ejecución en esta máquina depende del estado de la unidad decontrol y de los símbolos leídos por cada cabezal. En cada PE la máquina realizalas siguiente operaciones:

1. Cambiar de estado

2. Imprimir un nuevo símbolo en cada una de las celdas correspondientes acada cabezal

3. Mover independientemente cada cabezal una posición a izquierda o derecha,o incluso dejarlo sin mover.

Para este modelo de MT la función de transición asociada es:

Figura 2.4: MT multicinta.

Teorema 2.3 Un lenguaje L es aceptado por una MT multicinta M sii L esaceptado por una MT multipista M'.

DemostraciónDada una MT M con k cintas, podemos construir una MT M' con una cinta

de 2k pistas que simule a la anterior (ver figura 2.5). Por cada cinta de M setienen dos pistas en M', una para el contenido de la cinta correspondiente de M

Page 56: Introduccion a la teoria de la computabilidad

2.4. EQUIVALENCIA DE MODELOS DE MT 55

y la otra pista estará completamente en blanco salvo una celda que contenderá unsímbolo de marcado en la posición correspondiente del cabezal en M. La máquinaM' almacenará en un registro acotado de memoria un contador que representa elnumero de marcadores que se encuentran a la derecha del cabezal de M'. Paraello se utilizará la técnica presentada en el modelo anterior.

Figura 2.5: Simulación de la MT multicinta anterior con una MT multipista.

Cada paso de ejecución de M es simulado mediante dos barridos del cabezalde M': uno primero de lectura de izquierda a derecha y, posteriormente, otrode escritura de derecha a izquierda. Inicialmente el cabezal de M' está en lacelda más hacia la izquierda que contenga un marcador de cabezal. En el primerbarrido hacia la derecha, el cabezal de M' almacena el contenido de cada celdaque tenga asociado un marcador de cabezal2. Cada vez que el cabezal de M'cruza un marcador decrementa el contador interno, indicando cuantos le quedanaún por leer. Cuando M' haya visitado todos los marcadores tendrá almacenadotodos los símbolos que habría leído cada cabezal de M. En este momento M'tiene suficiente información para calcular el siguiente paso de ejecución de M (elpróximo paso de su función de transición), y comienza el segundo barrido delcabezal de M' hasta el marcador más a la izquierda de su cinta. Esta condiciónse determina mediante el contador. Cada vez que el cabezal de M' encuentra unmarcador actualiza el símbolo de la pista correspondiente y realiza el movimientoque corresponda del marcador según el símbolo que escribe M y el movimiento del

2 Par a que una MT pueda almacenar un número k de símbolos sería necesaria una técnicasimilar a la definida para almacenar un contador. Dejamos los detalles de la construcción comoejercicio para el lector.

Page 57: Introduccion a la teoria de la computabilidad

56 CAPÍTULO 2. MÁQUINAS DE TURING

cabezal de M. Después incrementa el contador de marcadores y busca el siguientemarcador. Por último, cuando M1 finaliza las operaciones con los marcadores,cambian su estado según lo hace M y se da por finalizada la simulación de unpaso de ejecución de M. Si el nuevo estado de M es de aceptación, entonces M1

acepta, en caso contrario continúa la ejecución de la simulación.

2.4.4. Máquina de Turing no determinista

Definición 2.10 Una MT no determinista consta de una cinta y una función detransición no determinista, en la que para un par de valores de estado actual ysímbolo leído existe un conjunto de posibles tupias próximo estado (ternas con losvalores: (<?j,s¿,m¿) ). Para un estado actual la función de transición tiene unaserie de valores distintos, y se ejecutarán todas las posibles acciones, dando lugara distintas ramificaciones en la secuencia de descripciones instantáneas.

Una MT no determinista acepta una entrada si en alguna de las ramificacionesde su ejecución se alcanza un estado final. Puede darse el caso, que para unamisma cadena de entrada, se alcancen distintos estados finales.

El no-determinismo de la máquina anterior viene dado por los valores de lafunción de transición para las parejas (91,0) y (#2, !)•

La secuencia de descripciones instantáneas para la cadena de entrada 001 esla siguiente:

Ejemplo 2.7

Sea Q = {90,01,01,93}; E = {0,l};r = {0,1,5};F = {q3} y la función detransición viene dada por la siguiente tabla:

EstadoQo9i

Q2

0

(91,0,0)(91,0,0)(92,0,0)(93,0,1?)

1

(91,1,0)(91,1,0)

(90,1,0)(^2, 1,0)

B

(9i,S,D)

(93,5,I>)

^3

Page 58: Introduccion a la teoria de la computabilidad

En este caso, por uno de los caminos la MT entra en un bucle infinito, en otrose detiene en un estado de no aceptación y en otro acepta la cadena.

La incorporación del indeterminismo en las MT no dota a estos dispositivos demayor potencia computacional, ya que reconocen el mismo conjunto de lenguajes.De hecho, la combinación de indeterminismo con cualesquiera de las extensionesestudiadas no aporta ninguna ampliación real respecto del modelo base.

Teorema 2.4 Si un lenguaje L es aceptado por una MT no determinista M,entonces es aceptado por alguna MT determinista M'.

DemostraciónPara cada par (s,o) de M, siendo s un estado de M y a un símbolo de la

cinta, la función de transición da un número finito de opciones para la próxi-ma configuración. Estas pueden ser numeradas 1,2, . . . . Sea k el número máximode opciones que se pueden dar en M para cualquier par (5,0). De esta forma,cualquier secuencia de opciones (decisiones) puede ser representado mediante unasecuencia de dígitos de 1 a A; (dígitos en sistema de numeración base-fc). No todaslas secuencias así codificadas representarán secuencias válidas de pasos de ejecu-ción de M, ya que puede haber menos de k opciones en algunas situaciones. LaMT determinista M' estará constituida por tres cintas. La primera almacenará losdatos de entrada de M. En la segunda, M' generará secuencias de dígitos de 1 afc, de forma sistemática (primero las de 1 paso, después las de 2 pasos, y así suce-sivamente). Para cada secuencia generada en la cinta 2, M' copiará el contenidode la cinta 1 en la cinta 3 y simulará el funcionamiento de M sobre la cinta 3, us-ando la secuencia de decisiones de la cinta 2 para determinar un comportamientodeterminista sobre la función de transición indeterminista de M. Por lo tanto, siexiste un secuencia de opciones que llevan a M a alcanzar un estado final, dichasecuencia será generada por M' en un período de tiempo finito, y también entraráen un estado final, aceptando M' la entrada. Si, por el contrario, no existe unasecuencia de opciones que lleve a M a un estado final, tampoco M' alcanzará unestado final y no aceptará la entrada.

2.4. EQUIVALENCIA DE MODELOS DE MT 57

Page 59: Introduccion a la teoria de la computabilidad

58 CAPÍTULO 2. MÁQUINAS DE TURING

Ejemplo 2.8

Como ejemplo consideremos la MT no determinista definida anteriormente. Siobservamos la función de transición, podemos comprobar que el número máximode opciones es 2, por lo que necesitamos únicamente los dígitos 1 y 2 para definirlas secuencias de opciones. Así, dada una cadena de entrada, la secuencia 212correspondería a una secuencia en la que primero se escoge la opción 2 de lafunción de transición (si existe), después la opción 1 y por último la opción 2.En el caso en que alguna de las segundas opciones no existieran, esa secuencia nosería válida y se pasaría a la siguiente secuencia. El algoritmo de simulación sebasa en generar todas las posibles secuencias e ir comprobando para cada una deellas si se alcanza un estado final. Para la máquina en cuestión, y la cadena deentrada 001, la lista de secuencias sería

1,2,11,12, 21, 22,111,112,121,122,211, 212, 221, 222 , . . .

La simulación concluiría cuando se llegara a la secuencia 1221, que es la que haceque M llegue a un estado final. Hay que hacer notar que la lista de secuencias esindependiente de la cadena de entrada, y sólo depende de la función de transicióndeM.

2.5. Lenguajes computables y funciones

2.5.1. Lenguajes recursivamente enumerables y recursivos

Hemos definido un lenguaje L aceptado por una MT M como el conjunto decadenas a que llevan a M a un estado de aceptación, pero no hemos dicho nadasobre las cadenas restantes, ¿qué sucede si a M se le pasa una cadena que nopertenece a L?. Pueden suceder dos cosas:

1. Que M se detenga en un estado que no es de aceptación, en cuyo caso sabre-mos que M ha rechazado la cadena, y que, por lo tanto, ésta no pertenecea L. Los lenguajes para los que es posible definir una MT de este tipo (queacepte todas las cadenas que pertenecen al lenguaje y rechace todas lasque no pertenecen a él) se denominan recursivos. Por ejemplo, el lenguajeZ/3 = {10,11,101,111,1011,...} que define el conjunto de los códigos bina-rios de los números primos es un lenguaje recursivo, ya que es posible definiruna MT que reconozca si un número binario es primo o no.

Page 60: Introduccion a la teoria de la computabilidad

2.5. LENGUAJES COMPUTABLES Y FUNCIONES 59

2. Puede suceder también que M entre en un bucle infinito con alguna a (£ L,en cuyo caso no podemos saber si M ha rechazado la cadena o no. Existenlenguajes para los que no es posible definir una MT que rechace aquellascadenas que no pertenezcan a él y sólo es posible aceptar las cadenas quepertenecen al lenguaje. A estos lenguajes se les denomina lenguajes no re-cursivos, y sólo pueden ser definidos de forma positiva: su complementarioes completamente indecidible ya que no existe algoritmo que determine siuna cadena pertenece a su complementario. En el último capítulo del libroveremos bastantes ejemplos de estos lenguajes.

Por último, también existen lenguajes que ni siquiera son r.e., esto es, no esposible construir ni siquiera una MT que se detenga para las cadenas del lenguaje.

Definición 2.11 Los lenguajes que son aceptados por alguna MT se denominanlenguajes recursivamente enumerables (r.e.).

Definición 2.12 Diremos que un lenguaje es recursivo cuando es aceptado poruna MT que se detiene para todas las cadenas de entrada, bien aceptándolas, bienrechazándolas. El conjunto de todos los lenguajes recursivos esta incluido en elconjunto de los lenguajes recursivamente enumerables.

2.5.2. Las MT corno computadores de funciones de naturales

Las MT además de ser aceptores de lenguajes pueden funcionar como proce-dimientos de cálculo, computadores, de funciones de naturales en naturales. Hayun gran numero de posibles codificaciones de los argumentos de estas MT, perola forma tradicional es representarlos como una cadena de símbolos 1 de longitudigual al valor del natural: n —> ln.

Si la función tiene k argumentos: ni, 712, • • . , n¿, estos naturales formarían losdatos de entrada en la cinta de la MT mediante dicha codificación y separadoscada uno del otro por un símbolo 0: ni, 7 7 - 2 , . . . , nn H> Ini01n20... Olnfe. Si laMT para dejando escrita en la cinta la cadena lm entonces interpretaremos que/(ni, 7 7 , 2 , . . . , n¿) = m donde / es la función de k argumentos computada por laMT. Hay que hacer notar que una misma MT puede computar una función de unargumento, otra diferente de dos argumentos y así sucesivamente.

En una máquina de Turing que compute una función de números naturales, elestado final o de aceptación puede ser el conjunto vacío, ya que cuando la máquinase detenga debe mostrar el resultado del cálculo realizado.

Ejemplo 2.9

Sea Q = {q0,qi,q2,93,44,95,96J; S = {0,1}; T = {0,1, B}- F = {q6}. La tablaadjunta representa la función de transición. La siguiente MT computa la funciónm—n (función definida como m — n si ra > n o O en otro caso):

Page 61: Introduccion a la teoria de la computabilidad

60 CAPÍTULO 2. MÁQUINAS DE TURING

Estado

9o9i92

93

(14

95

0(95,5,7))

fe,0,£>)te,o,D)(93,0,7)(94,^,7)(95,^,7))

1

(9i,5,I>)(91,1,7?)(93,0,7)(93,1,7)(94,1,7)

(95,5,1?)

5

(94,5,7)(9o, 5, D)(96,1,7))(96, 5, D)

La operación 3 — 1, se ejecutaría mediante las siguientes descripciones instan-táneas:

Definición 2.13 Una función f computada por una MT se denomina funciónTuring-computable. La función f puede ser parcial o total. Es decir, si una MTcomputa la función f de k argumentos, dicha función no tiene porque estar defini-da para todas las combinaciones de valores de sus argumentos (para todas lask-tuplas de naturales: ni, n 2 , . . . , n^).

Definición 2.14 Si la función f computada por una MT está definida para todaslas combinaciones de valores de sus argumentos diremos que f es una funciónTuring-computable total.

2.6. Caracterización de lenguajes con MT generadoras

Hemos comprobado que un lenguaje puede ser recursivo o bien r.e. y no re-cursivo. En el primer caso es posible, dada una cadena arbitraria, decidir si esacadena pertenece o no al lenguaje. En el segundo caso, si la cadena pertenece allenguaje, la MT que lo reconoce se detiene en un estado de aceptación, pero noes posible construir una MT que rechace, de forma general, las cadenas que nopertenecen al lenguaje.

Las MT pueden verse con una tercera interpretación, a parte de reconocedoresde lenguajes y computadores de funciones, y es como generadores de cadenas.Veremos en este apartado cómo se caracterizan los diferentes tipos de lenguajesutilizando MT generadoras.

Definamos primero una MT generadora.

La cadena 11 que devuelve cuando llega al estado final, corresponde a 3 — 1= 2.

96

golUOl h BqillQl h Sl^lOl h Sll^Ol h B110g2l H 511^00 h 51g3100 hB^llOO h 43.S1100 h 5^1100 h BBq^QO h SBl^OO h 5510^0 h BBWQq2 hBSIO^O h 5£lg40 \~ BBq4l h Bg451 h q6BU

Page 62: Introduccion a la teoria de la computabilidad

2.6. CARACTERIZACIÓN DE LENGUAJES CON MT GENERADORAS 61

Definición 2.15 Consideramos una MT multicinta M con dos cintas, en laprimera contiene los símbolos del alfabeto, y que utiliza la segunda cinta comocinta de salida en la cual una vez escrito un símbolo, ya no se puede cambiar(sobreescribir), y cuyo cabezal nunca se puede mover hacia la izquierda. Supong-amos que M escriba sobre dicha cinta de salida cadenas sobre un alfabeto finitoE, separadas por un símbolo marcador #.

Se considera que la MT generadora funciona operando sobre la primera cintay generando cadenas en la cinta de salida.

Definición 2.16 Definimos G(M], el lenguaje generado por M, como el conjuntode cadenas de S* que son impresas por M entre los símbolos # en la cinta desalida.

Hay que hacer notar que no se impone ninguna condición para que la cadenassean generadas en algún orden particular, o que las cadenas sean generadas sólouna vez.

Definimos un par de conceptos que utilizaremos más adelante.

Definición 2.17 Dado un alfabeto S denominamos ordenación lexicográfica deS* a una lista ordenada de todas sus cadenas. La ordenación lexicográfica induceun orden en el alfabeto y ordena las cadenas: 1) por longitud y 2) para cadenas dela misma longitud se utiliza la ordenación del diccionario, con el orden inducidopor el alfabeto.

Ejemplo 2.10

Supongamos el alfabeto S = {a, 6, c}. La lista de cadenas de £* ordenadaslexicográficamente sería la siguiente:

donde se ordenan los pares ( i , j ) por el valor de la suma i + j y, para igual valorde la suma, por valor creciente de i.

L = (A, a, 6, c, aa, a6, ac, 6a, 66,6c, ca, c6, ce, aaa, aa6, aac,...)

Definición 2.18 Definimos la ordenación de pares de números de la siguienteforma:

L = ((0,0), (0,1), (1,0), (0,2), (1,1), (2,0), (O, 3), (1,2), (2,1), (3,0) , . . . ) ,

Page 63: Introduccion a la teoria de la computabilidad

ya que, por ejemplo, el par (1,0) no aparece en una posición finita de la lista (sisuponemos que la lista representa pares de números generados por una MT, el par(1,0) no aparecería nunca en la cinta de salida). Esta ordenación ya la utilizamosen el primer capítulo para demostrar que N x N es un conjunto numerable.

2.6.1. Caracterización de los lenguajes recursivos

Veremos ahora que el teorema anterior puede restringirse al caso de lenguajesrecursivos.

En este caso, dado un lenguaje recursivo, va a ser posible generarlo en ordenlexicográfico y, a la inversa, dado un lenguaje generado en orden lexicográfico vaa ser posible construir un algoritmo recursivo de aceptación del lenguaje (querechace las cadenas que no pertenecen a él).

Teorema 2.5 L es un lenguaje recursivo si y sólo si L es generable en ordenlexicográfico.

Demostración

Sea L — L(MR) C £*, donde MR se detiene, aceptando o rechazando, paratodas las cadenas de entrada. Se construye MG como generador de L dela siguiente forma: MQ va generando, en una cinta auxiliar, las cadenas deS* en orden lexicográfico. Después de generar cada cadena a¿, MG simulaa MR con la entrada a¿. Si MR acepta o;¿, entonces MG genera o:¿. ComoMR siempre se detiene (ya que L es recursivo), sabemos que MG terminaráde procesar cada palabra en un tiempo finito y que llegará a procesar cadacadena de S* en un cierto instante de tiempo. Es evidente, además, que MGgenera L en orden lexicográfico.

Supongamos que MG genera L en orden lexicográfico. Se construye la máquinaaceptora de L, M#, de la siguiente forma: dada la entrada a simulamos MGpara generar las cadenas de L hasta que ésta genera a o hasta que generauna palabra posterior en orden lexicográfico a a. En el primer caso MRacepta y en el segundo rechaza.

Una ordenación de pares de números define una numeración sobre los pares(¿, j), de forma que cualquier par aparece tarde o temprano en una posición finitade la lista. Una ordenación no correcta hubiera sido

62 CAPÍTULO 2. MÁQUINAS DE TURING

L = ((O, 0), (0,1), (O, 2), (O, 3 ) , . . . , (1,0), (1,1),...),

Page 64: Introduccion a la teoria de la computabilidad

2.6. CARACTERIZACIÓN DE LENGUAJES CON MT GENERADORAS 63

2.6.2. Caracterización de los lenguajes r.e.

Teorema 2.6 L es un lenguaje recursivamente enumerable (aceptado por unaMT MR) si y sólo si existe alguna MT generadora MQ tal que L = G(Mc)-

Demostración

Primero demostraremos que si L es generado por una MT generadora, quellamaremos MG, entonces es L es r.e. Esto es, debemos construir, utilizandoMG, una MT (que llamaremos MR) que reconozca el lenguaje L, aceptandoaquellas cadenas que pertenezcan a L.

El algoritmo de funcionamiento de MR es bastante sencillo. Dada una ca-dena a £ S* situada en la entrada de MR iremos comparándola, una a una,con las cadenas generadas por MG, deteniendo la máquina en un estadode aceptación si en algún momento MG genera a. Así, si a E L tarde otemprano MG generará la cadena, con lo que la máquina MR se detendráaceptando. Si a ^ L y L es infinito, MG nunca generará a, con lo que MRno terminará nunca su ejecución y no podrá rechazar la cadena. Realmenteesto no importa, porque no queremos demostrar que L sea recursivo, sinor.e.

La demostración inversa, en la que se afirma que si un lenguaje es r.e.entonces existe una máquina MG que lo genera es algo más complicada.

Si L es r.e. tenemos una máquina MR que acepta sus cadenas (sabemos queMR se detiene aceptando para a E L, pero puede entrar en un bucle infinitopara aquellas a ^ L, ya que no estamos obligando a que L sea recursivo).Debemos entonces construir, utilizando M#, una máquina generadora, MG,que genere las cadenas de L (en cualquier orden, no estamos imponiendoque la generación sea ordenada). Podríamos pensar que MG funcionara de lasiguiente forma: generar una a una las cadenas de S* en orden lexicográfico(ai, «2, «35 • • •) 7 para cadena a¿ generada comprobar con MR si a¿ € L, ysi es así generarla en la cinta de salida.

Este método funcionaría si MR se detuviese para todas las cadenas de en-trada a¿. Pero no todos los lenguajes r.e. son recursivos y, en general, sedará el caso de que alguna cadena a¿ € S* haga que MR entre en un bucleinfinito, con lo que ya no se podrá generar las siguientes cadenas de £*, yMG no habrá generado todas las cadenas de L.

Por lo tanto, hay que evitar ejecutar MR indefinidamente sobre una cade-na. Para ello, utilizaremos la ordenación de pares vista anteriormente. Lasimulación de MR se desarrollará, ahora, generando primero pares ( i , j ) ysimulando j pasos de ejecución de M sobre la cadena ¿-ésima del ordenlexicográfico de S*.

Page 65: Introduccion a la teoria de la computabilidad

64 CAPÍTULO 2. MÁQUINAS DE TURING

Entonces el algoritmo de MG para generar L sería el siguiente: generar unoa uno los pares (¿,j) de forma que, para cada uno, se simulan j pasos deejecución de MU sobre la cadena ai E E*. Si MR termina los j pasos en unestado de aceptación, entonces MQ genera a¿. Por tanto, MG sólo generarápalabras que pertenezcan a L.

También podemos asegurar que MG generará todas las cadenas de L. Si£ E L es la cadena fc-ésima en orden lexicográfico en E*, entonces, porpertenecer a L, será aceptada por MR en algún paso de ejecución finito/; y como MG considera todos los pares, el par (&, /) será considerado porMG tras un período de tiempo finito, con lo que se simularán / pasos deMR sobre la cadena a^ (£), lo que llevará a MR a un estado de aceptación.Como resultado, en un instante de tiempo finito dado MG generará £, y portanto L = G(MG).

2.7. Problemas

1. Diseñar una máquina de Turing que reconozca el lenguajeL = {WWR | tu 6 {0,1}*} (Cadenas palíndromas)

2. Diseñar una máquina que reconozca el conjunto de cadenas con igual númerode ceros y unos. (Suponer que la cinta es infinita por ambos lados).

3. Diseñar una máquina de Turing que reconozca el lenguaje

4. Para la máquina no determinista del ejemplo 2.7, responder a las siguientescuestiones:

a) Cuál de las siguientes palabras es aceptada por la máquina?Olí, 110, 111, 000.

b) Cuál es el lenguaje reconocido por M?

5. Construir una máquina de Turing que calcule la función f(x) = x/2 (di-visión entera).

L = {OnlnOn n |> 1}

Page 66: Introduccion a la teoria de la computabilidad

2.7. PROBLEMAS 65

6. Diseñar una máquina de Turing que compute la multiplicación de dos númerospositivos.

7. Construir una máquina de Turing que calcule la división entera de dosnúmeros positivos.

8. Demostrar que para cualquier lenguaje r.e. existe una MT básica con el al-fabeto F = {0,1, B} que lo reconoce.

9. Sea una MT determinista restringida cuya cinta es finita por ambos lados.Razona si esta restricción es o no equivalente al modelo sin restringir.

10. Demostrar si los lenguajes I/i = 0 y Z/2 = S* son recursivos o recursiva-mente enumerables. (Suponer que S = {0,1} )

11. Demostrar que un lenguaje L es recursivo ̂ L y L son generables.

Page 67: Introduccion a la teoria de la computabilidad

This page intentionally left blank

Page 68: Introduccion a la teoria de la computabilidad

Capítulo 3

Funciones L-computables

En este capítulo introduciremos un sencillo lenguaje de programación de fun-ciones, que utilizaremos a lo largo del libro, y que servirá para definir los im-portantes conceptos de función L-computable y función L-computable parcial.También definiremos la semántica de este lenguaje de programación mediante laintroducción de conceptos como los de descripción instantánea y paso de ejecución.Por último, veremos (intuitivamente) que los conceptos de función L-computable,función Turing-computable y función computable por un algoritmo son equiva-lentes.

3.1. Introducción de un lenguaje programación

El lenguaje que vamos a definir a continuación, L, tiene cierto parecido conlos lenguajes de programación que estamos acostumbrados a manejar, con opera-ciones básicas como la asignación, y estructuras de control como condicionales ybucles. Pero no se trata de un lenguaje real, en el sentido de que no pretendemosque sea fácil de utilizar ni que sea eficiente. Pretendemos que, teniendo la mismacapacidad (más adelante quedará claro que entendemos por ello) que cualquierade los lenguajes usuales, sea lo más simple posible. De esta forma podremos for-malizarlo y estudiarlo con facilidad. Si el lenguaje tuviera características de másalto nivel, como la utilización de tipos de datos complejos se dificultaría muchosu formalización.

3.1.1. El lenguaje L

Comencemos por decir que los programas de L nos van a servir para definirfunciones sobre números naturales. El lenguaje tendrá un conjunto de variablescuyos valores serán estos naturales. A unas variables especiales,

Xi X<2 X% ...

Page 69: Introduccion a la teoria de la computabilidad

será variables locales del programa.Cuando sólo utilicemos una variable, el subíndice 1 a menudo se omitirá,

utilizándose, por ejemplo, X en lugar de X\, y Z en lugar de Z\, A diferenciade cualquier lenguaje de programación usual, no establecemos un límite en elnúmero máximo de variables a utilizar. Uno de los objetivos de la Teoría de laComputabilidad es estudiar los límites de los lenguajes de programación. En elcaso del lenguaje que estamos definiendo estos límites se refieren a cuáles son lasfunciones que se pueden computar con él. Sin embargo, no queremos que estoslímites dependan del tamaño de un programa, ni del número de variables usadas,sino de cuestiones más relevantes, como veremos en capítulos siguientes. Eso sí,el número de variables de entrada siempre debe ser finito.

El número de instrucciones de L es muy reducido. Únicamente utilizaremoslas tres siguientes:

1. Incrementar el valor de una determinada variable. Simbolizada como V++,donde V es una variable cualquiera, tiene el efecto de incrementar en unaunidad el valor de esta variable.

2. Decrementar el valor de una determinada variable. Se denota como V—,donde V es una variable cualquiera, y tiene el efecto de decrementar en unaunidad el valor de la variable. Si esta variable tiene de valor O, éste seguirásiendo su valor después de la instrucción.

3. Salto condicional. Se escribe IF V ^ O GOTO L, donde V es una variabley L una etiqueta. Si el valor de V es distinto de O, entonces la siguienteinstrucción a ejecutar será la que está etiquetada con la etiqueta L. Si elvalor de V es O, entonces se ejecuta como siguiente instrucción la siguientedel programa.

Un programa es una lista (esto es, una secuencia finita) de instrucciones comolas anteriores, cada una de ellas pudiendo estar precedida por una etiqueta. Lasetiquetas las definiremos con las letras

las denominaremos variables de entrada, y contendrán los valores de entrada de lafunción que estamos definiendo. La variable Y hará siempre el papel de variablede salida de la función, y las letras

68 CAPÍTULO 3. FUNCIONES L-COMPUTABLES

La lista de instrucciones que define un programa la escribiremos de arriba abajo,y cuando una instrucción está precedida por una etiqueta, escribiremos ésta entreparéntesis. Por ejemplo,

Ai Bl d Dl S1 A2 B2 C2 D2 S2 A3 ....

Zi Z2 Z% ...

Page 70: Introduccion a la teoria de la computabilidad

3.1. INTRODUCCIÓN DE UN LENGUAJE PROGRAMACIÓN 69

representa la instrucción de decrementar el contenido de la variable Z y estáprecedida por la etiqueta A.

Estableceremos la convención de que, al comenzar el programa, la variable desalida Y y todas las variables locales tendrán inicialmente el valor 0. Algunas vecesnos referiremos al valor de una variable escribiendo éste en itálica y en minúscula.Por ejemplo, x\ será el valor de X\,

Es difícil de imaginar un lenguaje más escaso que L, en el que no existeni siquiera la asignación de variables. Más adelante introduciremos una técnica,denominada expansión de macros que, respetando la sencillez del lenguaje, harámucho más sencilla la programación en él.

3.1.2. Algunos ejemplos de programas

Antes de pasar a una definicón más formal del lenguaje, veamos un par deejemplos que ilustrarán su funcionamiento: la función pseudo-identidad y la fun-ción identidad.

Ejemplo 3.1 Función pseudo-identidad Nuestro primer ejemplo es el siguiente

programa

(A) Z--

El efecto del programa, si el valor inicial de X no es O, es copiar su valor enla variable de salida Y, y decrementar el valor de X hasta O (como se recordará,el valor inicial de Y es 0). Si X = O, el valor de Y se incrementa y el programa sedetiene. Diremos entonces que el programa computa la siguiente función

Este programa se detiene cuando ejecuta la tercera instrucción con la variableX valiendo 0. En este caso, la condición X 7^ O no se cumple y no se realiza elsalto a la etiqueta A. El programa entonces se detiene cuando se intenta ejecutaruna inexistente cuarta instrucción. También se detendrá cualquier programa querealice un salto a una instrucción etiquetada L y no se haya definido tal etiquetaen todo el programa. Normalmente utilizaremos la letra 5 (de Stop) como laetiqueta que no aparece en ninguna instrucción.

/(*) =

(A] X--y++IF X ¿ O GOTO A

1 si x = Ox en otro caso

Page 71: Introduccion a la teoria de la computabilidad

70 CAPÍTULOS. FUNCIONES L-COMPUTABLES

Ejemplo 3.2 Función identidad

Para definir un programa que compute la función identidad, y que copie en lavariable Y el valor de la variable X incluso cuando éste sea O, es necesario refinaralgo más el ejemplo previo. El siguiente programa es una solución

Es posible comprobar fácilmente que el programa anterior copia el valor de lavariable de entrada X en la variable de salida Y para todos los posibles valoresde X. En el caso en que la variable de entrada valga O, el programa salta ala instrucción etiquetada con 5, y al no existir ésta, el programa se detiene sinhaber incrementado el valor de y. De esta forma podemos decir que el programacomputa la función identidad

Vamos a comentar algo más sobre el programa. En concreto, la utilidad dela variable auxiliar Z puede que no sea clara en un primer momento. Lo que seconsigue con esa variable es un salto incondicional. Esto es, el trozo de programa

tiene, sea cual sea el valor inicial de Z, el efecto de saltar a la instrucción etiquetadacon L, ya que la primera instrucción garantiza que siempre Z va a ser distinto decero (hay que recordar que en nuestro lenguaje de programación no se permitela utilización de números enteros negativos). El trozo de programa va a tener elefecto de la instrucción GOTO L tal y como existe en numerosos lenguajes deprogramación. Más adelante veremos cómo será posible definir este fragmento decódigo como una macro.

Z++IF Z ¿ 0 GOTO L

f ( x ) = x .

W

(B]

IF XZ++IF ZX--Y++Z++IF Z

¿

¿

í

0

0

0

GOTO

GOTO

GOTO

B

S

A

Page 72: Introduccion a la teoria de la computabilidad

3.2. DEFINICIONES FORMALES 71

3.2. Definiciones formales

Una vez introducido el lenguaje de programación L estamos preparados paradefinir de una forma más precisa este lenguaje.

Definición 3.1 Las variables del lenguaje L estarán representadas por los si-guientes símbolos

Los símbolos

se denominan variables de entrada.Los símbolos

se llaman variables locales.Y la variable Y se denomina variable de salida de L.

Definición 3.2 Los símbolos

se llaman las etiquetas del lenguaje L. (Como ya hemos dicho, en la práctica seomite el subíndice 1.)

Definición 3.3 Una sentencia es una de las siguientes:

donde V puede ser una variable cualquiera y L puede ser cualquier etiqueta.Hay que notar que entre las sentencias de L incluimos una sentencia vacía

(V ==) que no realiza ninguna acción, ni añade ninguna funcionalidad extra. Seincluye por razones que se verán claras más adelante.

Definición 3.4 Una instrucción es o bien una sentencia (en cuyo caso se de-nomina una instrucción no etiquetada) o (L) seguido de una sentencia (en cuyocaso se dice que la instrucción está etiquetada con la etiqueta L).

Definición 3.5 Un programa P es una lista (esto es, una secuencia finita) deinstrucciones.

La longitud de tal lista se denomina la longitud del programa.Es útil incluir el programa vacío de longitud O que no contiene ninguna ins-

trucción.

Xi X>2 X^

Zi Z<2 Z%

Ai BI d DI Si A2...

V++v-~V ==IF V T¿ 0 GOTO L

Page 73: Introduccion a la teoria de la computabilidad

72 CAPÍTULO 3. FUNCIONES L-COMPUTABLES

Las definiciones anteriores establecen la sintaxis del lenguaje L, esto es, ladefinición de qué tipo de expresiones son correctas en él. Normalmente, la defini-ción de la sintaxis de un lenguaje se realiza mediante una gramática o mediante unsistema formal equivalente, como la notación BNF. Vamos a formalizar la sintaxisde L, anteriormente definida, utilizando la notación BNF.

3.2.1. Notación BNF

La notación BNF (Bakus Naur Form) fue definida por John Bakus y PeterNaur en el año 1959 con el objetivo de poder definir formalmente la sintaxisdel lenguaje de programación ALGOL 60. A partir de esa fecha se ha utilizadoextensamente para definir la sintaxis de múltiples lenguajes de programación,formatos de datos y formatos de ficheros.

La notación BNF utiliza dos tipos de expresiones:

1. Expresiones terminales que representan expresiones propias del lenguajeque se está definiendo, como por ejemplo while, f or, =, [, o (en el caso dellenguaje L) ++,-.

2. Expresiones no terminales que representan expresiones que deben ser ex-pandidas y aparecen entre símbolos menor que y mayor que. Por ejemplo,<etiqueta> o <variable>.

Y también utiliza los símbolos : : =, que significa "se define comor |, que sig-nifica "o".

Veamos una serie de ejemplos de definiciones BNF, antes de pasar a la defini-ción del lenguaje L con esta notación.

Por ejemplo, la notación BNF que define un número natural sería:

<natural>::= <dígito>| <dígito><natural><dígito>::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Hay que hacer notar que las definiciones BNF utilizan frecuentemente larecursión . Por ejemplo, en el caso anterior se define un natural como undígito o bien un dígito seguido de un natural. Y a continuación se define undígito como cualquier número del O al 9.

Un problema de la definición anterior es que considera como naturales anúmeros que comienzan por O, como el 00112. Para no permitir que unnúmero natural comience por O, se podría utilizar la siguiente definiciónBNF

<natural>::= <dígito>I <dígito-no-cero><natural-cero><natural-cero>::= <dígito>I <dígito><natural-cero>

<dígito-no-cero>::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9<dígito>::= O | <dígito-no-cero>

Page 74: Introduccion a la teoria de la computabilidad

3.2. DEFINICIONES FORMALES 73

Por último, la siguiente definición BNF especifica un número decimal. Enella utilizamos las definiciones previas de natural, natural-cero, dígitoy digito-no-cero.

<decimal>::= <natural>| <natural>.<parte-decimal>|

.<parte-decimal>

<parte-decimal>::= <digito-no-cero>I <natural-cero><digito-no-cero>

3.2.2. Definición de L usando la notación BNF

Veamos a continuación la definición BNF de la sintaxis de programas válidosescritos en el lenguaje L. En ella se utiliza la definición previa de natural.

<programa-L>: = <instrucción>I <instrucción><programa-L>

<instrucción>: = <sentencia>| <etiqueta><sentencia>

<etiqueta>: = <id-etiqueta>I <id-etiqueta><natural>

<sentencia>: = <var>++ I <var>- | <var>== I IF <var>/ O GOTO <etiqueta>

<var>: = <id-var>| <id-var><natural>| Y

<id-etiqueta>: = A | B | C I D | S

<id-var>: = X I Z

Esta definición BNF es, formalmente, idéntica a las definiciones 3.1 hasta 3.5.

3.2.3. Semántica de L

Para definir completamente el lenguaje, debemos especificar su semántica,esto es, cómo se realizan computaciones en él. La definición de la semántica deun lenguaje de programación es un campo complicado, muy técnico y formal.Nosotros realizaremos una definición operativa, en la que definiremos el estado deun programa y veremos, una a una, cómo afectan las distintas instrucciones a esteestado.

Definición 3.6 Un estado de un programa P es una lista de ecuaciones de laforma V = m, donde V es una variable y m es un natural. La lista incluye unaecuación para cada una de las variables de P y no existe más de una ecuaciónpara una variable.

Ejemplo 3.3

Sea P el programa, que computa la función identidad, y que contiene lasvariables X, Y y Z. La lista

es entonces un estado de P (la definición de estado no requiere que el estadopueda ser realmente "obtenido" a partir de algún estado inicial.) La lista

(X = ±,Y = 3,Z = 3)

Page 75: Introduccion a la teoria de la computabilidad

74 CAPÍTULOS. FUNCIONES L-COMPUTABLES

es también un estado de P, dado que X y X\ son dos formas distintas de nombrarla misma variable y que la definición de estado permite la inclusión en la lista devariables que no ocurren realmente en P). La lista

no es un estado de P, ya que no aparece ninguna ecuación para Z. De la mismaforma, la lista

tampoco es un estado de P porque aparecen dos ecuaciones con la variable X.

o

Definición 3.7 Sea uj un estado de P y sea V una variable que aparece en u. Elvalor de V en u; es entonces el (único) número q tal que la ecuación V = q es unade las ecuaciones que constituyen u.

Ejemplo 3.4

El valor de X en el estado

es 4.

Supongamos que tenemos un programa P y un estado u; de P. Para poderdecir qué sucede "a continuación" debemos saber cuál es la instrucción de P queestá a punto de ejecutarse.

Definición 3.8 Definimos una instantánea o una descripción instantánea de unprograma P de longitud n como un par (¿,u;) donde 1 < i < n + 1, y uj es unestado de P. (Intuitivamente, el número i determina la instrucción que está apunto de ejecutarse; i = n + 1 corresponde a la instrucción "stop".)

Si s = (¿,w) es una instantánea de P y V es una variable de P, entonces elvalor de V en s significa el valor de V en u.

(X1=4,X2 = 5,y = 4,Z = 4)

(JT = 4,y = 3)

(A" = 4,y = 3,Z = 3)

(X = 4,X = 5,y = 4,Z = 4)

Page 76: Introduccion a la teoria de la computabilidad

3.2. DEFINICIONES FORMALES 75

Definición 3.9 Una instantánea (¿,w) de un programa P de longitud n se de-nomina terminal si i=n+l.

Ejemplo 3.5

Continuando con el programa que computa la función identidad, supongamosque ha comenzado a ejecutarse con la variable X valiendo 2. La primera instan-tánea del programa sería

donde el contador 1 determina que la primera instrucción es la que va a serejecutada, y los valores de las variables son las que aparecen en el estado.

Después de concluir la ejecución del programa, la instantánea terminal es

donde el contador 8 da a la instantánea su carácter de terminal, ya que el programaidentidad tiene únicamente 7 instrucciones.

Definición 3.10 Si (¿,u;) es una instantánea no terminal de P, definimos elsucesor de (¿, u>) como la instantánea (j, T) definida como sigue:

Caso 1 La i-¿sima instrucción de P es V++ y u contiene la ecuación V =m. Entonces j = i + lyrse obtienen sustituyendo la ecuación V — m porla ecuación V — m 4- 1 (esto es, el valor de V en T es m + 1,).

Caso 2 La i-ésima instrucción de P es V— y u contiene la ecuación V — m.Entonces j = i + 1 y T se obtienen sustituyendo la ecuación V — m por laecuación V = m — 1 si m ^ 0; si m — 07 entonces r = u.

Caso 3 La i-ésima instrucción de P es V =—. Entonces j = i -\-\ y T — uj.

Caso 4 La i-ésima instrucción de P es IF V ^ O GOTO L. Entonces T — ujy hay dos casos para la obtención de j:

Caso 4a u contiene la ecuación V = 0. Entonces j = i + 1.

Caso 4b u; contiene la ecuación V — m, con m ^ 0. Entonces, si existeuna instrucción de P etiquetada L, j es el menor número tal que la j-ésimainstrucción de P está etiquetada L. En otro caso, j = n + 1.

(i,(x = 2,y = o,z = o)),

(8,(X = 0,y = 2,Z = 3)),

Page 77: Introduccion a la teoria de la computabilidad

Vamos a calcular el sucesor de la instantánea (¿,u;) para distintos valores de i.

i = 1. El sucesor es (4,u;), con u igual al definido anteriormente.

i — 2. El sucesor es (3, r), donde r consiste en las ecuaciones

Definición 3.11 Una computación de un programa P se define como una se-cuencia (esto es, una lista) $ i , S 2 5 - - - > s & de instantáneas de P tales que Sj+i esel sucesor de s¿ para todos los valores i — 1, 2, . . . , k — 1 y s^ es terminal.

Ejemplo 3.7

Un ejemplo de computación del programa identidad, a partir de la instantáneainicial (1, (X = 2, Y = O, Z = 0)) es el siguiente

Ejemplo 3.6

Volvamos al programa identidad. Sea u el estado

76 CAPÍTULOS. FUNCIONES L-COMPUTABLES

i = 7. El sucesor es (8,u;). Esta es la instantánea terminal.

(i,(x = 2,y = o,z = o)),(4,pr = 2,y = 0,Z = 0)),(5,(x = i,y = o,z = o)),(6,(x = i,y = i,z = o)),(7,(x = i,y = i,£ = i)),(i,(A- = i,y = i,z = i)),(4,(A: = i,y = i,z = i)),(5,(A: = o,y = i,z = i)),(6,(A: = o,y = 2,z = i)),(7,(X = 0,y = 2,Z = 2)),(l,(A- = 0,y = 2,Z = 2)),(2,(X = 0,y = 2,Z = 2)),(3,(-x: = o,y = 2,z = 3)),(8,(A: = 0,y = 2,Z = 3)),

(X = 4,Y = Q,Z = 0).

(X = 4,y = 0,Z = 1).

Page 78: Introduccion a la teoria de la computabilidad

3.3. DEFINICIÓN DE MACROS 77

Hay que notar que no hemos prohibido que un programa tenga más de unainstrucción con la misma etiqueta. Sin embargo, nuestra definición del sucesor deuna instantánea hace que una instrucción de salto se refiera siempre a la primerasentencia que tiene la etiqueta en cuestión.

Ejemplo 3.8

El programa

3.3. Definición de macros

Hemos visto que los programas escritos en lenguaje L son bastante complicadosde leer, debido a ser éste un lenguaje de bastante bajo nivel. Para hacer mássencillo el lenguaje introducimos el concepto de macro.

Definición 3.12 Las macros nos proporcionarán la posibilidad de dar un nombrea un fragmento de código que usemos repetidamente y usarlo en otros programascomo una abreviación suya. A la instrucción que utilizamos como abreviación lallamamos macro, y el fragmento de código que representa lo llamaremos expansiónde la macro.

Para definir macros utilizaremos una notación similar al lenguaje L, pero cam-biando los identificadores de variables y de etiquetas. En una macro no se permitela utilización de las variables ni de las etiquetas propias del lenguaje L (variablesX,Y,Z y etiquetas A,B,C,£),5). Esto evitará confusiones a la hora de expandirla macro.

En su lugar utilizaremos como identificadores de variables locales a la macroa W\,..., Wn y usaremos como identificadores de etiquetas locales a la macro aGI, . . . , Gn o F, este último usado para definir el salto al final de la macro.

es totalmente equivalente a

(A) X--IF X ¿ 0 GOTO A

(A) X++

(A) X--IF X / 0 GOTO AX++

Page 79: Introduccion a la teoria de la computabilidad

78 CAPÍTULOS. FUNCIONES L-COMPUTABLES

Nos interesará que en la expansión de la macro se sustituyan ciertos identi-ficadores por identificadores propios del programa en el que hemos llamado a lamacro. Para ello utilizaremos los parámetros de la macro, que habrá que definiren la cabecera de la misma y que los denominaremos TI , . . . , Tn.

Ejemplo 3.9

Veamos, como ejemplo, la macro GOTO T que define un salto incondicionala la etiqueta T.

En esta macro, bastante sencilla, se utiliza el identificado! T como parámetrode la macro (puede haber más, en cuyo caso se utilizarán subíndices, TI, ... Tn),y el identificador W corresponde a una variable local a la macro.

El programa identidad quedaría de la siguiente forma al utilizar la macro

La primera llamada a la macro se realiza con el parámetro S y la segunda conel parámetro A.

Las reglas que definen la expansión de una macro son las siguientes

1. Las variables locales de la macro deben sustituirse por variables locales delprograma (variables Z) no utilizadas en el resto del mismo.

2. Las etiquetas locales de la macro deben sustituirse por etiquetas del progra-ma no utilizadas en el resto del mismo.

3. La etiqueta F en el código de la macro debe sustituirse por una etiqueta noutilizada en el programa, de forma que la siguiente instrucción a la macrocomience precisamente por esta nueva etiqueta. Así, cuando se termine derealizar la macro se saltará a la instrucción siguiente a la misma.

GOTOTW++IF W ^ 0 GOTO T

(A) IF X 7¿ 0 GOTO BGOTO 5

(B} X--Y++GOTO A

Page 80: Introduccion a la teoria de la computabilidad

3.3. DEFINICIÓN DE MACHOS 79

4. Los parámetros de la macro deben sustituirse de forma literal, utilizando enla expansión de la macro los mismos parámetros que se usan en la propiallamada a la macro.

Ejemplo 3.10

Como segundo ejemplo, veamos cómo se puede codificar la macro T •<— O, endonde el valor de una variable se inicializa a 0.

La etiqueta G es una etiqueta local a la macro.

Ejemplo 3.11

Como último ejemplo de este apartado veremos una macro que realiza laasignación de una variable a otra. La macro se denominará TI -f- TI y tendrá elefecto de copiar el valor de la variable T2 en la variable TI, dejando sin alterar elvalor de la variable T2.

En esta macro utilizamos las macros GOTO T y T 4- O que hemos definidoanteriormente. En un primer bucle, la macro copia el valor de TI en T2 y enla variable local W, y en un segundo bucle, se devuelve a T2 su valor original.Cuando el programa termina, T2 y TI contienen el valor original de T2 y W vale0.

T ^ O

(G) T--IF T ^ 0 GOTO G

Ti^T2

(Gi)

(02}

(G*)

(G,}

TI ^0IF T2 ^ 0 GOTO G2

GOTO G3

T2--TI++W++GOTO GiIF W ¿ 0 GOTO G4

GOTO FW--T2++GOTO G3

Page 81: Introduccion a la teoria de la computabilidad

80 CAPÍTULO 3. FUNCIONES L-COMPUTABLES

Las etiquetas GI, . . . , G^ son etiquetas locales a la macro. Recordemos que alexpandirse se reescribirán como etiquetas del programa que no se hayan usadopreviamente. La etiqueta F define un salto al final de la macro.

3.4. Ejemplos de programas

Ejemplo 3.12 Suma

El programa que computa la función

En el programa se utilizan las macros TI -f- T2 y GOTO T. Si fuera necesario,podríamos sustituirlas por sus correspondientes expansiones, teniendo siempre encuenta las reglas de expansión. Este programa también se puede utilizar en otrosdefiniéndolo como la expansión de la macro

Quedaría así:

puede ser el siguiente:

T3 ^-Ti+T2.

T3 ̂ TI + T2

(G2)

(Gi)

T3^TiW^T 2IF W ^ 0 GOTO GiGOTO FW--T3++GOTO G2

/(Zl,£2) = Xi +X<¿

(B)

(A]

Y <-XiZ^X2

IF Z ^ 0 GOTO AGOTO 5Z--Y++GOTO .B

Page 82: Introduccion a la teoria de la computabilidad

3.4. EJEMPLOS DE PROGRAMAS 81

Ejemplo 3.13 Multiplicación

Ahora presentaremos un programa que computa la función multiplicación,

El programa suma X2 veces el contenido de la variable X\, utilizando comovariables auxiliares las variables Zi y Z2.

Una cuestión interesante sobre el programa es por qué se utiliza la pareja demacros

en lugar de una macro más concisa que sería la siguiente

La razón es que la expansión de la macro anterior no daría los resultadospretendidos (reemplazar el valor de Y" por la suma de su valor anterior y del valorde JTi), sino otros muy distintos. Proponemos en un ejercicio que sea el lector elque determine cuál sería el resultado de la expansión de esta macro.

Como ejemplo de expansión de una macro, veamos como quedaría el programaanterior al incorporarle la expansión de Z\ 4- X\ + Y.

utilizando repetidas sumas.

f(xi,x2] = xi -x2,

(B)

(A]

Z% i — X 2

IF Z2 ¿ o GOTOGOTO 5ZT-Zl^Xl + YY ^ ZiGOTO B

A

Zl^Xl+YY <-Zi

Y 4- Xl + Y

Page 83: Introduccion a la teoria de la computabilidad

82 CAPÍTULO 3. FUNCIONES L-COMPUTABLES

El programa tiene dos variables de entrada (X\, X<¿). Si comenzamos con losvalores x\ = 5, #2 — 2, el programa asigna estos valores a las variables Y y Z.Después va decrementando ambas hasta que z = 0. Claramente, si comenzamoscon x\ = m y x% = n, con m > n, el programa terminará con Y = m — n.

¿Qué sucede si comenzamos con una pareja de valores tales que m < n? Eneste caso se irán decrementando Y y Z hasta que Y llegará a valer O, y en estepunto, se la computación entraría en el siguiente bucle

Ejemplo 3.14 Resta

Veamos, por último, el siguiente programa:

(B)

(A)

(£2)

(4z)

(SO

Z2 <— X2

IF Z2^0 GOTOGOTO 5Z2--

Zi^X l

Z3^-YIF Z3 / 0 GOTOGOTO 52

Z3--^i++GOTO B2

Y <- ZiGOTO 5

4

^2

(C)

(A)(B)

Y <-XiZ^-X2IF Z ̂ 0 GOTO ̂GOTO 5IF Y ̂ 0 GOTO 5GOTO ,4Y--Z--GOTO C

(A) IF F ̂ 0 GOTO BGOTO A

Page 84: Introduccion a la teoria de la computabilidad

Ya que y = O, el anterior fragmento de programa hace que la computaciónentre en un bucle infinito, del que ya no hay forma de salir. Decimos entonces quela computación se cuelga y nunca termina. En este caso (y en casos similares)diremos que el programa computa una función parcial, en concreto, la funciónparcial es

3.5. Funciones L-computables

Vamos a definir de una forma más precisa la noción de función computadapor un programa P.

Comencemos por tratar el aspecto del número de parámetros de entrada. Taly como hemos definido un programa escrito en L, P, puede aceptar un númerom variables de entrada, dependiendo del número de variables Xi, Xi,..., Xm queutilicemos. Es conveniente, sin embargo, considerar que un mismo programa Ppuede computar indistintamente una función de una variable

distinta de dos variablesesta forma, podemos decir que un único programa computa un número infinitonumerable de funciones. Vamos a definir estas funciones formalmente.

Definición 3.13 Sea P un programa del lenguaje L, y sean r i , r2 , . . . , r m mnúmeros dados. Construimos entonces el estado a de P definido por las ecua-ciones

(Xi = ri, X2 = r2, • • • , Xm = rm, Y = 0),

junto con las ecuaciones V = O para cada variable V de P distinta de X\,..., Xm, Y.Llamaremos a este estado el estado inicial, y a la instantánea (1, cr) la instantáneainicial.

Caso 1 Existe una computación S i , S 2 , . . . , s^ de P que comienza con lainstantánea inicial. Entonces definimos el valor deel valor de la variable Y en la instantánea (terminal) s&.

Caso 2 No existe tal computación; esto es, existe una secuencia infinitasii S2i S3 • • • que comienza con la instantánea inicial, donde cada s¿+i es elsucesor de s¿. En este caso decimos que el valorindefinido.

otra función

y asísucesivamente para cualquier De

(n , r 2 , . . . , r m ) como

(n , r 2 , . . . , r m ) está

3.5. FUNCIONES L-COMPUTABLES 83

Page 85: Introduccion a la teoria de la computabilidad

84 CAPÍTULO 3. FUNCIONES L-COMPUTABLES

Cuando quede suficientemente claro a qué programa P nos referimos, omitire-mos dicho subíndice de ^ f p .

Como ejemplos, vamos a revisar los programas ya vistos, examinándolos desdeesta nueva perspectiva.

Ejemplo 3.15

Para otros ejemplos de la sección anterior, tenemos

Ejemplo 3.16

Una vez establecidos estos conceptos, estamos en posición de poder definir u-nos conceptos de gran importancia para la teoría de la computación en particular,y para las matemáticas en general.

Definición 3.15 Dado un programa P y un natural m, se denomina funcióncomputada por P a la función fy™ (#1, . . . , #m).

Como hemos indicado, permitimos que cada programa se utilice con cualquiernúmero de variables de entrada.

Definición 3.14 Si un programa con m variables de entrada definidas se usacon un número n < m, entonces la computación comienza con todas las variablesrestantes inicializadas a 0.

Por otro lado, si se utiliza el programa con un número n > m de variables deentrada, entonces los valores de entrada extra son ignorados.

Identidad: ^^(ri,/^) = TI,Suma: tfí1) (n) = n + O = n (Xí = n, X 2 = 0)Suma: ^3Hri>r25r3) — ri + r2 (^3 se ignora).

Suma: í^2) (7*1,7*2) — r\ + r2,Multiplicación: ÍE^2)(7*1,7*2) = r\ • TI,

Identidad: *^(r) = r,

Page 86: Introduccion a la teoria de la computabilidad

3.6. MACHOS GENÉRICAS 85

Definición 3.16 Una función g (de una o más variables) total o parcial se diceque es L-computable si es computada por algún programa escrito en el lenguaje L.Esto es, si existe un programa P tal que

para todo ri, . . . , rm. Es importante puntualizar que g puede no estar definida paraalgunos valores de entrada, en este caso, el programa P que la computa debe tam-bién estar indefinido, esto es, entrar en un bucle infinito. Utilizaremos el términoL-computable en sentido amplio, incluyendo las funciones L-computables totalesy las funciones L-computables parciales. Cuando tengamos un programa L que sedetiene para cualquier entrada diremos que implementa una función L-computabletotal y cuando el programa L se queda colgado para algunas entradas diremos queimplementa una función L-computable parcial. En ambos casos diremos que lafunción implementada por el programa es una función L-computable.

Entre los ejemplos que hemos visto, las funciones #, x+y, x-y son L-computablestotales, y la función x — y es únicamente L-computable parcial.

3.6. Macros genéricas

En el apartado 3.4 vimos algunos ejemplos de macros de funciones L-computables,tales como x + ?/, x • y y de expansiones de estas macros en forma de programas.Vamos a considerar ahora una notación para poder definir macros de una formageneral.

3.6.1. Asignación

Sea /(#!, . . . ,xn) una función L-computable, computada por el programa P.Definimos la macro asignación

Tn+i <— /(Ti, . . . , Tn),

donde TI, . . . , Tn+\ pueden ser variables cualesquiera (y, en particular, Tn+\ puedeser una de las variables Tí, . . . ,Tn) . Como resultado de ejecutar la expansiónde la macro se ejecuta el programa P que computa la función /, utilizando lasvariables indicadas como entrada, y el valor Y resultante se asigna a la variableTn+i. Pueden suceder dos casos:

Caso 1. La función / está definida para los valores TI, . . . , Tn. En este caso,el valor de la función se asigna a la variable Tn+i.

Caso 2. La función / no es total y /(Ti, . . . , Tn) está indefinida. En este caso,la ejecución de la expansión de la macro nunca terminará, y el programaprincipal tampoco terminará nunca.

Page 87: Introduccion a la teoria de la computabilidad

86 CAPÍTULOS. FUNCIONES L-COMPUTABLES

No entraremos en detalles referentes a la definición de esta macro. Habría quetomar precauciones de forma que nos aseguremos que no se modifican los valoresde las variables del programa principal, ni se confunden etiquetas interiores de laexpansión con etiquetas del programa principal. No es complicado definir unascaracterísticas de P, la expansión de la macro, que tenga en cuenta estas consid-eraciones y que no impongan ninguna restricción adicional al tipo de funcionesL-computables que puedan utilizarse en esta macro. Dejamos como ejercicio parael lector interesado el establecer estas consideraciones.

Como ejemplo de utilización de la macro, supongamos el programa

Como comentábamos anteriormente, el valor de la función /(1,4,8) queda in-definido, ya que el programa que computa la función nunca termina al ejecutar laprimera macro. Esto es asía pesar de que el valor de (1 — 4) + 8 es 5.

3.6.2. Comparación

Vamos ahora a definir una macro que nos permita aumentar la flexibilidad delas comparaciones que se realizan en el lenguaje L. Hasta ahora, las únicas com-paraciones que hemos definido son las desigualdades de variables con O, teniendola instrucción

IF V ^ O GOTO L

Definimos la macro comparación de la forma siguiente

IFP(T1,...,Tn)GOTOTn+1,

donde P(#i,. . . ,xn) es un predicado L-computable total. Como definíamos en elcapítulo 1, y haciendo uso de la convención

TRUE = 1, FALSE = O,

un predicado es una función total cuyos valores son siempre o bien O, o bien 1.Por ello, un predicado L-computable es un predicado que es computado por algúnprograma P escrito en el lenguaje L.

La expansión de la macro

Este programa computa la siguiente función

Z +-Xi-X2Y <- Z + X3

Page 88: Introduccion a la teoria de la computabilidad

3.7. TESIS DE CHURCH APLICADA AL LENGUAJE L 87

Como ejemplo, una macro que utilizaremos frecuentemente será

IF V = O GOTO L.

Para que ésta sea una macro correcta, es necesario justificar que la compara-ción con O es un predicado L-computable. Esto es, necesitamos una función L-computable P(x) tal que P(x) = 1 (TRUE) si x = O y P(x) = O (FALSE) encaso contrario. El siguiente programa hace ese trabajo

3.7. Tesis de Church aplicada al lenguaje L

Hemos visto en este capítulo un formalismo para representar la computación,el lenguaje L. Los programas escritos en este lenguaje sirven para definir fun-ciones matemáticas que, a partir de uno o más números naturales, devuelven otronúmero natural. ¿Es posible definir con el lenguaje L todas las funciones exis-tentes? ¿Existen métodos formales de definir funciones que, con el lenguaje L, nopueden ser definidas? ¿Son las mismas las funciones computables por máquinas deTuring que las computables con el lenguaje L? Dicho de otra forma, ¿es cualquierfunción computable (con algún tipo de formalismo) L-computable?.

A esta pregunta responde la Tesis de Church. Formulada a finales de la décadade los 30, y también conocida como tesis de Church- Turing, esta proposiciónse podría interpretar actualmente como la afirmación de que cualquier posiblealgoritmo capaz de realizar una computación sobre números puede ser programadoen el lenguaje L.

Inicialmente, esta tesis se formuló cuando se demostró la equivalencia de lasmáquinas de Turing, el cálculo-lambda y otros modelos de computación queaparecieron en dicha década. Church y Turing especularon que, al ser equiva-lentes todos esos modelos, serían también equivalentes a cualquier otro modelode computación que se pudiera desarrollar en el futuro. Esto es, que todos losmodelos son capaces de computar las mismas funciones de números naturales yque todos ellos pueden formalizar el concepto abstracto de algoritmo. Ya que lapalabra algoritmo no tiene una definición matemática general, la Tesis de Church

es, simplemente,

IFP(Ti,. . . ,Tn)GOTOTn + 1

W^P(T1 ? . . . ,Tn)IFW^QGOTOT n+i

IF X ¿ O GOTO Sy++

Page 89: Introduccion a la teoria de la computabilidad

88 CAPÍTULOS. FUNCIONES L-COMPUTABLES

no puede ser probada como un teorema matemático. Pero, aún así, es aceptadacomo cierta. De hecho, en capítulos siguientes utilizaremos esta tesis para afir-mar la no existencia de algoritmos siempre que hayamos demostrado que algúnproblema no puede ser resuelto por un programa de L.

3.8. Problemas

1. Qué función computaría realmente la expansión de la siguiente macro?

Y ^- X + Y

2. Escribe un programa en L, sin usar ninguna macro, que compute la función:f ( x ) = 3a?.

3. Definir la macro T <— m, en la que se asigna a la variable T un número m.

4. En todos los ejemplos vistos, se han diseñado programas que computan fun-ciones en los que el cardinal del conjunto origen es infinito.Si el conjunto origen fuese un conjunto finito de números, ¿Se podría en-contrar siempre un programa P que compute la función?

5. Sea f ( x ) = 1 si x es par y f ( x ) = O si x es impar. Escribe un programa enL que compute /.

6. Sea f ( x ) = 1 si x es par y f ( x ) indefinido si x es impar. Escribe un progra-ma en L que compute /.

7. Sea /(#i, #2) = 1 si x\ = x%, y /(#i, #2) — O si xi ^ X2- Escribe un progra-ma en L, sin usar macros, que compute /.

8. Sea f ( x ) el mayor número n tal que n2 < x. Escribe un programa en L quecompute /.

9. Sea mcd(íci, #2) el máximo común divisor de x\ y x%. Escribir un programaen L que compute mcd.

Page 90: Introduccion a la teoria de la computabilidad

3.8. PROBLEMAS 89

Podemos considerar que la función / así definida implementa la función res-ta en una codificación de los números negativos mediante números enterospositivos. En esta codificación un número m par representa el entero posi-tivo x tal que m = 2x y un número m impar representa el entero negativoy tal que n = 2|y| + 1, donde |y| denota el valor absoluto de y. Escribir unprograma que compute la función /.

11. Sea P el programa del Ejemplo 3.2 (función identidad). Escribir la compu-tación de P comenzando con la instantánea (l,w), donde w consiste en lasecuaciones X = 2, Y = O, Z = 0.

12. Escribir un programa P tal que para cualquier computación si,..., Sf* de P,sea k=5.

13. Escribir un programa P tal que para cualquier n > O y cualquier computa-ción si = ( l ,u>),S2, • • •S fc de P que contenga la ecuación: X = n en w, seak = 2n + 1.

14. Sea P el programa

IF X ^ O GOTO A(A) X + +

IF X ¿ O GOTO A(A) y + +

¿Qué función es (x)l

15. La misma pregunta que en el ejercicio anterior para el programa:

(B) IF X ^ O GOTO AZ + +IF Z ¿ O GOTO B

(A) X <- X

16. La misma pregunta que en el ejercicio 14, para el programa vacío.

17. Sea P el siguiente programa:

10. Sea f ( x \ , X 2 ) = 2(a?i -z2)2(|a?i-x2 |) + l

SÍ Xi > X2

SÍ Xi < X2

Page 91: Introduccion a la teoria de la computabilidad

90 CAPÍTULOS. FUNCIONES L-COMPUTABLES

Y <r-Xi

(A) IF X2 ¿ O GOTO SY + +Y + +X2--GOTO A

¿Qué función es

18. Demuestra que para cualquier función L—computable /(#!, ...,#n), existeun número ra > O tal que / se computa por infinitos programas de longitudra.

19. Sean /(#), g(x] dos funciones L—computables, y sea h(x) = f(g(x)). De-mostrar que h es L—computable.

20. Sea P(x) un predicado L—computable total. Demostrar que la función

es L—computable.

21. Sea P(x] un predicado L—computable total. Demostrar que

22. Sea TT una función biyectiva L—computable total, y sea n 1 su inversa. De-mostrar que TT~I es L—computable total.

23. Sea / (x) una función L—computable parcial. Sea M = {mi,...,m^} unconjunto finito de números tales que /(ra) = f para todo ra € M, y seag(x] una función L—computable arbitraria. Demostrar que

es L—computable.

9(x)/(*)

sien

x e Motro casoh(x) =

1 si existen al menos x números n tales que P(n) = 1t en otro caso

es L—computable.

EXp(x) =

Xi + X2 SÍ P(XI + X2)

t en otro casof(xi,x2) =

Page 92: Introduccion a la teoria de la computabilidad

Capítulo 4

Funciones recursivas primitivas

En este capítulo vamos a introducir una nueva notación para definir funcionesmatemáticas, la notación de funciones recursivas primitivas. En la primera partedel capítulo utilizaremos tanto la notación matemática como un nuevo lenguaje, ellenguaje R, para comprobar por medio de ejemplos qué tipos de funciones son lasque pueden ser definidas mediante esta notación. En la segunda parte del capítuloanalizaremos más formalmente estas construcciones, para llegar a comprobar lascaracterísticas de las funciones recursivas primitivas.

Demostraremos, en concreto, que una ventaja de la definición de las funcionesrecursivas primitivas es que aseguramos que cualquier función definida de estaforma es una función L-computable total. Sin embargo, también comprobaremosque la recursión primitiva no es una notación completa, desde el momento en queveremos que existen funciones L-computables totales que no se pueden definir conella.

4.1. Definición de las funciones recursivas primitivasmediante la notación matemática

Las funciones iniciales

Definición 4.1 Definimos como función cero a la función de un único argumento(cerox] que implementa la función constante cero(x] = O sea cual sea el valor deentrada x.

Definición 4.2 Definimos como función suc a la función de un único argumento(suc x) que implementa la función suc(x) = x + 1.

Definición 4.3 Definimos como función proyección a la función de n argumentosP™(XI, ... ,xn) = Xi extrae la componente i-ésima de una tupia.

Definición 4.4 Decimos que la función / (#i , . . . , xn) se construye por composi-ción si se define de la forma

Page 93: Introduccion a la teoria de la computabilidad

92 CAPÍTULO 4. FUNCIONES RECURSIVAS PRIMITIVAS

f(xi,...,xn) =g(hi,...,hm),

siendo g una función ya definida y h\,..., hm argumentos de f o llamadas a otrasfunciones ya definidas.

En el caso en que hi sea una llamada a una función ya definida, sus argumentospueden ser, a su vez, de la misma clase que los de g, a saber argumentos de f ollamadas a otras funciones ya definidas.

El número de llamadas a funciones debe ser finito.

Para concluir el apartado presentamos la definición matemática formal de larecursión.

Definición 4.5 Dadas dos funciones f y g, decimos que la función h se definepor recursión si se puede construir de la forma:

En la primera línea se define el caso base de la recursión y en la segunda elcaso general.

Hay que hacer notar que la función / toma como argumentos los n primerosargumentos de la función h ( a ? i , . . . , xn) y que la función g toma como argumentoslos mismos que / más el argumento de recursión (t) y el resultado de la llamadarecursiva, en la que el argumento de recursión se decrementa en 1.

Ejemplo 4.1

Como ejemplo de notación matemática de la recursión, veamos cómo quedaríanexpresadas con esta notación las funciones definidas previamente.

1. Función suma. Si suma(x,y) — x + y podemos definir suma por recursiónde la siguiente forma

suma(x,Q) =

suma(x,t) = suc(suma(x,t — 1)).

2. Función mult. Si mult(x, y] = x • y definimos mult por recursión de lasiguiente forma

mult(x, 0) = cero(x)mult(x,t) = suma(x,mult(x,t — 1)).

h(xi,...,xn,Q) = f(xi,...,xn)h(xi,...,xn,t) = g(xi,...,xn,t,h(xi,...,xn,t-l)).

Page 94: Introduccion a la teoria de la computabilidad

4.2. INTRODUCCIÓN AL LENGUAJE R 93

3. Función pred.

pred(O) = cero(x]

pred(í) = t - 1.

4. Función factorial.

factorial(O) = suc(cero(x})

factorial(í) = rau/í(í,factorial(í — 1)).

5. Función monus. Si definimos la función monus como:

4.2. Introducción al lenguaje R

Al igual que el lenguaje L, veremos que el lenguaje R es bastante escaso encuanto a características. Se trata de un lenguaje funcional en el que todas lasfunciones se definen a partir de una función inicial (la función sucesor) utilizandodos constructores básicos: la composición y la recursión. La sintaxis del lenguajeR está basada en la sintaxis del LISP1.

En este apartado se introducirá el lenguaje R, presentando primero los ladrillosbásicos con los que se construye cualquier función: las funciones iniciales (funcióncero y función sucesor) y los constructores composición y recursión. Presentaremosalgunos ejemplos de definición y uso de funciones en un intérprete de R.

*E1 LISP (LISt Processing) fue el primer lenguaje de programación de alto nivel. Diseñadoen la década de los 50, su fama se debe a que ha sido el lenguaje en el que se han programadola mayoría de las aplicaciones clásicas de Inteligencia Artificial.

O si x < yx — y en otro caso

monus(x,y} =

monus(x,Q) =

monus(x,t) = pred(monus(x,t — 1)).

6. Función \x — y\ (valor absoluto de la resta)

\x — y\ = suma(monus(x, y),monus(y, x ) } .

Page 95: Introduccion a la teoria de la computabilidad

94 CAPÍTULO 4. FUNCIONES RECURSIVAS PRIMITIVAS

Las funciones iniciales

Definiremos a continuación la función cero y la función suc. Estos métodosrepresentan los elementos fundamentales del lenguaje R.

Ejemplo 4.2

A continuación se presenta un ejemplo de utilización de la función cero en elintérprete de R.

> (cero 0)

O> (cero 1000)

O> (cero 3 4)

Error: numero de argumentos erróneos

En la primera línea se realiza una llamada a la función pasándole como argu-mento el número O y vemos que el valor devuelto es el mismo 0. Hay que hacernotar que en R las llamadas a las funciones se realizan entre paréntesis, y queéstos no son necesarios para rodear los argumentos. En la segunda llamada sepasa como argumento a la función el número 1000, devolviendo ésta también elnúmero 0. Por último, la función se llama con 2 argumentos y el intérprete de Rdetecta el error y devuelve un mensaje de aviso.

Ejemplo 4.3

A continuación se presenta un ejemplo de utilización de la función suc en elintérprete de R.

> (suc 3)4> (suc 0)1> (suc 3 4)Error: numero de argumentos erróneos>

Page 96: Introduccion a la teoria de la computabilidad

4.2. INTRODUCCIÓN AL LENGUAJE R 95

Composición

El segundo método de construcción de nuevas funciones R es la composiciónde funciones. Se trata exactamente del mismo método que se utiliza en el cálculoclásico, en donde el resultado de una llamada a una función ya definida se utilizacomo argumento de la nueva función que estamos definiendo.

> (defun prueba (xl x2)(suc xl)))

Función prueba definida

> (prueba 30)4> (prueba 1)Error: numero de argumentos erróneo

> (defun prueba2 (xl)(suc (cero xl)))

Función prueba2 definida> (prueba2 5)1

Podemos observar que las nuevas funciones se definen con el operador defun,seguido del nombre de la función, sus argumentos y su cuerpo. El valor devueltopor la última línea del cuerpo de la función es el valor devuelto por la función, eneste caso uno de los argumentos previamente definidos.

En el caso de la composición, la función se define como una llamada a otrasfunciones ya definidas previamente. En la función prueba, se llama a la funciónsuc pasándole como argumento el parámetro xl y se ignora el parámetro x2. Lafunción prueba devuelve entonces el sucesor de xl, con lo que podemos afirmarque la función matemática que implementa es la función /(#i,#2) definida como

/(zi,x2) = suc(xi).

La función prueba2 llama a la función suc pasándole como argumento elresultado de haber llamado a la función cero con xl como argumento. La funcióncero siempre devuelve el valor O, con lo que la función matemática implementadapor prueba2 es la función constante f ( x ) definida como

Es posible utilizar un número cualquiera de llamadas a funciones cuando es-tamos utilizando la composición. Por ejemplo, la función (suma-6 x) que imple-menta la función f ( x ) = x + 6, se puede construir de la siguiente forma.

> (defun suma-6 (x)(suc (suc (suc (suc (suc (suc x)))))))

Función suma-6 definida

/(*) = 1.

Page 97: Introduccion a la teoria de la computabilidad

96 CAPÍTULO 4. FUNCIONES RECURSIVAS PRIMITIVAS

> (suma-6 0)6> (suma-6 133)139

Por último daremos una notación matemática formal a la composición defunciones tal y como se construye en el lenguaje R.

Ejemplo 4.4

Por ejemplo, las funciones definidas anteriormente en lenguaje R se definenmatemáticamente por composición como sigue

prueba2(:c) = prueba(prueba(#,;r),;E)

suma-6(;c) = suc(suc(suc(suc(suc(suc(#))))))

Recursión

La recursión es el otro constructor de funciones de R. Se trata de un métodomuy potente que define una función mediante:

1. un caso base en el que se proporciona el valor de la función cuando elargumento de recursión vale O y

2. un caso general en el que se define el valor que devuelve la función parael argumento de recursión (t) en función del valor devuelto por la funciónpara el argumento de recursión menos 1 (t-1).

Ejemplo 4.5 Función suma

El primer ejemplo es la función (suma xl x2), que realiza la suma de dosnúmeros utilizando la función inicial suc.

> (defun suma (x t)(ifzero x

(suc (suma x t-1))))Función suma definida> (suma 3 0)3> (suma 3 30)33

pmeba(£i,£2) = SUG(XI)

Page 98: Introduccion a la teoria de la computabilidad

4.2. INTRODUCCIÓN AL LENGUAJE R 97

Para definir una función en R por recursión se usa también el operador def unseguido del nombre de la función y sus argumentos. A continuación se define,precedido por ifzero, el valor de la función para el caso base (t=0) y en latercera línea se define la llamada recursiva.

Para calcular el valor de (suma 8 3), al no estar en el caso base de la recursión,R debe calcular el resultado de aplicar la función suc al resultado de sumar 8 y3 — 1. Como no se dispone del valor de (suma 8 2), la aplicación de la funciónsuc queda pendiente hasta que éste se calcule. Para ello se realiza una llamadarecursiva en la que se vuelve a aplicar la definición del caso general. Así hastaque se llega a (suma 8 0 ) , momento en el que ya se puede aplicar el caso base(ya que t = 0) y devolver directamente 8. Y este es el momento en el que todaslas llamadas a la función suc pendientes se van completando de atrás a adelante.

Veamos un ejemplo de cual sería la secuencia de llamadas recursivas, y susresultados.

(suma 8 3 ) = (suc (suma 8 2)(suma 8 2 ) = (suc (suma 8 1)

(suma 8 1 ) = (suc (suma 8 0)(suma 8 0) = 8

(suc 8) = 9(suc 9) = 10

(suc 10) = 11

Ejemplo 4.6 Función mult

La función (mult xl x2) calcula la multiplicación de dos números. Se defineutilizando la función suma.

> (defun mult (x t)(ifzero (cero t)

(suma x (mult x t-1))))Función mult definida> (mult 5 0)O> (mult 5 4)20

Ejemplo 4.7 Función pred

La función (pred x) calcula el predecesor de un número. Para ajustamos ala sintaxis de R, que veremos más adelante, es necesario realizar la llamada a lafunción suma, que no hace sino devolver el valor de t-1.

> (defun pred (t)(ifzero (cero t)

Page 99: Introduccion a la teoria de la computabilidad

98 CAPÍTULO 4. FUNCIONES RECURSIVAS PRIMITIVAS

(suma (cero t) t-1)))

Función predecesor definida> (pred 0)O> (pred 15)14

Ejemplo 4.8 Función factorial

La función (factorial x) calcula el factorial de un número.

> (defun factorial (t)(ifzero (suc (cero t))

(mult t (factorial t-1))))Función factorial definida> (factorial 0)1> (factorial 4)24

Ejemplo 4.9 Función monus

Como último ejemplo, la función (monus xl x2) devuelve la resta natural dedos números. En los casos en que x\ es mayor que #2 se devuelve x\ — x<¿. En elcaso contrario se devuelve 0.

> (defun monus (x t)(ifzero x

(pred (monus x t-1))))Función monus definida> (monus 93)

6> (monus 39)

O> (monus 9 9)

O

4.3. Definición formal de R

Al igual que ya se hizo para el lenguaje L, daremos en este apartado unadefinición formal del lenguaje R, entendiendo ésta como una definición de susintaxis (cómo deben estar escritos los programas en R) y su semántica (quéfunción define un programa R).

Page 100: Introduccion a la teoria de la computabilidad

4.3. DEFINICIÓN FORMAL DE R 99

4.3.1. Sintaxis del lenguaje R

La definición en BNF de la sintaxis de R es:

<definición-R>::= <composición>I <recursión>

<composición>::= (defun <func-ident>(<lista-param>) <valor>)

<recursión>::= (defun <func-ident>= * (<lista-param>t)

(ifzero <valor>

(<func-ident><lista-args>(* <lista-args>t-l))))

<valor>:

<llamada-func>:

<func-ident>:

<lista-param>:

<lista-args>:

<arg>:

<ident>:

<exp-alfa>:

<letra>:

<ident>| (<llamada-func>)

<func-identXlista-args>

<ident>

I <ident>| <ident><lista-param><arg>| <arg><lista-args>

I <ident>| <llamada-func><exp-alfa>| <exp-alfa>-<exp-alfa><letra>| <letra><exp-alfa>a I b | ... | z

La definición de una función en R (<def inición-R>) puede realizarse o bienmediante una composición o mediante una recursión.

La definición por composición (<composición>) utiliza un identificador denombre de función (<f unc-ident>), una lista de parámetros (<lista-param>)entre paréntesis y devuelve el valor <valor> que, a su vez, puede ser unode los parámetros de la función o una llamada a una función previamentedefinida.

La definición por recursión (<recursión>) consiste en un identificador denombre de función (que se marca con un asterisco para poder referenda-rio posteriormente en la llamada recursiva), una lista de parámetros, unparámetro adicional (t) que es el argumento de recursión, la definición delcaso base ((ifzero <valor>)) y la definición del caso general, en el que serealiza la llamada recursiva. En el caso base se pueden utilizar como argu-mentos cualquiera de los argumentos de la función que estamos definiendoexcepto el argumento de recursión. En el caso general se realiza una llamadaa una función ya definida y uno de los argumentos de esta función es, asu vez, la llamada recursiva, en la que debe utilizarse el valor anterior delargumento de recursión (t-1).

4.3.2. Semántica del lenguaje R

Para la definición de la semántica del lenguaje R vamos a basarnos en ellenguaje L, definiendo cómo codificar en lenguaje L todos y cada uno de loselementos de R.

Para ello veremos, en las definiciones 4.6-4.9 cómo se codifica en L la funcióninicial y cómo se puede construir una composición y una recursión.

Page 101: Introduccion a la teoria de la computabilidad

100 CAPÍTULO 4. FUNCIONES RECURSIVAS PRIMITIVAS

Definición 4.6 La función sucesor se codifica en lenguaje L de la siguiente for-ma:

Y <- X++

Definición 4.7 La función cero se codifica en lenguaje L de la siguiente forma:

Y ^0

Definición 4.8 Si g, h\,..., hm son funciones ya definidas en R, la composición

f(xi,..., x n) = g(hi(EI,..., xh),..., hm(xi,..., xim))

se codifica en lenguaje L de la siguiente forma

En el caso de que alguno de los argumentos de las funciones hi sea una llamadaa otra función, ésta se realizará en el programa L previamente a la asignacióndonde aparece dicha función hi, de forma que se pase el resultado de esta llamadacomo argumento de la función.

Ejemplo 4.10

Por ejemplo, la codificación de la función suc-6 en lenguaje L es la siguiente

Zi 4- SUc(J5íi)

Z2 4- suc(Zi)Z3 <- suc(Z2)Z4 4- suc(Z3)Z5 4- suc(Z4)Y <- suc(Z5)

Definición 4.9 Por último, si f y g son funciones ya definidas en R, la recursión

Zi <- hi (Xi,..., X¡j_)

^m ̂ hm(Xi, . . . , X/m )

y<-0(Zi , . . . ,z m )

/ i(a;i , . . . ,a:n ,0) /(a;i,. . . ,a;n)

/ i (a? i , . . . , a ; n , í ) p(^ i , . . . , xn, í, /i(^i,. ..,xn,t- 1)).

Page 102: Introduccion a la teoria de la computabilidad

4.3. DEFINICIÓN FORMAL DE R 101

se define con el siguiente programa L

(A)y <-/(*!,...,*«)IF XvGOTO SZ + +Y^-g(Xll..Xn+i —GOTO A

• ,Xn, Z,Y)

Ejemplo 4.11

Por ejemplo, el programa L que define la función monus es el siguiente

(A)Y <-XiIF X2 = 0 GOTO 5Z++Y <- pred(y)Xn+i —GOTO A

4.3.3. Funciones recursivas primitivas

Tras haber definido una semántica de R ya es posible definir que entendemospor función definida por un programa de R. Lo hacemos con la siguiente definición.

Definición 4.10 Dado un programa P en lenguaje R, con variables de entrada#1, . . . ,xn, y dado el programa Q en lenguaje L, que codifica P según las defini-ciones 4-6-4-9 denominamos función definida por P a \!/Q(:EI, . . . , #n) (funcióncomputada por el programa Q).

Las funciones recursivas primitivas son aquellas definidas por programas R.Lo definimos formalmente en la siguiente definición.

Definición 4.11 Una función f es recursiva primitiva si existe un programa Pen lenguaje R que la define.

Una afirmación importante en teoría de la computabilidad es la que relacionacomputabilidad con recursión primitiva. Con el siguiente teorema demostraremosque cualquier función recursiva primitiva es L-computable total. Es importantehacer notar que la afirmación no es cierta en el sentido inverso, al final del capítuloesbozaremos una demostración que ilustrará cómo es posible construir una funciónL-computable total que no es recursiva primitiva.

Page 103: Introduccion a la teoria de la computabilidad

102 CAPÍTULO 4. FUNCIONES RECURSIVAS PRIMITIVAS

Teorema 4.1 Las funciones recursivas primitivas son L-computables totales.

DemostraciónPor las definiciones 4.6-4.9 se puede comprobar que la función inicial, la com-

posición y la recursión definen funciones L-computables totales. Como cualquierfunción recursiva primitiva va a construirse con estas operaciones, también seráL-computable total.

4.4. Constructores avanzados

En este apartado veremos formas avanzadas de demostrar que una funciónes recursiva primitiva. Estrictamente, para demostrarlo deberíamos encontrar elprograma R que la define. Sin embargo, iremos definiendo operadores de más altonivel que nos permitirán demostrar la recursividad primitiva de las funciones sintener que recurrir al lenguaje R.

4.4.1. Predicados

Recordamos que los predicados, o las funciones con valor boolean son, simple-mente, funciones totales cuyos valores son O o 1, y que se identifica 1 con TRUE yO con FALSE. Así podemos hablar de predicados primitivos recursivos sin añadirninguna definición adicional.

Vamos a listar alguno de estos predicados:

Ejemplo 4.12

a(x)

La función a(x) se define como

Esta función es recursiva primitiva, ya que

Ejemplo 4.13

x = y

a(x) — 1—x.

Page 104: Introduccion a la teoria de la computabilidad

4.4. CONSTRUCTORES AVANZADOS

Ejemplo 4.14

Teorema 4.2 Si P y Q son predicados recursivos primitivos, también lo son-P,PAQ y PVQ.

Este teorema plantea que los operadores lógicos son constructores correctos defunciones recursivas primitivas. Para demostrar el teorema veremos cómo construircada uno de los operadores a partir de los constructores recursivos primitivos(composición y recursión).

Demostración

puede ser construido utilizando la ley de Morgan:

Como ejemplo sencillo, podemos comprobar que x < y es recursivo primitivo

Ejemplo 4.15

103

El predicado x = y se define como 1 si los valores de x e y son iguales y O enotro caso. Esto es, queremos demostrar que la función

es recursiva primitiva. Esto es así por

Este predicado es simplemente la función recursiva primitiva a(x—y).

Page 105: Introduccion a la teoria de la computabilidad

104

Introducimos a continuación un nuevo constructor, la definición por casos.

Teorema 4.3 Sean f y g dos funciones recursivas primitivas y P un predicadorecursivo primitivo, y sea h la función definida por

DemostraciónLa demostración es muy sencilla, ya que

Corolario 4.1 Sean las funciones /i,... /m, g y los predicados P1 ? . . . , Pm recur-sivos primitivos, y sea

CAPÍTULO 4. FUNCIONES RECURSIVAS PRIMITIVAS

x <y

Podemos escribir

o, más sencillo,

Entonces h, construida por definición por casos, es una función recursiva primi-tiva.

en otro caso

entonces h es recursiva primitiva.

para todo l<i<j<my para todo x\,..., xn (esto es, para cualquier valor de#1, . . . xn sólo es cierto, como máximo, un único PÍ). Si

en otro caso

Page 106: Introduccion a la teoria de la computabilidad

4.4. CONSTRUCTORESAVANZADOS 105

DemostraciónPara demostrarlo, realizaremos una inducción sobre m. El caso base, ra = 1

está demostrado por el teorema anterior. Para m — fc, suponemos que se cumpleque la función

es primitiva recursiva.Entonces, la función, para m = k + 1 se puede comprobar que es recursiva

primitiva, haciendo que

y definiendo

en otro caso

en otro caso

4.4.2. Iteradores acotados

Teorema 4.4 Si la función /(í, #1, . . . , xn) es recursiva primitiva, entonces tam-bién lo son las funciones

Estas funciones se denominan, respectivamente, sumatorio y productorio.

DemostraciónVamos a demostrarlo por recursión

en otro caso

y

Page 107: Introduccion a la teoria de la computabilidad

106 CAPÍTULO 4. FUNCIONES RECURSIVAS PRIMITIVAS

y, ya que + es una función recursiva primitiva, g lo es.De la misma forma,

En algunas ocasiones será conveniente comenzar el sumatorio o el productoriopor el número 1, en lugar del 0. También en este caso es posible demostrar quelas funciones son recursivas primitivas, tomando

4.4.3. Cuantificadores acotados

Teorema 4.5 Si el predicado P(XI, ... ,xn,t) es recursivo primitivo, también loson los predicados cuantificador universal acotado y cuantificador existencial aco-tado,

Estos predicados son ciertos cuando, respectivamente, para todos los valo-res de t menores o iguales que un cierto y se cumple P(XI, ... ,xn,t) y cuandoexiste algún valor de ¿ menor o igual que un cierto y para el que se cumpleP(xi,...,xn,t).

DemostraciónSe puede comprobar observando que

y

Page 108: Introduccion a la teoria de la computabilidad

4.4. CONSTRUCTORES AVANZADOS

Algunas veces utilizaremos los cuantificadores

Como ejemplos, podemos enunciar los siguientes

Ejemplo 4.16

y\x

El predicado "y es divisor de x". Por ejemplo, 3|12 es cierto, mientras que 3|13es falso.

Este predicado es recursivo primitivo, ya que lo podemos expresar de la si-guiente forma:

Ejemplo 4.17

Primo(x)

El predicado "x es un número primo" (x es distinto de 1 y sus únicos divisoresson el 1 y él mismo). Es recursivo primitivo, ya que

Primo(a:)

4.4.4. Minimización acotada

Vamos a definir en este apartado la minimización acotada de un predicado.Mediante esta función, que demostraremos que también es primitiva recursiva,podremos comprobar que funciones como la parte entera o el resto son tambiénprimitivas recursivas.

107

Page 109: Introduccion a la teoria de la computabilidad

108 CAPÍTULO 4. FUNCIONES RECURSIVAS PRIMITIVAS

Definición 4.12 La notación de la minimización acotada es la siguiente. DadoP(XI, ..., xn, t), un predicado recursivo primitivo, la función

es la minimización acotada de P.

La minimización acotada va comprobando, desde t = O hasta t = y el predica-do P(XI, ..., xn, t), devolviendo el menor valor de y que hace el predicado cierto.Si para todos esos valores de y el predicado P es falso, entonces la minimizaciónacotada devuelve 0.

Ejemplo 4.18

Por ejemplo, veamos la minimización acotada

Debemos considerar el predicado para todos los valores de f, desde O hasta #, ycomprobar cual es el primero de ellos que hace el predicado cierto.

Por ejemplo, dados los valores x = 7 y y = 2, el predicado

es cierto para £ = 3(3 + l ' 2 > 7 ) , pero falso para cualquier valor menor de í, porejemplo, (2 + 1) • 2 < 7.

Por ello

Seguramente el lector se habrá dado ya cuenta de que mediante esta funciónse está calculando la parte entera de la división x/y.

Vamos a demostrar que la función es recursiva primitiva.

Teorema 4.6 Si P(x\,..., xn, t) es un predicado recursivo primitivo, entonces lafunción /(#!,..., xn, y) = mint<yP(x\,..., xn, t) también es recursiva primitiva.

DemostraciónA partir del predicado -P(#i, . . . , xn) t) podemos construir la siguiente función

recursiva primitiva,

(t + 1) . y > x

Page 110: Introduccion a la teoria de la computabilidad

4.4. CONSTRUCTORES AVANZADOS 109

Vamos a analizar esta función. Supongamos que existe un valor ÍQ < y que esel menor valor de t < y para el cual el predicado P(x\,..., #n, t) es cierto. Estoes,

P(XI, . . . , #n, í) = O para t < ÍQ,

pero

P(xi , . . . ,xn , í0) = 1

Entonces

Por ello, el sumatorio de este predicado que se realiza para construir g va adar precisamente ÍQ, ya que

Por último, sólo nos queda por definir la minimización acotada utilizando estafunción g

Y esta función es un función definida por casos y, por tanto, recursiva primi-tiva.

Hay que hacer notar que la función minimización acotada de un predicadodevuelve O en el caso en que el predicado no sea cierto para ningún valor menoro igual que la cota.

Veamos algunos ejemplos de funciones recursivas primitivas utilizando la mi-nimización acotada.

en otro caso

Page 111: Introduccion a la teoria de la computabilidad

110 CAPÍTULO 4. FUNCIONES RECURSIVAS PRIMITIVAS

Ejemplo 4.19

\x/y\ es la "parte entera" de la división x/y. Como vimos en el ejemplo anteriorla definición de esta función es la siguiente:

Ejemplo 4.20

R(x,y)

El resto de la división de x por y. Ya que

podemos escribir

por lo que R(x, y] es recursiva primitiva.

Ejemplo 4.21

Pn

El número primo número n, para n > 0. Así, por ejemplo, PQ = 0,pi = 2,p2 —3,p3 = 5,. . . .

Podemos construir la función utilizando una notación relajada de las ecua-ciones de recursión

Page 112: Introduccion a la teoria de la computabilidad

4.5. UNA FUNCIÓN L-COMPUTABLE TOTAL NO RECURSIVA PRIMITIVAl 1 1

Ejemplo 4.22

i(c)

Si recordamos la codificación de pares de números (a, 6), definíamos esta co-dificación, y las funciones de descodificación asociadas, de la siguiente forma

La definición de l(c) utilizando la notación de funciones recursivas sería

Todas las funciones vistas hasta ahora son recursivas primitivas y, por tanto,L-computables totales. En los capítulos siguientes las utilizaremos para construir,a su vez, otras funciones L-computables totales y otros programas. Recordemosque, al ser totales, podemos asegurar que los programas que las computan sedetienen para cualquier valor de entrada.

Cuadro resumenConstructores básicos

Constructores avanzados

ComposiciónRecursiónDefinición por casosCuantificadores acotadosIteradores acotadosMinimiz ación acotada

4.5. Una función L-computable total no recursiva pri-mitiva

Hemos demostrado que cualquier función recursiva primitiva es L-computabletotal. Sin embargo, en este apartado vamos a comprobar que la afirmación inversano es cierta. Veremos que existe una función L-computable total que no es recur-siva primitiva. No realizaremos una demostración en profundidad, sino que sóloenunciaremos las líneas genéricas de la construcción de dicha función.

Page 113: Introduccion a la teoria de la computabilidad

112 CAPÍTULO 4. FUNCIONES RECURSIVAS PRIMITIVAS

Teorema 4.7 Existe una función h(x) L-computable total que no es recursivaprimitiva.

DemostraciónPara construir esta función, vamos a definir primero la función <£(£,#) que

enumera todas las funciones recursivas primitivas de una variable. Por ejemplo,$(1,10) nos devolverá el valor de la primera función recursiva primitiva (aten-diendo a un cierto orden) cuando se le pasa 10 como valor de entrada.

Si se pudiera implementar con un programa en lenguaje L tal función, ten-dríamos que:

1. para todo valor fijo t = ¿o? la función $(¿0; #) será recursiva primitiva;

2. para toda función recursiva primitiva /(#), existirá un número ÍQ tal que

La parte más complicada de la demostración es la implementación de estafunción. No vamos a entrar en detalles de esta implement ación, únicamente di-remos que es posible llevarla a cabo dada la forma en que están definidas lasfunciones recursivas primitivas. Sería posible encontrar una codificación que nu-merara unívocamente todas las funciones recursivas primitivas de una variable.Una vez implementada esta codificación, deberíamos construir un programa en Lque aceptara como uno de sus argumentos el código de la función y como otroel argumento a pasar a la función, y que interpretara la función y devolviera elmismo valor que la función devuelve para el argumento adicional (algo similar alo que haremos en el capítulo siguiente con el programa universal).

Una vez definido tal programa, podemos diagonalizar, construyendo el siguien-te programa

La función implementada por el programa de arriba es claramente L-computabletotal (sea cual sea el valor del argumento de entrada, va a devolver un valor) y esdistinta de cualquier función recursiva primitiva.

Vamos a probar esto último por reducción al absurdo. Sea $(#, x] + \ recursivaprimitiva, y sea ¿o el natural que codifica esta función. Entonces tendríamos que

para algún ¿o fijo, por lo que al hacer x = ¿o obtendríamos una contradicción.

Page 114: Introduccion a la teoria de la computabilidad

4.5. UNA FUNCIÓN L-COMPUTABLE TOTAL NO RECURSIVA PRIMITIVA113

4.5.1. Minimización no acotada

Definición 4.13 Dado un predicado P(x\,... ,xn,y) definimos su minimizaciónno acotada como

Esto es, la minimización no acotada de P es el mínimo valor de y para el queel predicado P es cierto, si existe alguno. Si no hay ningún valor de y para el queP es cierto, entonces minyP(xi,. . . , xn, y) está indefinida.

La minimización no acotada de un predicado puede producir fácilmente unafunción que no es total. Por ejemplo,

está indefinida para los valores de x < y.Debido a esto último, la minimización no acotada de un predicado L-computable

sólo podemos asegurar que sea L-computable (puede no ser L-computable total).Vamos a enunciarlo formalmente con el siguiente teorema

Teorema 4.8 Si P(x\,... ,xn,y] es un predicado L-computable, y si

g(xi,...,xn) = minyP(xi,...,xn,y),

entonces g es una función L-computable.

DemostraciónEl siguiente programa computa g:

El programa es L-computable, pudiendo ser parcial, ya que pueden existiralgunos valores de X\,..., Xn para los cuales no exista una computación (el predicado nunca sea cierto, y el programa no se detenga nunca).

(A] IFP(Xi , . . . ,X n ,y)GOT05Y++GOTO A

minyP(xi,...,xn,y) =en otro caso

mínimo valor de y tal que P(x\,..., xn, y) = TRUE

Page 115: Introduccion a la teoria de la computabilidad

114 CAPÍTULO 4. FUNCIONES RECURSIVAS PRIMITIVAS

4.5.2. Funciones recursivas-//

De las funciones definidas anteriormente, utilizando la minimización no aco-tada, vamos a quedarnos con aquellas minimizaciones no acotadas que estándefinidas para todos los valores de entrada (esto es, las minimizaciones que definenfunciones totales). Y llamaremos a estas funciones, funciones recursivas-/¿.

Formalmente, lo definimos de la siguiente forma

Definición 4.14 Una función f es recursiva-p si cumple una de las siguientescondiciones:

• f es recursiva primitiva,

• / es una minimización no acotada total.

Se demuestran, aunque nosotros no lo vamos a hacer, los siguientes teorema.

Teorema 4.9 La clase de funciones recursivas-fJL incluye de forma propia a laclase de funciones recursivas primitivas, esto es, que existen funciones totalesque, siendo funciones recursivas-¡JL, no pueden ser expresadas como funciones re-cursivas primitivas.

Teorema 4.10 Una función f es L-computable total si y sólo si es recursiva-¡JL.

Esto es, al añadir la minimización no acotada estamos proporcionando el ele-mento formal que nos faltaba para poder definir todas las funciones L-computablestotales.

Este teorema, junto con todos los demás que demuestran la equivalencia com-putacional de formalismos, es de gran importancia para reafirmar la Tesis deChurch. El teorema anterior establece que los formalismos definidos por el lenguajeL y por las funciones recursivas-// definen la misma idea abstracta de computa-ción, ya que no existen funciones que puedan especificarse con uno de ellos y nocon el otro.

4.6. Problemas

1. Sea h una función recursiva primitiva y sean

f ( x ) = h(g(x}}

g(x] = h(f(x}}

Demostrar que / es recursiva primitiva si y solo si g lo es.

Page 116: Introduccion a la teoria de la computabilidad

4.6. PROBLEMAS 115

2. Dar un argumento detallado de xy, p ( x ] , monus(x,y) = x — y son recur-sivas primitivas.

3. Demostrar que para todo fc, la función constante fk(x) — k Mx es recursivaprimitiva.

4. Para una función unaria /(#), la n-ésima iteración de /, escrita /n, se definecomo:

/"(*) = /(.../(*)...)

donde / se compone consigo misma n veces en la parte derecha de la ecuación(notar que f°(x) = x}. Sea gf(x,n) = fn(x}. Demostrar que si / es recur-siva primitiva, entonces también lo es gf.

5. Sea g(x] una función recursiva primitiva y sea / una función que cumplelas siguientes ecuaciones:

f ( x , 0 ) = g ( x )f(x,n + l) = /( /(x,n),n)

Demostrar que / es recursiva primitiva.

6. Sea P(x) la función definida como

Demostrar que P(x) es una función recursiva primitiva.

7. Sea H(x) la función definida como

Demostrar que H(x) es una función recursiva primitiva.

8. Sea /(O) = O, /(I) = 1, /(2) = 22, /(3) - 333, etc. En general f ( x ) seescribe como x elevada o;— veces a x. Demostrar que / es recursiva primitiva.

si x es parsi x es impar

1 si a: es parO si # es imparP(x) =

H(x} = x/2(*-l)/2

Page 117: Introduccion a la teoria de la computabilidad

116 CAPÍTULO 4. FUNCIONES RECURSIVAS PRIMITIVAS

9. Sea la función m(xi, x>¿} la función mínimo, de forma que m(xi, x<¿] — x\ sien otro caso.

a) Demostrar que ra es una función recursiva primitiva, dando una se-cuencia de composiciones y/o recursiones.

b) Demostrar que mn(xi,...,#„), que devuelve el valor del mínimo com-ponente de la tupia (#1, ...,o?n), es primitiva recursiva.

10. Sea f ( x ) = 2x, si x es un cuadrado perfecto y f(x) = 2x + 1 en otro caso.Demostrar que / es recursiva primitiva.

11. Sea cr(x) la suma de los divisores de #, si x 7^ O, y <r(0) = 0. (p.e. <r(6) =1 + 2 + 3 + 6 = 12). Demostrar que a(x) es recursiva primitiva.

12. Sea n(x) el número de primos que son < x. Demostrar que n(x) es recursivaprimitiva.

13. Demostrar, utilizando un único cuantificador, que el predicado

R(x) •&• x es la suma de dos cuadrados perfectos

es recursivo primitivo.

14. Sea h(x) el entero n tal querecursiva primitiva.

15. Sea R(x, t) un predicado recursivo primitivo. Sea

esto es, g ( x , y ) es el mayor valor de t < y para el cual R(x,t] es cierto; ysi no existe ninguno, entonces g ( x , y ) = 0. Probar que g ( x , y ) es recursivaprimitiva.

16. Sea mcd(x, y) el máximo común divisor de x e y. Demostrar que la funciónmcd(x, y) es recursiva primitiva.

17. Sea mcm(x, y) es el mínimo común múltiplo de x e y. Demostrar que lafunción es recursiva primitiva.

Demostrar que h(x) es

Page 118: Introduccion a la teoria de la computabilidad

4.6. PROBLEMAS 117

18. Dar un predicado L—computable total P(#i,..., #n, y] tal que la funciónmínP(a:i, ... ,xn ,y) no sea L—computable total.y

Page 119: Introduccion a la teoria de la computabilidad

This page intentionally left blank

Page 120: Introduccion a la teoria de la computabilidad

Capítulo 5

Un programa universal

Cuando en 1936 Turing propuso su modelo de computación, también definiólo que posteriormente se ha denominado Máquina de Turing Universal. La MTUniversal es equivalente al computador programable, ya que es capaz de "ejecutar"programas representados por otras MT. Turing demostró que era posible diseñaresta máquina que tiene como entrada la descripción de otra máquina cualquieraM y que simula el comportamiento de M sobre cualquier cadena de entrada.

La denominación de máquina universal se basa en que esta máquina puede,virtualmente, reconocer cualquier lenguaje reconocible por una máquina de Turingcualquiera.

En este capítulo vamos a demostrar que es posible hacer lo mismo en lengua-je L. Vamos a diseñar un programa en lenguaje L (el Programa Universal) quetome como entrada a un programa P cualquiera y que compute la misma funcióncomputada por P. Recordemos que el lenguaje L sólo trabaja con números natu-rales y que los programas L sólo aceptan como argumentos de entrada númerosnaturales. Esto nos lleva directamente a dos de los problemas que trataremos eneste capítulo: ¿cómo representar un programa en L mediante un número natu-ral? y ¿como representar con números naturales la ejecución de un programa enL?. Una vez resueltos estos problemas, será sencillo construir el programa L queimplementa el Programa Universal.

5.1. Numeración de Gódel

En el capítulo 1 definimos el concepto de función codificadora y obtuvimos lasfunciones codificadoras y descodificadores de pares de números naturales(< a, b >,/(#) y T(X), ver sección 1.7.1). Vamos ahora a construir una función quecodifique listas de cualquier longitud de números naturales, convirtiendo cada unade ellas en un número natural único. Este método fue utilizado por primera vezpor el lógico alemán Kurt Gódel, y está basado en la descomposición en factoresprimos.

Page 121: Introduccion a la teoria de la computabilidad

120 CAPÍTULO 5. UN PROGRAMA UNIVERSAL

5.1.1. Función de codificación

Definición 5.1 Definimos como número de Gódel de la secuencia ( a i , . . . , an) alnúmero

donde PÍ es el número primo i-ésimo.

Ejemplo 5.1

El número Gódel de la secuencia (1,4, 5,1) es

[1,4, 5,1] = 21 • 34 • 55 • 71 = 3543750.

Es evidente que la función [ai, . . . , an] es recursiva primitiva, ya que se ob-tiene a partir de constructores y funciones que ya se han demostrado que lo son(multiplicación acotada, primo i-ésimo, exponenciación).

La numeración de Gódel satisface la propiedad de unicidad:

El resultado es una consecuencia inmediata de la factorización de naturalesen números primos, conocido a veces como el teorema de la factorización única oel teorema fundamental de la aritmética, que establece que la descomposición enfactores primos de números distintos siempre es distinta.

Sin embargo, hay que notar que

[ai , . . . , an] = [ai, . . . ,an,0]

debido a que (j?n+i)° = 1. Y lo mismo es cierto para cualquier secuencia finita deceros añadida al final de una lista. Por ello consideraremos como tupias idénticaslas resultantes de añadir ceros a su derecha.

En particular, ya que,

[0]-[0,0] = [0,0,0] = ...-!,

consideraremos todas estas tupias como la misma, y haremos que la codificaciónde la tupia vacía sea también 1.

Sin embargo, si se añade O a la izquierda de la lista, se obtiene una numeraciónde Gódel distinta de la original.

[ai, . . . ,an] = [ & i , . . . , &„] a¿ = 6¿, i = 1,... , n.

Page 122: Introduccion a la teoria de la computabilidad

5.1. NUMERACIÓN DE GÓDEL

5.1.2. Función de descodificación

Ahora definiremos una función primitiva recursiva (x)¿, que realice la desco-dificación de la numeración de Gódel. Dado un número natural queremos obtenerqué tupia está codificando.

Ejemplo 5.3

Informalmente, para descodificar un número Gódel sólo hay que hacer una des-composición en factores primos del número. Por ejemplo, supongamos el númerode Gódel 1125. Su descomposición en factores primos es

1125 = 3 2 -5 3 = 2° -3 2 -5 3 .

Por ello la tupia que está codificando es la tupia correspondiente a los exponentesde los números primos, a saber [0,2,3].

Lo que sigue es una formalización, utilizando funciones recursivas primitivas,de lo anterior.

Definición 5.2 Si x es el número de Gódel de la tupia (a i , . . . ,an),

x = [ai , . . . ,an],

entonces la función des codificadora de Gódel, que devuelve el elemento i-ésimo dela tupia codificada por x, (x)i = a¿, se define como

esto es, suponiendo la secuencia (pi)1, (p¿)2> • • • , (Pí) x , el primer valor t tal que(piY es divisor de x y (pi)i+l1 no.

121

Ejemplo 5.2

[2,3] = 22 • 33 = 108,

y

[2,3,0] = 2 2 - 3 3 - 5 ° = 108,

pero

[0,2,3] = 2 ° - 3 2 - 5 3 = 1125.

Page 123: Introduccion a la teoria de la computabilidad

122 CAPÍTULO 5. UN PROGRAMA UNIVERSAL

Ejemplo 5.4

Supongamos que x = 1125, entonces

(H25)i = O,

ya que 2° = 1 es divisor de 1125, pero 21 = 2 no lo es. De la misma forma,

(1125)2 = 2,

ya que 32 = 9 es divisor de 1125, pero 33 = 27 no lo es.Podemos comprobar que (x)i = O para todo i > 4. Por ejemplo, para i = 4,

(1125)4 - O,

ya que el único exponente que hace que el número primo 7 divida a 1125 es 0. Ylo mismo sucede para cualquier primo mayor de 7.

Definición 5.3 Podemos definir la longitud de una numeración de Gó'del comola función primitiva recursiva

esto es, el primer i tal que, a partir de ese valor se cumple que (ar)¿ = O para todoslos valores de i < x.

Podemos comprobar, pues, que Long

Ejemplo 5.5

Si x = 20 = 22 • 51 = [2,0,1], entonces Long(20) = 3, ya que (x) 3 = 1 y(ar)4 = (x) 5 = ... = (x)2Q = 0.

En el siguiente apartado, en el que definiremos la codificación de programas,será donde apliquemos estas técnicas de codificación.

5.2. Codificación de programas L

Vamos a definir cómo asociar a cada programa P del lenguaje L un número quelo codifique, que escribiremos como (#-P). Definiremos una función codificadoray un conjunto de funciones descodificadoras que nos permitan representar unprograma cualquiera mediante un número único, y extraer el programa a partir

Page 124: Introduccion a la teoria de la computabilidad

5.2. CODIFICACIÓN DE PROGRAMAS L 123

del número. La idea será definir una codificación para las instrucciones mediantela cual se asignen números distintos a instrucciones distintas. Una vez codificadaslas instrucciones representaremos un programa como una n-tupla que podremoscodificar utilizando la codificación de Gódel. Obviamente, sólo permitiremos lacodificación de programas en lenguaje L estricto, sin incluir macros.

5.2.1. Codificación de instrucciones

Comencemos definiendo cómo codificar instrucciones del lenguaje L. Recorde-mos algunos ejemplos de instrucciones de L:

(A] X++YZ*==

Definición 5.4 Vamos a ordenar como sigue todas las variables que pueden apare-cer en un programa:

Y X\ Z\ X2 Z2 X's Z% . . . .

También hacemos lo mismo con las etiquetas:

Al Bi Cl Dl Sl A2 B2 C2 D2 S2 ....

Escribimos #V, #L por la posición en la ordenación definida anteriormentede una variable o una etiqueta determinada, comenzando por el número 1.

Ejemplo 5.6

#y = 1, #X2 = 4, #Z = 3, #S = 5, #B2 = 7.

Definición 5.5 Sea I una instrucción (etiquetada o no) del lenguaje L. Defini-mos como su código, #/ a la siguiente expresión

#1 =< a, < 6, c »

donde

1. Si I no está etiquetada, entonces a = 0; si I tiene como etiqueta a L,entonces a = #L;

2. si la variable V aparece en I, entonces c = #V — 1;

B2 IF Z2 = 0 GOTO B3

Page 125: Introduccion a la teoria de la computabilidad

124 CAPÍTULO 5. UN PROGRAMA UNIVERSAL

3. si la instrucción en I es

V== o V++ o V--

entonces b = O o 1 o 2 respectivamente;

4- si la instrucción en I es

entonces

Ejemplo 5.7

• El número de la instrucción sin etiqueta X++ es

• el número de la instrucción

(A) X++

es

5.2.2. Codificación y descodificación de programas

Recordemos que un programa L es una lista finita de instrucciones. Podemosentonces convertir un programa en una lista finita de números naturales utilizandola codificación de instrucciones vista anteriormente. Y la codificación de una listade números mediante un número es inmediata con la codificación de Gódel.

< 1, < 1,11 > >=< 1,5 > =21.

< 0, < 1,1 > >=<0,5> =10,

IF V = 0 GOTO L'

Page 126: Introduccion a la teoria de la computabilidad

5.2. CODIFICACIÓN DE PROGRAMAS L 125

Codificación de programas

Definición 5.6 Representamos un programa P de longitud k que consiste en lasinstrucciones /i, J 2 , . . . , /¿ mediante la tupia (#/i, #/2> • • • , #4)- ^e esíe modo,podemos utilizar la numeración de Godel, para definir el número asociado al pro-grama, #P, de la forma que sigue

#P =[#/!, #/2,..., #/fc] -1.

El restar 1 a la codificación de Godel tiene por objeto que la codificación deprogramas comience por O, constituyendo una biyección completa con los natura-les.

Ya que los números de Godel tienden a ser muy grandes, incluso el númeroasociado a programas muy sencillos es enorme.

Ejemplo 5.8

Un programa muy sencillo:

(A) X ++

Este algoritmo computa una función indefinida para cualquier valor de entra-da. Veamos cuál es su número asociado. Si llamamos a sus dos instrucciones I\ e/2, sus números son

#/i =< 1,< 1,1 »=< 1,5>=21,#/2 =< O, < 3,1 »=< 0,23 >= 46.

Con lo que el número del programa es

#P= [21,46] -1 = 221 -34 6- l .

Hay que hacer notar que el número de la instrucción no etiquetada Y== es

< 0,< 0,0 »=<0,0 >=0.

Por ello, debido a la ambigüedad de la numeración de Godel referente a losnúmeros O situados al final de las listas, el número de un programa no cam-bia si la instrucción no etiquetada Y== se coloca al final. Evidentemente, estaambigüedad no provoca demasiados problemas, ya que el programa resultante,aunque más largo, computa la misma función. Sin embargo, nos interesa eliminaresta ambigüedad. Por ello añadiremos a la definición de programa en lenguaje

IF X = 0 GOTO A

Page 127: Introduccion a la teoria de la computabilidad

126 CAPÍTULO 5. UN PROGRAMA UNIVERSAL

L la estipulación de que no se permite que la instrucción final del programa seaY==.

Con esta última salvedad, cada número determina únicamente un programaP.

Ejemplo 5.9

Vamos a determinar el programa con número 199. Tenemos que

199 + 1 = 200 = 23 • 3° • 52 = [3, 0, 2].

Así, si #P = 199, P consiste en 3 instrucciones, la segunda de las cuales es Y==.En cuanto al resto de las instrucciones, tenemos que

3 =<2 ,0 >=<2,< 0,0 »2=<0 ,1 >=<0, < 1,0 »

Por lo que el programa es el siguiente

(B) Y==•\r==Y++

un programa no muy interesante que computa la función y = 1.Por último, hay que hacer notar que el programa vacío le asignamos el número

0.

Descodificación de programas

Aunque la descodificación de un programa es operativamente sencilla (desco-dificar el número de Gódel y descodificar cada una de las instrucciones) no lo estanto su definición formal. Necesitaremos definir para ello un conjunto de fun-ciones que proporcionarán información sobre la instrucción z'-ésima del programacodificado por el número #P.

Definición 5.7 Definimos las siguientes funciones

Etiq(i, #P) = número de orden de la etiqueta situada en la instruccióni-ésima del programa #P.

Var(i,#P) = orden de la variable situada en la instrucción i-ésima delprograma i£P.

Instr(i,j) = código de la instrucción i-ésima del programa i^P.

Etiq'(i,#P) = código de la etiqueta a la que se salta cuando la instruccióni-ésima del programa #P es una instrucción de salto (O en el caso en queno lo sea).

Page 128: Introduccion a la teoria de la computabilidad

5.2. CODIFICACIÓN DE PROGRAMAS L 127

Estas funciones son primitivas recursivas, y se definen de la siguiente manera,utilizando las funciones de descodificación de Godel y de pares de números.

Para entender cómo se construyen estas funciones, recordemos que una ins-trucción de un programa se codifica como < a, < 6, c », donde a es la etiquetade la instrucción y < 6, c > es el código a ejecutar (siendo c + 1 la variable de lainstrucción y 6 el tipo de instrucción a ejecutar).

Ejemplo 5.10

Si tenemos el programa #P = 221 • 346 — 1 que, como se recordará, codifica

(A) X++IF X T¿ O GOTO A

Veamos cuál es el valor de Etiq'(2, #P)

Etiq '(2,#P) = /(r(221 • 346)2)-2 = ¿(r(46))-2.

Ya que

46 =< O, 23 >=< O, < 3,1 »,

entonces

l(r(< O, < 3,1 »))-2 = 3-2 = 1,

lo que indica que la etiqueta a la que se salta en la segunda instrucción delprograma que estamos descodificando es precisamente A.

Además se cumple que los valores de las funciones definidas para distintosvalores de i son los siguientes

Etiq(l,#P) = l = ¿Etiq(2,#P) = 0Var(l,#P) = 2 = XInstr(l,#P) = l = V++Instr(2, #P) = 3 = IF V / O GOTO LEtiq'(l ,#P)=0Etiq ' (2,#P)- l = A

Etiq(i,#P)=l((y + l ) i )VoKt ,#P)=r ( r ( (y + l)¿)) + l/n5¿r(¿,#P)-/(r((y + l)¿))Etiql(i^P} = l(r((y + l}i}}-1

Page 129: Introduccion a la teoria de la computabilidad

128 CAPITULO 5. UN PROGRAMA UNIVERSAL

5.3. Codificación de ejecuciones de programas

Trataremos en este apartado la forma de codificar estados de ejecución deprogramas L y, utilizando esta codificación, definiremos la importante funciónInst que nos devolverá la codificación del estado de ejecución de un programacualquiera L después de haberle pasado unas determinadas variables de entraday de realizar n pasos de ejecución.

5.3.1. Codificación de instantáneas

Recordemos que una instantánea de ejecución de un programa L consiste enuna lista (¿,u;) donde la componente i representa el número de instrucción delprograma que está a punto de ser ejecutada y la componente u representa elestado del programa (valores de cada una de las variables).

Por ejemplo, la instantánea

(3,w = (X1 = 3, X2 = 0,Zi - 3, y = 2))

representa un estado en el que la instrucción 3 va a ser ejecutada con los valoresde las variables definidos por el estado o;.

Para representar el estado de un programa vamos a utilizar la siguiente codi-ficación.

Definición 5.8 Utilizando la ordenación de las variables que se definió para co-dificar los programas, determinamos la variable m-ésima tal que todas las queestán detrás de ellas tienen un valor 0. Construimos entonces el número de Godel[ai , . . . , om], donde a i , . . . , am son los valores de las variables con orden anterioro igual m. Ese número será el que codifique el estado del programa.

Ejemplo 5.11

El estado

(Y = Q,X1=2,X2 = 1)

se codifica con el número

[0,2,0,1] = 3-7 = 63,

ya que el valor de las variable Z\ y de todas las que se encuentran tras X<¿ es 0.

Hay que hacer notar que en la ordenación los valores situados en las posicionespares son los que corresponden a las variables de entrada.

Page 130: Introduccion a la teoria de la computabilidad

5.3. CODIFICACIÓN DE EJECUCIONES DE PROGRAMAS 129

Definición 5.9 Denotamos por Ó(x, z] un predicado que nos indica si el valor dela variable numero x es distinto de O en el estado codificado como z:

el valor de la variable x es distinto de O en el estado z.

Dada la codificación de Godel, este predicado será verdadero si y sólo si elnúmero primo i-ésimo es divisor de z

Ejemplo 5.12

En la codificación anterior, el valor de la variable 2 (X\) es distinto de O, yaque

VERDADERO.

Sin embargo, el valor de la variable 3 (Zi) es O, ya que

Una vez definida la forma de codificar estados de un determinado programa,es sencillo codificar instantáneas. Recordemos que una instantánea de un progra-ma se definía por un estado del programa y por una posición del contador delprograma, que indicaba el número de instrucción a ejecutarse.

Definición 5.10 Una descripción instantánea (¿,u;) se codifica por < i,z >,donde z es la codificación del estado uj construida según se ha comentado an-teriormente.

Ejemplo 5.13

La codificación de la descripción instantánea (2, (y = O, .Xi = 2,^2 = 1))sería

< 2, [0,2,0,1] >=< 2,63 >= 22(2 • 63 + 1)-1 = 507.

Page 131: Introduccion a la teoria de la computabilidad

130 CAPÍTULO 5. UN PROGRAMA UNIVERSAL

Definición 5.11 Abusando de la notación anterior, permitiremos que la función6 se aplique también a descripciones instantáneas. Así,

s1 i el valor de la variable x en la instantánea codificada por 5 / 00 si el valor de la variable x en la instantánea codificada por 5 = 0

La implementación de S(x, s) como función primitiva recursiva es

Ejemplo 5.14

Utilizando la codificación de la instantánea anterior, 5, podemos comprobarsi la variable X% es distinta de O en 5

VERDADERO

5.3.2. La función Inst

Vamos a definir una serie de predicados que nos van a indicar, para un pro-grama #P y una descripción instantánea 5 =< i,z > qué clase de acción se va arealizar a continuación.

Comencemos definiendo una función que computa el estado inicial de un pro-grama, que a partir de los valores de entrada # i , . . . , £ n calcula el código delestado inicial < 1, [O, #1 ,0 , . . . , O,x ]>.

Definición 5.12 Definimos la función Inic(x\,... ,xn) que devuelve la descrip-ción instantánea inicial a partir de los valores de entrada xi,... ,xn:

Vamos ahora a definir las funciones que van a simular los pasos de ejecuciónde un programa. Recordemos que la definición de la semántica de L hace posiblesimular el comportamiento de un programa con sólo cuatro tipos de acciones (yla acción FINAL que hace que el programa termine):

Page 132: Introduccion a la teoria de la computabilidad

5.3. CODIFICACIÓN DE EJECUCIONES DE PROGRAMAS 131

SKIP

INCDEC

SALTO

FINAL

Incrementa el contador de instrucción sin cambiar el valor de lasvariablesIncrementa el valor de una variable y el del contador de instrucciónDecrementa el valor de una variable e incrementa el contador deinstrucciónAsigna un nuevo valor de instrucción al contador de instrucciónsin cambiar el valor de las variablesAsigna al contador de instrucción el valor / 4-1 siendo / la longituddel programa

Recordemos también que las condiciones en las que se realiza cada una de lasacciones anteriores son las siguientes:

SKIP

INCDECSALTO

La instrucción a ejecutar es V==La instrucción a ejecutar es IF V ^ O GOTO L y el valor de lavariable V es OLa instrucción a ejecutar es V— y el valor de la variable V es OLa instrucción a ejecutar es V++La instrucción a ejecutar es V— y el valor de V es mayor que OLa instrucción a ejecutar es IF V / O GOTO L, el valor de lavariable V es 7^ O y existe una línea de programa etiquetada conL

Definición 5.13Construimos la función Suc(s, #P) que, para el programa númeroT^P y la descripción instantánea s, nos da la siguiente descripción instantánea,mediante la siguiente definición por casos:

Estos predicados son recursivos primitivos, siendo las funciones que los imple-mentan las siguientes:

en otro caso

Page 133: Introduccion a la teoria de la computabilidad

Ejemplo 5.15

Sea el programa

(A) X--y++

y llamemos #P a su código.La descripición instantánea inicial, para X = 3 se calcula con la función Inic(3)

y es < 1,27 >.Vamos ahora a calcular cuál sería la codificación de la instantánea resultante

de ejecutar un paso en el programa #P, mediante la función

Suc(< 1,27>,#P).

Al estar la función Suc definida por casos, debemos comprobar qué predicado(SKIP,INC,DEC o SALTO) el verdadero. En esta ocasión, para la descripcióninstantánea < 1,27 >, el predicado verdadero es DEC, ya que se cumple que

Instr(l ,#P)=2,

esto es, el código de la instrucción es 2 (decrementar) y

o sea, la variable que hay en la primera instrucción de P es la variable 2 (X) y elvalor de esta variable es distinto de O en la instantánea actual.

Entonces, la función a ejecutar es

que, con los valores actuales, se convierte en

=< 2, [27/P2\ >=< 2, [27/3J >=< 2,9 >.

De esta forma, la siguiente descripción instantánea define que el programa Pse encuentra a punto de ejecutar la instrucción 2 y que su estado es

Podemos ya definir una función recursiva primitiva que nos devuelva la co-dificación de la descripción instantánea producida por un programa #P con nvariables de entrada x\,..., xn después de t pasos.

9 = [0,2] = #(y = 0,A- = 2).

132 CAPÍTULO 5. UN PROGRAMAUNIVERSAL

IF X = 0 GOTO A

Page 134: Introduccion a la teoria de la computabilidad

5.4. EL PROGRAMA UNIVERSAL

Definición 5.14 Sea función Inst(xi, . . . ,xn, #P, t] que devuelve la codificaciónde la descripción instantánea de #P con las variables de entrada x\, . . . , #„ des-pués de t pasos de ejecución. Su definición como función recursiva primitiva,utilizando la recursión, es la siguiente.

La función Inst comienza a calcularse en el estado inicial y va aplicando ite-rativamente la función Suc hasta que se llega al número de pasos deseado.

5.4. El programa universal

En este apartado veremos uno de los resultados más importantes de la teoría dela computabilidad. Comprobaremos que existe un programa C7n, que llamaremosprograma universal de orden n que es capaz de computar todas las funcionesL-computables de orden n. Para ello, este programa funcionará de una formasimilar a un interprete, tendrá n + 1 argumentos, siendo el último de ellos elnúmero asociado a un programa P a simular, y los n primeros los n parámetrosque se pasarán como argumentos al programa P.

Antes de llegar a definir este programa universal, demostraremos que es posibledefinir el predicado computable

que será cierto si el programa número #P se detiene antes o en t pasos de ejecucióncon las entradas #1, . . . , xn. Dicho de otra forma, el predicado será cierto cuandoexista una computación de longitud menor o igual a t + 1 del programa númerocon las entradas x\, . . . , xn.

5.4.1. El predicado PASOS

Teorema 5.1 Sea el predicado PASOS(x\, . . . , #n, #P, t) <^ existe una computa-ción de longitud < t + 1 del programa #P con las entradas xi, . . . , xn, con n > 0.El predicado PASOS es primitivo recursivo.

DemostraciónLa idea para construir dicho predicado primitivo recursivo será utilizar la

función Inst que calcula la descripción instantánea después de t pasos de ejecucióny comprobar si ésta se trata de una descripción instantánea final.

Definición 5.15 Definimos el predicado FINAL(s,#P) que será cierto sólo enlos casos en que s represente un descripción instantánea final del programa codi-ficado por iJ^P:

133

/ns¿(zi,.. . ,£n ,#P,0) = Mc(xi,...,xn)Inst(xi,... ,En,#P, t + 1) = Suc(Inst(xi,... ,xn, #P,t), #P)

PASOS(rci , . . . ,ajn ,#P,í)

Page 135: Introduccion a la teoria de la computabilidad

134 CAPÍTULO 5. UN PROGRAMAUNIVERSAL

Definición 5.16 Definimos el predicado PASOS(xi,..., xn, #P, í) como

que, evidentemente, es recursivo primitivo y, por tanto, computable total.

5.4.2. El programa universal

En el apartado anterior hemos podido comprobar que el predicado PASOSes recursivo primitivo. Por ello podemos asegurar que existe un programa de Lque, dados x\,..., xn un número t y el código #P de un programa es capaz dedecidir si el programa #P se detiene antes de t pasos con las entradas #1 , . . . , xn.Este programa daría como resultado O o 1 y, al ser la función computable total,se detendría para cualquier entrada.

Vamos ahora a construir un programa algo más complejo, que será una de lasclaves de la teoría de computabilidad.

Definición 5.17 Llamaremos programa universal Un, a un programa que rea-lizará una simulación de cualquier programa #P. Dados x\,...,xn y el códigode programa #P, Un simulará el comportamiento del programa codificado por #Pactuando sobre los valores de entrada x\,..., xn y, si #P realiza una computaciónsobre estos valores y devuelve un valor y de salida, ese mismo y es devuelto porUn.

Más formalmente, vamos a definir la función universalque computaría este programa Un como sigue:

Esto es, si P devuelve un número para ciertos valores de entrada, O devolveráel mismo, y si P entra en un bucle infinito,

El siguiente teorema servirá como marco de toda la construcción

Teorema 5.2 Para todo n > O, la función Q(#i , . . . , xn, #P) es L-computable.

Page 136: Introduccion a la teoria de la computabilidad

5.4. EL PROGRAMA UNIVERSAL 135

Figura 5.1: El programa universal C7n, que computa

DemostraciónComprobaremos este teorema mostrando cómo construir, para todo n > O ,

el programa Un que computa la función O. De esta forma, tendremos, para todon > O ,

El programa C7n funcionará de una forma muy similar a la de un intérprete.De forma parecida a cómo se ha mostrado en el apartado anterior, mantendremosen una variable las diferentes descripciones instantáneas por las que va pasando elprograma #P y, mediante la función Inst se irán simulando los pasos de ejecucióndel programa.

En la figura 5.1 se encuentra especificado el programa Un que computa lafunción Í7. Vamos a comentarlo instrucción a instrucción.

El programa tiene como variable de entrada Xn+\ el código del programa Pa simular y como variables X±, . . . , Xn los datos de entrada del programa P.

La primera instrucción

Z<-Inic(Xi,. . . ,Xn)

asigna a Z la codificación de la instantánea inicial del programa P. Esta instan-tánea se codifica por < 1, [O, -X"i, O , . . . , O , X n ] >.

En la siguiente instrucción de C/n,

(A) IF FINAL(Z, Xn+í) GOTO B

nos encontramos con el punto de entrada al bucle en el que se va a simular elfuncionamiento de P. Si la instantánea actual de P es una instantánea final,el programa saltará a la etiqueta B. En caso contrario ejecutará las siguientesinstrucciones

Z2++Z^-Inst(Xi, . . . ,Xn ,Xn + i ,Z2)GOTO A

Z^Inicpf!,..., Jín)(A) IF FINAL(Z,Xn+1) GOTO B

Z2++Z<^lnst(X1,...,XníXn+1,Z2)GOTO A

(B) y<- ( r (Z)h

Page 137: Introduccion a la teoria de la computabilidad

136 CAPÍTULO 5. UN PROGRAMA UNIVERSAL

Estas instrucciones representan el núcleo de la simulación de P. La variableZ2 representa el número de pasos de ejecución que llevamos simulados y la uti-lizamos como último argumento de la llamada a la función Inst, que asigna a Z lacodificación de la descripción instantánea de P (Xn+i) después de Z<¿ pasos. Des-pués se salta al comienzo del bucle donde se comprobará si Z es una instantáneaterminal.

La última línea del programa se alcanza cuando se ha llegado a una instantá-nea terminal de P. En ella se actualiza el valor de la variable de salida y, con elvalor correspondiente a la salida de P, que es el valor de la primera componentedel estado de su instantánea terminal

(5) y<-(r (z)h

Por todo lo anterior, si P devuelve un número y con las entradas X\, . . . , Xn elprograma Un devolverá ese número y, y si P se cuelga con esas entradas, tambiénlo hará el programa Un.

Teorema 5.3 Las funciones L-computables son numerables.

DemostraciónUtilizando el teorema demostrado, podemos comprobar que para todo n, la

secuencia

enumera todas las funciones L-computables de n variables, por lo que podemosafirmar que estas funciones son numerables.

Definición 5.18 Utilizaremos también como notación de la función universal lasiguiente

5.5. Problemas

1. Calcular el número de los programas ejemplo 3.1 y 3.2 del capítulo 3.

Page 138: Introduccion a la teoria de la computabilidad

5.5. PROBLEMAS 137

2. Encontrar los programas P cuyos códigos son 575, 1028 y 1327103.

3. Calcular #P para el siguiente programa:

Z + +(C) IF X2 ¿ O GOTO A

IF Z ± O GOTO S(A) IF Xi ¿ O GOTO B

IF Z ¿ O GOTO A(B) Xi--

X2--IF Z T¿ O GOTO C

4. Para cada fc > 1, sea P'k el programa:

(C) Z, + +

Demostrar que el predicado P(x) <& x es el código de un programa de lafamilia anterior, es recursivo primitivo.

5. Calcular los valores del predicado PASOSA1) (2, y, 8) para los códigos y cal-culados en el ejercicio 1.

6. Demostrar que la siguiente función es recursiva primitiva:Ref(v, #P) = Número de veces que se referencia la variable de código v enel programa #P.

7. Demostrar que la siguiente función es L-computable:Referencia(xi,..., xn, #P, v) = Número de veces que se referencia la va-riable de código v en durante la ejecución del programa #P, cuando se lepasan las variables #1, . . . , xn como valores de entrada.

8. Probar que el siguiente predicado es:

a] Recursivo primitivo.

b) L-computable.

Q(#P) <^> El programa de código #P contiene al menos una instrucciónZ 4- + (con o sin etiqueta).

Page 139: Introduccion a la teoria de la computabilidad

9. Sea la función:Nvar(xi,...,xn,#P,t) = Número de variables con valor distinto de O, des-pués de t pasos de computación, del programa #P con las entradas #1,..., xn.Demostrar que Nvar es recursiva primitiva.

10. Demostrar que la siguiente función es L—computable:

si la ejecución del programa #Ppasa por la instrucción ¿-ésimaen otro caso

11. Demostrar que la siguiente función es recursiva primitiva:VALOR(v, y, í, xi, • • • , xn) = valor de la variable de código v en el progra-ma y después de t pasos de computación cuando éste recibe las entradasX\ = #1, • • • , Xn — xn.

12. Sea P el programa que computa la función f(x\, ...,#„), y supongamosque para alguna función recursiva primitiva g(x\,...,xn] se cumple quePASOSA (x\, ...,£n, #P,g(xi, ...,#n)) es cierto para todo x\, ...,xn.Demostrar que /(#i, ...,^n) es recursiva primitiva.

13. Demostrar que para cada w, existen infinitos números distintos v tales quepara todo x,

14. a) Sea

Demostrar que H\(x] es L-computable parcial.

b) Sea A = {ai,..., an} un conjunto finito tal que O(a¿, a¿) =f parasea

en otro caso

Demostrar que H^x) es L-computable parcial.

c] Construir un conjunto infinito B tal que O(6,6) =t para todo 6 G B ytal que

PasaPor(xi,...,Xn,#P,i) —1

138 CAPÍTULO 5. UN PROGRAMA UNIVERSAL

Page 140: Introduccion a la teoria de la computabilidad

5.5. PROBLEMAS 139

sea L-computable parcial.

15. Siguiendo el modelo dado en la sección de Teoría, dar otras dos versionesdel Programa Universal:

a) Utilizando la función Suc

b) Utilizando el predicado PASOS.

16. Demostrar que la función

es L-computable parcial, pero que la función

no lo es.

Page 141: Introduccion a la teoria de la computabilidad

This page intentionally left blank

Page 142: Introduccion a la teoria de la computabilidad

Capítulo 6

Decidibilidad e indecidibilidad

Veremos en este capítulo unos importantes resultados sobre las limitaciones dellenguaje de programación L y, siguiendo la Tesis de Church, de cualquier procesoalgorítimico. Comenzaremos con la definición de un par de problemas indecidibles(irresolubles) y demostraremos la no existencia de una función L-computable quelos resuelva.

A continuación definiremos unas clases de conjuntos, los conjuntos recursivosy los recursivamente enumerables, y se demostrarán unas propiedades de dichasclases de conjuntos. Veremos que los conjuntos recursivamente enumerables es-tán peor definidos que los conjuntos recursivos, en el sentido de que es posibleidentificar a los números que pertenecen a ellos, pero no los que no pertenecen.

Por último, demostraremos la existencia de conjuntos de naturales que no sonni recursivos y ni recursivamente enumerables.

6.1. El problema de la parada

En esta sección se trata el primer ejemplo de problema indecidible, el problemade la parada, un problema clásico que ya planteó Turing en su artículo sobrecomputación de 1936.

Definición 6.1 Definamos el predicado HALT(x,y) de la siguiente forma. Paraun cierto y, sea P el programa tal que #P = y. Entonces HALT(x, y) es cierto sityp (x) está definida y es falso si ^p(x] está indefinida. En una sola línea,

HALT(x,y) ^ el programa número y se detiene con la entrada x

Si este predicado fuera computable, esto es, si existiera un programa en Lque lo computara para cualquier x e y, tendríamos la "piedra filosofal" de lasmatemáticas, ya que sería posible comprobar cualquier teorema existente. Porejemplo, consideremos la afirmación de que cualquier número par > 4 es la sumade dos números primos. Esta afirmación, conocida como la conjetura de Goldbach

Page 143: Introduccion a la teoria de la computabilidad

142 CAPÍTULO 6. DECIDIBILIDAD E INDECIDIBILIDAD

claramente es cierta para números pares pequeños: 4 = 2 + 2,6 = 3 + 3, 8 =5 + 3, etc. Sin embargo, la conjetura sigue abierta; después de más de 250 años,nadie ha conseguido demostrarla. Sin embargo, si tuviéramos ,el programa quecomputa el predicado HALT, sería sencillo demostrarla. Para ello sólo tendríamosque construir un programa P que buscara un contraejemplo a la conjetura, esto es,un número par > 4 que no sea la suma de dos primos y chequear con el predicadoHALT si dicho programa se detiene.

El programa P sería el siguiente. Primero construiríamos el predicado NO-SUMA-DE-PRIMOS(n)

y utilizando el predicado podríamos construir el programa P

Si fuera cierto HALT(x,#P) entonces la conjetura de Goldbach sería falsa.Veremos, sin embargo, que no es posible computar el predicado HALT.

Teorema 6.1 HALT(x,y) no es un predicado computable.

DemostraciónSupongamos que HALT(x, y) fuera computable. Entonces podríamos construir

el siguiente programa P:

(A} IF HALT(X, X] GOTO A

O sea, P tomaría el valor de la variable de entrada (x) y comprobaría si elprograma cuyo número es x se detiene al computar el valor x. En el caso deque fuera así, el programa entraría en un bucle infinito y nunca terminaría. Sinembargo, en el caso de que el programa x no se detuviera con el valor x, elprograma P finalizaría.

Más formalmente:

Veamos ahora cómo generar una contradicción a partir de este programa. Sea#P = yo e intentemos aplicar el predicado HALT al mismo programa P. De laforma en que P está definido, se cumple para todo x

Page 144: Introduccion a la teoria de la computabilidad

6.2. EL CASTOR AFANOSO 143

Ya que esta expresión es cierta para todo valor de x, podemos hacer x = yo:

Y esta es la contradicción a la que queríamos llegar.

Este teorema nos proporciona un primer ejemplo de una función total biendefinida (dados x e y, el programa número y o bien terminará con la entrada x obien no lo hará) que no es computable por ningún programa escrito en L.

Más aún, si utilizamos aquíla Tesis de Church, podemos afirmar que

No existe ningún algoritmo que, dado un programa de L y una entradaal programa, pueda determinar si el programa dado se detendrá enalgún momento con la entrada dada.

6.2. El castor afanoso

Veamos ahora una función que, estando perfectamente definida, no va a poderser computada. Primero definiremos el problema del castor afanoso, y despuésdemostraremos que no es posible computar la función correspondiente a este pro-blema.

Denotemos por /& a la función constante

/(*) =k

que, para cualquier valor de entrada, devuelve el número k. En el capítulo 2vimos cómo construir el programa P que computa esta función fk que ignora laentrada x y siempre devuelve el número k. La forma más sencilla de hacerlo eraconstruyendo un programa lineal con k instrucciones que incrementan la variablede salida que inicialmente tiene de valor 0:

Esta forma de construir la función //, hace que la longitud del programa P sea lamisma que el número k generado por la función. Así, el programa que computa /itendrá únicamente una línea, mientras que el programa que computa /IQOOO tendría10000 líneas. ¿Sería posible construir programas más cortos que computaran lafunción f? Quizá, para números k pequeños, este tipo de programa es el óptimo,sin embargo no sucede lo mismo para números grandes.

k líneas

r++y++

y++

Page 145: Introduccion a la teoria de la computabilidad

144 CAPÍTULO 6. DECIDIBILIDAD E INDECIDIBILIDAD

Por ejemplo, consideremos el siguiente programa

Este programa tiene 10 instrucciones, y computa la función /Q. Lo hace de unaforma sencilla: las primeras tres instrucciones inicializan la variable Z\ a 3, y lassiete instrucciones siguientes asignan dos veces ese valor a la variable Y. Para 10instrucciones este no es el programa que devuelve un número k mayor, ya que elprograma que realiza 10 veces la instrucción Y++ ya devuelve un número mayorque 6. Sin embargo, a partir de 15 instrucciones esta estrategia vence al programalineal, ya que se pueden utilizar las primeras 8 instrucciones para inicializar lavariable Z\ a 8 y el resto de instrucciones para doblar ese valor y colocarlo enla variable de salida, obteniendo como resultado Y = 16. Mientras, el programalineal sólo conseguiría devolver el valor Y = 15.

Conforme disponemos de más instrucciones, podemos utilizar más técnicaspara aumentar el valor inicial calculado en las primeras instrucciones. Por ejemplo,una forma de computar la función constante /IQOOO sería utilizar el programalineal que computa /ioo (longitud 100), guardar este valor en una variable auxiliar(longitud 13) y multiplicar ambas variables (longitud 61), con lo que la longitudtotal del programa sería de 174 líneas.

¿Es esta la máxima función constante que se puede calcular con un programade 174 líneas? ¿O bien existe otro programa de 174 líneas que calcule la funciónconstante /&, siendo k > 10000?

Esta pregunta nos lleva directamente al problema del castor afanoso: dado unnúmero n de instrucciones en las que no aparecen variables de entrada ¿cuál es lamayor función /& que se puede computar con esas n instrucciones?. O, lo que esigual, de todos los programas de longitud n que se pueden construir sin utilizarvariables de entrada, cuál es el que computa la mayor función ^p(x] — k?.

Definiendo el problema en forma de función

Definición 6.2 Para cualquier n, el valor de la función castor afanoso, S(n); esel mayor valor que puede almacenarse en la variable Y en alguna computación deun programa de longitud n.

Zl++^1++Zl++

(A) y++z2++Zi--IF Zi 7^ O GOTO 4

(5) y++£2--IF Z2 / O GOTO 5

Page 146: Introduccion a la teoria de la computabilidad

6.2. EL CASTOR AFANOSO 145

Ejemplo 6.1

Por ejemplo, S(l) es, evidentemente, 1, ya que la mayor función constanteque se puede computar con programas de una única instrucción es /i. También sepuede asegurar que S(2) = 2, S(3) = 3 y que, como hemos visto antes, £(15) > 16y S(174) > 10000.

Definición 6.3 Al programa P de longitud n que computa /s(n)? esto es, al quecomputa la mayor función constante que se puede implementar con n instruc-ciones, se le denomina el castor afanoso de longitud n.

Vamos a demostrar que la función S(n) no es computable, ya que no va aser posible construir un programa P que la compute. Dicho de otra forma, dadoun número n de instrucciones no es posible determinar cuál es la mayor funciónconstante que se puede implementar utilizando esas n instrucciones.

Lema 6.1 Para todo n,

DemostraciónSupongamos que S(n) = p y sea P el castor afanoso de longitud n. Podemos

construir entonces a partir de P el programa P« añadiéndole a P la instrucción

De esta forma la longitud de P« es n + 1, y el valor que tiene Y al finalizar lacomputación es p + 1 con lo que

Lema 6.2 Si P es un programa de longitud k que computa una función cualquierag(x], entonces para todo x se cumple que

DemostraciónPara esta demostración usamos la técnica que vimos en la introducción: las

primeras x líneas del programa computan Z •= #, y después se aplica la función/ a la variable Z. Supongamos por ejemplo la función g(x) — 2rc, y supongamosque la longitud del programa P que la computa es de k. Debemos demostrar que

Y++.

Page 147: Introduccion a la teoria de la computabilidad

146 CAPÍTULO 6. DECIDIBILIDAD E INDECIDIBILIDAD

para cualquier valor de #, el valor computado por el castor afanoso de longitudx + k es mayor o igual que 2x. Se demuestra fácilmente considerando el siguienteprograma P«

Este programa lo hemos construido colocando al comienzo de P x instruccionesZ++. La salida de P« siempre será g(x), por lo que, ya que la longitud de P« esx + fc, se cumple que

Teorema 6.2 No existe ningún programa P que compute la función S.

DemostraciónVamos a demostrar el teorema por reducción al absurdo. Supondremos que la

función es computable y utilizaremos el programa que la computa para terminarllegando a una contradicción.

Supongamos que la función S es computable. Tomemos también la función2x que hemos demostrado en un capítulo anterior que también lo es. Entonces lafunción

también es computable, al ser una composición de las funciones anteriores. Estafunción devolvería, para una determinada entrada x, el valor calculado por elcastor afanoso de longitud 2x. Supongamos que este programa P que computag(x) tiene una longitud k. Aplicando el lema 6.2 a g(x), obtenemos que, para todox se cumple que

ya que, como vimos en la demostración del lema, podemos construir para cualquiervalor £ y a partir del programa P un programa P« que utilice las x primerasinstrucciones para computar Y = x y después ejecute sobre esa variable Y elprograma P obteniendo el valor Y =

x líneas

P

y++Y++

y++

Page 148: Introduccion a la teoria de la computabilidad

6.3. CONJUNTOS DECIDIBLES E INDECIDIBLES 147

En concreto, para el caso de x = k + 1 obtenemos que

por lo que

esto es, hemos construido un programa con 1k + 1 instrucciones que consigue unvalor de Y mayor o igual que el castor afanoso de longitud 2k + 2, lo que está encontradicción con el lema 6.1, según el cual se debería demostrar que

con lo que hemos llegado a una contradicción y la suposición inicial debe ser falsa.

6.3. Conjuntos decidibles e indecidibles

Vamos ahora a formalizar los conceptos de decidibilidad e indecidibilidad me-diante conjuntos y programas en lenguaje L. Hasta ahora hemos utilizado ellenguaje L para definir funciones sobre números naturales. Veremos cómo utilizardos tipos de programas en lenguaje L: procedimientos de decisión, que definen losconjuntos recursivos y procedimientos de semidecisión, que definen los conjuntosrecursivamente enumerables (r.e.). Los primeros permiten definir perfectamentelos conjuntos, de forma que, ante un natural, devuelven un 1 cuando el númeropertenece al conjunto y un O cuando no. Los segundos sólo permiten semidecidirqué elementos pertenecen al conjunto ya que son programas que sólo se detienencuando el número que se les pasa como entrada es un número que pertenece alconjunto, pero entran en un bucle infinito cuando no.

Demostraremos que cualquier conjunto recursivo es también r.e., y (lo másimportante) que existen conjuntos que son r.e. y no son recursivos (esto es, sólopueden semidecidirse) y que existen conjuntos que ni siquiera son r.e. (conjuntosde naturales para los que ni siquiera es posible definir un algoritmo de semide-cisión).

6.3.1. Conjuntos recursivos

Para empezar recordemos que, como vimos en el capítulo de introducción,existe una equivalencia entre predicados y conjuntos. Allívimos que un predicadodefinía precisamente el conjunto de números para los que el predicado es cierto.Por ejemplo, el predicado Primo(x) define precisamente el conjunto de númerosprimos.

Page 149: Introduccion a la teoria de la computabilidad

148 CAPÍTULO 6. DECIDIBILIDAD E INDECIDIBILIDAD

Definición 6.4 Diremos que un conjunto B es recursivo f recursivo primitivo jcuando la función característica del conjunto (el predicado que devuelve 1 paratodos los elementos que pertenecen a él y O para los que no) es L-computable total(recursiva primitiva).

Por ejemplo, el conjunto de números primos es un conjunto recursivo primitivo,ya que su función característica lo es.

Dicho de otra forma, un conjunto B es recursivo cuando existe un programaP que implementa su función característica. Esto es, para todos aquellos x £ B elprograma P devolverá como salida 1, y para aquellos x ^ B devolverá 0. A esteprograma P que implementa la función característica de B lo denominaremosprocedimiento de decisión de B.

Teorema 6.3 Sean los conjuntos A y B conjuntos recursivos (recursivos primi-tivos) entonces los siguientes conjuntos también lo son: A U B, A D B, A.

Demostración

6.3.2. Conjuntos recursivamente enumerables

Vamos ahora a definir el importante concepto de conjunto recursivamenteenumerable. Este es un concepto más débil que el concepto anterior de conjuntorecursivo, en el sentido de que todos los conjuntos recursivos serán conjuntos re-cursivamente enumerables (también llamados conjuntos r.e.), pero además existenalgunos conjuntos r.e que no son recursivos.

Definición 6.5 Un conjunto B C N se denomina recursivamente enumerable(r.e.) si existe una función L-computable g(x) que esté definida únicamente paraaquellos números naturales que pertenecen a B:

Page 150: Introduccion a la teoria de la computabilidad

6.3. CONJUNTOS DECIDIBLES E INDECIDIBLES 149

Esto es, un conjunto es recursivamente enumerable cuando es el dominio deuna función L-computable.

El programa P que computa la función g será un programa que devolverá unresultado para algunos valores de entrada, y que se colgará para otros valores.Entonces, el conjunto B será aquel conjunto de valores para los que el programano se queda colgado. Por ello, podemos pensar en P como un algoritmo con elque determinar la pertenencia de un número a 5, de forma que, para aquellosnúmeros que pertenezcan a B el programa, al terminar, dará una respuesta "si",pero para aquellos números que no pertenezcan a B el programa no terminanunca. A este tipo de algoritmos se les denomina procedimientos de semidecisión,ya que permiten definir de forma parcial el conjunto B (podemos saber cuándo unelemento pertenece a B pero no cuando no pertenece). Veremos más adelante quecualquier conjunto recursivo es también r.e. pero (y esto es lo más importante)que existen conjuntos r.e. para los que no es posible definir un procedimiento dedecisión (no son recursivos).

Los conjuntos r.e. no recursivos son conjuntos, en cierta manera, semidefinidos.Mediante los procedimientos de semidecisión que los caracterizan se puede sabercuáles son sus elementos, pero no qué elementos se quedan fuera de ellos. Veremosque una de las características fundamentales de un conjunto r.e. no recursivo esque no es posible conocer su conjunto complementario.

Ejemplo 6.2

Veamos un ejemplo de conjunto r.e.

Definición 6.6 Sea el conjunto NO_ VACÍO el conjunto de codificaciones deprogramas que se detienen para algún número de entrada,

Ejemplo 6.3

Por ejemplo, el número 22 — 1 = 3 codifica al programa

que se detiene se cual sea el valor de la variable de entrada que se le pase. Porello, 3 e NO_VACíO.

Sin embargo, el número 221 • 346 — 1 recordemos que codificaba al programa

Este programa P se cuelga para cualquier número de entrada, por lo que

Y++

(A) X +++IF X = 0 GOTO A

Page 151: Introduccion a la teoria de la computabilidad

150 CAPÍTULO 6. DECIDIBILIDAD E INDECIDIBILIDAD

Teorema 6.4 El conjunto NO_ VACÍO es r.e.

DemostraciónPara demostrar que NO_VACíO es r.e. construiremos, utilizando el predi-

cado PASOS, un programa de semidecisión que, para un número de entrada xdecida si el programa codificado por este numero se detiene para algún valor deentrada:

Como se puede comprobar, el programa va comprobando todas las posiblescombinaciones de número de pasos y números de entrada sobre el programa co-dificado x (P). Así, si existe algún número k con el que P se detiene después de /pasos, el programa anterior también se detendrá en el momento en que Z\ = k yZ2 = l.

A continuación demostraremos una serie de teoremas sobre conjuntos r.e., quenos servirán para caracterizarlos mejor.

6.3.3. Conjuntos recursivos y recursivamente enumerables

Vamos a demostrar en este apartado un par de teoremas que relacionan losconjuntos recursivos con los r.e.

Teorema 6.5 Si B es un conjunto recursivo, entonces B es r.e.

DemostraciónSi B es un conjunto recursivo, entonces su función característica es L-computable

total. Consideremos el siguiente programa P

Al ser L-computable total la función característica de B, el programa anteriorse puede expandir a un programa de L, teniendo dicho programa la característicade terminar cuando la variable de entrada pertenece a B y de entrar en un bucleinfinito cuando la entrada no pertece a B. Entonces, si llamamos h(x) a la funcióncomputada por este programa, claramente podemos definir B como sigue,

(A) IF PASOSA,X, Z2) GOTO 5Zi++IF Zl < Z<¿ GOTO AZ2++Zi <-0GOTO ^

Page 152: Introduccion a la teoria de la computabilidad

6.3. CONJUNTOS DECIDIBLES E INDECIDIBLES 151

con lo que demostramos que B es r.e. ya que h(x) es L-computable.

Si B y B son ambos r.e. tenemos entonces una pareja de algoritmos que termi-narán en el caso de operar sobre una entrada que pertenezca o no, respectivamente,a B. Podemos entonces pensar en combinar estos dos algoritmos para obtener unúnico algoritmo conclusivo para cualquier entrada que nos dirá si un determina-do número pertenece o no a B. Este algoritmo podría funcionar "ejecutando enparalelo" ambos algoritmos hasta que uno de los dos termine. Este método decombinar algoritmos se denomina dovetailing, y el predicado PASOS nos permiteutilizarlo de una forma rigurosa.

Teorema 6.6 El conjunto B es recursivo si y sólo si B y B son ambos r.e.

DemostraciónSi B es recursivo entonces B también lo es, por lo que, aplicando el teorema

anterior, ambos son r.e.La demostración de la doble implicación en el otro sentido es un poco más

elaborada. Si B y B son r.e., existen dos funciones L-computables g y h quecumplen que

Llamemos P al programa que computa g y Q al que computa h. Sean entoncesp = #P y q = #Q. Entonces el siguiente programa computa B (esto es, computasu función característica).

(A) IF PASOSpT,p, Z) GOTO BIF PASOSpf,g,Z) GOTO 5Z++GOTO A

(B} Y++

El programa anterior va comprobando, para cualquier número de pasos deejecución, qué procedimento de semidecisión (P o Q} termina con la entrada x.Alguno debe terminar, ya que P semidecide B y Q semidecide B. Si termina P,entonces el programa devuelve I (x G B) saltando a la línea B. Si termina Q,entonces el programa devuelve 0.

Page 153: Introduccion a la teoria de la computabilidad

152 CAPÍTULO 6. DECIDIBILIDAD E INDECIDIBILIDAD

Teorema 6.7 Si B y C son conjuntos r.e. también lo son

Sean

donde g y h son funciones L-computables.

A partir de estas funciones podemos construir el siguiente programa P:

P concluirá únicamente en aquellos casos en que g(x) y h(x) estén definidos.Por ello, si llamamos / a la función computada por P,

por lo que B n C es también r.e.

Para obtener el mismo resultado para B U C debemos usar de nuevo el métododel dovetailing. Sean P y Q los programas que computan, respectivamente, lasfunciones g y h (esto es, P y Q son los procedimientos de semidecisión de -B y Crespectivamente), y sean p y q los códigos de tales programas. Podemos entoncesdefinir el siguiente programa

que terminará si y sólo si alguno de los programas P o Q se detienen con el valorde^.

Si llamamos k a la función computada por el programa anterior, entoncespodemos afirmar que k(x) está definida en los casos en los que o bien g(x) o bienh(x) están definidas. Por ello,

(A) IF PASOS(X,p,Z) GOTO 5IF PASOSA, q,Z] GOTO 5Z++GOTO A

Page 154: Introduccion a la teoria de la computabilidad

6.3. CONJUNTOS DECIDIBLES E INDECIDIBLES 153

6.3.4. Conjuntos recursivanaente enumerables y funciones

Vamos a demostrar en este apartado dos teoremas que relacionan los conjuntosr.e. con las funciones recursivas y con las funciones L-computables.

Teorema 6.8 Sea un conjunto B r.e. no vacío. Entonces existe una función re-cursiva primitiva f ( n ) tal que B = {/(n) | n E N} = {/(O), /(I), /(2),...}. Estoes, B es la imagen de f .

DemostraciónPor ser B r.e. existe un procedimiento de semidecisión P que se detiene para

todo elemento de B y entra en un bucle infinito para todo elemento que no esde B. Sea XQ un elemento fijo de B (por ejemplo, el menor). Podemos definirentonces la función recursiva primitiva / que enumera B de la siguiente forma,

Esto es, dado un determinado n que se le pasa de entrada a /, esta función lodescompone en su parte izquierda y su parte derecha. De esta forma obtiene dosnúmeros, l(n) y r(n), que siempre van a ser distintos para valores distintos de n.Una vez obtenidos dichos valores, se comprueba si el programa P se detiene enr(n) pasos de ejecución con la entrada /(n). En dicho caso se devuelve l(n) y encaso contrario se devuelve XQ.

Esta función / es recursiva primitiva, al estar definida por casos. Todos losvalores devueltos por f ( n ] , para cualquier valor n de entrada, pertenencen a £?,ya que XQ pertenece automáticamente a B y si PASOS(/(n), #P, r(n)) es ciertosignifica que el programa P se detiene con el número /(n) en r(n) pasos de eje-cución, por lo que, al ser P el procedimiento de semidecisión de 5, significa quel(n) pertenece a B.

De forma inversa, si x G B, entonces el procedimiento de semidecisión P sedetendrá con x en algún número de pasos ÍQ? por 1° que PASOS(cc, #P, ¿o) serácierto para algún ÍQ. Por ello,

/(< x,tQ >) = /(< x,tQ >) = a?,

por lo que x = f ( n ) para n =< X,ÍQ >.

/(«) =l(n) si PASOS(/(n), #P, r(n))XQ en otro caso

Page 155: Introduccion a la teoria de la computabilidad

154 CAPÍTULO 6. DECIDIBILIDAD E INDECIDIBILIDAD

Teorema 6.9 Sea f ( x ) un función L-computable, y sea B = {f(x} \ f(x] =\}.(Esto es, B es la imagen de f . ) Entonces B es r.e.

DemostraciónEsto es, tenemos una función / que sabemos devuelve, siempre que esté defini-

da, un valor de B, y que todos los valores de B son devueltos por esa función paraalgún valor de entrada (algo parecido al teorema anterior, pero entoces la funciónera recursiva primitiva y ahora la función es L-computable). Suponemos tambiénque, al ser / L-computable, existe un programa P que la computa.

Tenemos que demostrar que, en estas condiciones, B es r.e. Para ello necesita-mos encontrar un procedimiento de semidecisión que se detenga para todo x G By que entre en un bucle infinito para todo x £ B. Vamos a construir el siguienteprograma, a partir del código del programa P,

Si se hace una traza de este programa, se comprobará que las variables lo-cales Z\ y Z<¿ sirven para generar todas las posibles combinaciones de númerosde entrada al programa P y pasos de ejecución. De esta manera, el programava comprobando todas las posibles combinaciones (Zi,Z>¿) para buscar aquellosnúmeros de entrada con los que el programa P se detienen. Estos números seránprecisamente aquellos x para los que la función / está definida. Cada vez que seencuentra a uno de estos números se llama a la función / usándolo como argu-mento, y se comprueba si el valor devuelto por la función coincide con el valor dela variable X de entrada. Si es así, el procedimiento se detiene, significando queel valor de la variable X pertenece a B; si no es asíse prueban más combinaciones(Zi.Zz)1.

Hay que hacer notar que en el programa la expansión de la macro Z% «— f(Z\)sólo será ejecutada cuando prueba del contador de pasos ha garantizado que elvalor de / está definido para Z\.

1Este método es muy similar al utilizado en el capítulo de máquinas de Turing para demostrarque un lenguajes es r.e. si y sólo si es generable.

(A) IF -.PASOS(Zi, #P, Z2) GOTO BZ3 <- /(Zi)IF Z3 = X GOTO 5

(5) ^i++IF Zi < Z2 GOTO AZ2++Zi <-0GOTO A

Page 156: Introduccion a la teoria de la computabilidad

6.4. CONJUNTOS NO RECURSIVOS 155

Como resumen de estos teoremas vistos, podemos asegurar el siguiente teore-ma

Teorema 6.10 Para cualquier conjunto B / 0 las siguientes afirmaciones sonequivalentes:

B es r.e.B es la imagen de una función recursiva primitiva;B es la imagen de una función L-computable.

DemostraciónPara demostrar que las afirmaciones anteriores son equivalentes, podemos de-

mostrar que 1) —> 2) —> 3) y cerrar el círculo demostrando que 3) —>• 1).Por el teorema 6.8 se cumple que 1) —>• 2). La implicación 2) —>• 3) es inmediata.

Y por el teorema 6.9 se demuestra la implicación 3) —> 1).

Es por esto último por lo que estos conjuntos reciben el nombre de recursi-vamente enumerables, ya que para cada uno de ellos existe una función recursiva(denominación histórica equivalente a L-computable) que enumera sus elementos.

6.4. Conjuntos no recursivos

En este apartado vamos a demostrar que existen conjuntos que, siendo r.e.,no son recursivos.

6.4.1. El conjunto K

Definición 6.7 Sea un número n que representa un código de programa. Defini-mos el conjunto Wn de la siguiente manera

Esto es, Wn es el conjunto r.e. correspondiente al programa cuyo código esn. Recordemos que Í7(x, n) nos devuelve el valor de salida del programa n con laentrada x, por lo que Wn representa todos aquellos valores de entrada x para losque el programa n se detiene.

Al definir Wn es posible realizar una enumeración de todos los conjuntosrecursivamente enumerables ya que la función $7(ar, n) enumera todos los posiblesprogramas de L.

De esta forma, la lista que enumera todos los conjuntos r.e. es la siguiente

Page 157: Introduccion a la teoria de la computabilidad

156 CAPÍTULO 6. DECIDIBILIDAD E INDECIDIBILIDAD

Definición 6.8 Asociado a Wn podemos definir el conjunto K de aquellos códi-gos de programa n que representan programas que cumplen la condición de dete-nerse cuando se les pasa el propio código n como entrada:

K = {n G TV n e Wn}.

Ejemplo 6.4

Por ejemplo, el número 210 — 1 pertenece a K, ya que codifica el programa

X++

que es un programa que se detiene para cualquier entrada (y, por lo tanto,también se detiene para X = 210 — 1).

Sin embargo, el número 222 • 393 — 1 no pertenece a K, ya que codifica elprograma

X--(A) IF X ¿ O GOTO A

que sólo se detiene con los números O e 1, por lo que no se detiene con su propiocódigo (222 • 393 - 1).

Teorema 6.11 El conjunto K es r.e.

DemostraciónYa que hemos definido K como {n £ N Í7(n, n) =|}, y í)(n, n) es una función

L-computable , entonces K es claramente r.e. Podríamos también demostrar queK es r.e. mediante el siguiente procedimiento de semidecisión

(A) IF PASOSpí, X, Z) GOTO 5Z++GOTO A

con el que se comprueba si el programa codificado por el número X se detiene encierto número de pasos con la entrada X. Este programa se detendrá con aquellosX E K, pero entrará en un bucle infinito con el resto, por lo que constituye unprocedimiento de semidecisión de K, demostrando que este conjunto es r.e.

L = (Wi,W2 ,W3 , . . .).

Page 158: Introduccion a la teoria de la computabilidad

6.5. CONJUNTOS NO RECURSIVAMENTE ENUMERABLES 157

Teorema 6.12 El conjunto K no es recursivo.

Para demostrar que K no es recursivo, haremos una reducción al absurdo yllegaremos a una contradicción. Supongamos que K es recursivo, esto es, que paracualquier número n podemos saber si el programa n se detiene con la entrada no si no lo hace.

Entonces, por el teorema 6.6, K, definido como

también lo será y, por el mismo teorema , este conjunto será entonces r.e. O sea,que existirá un valor i para el que se cumpla que

esto es, un programa codificado por i que se detiene con todos aquellos númerosque no pertenecen a K.

Veamos qué sucede cuando nos preguntamos si el natural i E K:

o, dicho con palabras, i pertenece al conjunto K si y sólo si, por definición, i nose detiene con el programa i. Pero al ser i el programa que semidecide K llegamosa la contradicción de que i ^ K.

Hemos demostrado entonces que únicamente es posible decidir si un deter-minado número n es aceptado por el programa codificado con n, sin poder de-cidir la cuestión contraria de si un determinado programa n se cuelga con laentrada número n. Esta es otra demostración de que el predicado HALT no esL-computable total.

6.5. Conjuntos no recursivamente enumerables

Existen conjuntos que ni siquiera son r.e., o sea, ni siquiera es posible semide-cidir qué elementos pertenecen a ellos.

6.5.1. El conjunto K

Teorema 6.13 El conjunto K definido como

no es r.e.

K = Wi,

Page 159: Introduccion a la teoria de la computabilidad

158 CAPÍTULO 6. DECIDIBILIDAD E INDECIDIBILIDAD

DemostraciónPor el teorema 6.6 si K fuera r.e., al ser K y K r.e. entonces K sería recursivo,

lo que está en contradicción con lo demostrado anteriormente.

6.5.2. El conjunto TOT

Definición 6.9 Sea TOT el conjunto de todos los números x que codifican pro-gramas que se detienen para todos los números naturales. Formalmente

Los números que pertenecen a TOT codifican programas que definen funcionesL-computables totales.

Ejemplo 6.5

Ejemplos de números que pertenecen a TOT son:

• ^(CUADRADO), el código del programa que computa la función x2,

• #(INC-3), el código del programa que computa la función x + 3.

Teorema 6.14 TOT no es r.e.

Demostración.Supongamos que TOT sea r.e. Ya que TOT ^ 0, por el teorema 6.8 existe

una función recursiva primitiva g(x] tal que TOT = {g(0), (7(1),g(2),. . .}. Sea

h(x] = Ü(x,g(x}} + 1.

Esto es, para un x determinado, h(x) devuelve el resultado de sumar 1 al valor delprograma g(;r)-esimo de TOT con la entrada x. Supongamos que x es el númerok. Para calcular el valor h(k}, deberemos calcular primero g(k], lo cual nos dará elfc-ésimo valor de TOT; supongamos que este valor es /. Ahora debemos calcularfí(fc, /) + 1, el valor devuelto por el programa /-ésimo cuando se le pasa el valor k.

Ya que / E TOT, / es el número de un programa que computa una funcióntotal, por lo que £l(k,g(x)) =| para todo k,x y por ello h(x) =\, para todo x.Llamaremos Ph al programa que computa la función /i,

TOT={x\Wx = N}

Page 160: Introduccion a la teoria de la computabilidad

6.6. REDUCCIÓN 159

Sea p el número del programa P^. Por ser /i una función L-computable total,p e TOT, por lo que p = g(i) para algún i. Entonces

h(i) = £ l ( i , g ( i ) ) + 1 por definición de ^= í í(¿,p)+¿ yaquep = ^(¿)= /i(¿) + 1 ya que ^ es computada por P^

con lo que hemos llegado a una contradicción, y la suposición original no puedeser cierta.

Siguiendo la Tesis de Church, los teoremas anteriores implican que no existeningún algoritmo que nos permita determinar si el código de un programa #P(y, por extensión, el propio programa P) es un programa que no se detiene consu propio código (en el caso de K) o computa una función total, o, lo que es lomismo, se detiene para cualquier entrada (en el caso de TOT).

6.6. Reducción

Una vez que un conjunto C se ha demostrado que no es recursivo (r.e.) pode-mos usar ese conjunto para demostrar que otros conjuntos no son tampoco recur-sivos (r.e.) mediante el método de la reducción de conjuntos.

Definición 6.10 Sean los conjuntos A y B. Decimos que A es reducible a B,escrito A < B , si existe una función L-computable total f tal que

O sea, existe una función L-computable total f que transforma elementos x €A en elementos y e B y elementos x £ A en elementos y ^ B. Esto es,

Ejemplo 6.6

Z^g(X)Y <-ÍÍ(X,Z)Y++

A = {x | f (x) E B }.

Page 161: Introduccion a la teoria de la computabilidad

160 CAPÍTULO 6. DECIDIBILIDAD E INDECIDIBILIDAD

Por ejemplo, dado los conjuntos PARES e IMPARES es claro que PARES< IMPARES, ya que existe una función computable total que reduce el primerconjunto al segundo, la función x + 1. Un número x es par si y sólo si x + 1 esimpar.

La importancia de la reducción es que nos proporciona un método adicionalde comprobar si un número pertence al conjunto A. Si A < B, entonces paradecidir si x 6 A, podemos computar f(x] y comprobar si f ( x ) £ B.

Por ello podemos dar también la siguiente interpretación: si A < B entoncesun supuesto algoritmo para decidir (semidecidir) si un número 6 B permitiríadecidir (semidecidir) si un número € A.

De esta forma, podemos decir que chequear la pertenencia a A es "no másdifícil que" chequear la pertenencia a B. Con el siguiente teorema formalizaremosesta proporsición.

Teorema 6.15 Supongamos que A < B mediante la función f .

1. Si B es recursivo, entonces A es recursivo.

2. Si B es r.e., entonces A es r.e.

Demostración

1. Sea A — {x \ f ( x ) € -B}, donde / es computable total, y sea PB(X] lafunción característica de B. Entonces el conjunto A se puede expresar como

donde PB(/(#)) es la función que permite saber si un número x pertenece ono a A. Esto es debido a que, por ser A < B, para saber si un determinadox pertenece a A podemos aplicarle la función de reducción / y comprobarsi el resultado f ( x ) pertenece a B. El siguiente programa implementa estafunción característica.

2. Ahora supongamos que B es r.e. Entonces, B = {x \ g(x] =|} para al-guna función L-computable <?, y A = {x \ g(f(x}} =\}. Pero g(f(x)) esL-computable, por lo que A es r.e. (por el mismo programa de antes).

A = {x PB(f(x))},

Z / f(X)Y / f(XZ

Page 162: Introduccion a la teoria de la computabilidad

6.6. REDUCCIÓN

La importancia del teorema anterior consiste en que lo utilizaremos comométodo de demostración de la no recursividad de conjuntos. Si A < B y A no esrecursivo (r.e.), entonces B tampoco es recursivo (respectivamente r.e.).

Vamos a explicar un poco más esto último. Por definición, si A < B podemoscomprobar la pertenencia de un elemento x transformando éste en un elemento ymediante la función / y comprobando la pertenencia de y a B. Supongamos que Ano fuera recursivo y -B si que lo fuera (siendo P su función característica). Entoncesse daría el absurdo de que podríamos demostrar que A síes recursivo medianteel programa P visto en el teorema. P implementa una función computable quedevuelve 1 cuando x E A y O cuando x ^ A, por lo que estaríamos computandola función característica de A, con lo que A sería recursivo (contradicción con laproposición inicial que dice que A no es recursivo).

Exactamente el mismo argumento se puede utilizar para explicar cómo seutiliza el teorema para demostrar que un conjunto no es r.e.

Como reglas rápidas:

1. Para demostrar que un conjunto C no es recursivo debemos encontrar algúnconjunto no recursivo (K por ejemplo) y demostrar que K < C.

2. Para demostrar que un conjunto C no es r.e., debemos encontrar algúnconjunto no r.e. (K por ejemplo) y demostrar que K < C

Definición 6.11 A = B denota que A < B y B < A.

En general, si demostramos que A = B estamos demostrando que comprobarla pertencia de un elemento a A "tiene la misma dificultad" que comprobar lapertenencia a B.

Veremos a continuación ejemplos de aplicación de la reducción a distintosconjuntos.

6.6.1. El conjunto K0 no es recursivo

Definición 6.12 Definimos KQ de la siguiente forma

Como se ve, es una definición más general que K. A K pertenecían aquellosnúmeros naturales x que cumplían que el programa x-ésimo se detenía con laentrada x; sin embargo, a KQ pertenecen aquellas codificaciones < x, y > tal queel programa í/-ésimo se detiene con la entrada x.

Teorema 6.16 El conjunto KQ no es recursivo

161

Page 163: Introduccion a la teoria de la computabilidad

162 CAPÍTULO 6. DECIDIBILIDAD E INDECIDIBILIDAD

DemostraciónPara hacer esta demostración reduciremos el conjunto K (no recursivo) a KQ,

esto es, construiremos una función / tal que

En este caso la función / es inmediata: x € K si y sólo si < x,x >G KQ yla función f ( x ) =< x,x > es computable. Podemos comprobar fácilmente que, siKQ fuera computable por el predicado PKO ? entonces K sería computable por

ya que

Esto contradice la demostración de que K no es recursivo.

Sin embargo, el conjunto KQ sí que es r.e. (para una demostración ver elproblema 6.4). Estos es, para un determinado número natural n existe un pro-cedimiento de semidecisión que reconoce aquellos números que codifican pares denúmeros tales que su parte izquierda se detenga con su parte derecha.

Al igual que demostramos con K, al ser KQ no recursivo, se demuestra queKQ no es r.e., ya que si lo fuera, entonces KQ sería recursivo, por el teorema 6.6.Esto es, dado un número de entrada x y un programa P no es posible decidir siP va a entrar en un bucle infinito con la entrada x.

6.6.2. El conjunto NO_VACíO no es recursivo

La demostración de que NO_ VACÍO es r.e. la vimos en un apartado anterior.Vamos a demostrar ahora que no es recursivo.

Teorema 6.17 El conjunto NO VACÍO no es recursivo

DemostraciónDemostraremos que K < NO_VACíO. Al ser K un conjunto no recursivo,

y encontrar una función /(n) que transforma elementos de K en elementos deNO_VACíO, estaremos demostrando que resolver NO_VACíO es, al menos,tan difícil como resolver K, o sea, que NO VACÍO no es recursivo.

Z X, X >Z PKo (Z)

Page 164: Introduccion a la teoria de la computabilidad

6.6. REDUCCIÓN 163

Recordemos que un número x pertenece a K cuando ese número codifica unprograma que se detiene cuando recibe la entrada x. A partir de este tipo denúmeros debemos obtener números que pertenezcan a NO_VACíO, esto es,números que codifiquen programas que se detengan ante alguna entrada.

Para ello veamos que es posible construir a partir de cualquier número n unprograma Pn que se detenga para algún número de entrada (#Pn pertenece aNO_VACÍO) si y sólo si n G K. El programa Pn es el siguiente

Este programa Pn ignora cualquier valor de entrada X y comprueba si elprograma n se detiene con la entrada n. Si esto es así entonces el programa Pn sedetendrá a su vez para cualquier número de entrada (#Pn E NO_VACíO). Alcontrario, si el programa no se detiene para la entrada n entonces el programa Pn

no se detendrá a su vez para ningún número de entrada (#Pn ^ NO_VACíO).La función /(n) queda entonces definida de la siguiente forma

f(n] = #Pn,

o sea, que a partir de cualquier número natural n debe devolver el código delprograma Pn construido de la forma vista anteriormente. Esta función sería re-cursiva primitiva, ya que, para cualquier número n existe un único programa Pn

asociado, y su código se podría obtener algorítmicamente. A pesar de ser recursivaprimitiva, la implementación de esta función / está, por su complejidad, más alládel objetivo de este apartado. Baste reconocer que, intuitivamente, se trata deuna función recursiva primitiva.

Así, mediante esta función / podemos convertir números que pertenecen a Ken números que pertenecen a NO_VACíO, y números que no pertenecen a Ken números que no pertenecen a NO_VACíO, por lo que K < NO_VACíO yNO VACíO no es recursivo.

Como explicación adicional, comprobemos que caso de existir un predicado re-cursivo que implementara la función característica de NO_VACíO y reconocieracódigos de programas que aceptan algún número, entonces podríamos reconocerde forma recursiva el conjunto K.

Llamaremos PNO VACÍO a 1a función característica del predicado NO_ VACíO.Utilizando la función / planteada anteriormente, podemos implementar el siguien-te programa

z <- f(x)y <- ^NO_VACÍO(•£)

Z ̂ ny ^-íí(z,z)

Page 165: Introduccion a la teoria de la computabilidad

164 CAPÍTULO 6. DECIDIBILIDAD E INDECIDIBILIDAD

que sirve como implementación de PK- La función /, convierte el número de entra-da x en el código de su programa Px asociado. Como veíamos en la demostraciónanterior, Px está construido de forma que

Así, el programa anterior estará implementando precisamente la función caracte-rística de K de forma recursiva, cosa que hemos demostrado que es imposible.

6.6.3. El conjunto VACÍO no es r.e.

Definición 6.13 Sea el conjunto VACÍO

esto es, el conjunto de codificaciones de programas que no se detienen para ningunaentrada.

Vamos a demostrar por reducción que este conjunto no es r.e.

Teorema 6.18 El conjunto VACÍO no es r.e.

DemostraciónDemostraremos que K < VACíO. Al ser K un conjunto no r.e., y encontrar

una función que transforma elementos de K en elementos de VACíO, estaremosdemostrando que la dificultad del resolver VACÍO es, al menos, tan difícil comola de resolver K, o sea, que VACíO no es r.e.

Al igual que en el teorema anterior, debemos encontrar una función / quetransforme elementos de K (codificaciones < x, y > donde x no es aceptado porel programa y} en elementos de VACíO (codificaciones de programas que noaceptan ninguna entrada).

La forma de implementar / es idéntica a la utilizada en la demostración an-terior. Para todo n es posible definir el programa siguiente programa Pn

Es fácil observar que Pn se detiene para cualquier número si y sólo si n repre-senta un código de programa tal que se detiene con n. Por ello, la función / seimplementa como una función que devuelve el código del programa Pn asídefinido.De esta forma podemos ver que

por lo que

Z ^ nY <- 0(Z, Z)

K < VACíO.

VACíO = {x Wx = 0},

Page 166: Introduccion a la teoria de la computabilidad

6.6. REDUCCIÓN 165

6.6.4. El conjunto FINITO no es r.e.

Como último ejemplo en el que seguiremos el esquema del teorema de Rice,demostraremos que el conjunto FINITO tampoco es r.e.

Definición 6.14 Definimos FINITO como

FINITO = {x 6 N \ Wx es finito},

es un conjunto no r.e. El conjunto FINITO, asídefinido, está formado por aque-llos códigos de programas que se detienen con un número finito de números.

Teorema 6.19 El conjunto FINITO no es r.e.

DemostraciónVolveremos a utilizar el conjunto K como conjunto no r.e. que reduciremos a

FINITO. Para demostrar que K < FINITO debemos encontrar una función /que transforme elementos de K en elementos de bFINITO (códigos de programasque se detienen para un conjunto finito de números).

Consideremos un conjunto finito cualquiera, por ejemplo A = {0,1,2,3}. Elsiguiente programa Pn se detendrá para un conjunto finito de números (A) si ysólo si n G K.

IF X = O GOTO SIF X = I GOTO SIF X = 2 GOTO SIF X = 3 GOTO S

Si n E K el programa Pn se detendrá únicamente para las entradas x E{0,1,2,3}, con lo que W#pn será un conjunto finito y #Pn e FINITO. Sinembargo, si n ^ K entonces n E K, por lo que, para cualquier entrada, el programaPn se detendrá y W#pn = N, un conjunto infinito, por lo que #Pn ^ FINITO.Así,

por lo que la función / que buscamos y que demuestra la reducción es la quedevuelve, a partir de un número n, el código del programa Pn definido arriba. Asídemostramos que

K < FINITO.

Z¬ nY ¬ W(Z,z)

Page 167: Introduccion a la teoria de la computabilidad

166 CAPÍTULO 6. DECIDIBILIDAD E INDECIDIBILIDAD

6.7. Teorema de Rice

El Teorema de Rice nos va a dar un importante resultado general sobre larecursividad de conjuntos asociados a codificaciones de programas.

Recordemos que la lista

en la que W¿ es el conjunto de números para los que el programa i se detiene,es una lista que enumera todos los conjuntos r.e. Supongamos ahora que estamosinteresados en construir un programa que escoja todos aquellos conjuntos r.e. quecumplan una propiedad determinada, por ejemplo contener únicamente númerosprimos. Este conjunto se podría definir como

Para que fuera posible construir este programa deberíamos demostrar queeste conjunto es recursivo, esto es, construir un programa que, dado un número xdecidiera si el conjunto W^ está formado únicamente por números primos.

Pues bien, el teorema de Rice nos permite afirmar que tal algoritmo es im-posible de construir, y que todos los conjuntos definidos como

C = {x | Wx cumple una determinada propiedad }

son conjuntos no recursivos. O, utilizando un lenguaje más técnico, cualquierpropiedad no trivial de los conjuntos r.e. es indecidible.

Definición 6.15 Definimos como propiedad no trivial de un conjunto r.e. a unpredicado P que nos permite separar la lista L en dos conjuntos, ambos no vacíos,un conjunto con los códigos de programa x tal que W^ cumple P, y otro con elresto.

Ejemplo 6.7

Un ejemplo de propiedad no trivial podría ser la propiedad de no ser vacío,de forma que se puede construir un conjunto C y C ambos con algún elemento.

C estaría definido como aquellos códigos de programa que se detienen conalgún número natural

que, evidentemente, tiene algún elemento. Por ejemplo, 199 € C, ya que 199codifica un programa que se detiene para cualquier valor de entrada.

El conjunto complementario C estaría definido como

L = (Wi,W2 , . . .) ,

Page 168: Introduccion a la teoria de la computabilidad

6.7. TEOREMA DE RICE

esto es, el conjunto de codificaciones de programas que no se detienen para ningúnvalor de entrada. Por ejemplo, 221 • 346 — 1 6 C, siendo este número la codificaciónde un programa de dos instrucciones que implementa un bucle infinito.

El Teorema de Rice generaliza los resultados vistos hasta ahora. Recordemosque todos los ejemplos anteriores (VACÍO, NO_VACíO, TOT, FINITO) sonconjuntos definidos a partir de propiedades no triviales de los conjuntos r.e. Elteorema de Rice asegura que cualquiera de estas propiedades es indecidible, es-to es, que los conjuntos asociados a estas propiedades son todos ellos no recur-sivos. La demostración sigue un esquema similar a las demostraciones anteriores,construyendo una función / que, para cualquier conjunto C definido por unapropiedad no trivial P, permita comprobar que K < C.

Teorema 6.20 (Teorema de Rice) Cualquier propiedad no trivial de los conjuntosr.e. es indecidible.

DemostraciónSupongamos que los programas que no se detienen con ningún número no

cumplen la propiedad P. Ya que la propiedad P no es trivial, existirá un conjuntoW& que cumple la propiedad P y, por tanto, que pertenece a C. Sea /& entoncesla función computada por el programa #P = k correspondiente a este conjuntoW¿¡. Entonces podemos construir el siguiente programa Pn a partir de un númeron

Dado un número n, si n € K entonces el programa Pn anterior no se colgaráen la línea 2, y ejecutará el programa fc, con lo que el conjunto de números paralos que se detiene Pn cumplirán la propiedad P, ya que es el mismo conjunto denúmeros para los que se detiene el programa k. Por otra parte, si n £ K, entoncesPn entrará en un bucle infinito en la línea 2, con lo que no se detendrá para ningúnnúmero de entrada. Hemos supuesto que no cumple P, por lo que el código deeste programa no pertenece a C.

Así, como queríamos demostrar,

167

Z ^nY <-$l(Z,Z)Y <- fk(X)

Page 169: Introduccion a la teoria de la computabilidad

168 CAPÍTULO 6. DECIDIBILIDAD E INDECIDIBILIDAD

Por ello,

K < C

y el conjunto C no es recursivo

6.8. Problemas

1. Demostrar por reducción al absurdo que HALT(x,a?) no es L-computabletotal.

2. Demostrar que el conjunto PARCIAL= {ra E N Wm ^ N} no es recursi-vamente enumerable.

3. Sea el predicado HALT1 (x) definido como HALT1 (x) <£> HALT(l(x),r(x)}.Demostrar por reducción al absurdo que HALT1(^) no es L-computable to-tal.

4. Sea el predicado P(x) •&• nx(x) — 1- Demostrar que P(x) no es L-computabletotal.

5. Demostrar que B = {x 6 N \ ^/x =4-} es un conjunto recursivo.

6. Una tupia (ai,...,on) es palíndroma cuando [ai,...,an] = [on,...,ai]. De-mostrar que el conjunto

B = {x E N | x es el número de Gódel de una tupia palíndroma }

es un conjunto recursivo.

7. Sea KQ = {{x, y) x E Wy}. Demostrar que KQ es r.e.

8. Demostrar que el conjunto A = {x \ Wx D Wx+i =¿ 0} es recursivamenteenumerable.

Page 170: Introduccion a la teoria de la computabilidad

6.8. PROBLEMAS 169

9. Demostrar que el siguiente conjunto C es recursivamente enumerable.

10. Demostrar que el siguiente conjunto A es recursivamente enumerable.

A = {x | Wxcontiene más de un número}

11. Sean /, g, h tres funciones L-computables totales. Demostrar que el conjun-to A = {x \ f ( x ) e Wg(x) U Wh(x] } es r.e.

12. Sean dos conjuntos A, B. Demostrar si son ciertas las siguientes proposi-ciones:

a] Si A U B es r.e. entonces A y B son ambos r.e.

b) Si A C B y B es r.e. entonces A es r.e.

13. Sea B un subconjunto de Nm, m > 1. Decimos que B es r.e. si existe algunafunción <7(#i, ...,xn) L-computable tal que

Demostrar que B es r.e. si y solo si B' es r.e.

14. Sea A

a) Demostrar que A es r.e.

6) Demostrar que A no es recursivo.

15. Sean A, B conjuntos de números naturales. Demostrar que:

a) A< A

b) A < B si y solo si ~Á < ~B.

16. Para todo n, sea An = {x n G Wx}

a) Demostrar que A{ es r.e. pero no recursivo para todo ¿.

6) Demostrar que AÍ = Aj para todo i,j.

17. Sea INF= {x£N\Wxes infinito }. Demostrar que INF = TOTAL.

Sea

Page 171: Introduccion a la teoria de la computabilidad

170 CAPÍTULO 6. DECIDIBILIDAD E INDECIDIBILIDAD

18. Demostrar que no existe ningún algoritmo para determinar, dado un pro-grama P de L, si ^fp(x) = x2 para todo x.

19. Demostrar que no existe ningún algoritmo para determinar de cualquierpareja de números u,v si f l ( x , u ) = Ct(x,v) para todo x. (Es decir, si u y vson los códigos de dos programas que calculan la misma función).

20. Demostrar que el conjunto B — {n e N Wn = {2,5} } no es r.e.

Page 172: Introduccion a la teoria de la computabilidad

Apéndice A

Soluciones

A.l. Preliminares

1. Determinar si las siguientes expresiones son verdaderas falsas:

a) 0 C 0.

b] 0 G 0 .

c} 0E{0}.

d) 0C{0}.

e] {2,4} 6 {2,4, {2,4}}.

/) {{2,4}} e P ({2,4, {2,4}}).

Solución:

a) Verdadera

b) Falsa

c) Verdadera

d) Verdadera (0 es subconjunto de cualquier conjunto)

e) Verdadera

/) Verdadera (puesto que P({2,4, {2,4}}) ={0, {2}, {4}, {{2,4}}, {2,4}, {2, {2,4}}, {4, {2,4}}, {2,4, {2,4}}}

2. Calcular las siguientes expresiones:

a) (0U{1,3 ,5})H0.

b] {2,4, {2,4}}-{2,4}.

Page 173: Introduccion a la teoria de la computabilidad

172 APÉNDICE A. SOLUCIONES

c) {{!,2},0,{4,5},{l}}nP({l,2}).

d) U({l,2},{3,4},({!,3,5,7}-0)).

e) P({l,2})nP(0).

Solución:

a) 0

6) {{2,4}}

c) {0, {!},{!, 2}}

d) {1,2,3,4,5,7}

e) P ({1, 2}) n P (0) = {0, {!}, {2}, {1,2}} n {0} = {0}

3. Contestar las siguientes preguntas:

a) Existe algún conjunto A tal que | P(A) = 48?

6) SiA = {a}. Quién es P(P(A))1

Solución:

a) Puesto que | P(A) \= 2^', se cumple que P(A) tiene2° = 1, 21 = 2, 22 = 4, 23 = 8, 24 = 16, 25 = 32, 26 = 64, •elementos según que A tenga 0,1,2, 3,4, 5, 6, • • • elementos.Luego no existe ningún conjunto A tal que P(A) \ = 48.

b) P(A) = Conjunto formado por todos los subconjuntos de A

= {0,W>P(P(A)) = Conjunto formado por todos los subconjuntos de P(A)

= U {0}, {MI, {0,MH

4. Demostrar, utilizando el método de inducción, que para todo número naturaln > 1 se verifica que:

Solución:

Caso base: La igualdad se cumple para n — 1 de forma obvia pues sería1 - 1 • 2/2.

Page 174: Introduccion a la teoria de la computabilidad

A.l. PRELIMINARES 173

Hipótesis de inducción: Suponemos cierto que para n = k se cumple la igual-

dad:

Paso de inducción: Hay que probar entonces que la igualdad también secumple para n = k + 1 :

5. Un palíndromo puede definirse como una cadena que se lee igual hacia de-lante y hacia atrás, o si y sólo si cumple las siguientes propiedades:Pl: A es palíndroma.P2: Si | a =1 entonces a es palíndromo.P3: Si a es cualquier símbolo y a es palíndroma, entonces acta es palíndro-ma.Demostrar por inducción que las dos definiciones son equivalentes.

Solución:Def.l: w — ai • • • an es palíndroma si ai • • • an — an • • • ai.Def.2: w es palíndroma si se obtiene a partir de Pl, P2, P3.(Hay que probar que Def.l => Def.2, y que Def.2 =¿> Def.l. Se demostraránambas por inducción sobre n = w\ = long(w) > 1, pues el caso n = O esinmediato por ser A (palabra vacía) paíndroma según ambas definiciones).

Def.l => Def.2 (hay que probar que si w es palíndroma según Def. 1, entoncesw es palíndroma según Def.2).

• Caso base: Si w, de longitud = 1, es palíndroma según Def.l =^ w espalíndroma según Def.2 por aplicación de P2.

• Hipótesis de inducción: Suponemos cierto que toda palabra de longitud< k que sea palíndroma según Def.l, lo es según Def.2.

• Paso de inducción: Sea w = ai • • • a^+i palíndroma según Def.l =$•ai ... a/b+i = afc+i ...a\^a\= a^+i, y a2 . . . a¿ = a^ . . . a2.La subpalabra a = a% ... a& — a j ~ . . . a^ es palíndroma según Def.l =>(por la hipótesis de inducción) a = a^ ... a¿. es palíndroma según Def.2.Llamando a = ai = a^+i, tenemos que w = aaa, siendo a palíndromasegún Def.2 =¿> (aplicando P3) w es palíndroma según Def.2.

Def.2 =>• Def.l (hay que probar que si w es palíndroma según Def.2, entoncesw es palíndroma según Def.l).

• Caso base: Si w, de longitud = 1, es palíndroma según Def.2, entoncesobviamente es palíndroma según Def.l (se lee igual hacia adelante quehacia atrás).

Page 175: Introduccion a la teoria de la computabilidad

174 APÉNDICE A. SOLUCIONES

Hipótesis de inducción: Suponemos cierto que toda palabra de longitud< k que sea palíndroma según Def.2, lo es según Def.l.

Paso de inducción: Si w = ai ... a^+i es palíndroma según Def.2 =^> wes de la forma w — aaa => ai = a, a = «2 • • • o-ki ak+i — ai siendo apalíndroma según Def.2.Por la hipótesis de inducción tendremos que a es palíndroma segúnDef.l => a — 0,2 • • • dk — ak • • • °2 => (p°r ser a\ = a = a,k+i) w =aitt2 . . . a^dk+i — ük+ia-k • • • Q"¿a\ ̂ w es palíndroma según Def.l.

6. Demostrar que el conjunto Z de todos los enteros: . . . — 2, —1, O, 1, 2 , . . . ,es numerable. Hacerlo de las dos formas siguientes:

a) Encontrando una disposición de todos los números de Z en una listaaceptable.

b) Definiendo una función, expresada de forma matemática, de Z+ =N - {0} en Z.

Solución:

a) Podemos formar la lista: O, 1, —1, 2, —2, 3, ....

b] Definimos la siguiente biyección / : Z+ —> Z:n/2 si n es par

— (n — l)/2 si n es impar

7. Demostrar que el conjunto de los números racionales positivos Q+ es nume-rable. Hacerlo de las dos formas vistas en el ejercicio anterior.

Solución:

a) Podemos listar todos los elementos de Q+ siguiendo las diagonales delsiguiente cuadro:

1/12/13/14/1

1/22/23/24/2

1/32/33/34/3

1/42/43/44/4

Tenemos la lista L = 1/1, 1/2, 2/1, 1/3, 2/2, 3/1, 1/4, 2/3, •••

f ( n } =

.

.

Page 176: Introduccion a la teoria de la computabilidad

A.L PRELIMINARES 175

b) Definimos la siguiente aplicación inyectiva / : Q+ —> Nf ( x / y ) = 2P • (2 • q + 1) — 1, siendo p/q la forma irreducible de x/y conq>l.

(Nota: No se puede poner directamente f ( x / y ) = 2x(2y + 1) — 1, puesen tal caso tendríamos por ejemplo que 2/1 = 4/2 = 8/4 = ..., y sinembargo /(2/1) / /(4/2) ^ /(8/4) 7^ ..., lo cual haría que, comoaplicación, no esté bien definida.Tal como la hemos definido más arriba, esta ambigüedad no existe,pues la imagen del número 2 = 2/1 = 4/2 = 8/4 = • • • se calcula deuna única forma: /(2/1) = 22 • (2 • 1 + 1) - 1 = 11).

Demostrar que el conjunto de todos los números racionales (positivos, ne-gativos y cero) es numerable. Probarlo, igualmente, de las dos formas vistasen el ejercicio anterior. (Para el apartado (b), utilizar el conjunto Z, que yase ha demostrado que es numerable).

Solución:

a) Sería una lista como la del problema anterior, pero comenzando por Oe intercalando las fracciones negativas, es decir:L = O, 1/1,-1/1, 1/2,-1/2, 2/1,-2/1, 1/3,-1/3, 2/2, •••

b) Definimos la siguiente aplicación inyectiva / : Q —> Zy • (2 • q + 1) - 1 si x/y > O

-2^ • (2 • q + 1) - 1 si x/y < O

(Como antes, p/q, con q > 1, es la forma irreducible de x / y ) .

9. Demostrar que el conjunto de todas las cadenas finitas formadas con lossímbolos + y — es numerable describiendo una lista que las enumere.

Solución:Formamos una lista en la que las cadenas están ordenadas de la siguientemanera:(1) Por longitud de palabra (primero las de longitud 1, después las de lon-gitud 2, etc.)(2) Dada una longitud, por orden de valor numérico tras haber identificadoel — con el O, y el -I- con el 1.

8.

f(*M =

Page 177: Introduccion a la teoria de la computabilidad

176 APÉNDICE A. SOLUCIONES

Es decir, tenemos la siguiente lista:

-0

+1—00

-+01

+-10

++11 000

h001

- + -010

- + +Olí

10. Demostrar que el conjunto de todos los conjuntos finitos de números natu-rales es numerable, describiendo una forma en la que las cadenas finitas de+ y — puedan codificar esos conjuntos.

Solución:Para cada conjunto diferente hemos de obtener una codificación dife-rente. Seguimos los siguientes pasos:(1) Se ordenan los elementos de A — { a i , - - - , a f c } de menor a mayor yomitiendo las repeticiones (es decir, expresamos A en su forma normalizada).(2) Codificamos: el O con +

el 1 con ++el 2 con + + +

el número m con (ra + 1) signos +las comas con el signo —

Por ejemplo: {O, 2} ->• H h + +Con esto hemos visto que F = {A C N A es finito } es numerable, puesel conjunto C de las cadenas finitas de signos + y — es numerable, y loque hemos hecho con la codificación anterior es establecer una aplicacióninyectiva ip : F —> C definida por:

Nota: Si a partir de aquí queremos codificar el conjunto A con un númeroentero, aplicaríamos el siguiente paso adicional:(3) Asignamos 1 al signo +, y O al signo —, con lo que obtenemos un númeroen binario. Dicho número, en decimal, será el código del conjunto.

11. Demostrar que los siguientes conjuntos son numerables: (sobre un alfabetoinfinito numerable A — {ai, 02,03,04, • • •} ).

a) L2: Conjunto de las palabras de dos letras.

En el ejemplo anterior: {O, 2} ->• (H h + +) ->• (10111)

Page 178: Introduccion a la teoria de la computabilidad

A.l. PRELIMINARES 177

b) L3: Conjunto de las palabras de tres letras.

c) Ln: Conjunto de las palabras de n letras, para un n fijo arbitrario.

d) L*: Conjunto de todas las palabras de cualquier longitud finita (L* =L1UL2UL*\J-- ).

Solución:

a) Siguiendo las diagonales del siguiente cuadro podemos formar una listacon todos los elementos de L2:

ai

¿2

as

aiaiai

(120-10,30,1

02

aia2

«2^2

«3a2

asoia3

02&3

«3a3

Las palabras de tres letras pueden formarse mediante la concatenaciónde una letra y una palabra de dos letras. El conjunto de palabras dedos letras es numerable. Llamamos a sus elementos: ai, «2, #3?Entonces, podemos listar los elementos de L3 siguiendo las diagonalesdel siguiente cuadro:

abc

aiaaiba icaí

a2a&2ba-2ca%

0:3aa3frcaz

Tendríamos la siguiente lista: aai, aa2, 6ai, aas, 60:2, caí, • • •

Lo demostramos por inducción sobre n > 1:Caso base: La proposición es cierta para n = 1 puesL1 = {a, 6, c, d, • • •} consiste en las mismas letras del alfabeto numera-ble AHipótesis de inducción: Suponemos que la proposición es cierta para

n = fc, es decir, suponemos que Lk = {/?i, /?2, ^3, • • •} es numerable.Paso de inducción: Hay que probar que, entonces, Lk+l es numerable:Las palabras de longitud k + 1 pueden formarse mediante la concate-nación de una letra y una palabra de longitud k. Por la hipótesis deinducción Lk es numerable, entonces, podemos listar todos los elemen-tos de Lk+l siguiendo las diagonales del siguiente cuadro:

La lista sería: aiai, a\a,2, 0-20-1, «i^3? 0,20-2-, «301, •••

b)

c)

Page 179: Introduccion a la teoria de la computabilidad

178 APÉNDICE A. SOLUCIONES

abc

PiafabPicfa

&a(32

b/32

c/32

faafobfocfo

d) Hemos visto que para cada m > 1, el conjuntoLm = {a™, a^1, a™, a™, • • •} es numerable. Formamos entonces uncuadrado infinito con los elementos de L1 en la primera fila, los ele-mentos de L2 en la segunda fila, etc.Recorriendo el cuadrado a través de las diagonales obtendremos unalista con todos los elementos de L* = L1 U L2 U L3 U • • •:

Es decir, una lista con todos los elementos de L* es la siguiente:

12. Demostrar que la unión numerable de infinitos conjuntos numerables es nu-merable.

Solución:

Hay que probar que

AÍ lo es.A los elementos de cada conjunto AÍ los numeramos con la notación:«¿i> «¿2 > «¿3, • • •, y formamos un cuadrado infinito con los elementos de AÍ enla i—esima fila:¿i:

A2:AS:A4:

«uQ>21

«31

041

«12

«22

«32

«42

«13

«23

«33

«43

«14

«24

«34

«44

Recorriendo el cuadrado a través de las diagonales obtenemos una lista contodos los elementos de A:

«u, «12, «21, «13, «22, «31, «14, «23, «32, ' • •

es numerable si cada

La siguiente lista numera todos los elementos de Lk+l:afii, afa, b(3i, a/33, bfa, cfii, •••

L1:L2:L3:

«íaial

a\a{«2

a\«3a¡

Page 180: Introduccion a la teoria de la computabilidad

A.l. PRELIMINARES 179

por lo tanto, A = AI U A-¿ U ̂ 3 U • • • es numerable.

13. Para las siguientes listas (infinitas) de conjuntos, hallar5* = {n \ n i Sn}:

a) Si = {1, 2}, S2 = {2,3}, S3 = {3,4}, S4 = {4,5}, S5 = {5,6},...

b) Si = {2}, S2 - {3}, S3 = {4}, S4 - {5}, S5 = {6},...

c) Sl = {2}, S2 = {3}, S3 = {3,4}, S4 = {4,5}, S5 = {5,6},...

d) Si = 0, S2 = {2}, S3 = 0, 54 = {4}, S5 = 0, S6 = {6}, ...

Solución:

a) Puesto que n € Sn Vn => 5* = 0.

6) Para todo n se cumple que n ^ Sn, por lo tanto 5* = N.

c) 1 ̂ Si y 2 ̂ 52, pero n € 5n para n > 3, por lo tanto 5* = {1,2}.

d) En este caso, n e 5n si n es par, y n ^ 5n si n es impar, luego5*-{1,3,5, 7,...}.

14. Dada una lista L de conjuntos: Si, 52, S^r.. , definíamos el conjunto S* dela forma siguiente:

a) Construir una lista con todos los conjuntos finitos de números natura-les, incluyendo el conjunto 0.

6) Para esta lista, ¿Qué conjunto es el que define 5*?

c) ¿Pertenece 5* a L?.

d) ¿Qué conjunto es el definido por S* = {n \ n E 5n}?

Solución:

a) En la codificación que hacíamos en el problema 10, a todo conjun-to finito le asignamos un número, y este número es diferente paraconjuntos diferentes. Sin embargo, hay números que no son el códi-go de ningún conjunto (la aplicación que codifica los conjuntos fini-tos es inyectiva pero no biyectiva). Formamos pues, la siguiente listaL \ Si, 52, £3, S^, • • •, siendo

Conjunto de código n si n es el código de un conjunto0 si n no es el código de ningún conjunto

Por ejemplo: Si = {0}, 52 = 0, S3 = {!}, ...,S239 = {2,3},...

bn —

S* = {n \ n E 5n}?

Page 181: Introduccion a la teoria de la computabilidad

180 APÉNDICE A. SOLUCIONES

b) Dada la forma con que se han codificado los conjuntos (ver Prob.10),tenemos, para todo n, que n £ 5n, pues si n es el código de un conjuntoy k e 5n, entonces n es un número decimal cuya expresión en binariocontiene al menos una secuencia de k+1 unos => n > 2°+21H \-2k >k. Tenemos pues, que si k G Sn entonces k < n, luego n ^ 5n, Vn, yen consecuencia S* = N.

c) S* = N no es un elemento de la lista L.

d) S* = 0 (que sí es un elemento de la lista).

Nota: Los conjuntos finitos se podrían haber listado o codificado de otrasformas, dando lugar a otros 5* diferentes.

15. Utilizando el argumento de la diagonal, demostrar que el producto carte-siano infinito de conjuntos infinitos numerables no es numerable.

Solución:Sean AL, A>¿, ^3> ••• conjuntos infinitos numerables, hay que probar queA = AI x A% x AS x • • • no es numerable.Supongamos que L : Xi, X<¿, -X"s, • • • es una lista con todos los elementosde A:Xi = (xu, xu, xw, • • •) € A = AI x A2 x ^3 x • • •X2 = (^21,^22,^23,-") £ A = AI X A2 X A3 X •••^3 = (íC31, ^32, #33, • • •) € A = AI X A2 X A3 X • • •

Sea entonces: 61 € AI tal que 61 ̂ x\\62 e ^2 tal que 62 ^ #2263 e ^3 tal que 63 ̂ £33

El elemento B = (61, 62, &3? • • •) verifica que B e A\ x ^2 x ^3 x • • •, y sinembargo B no es un elemento de la lista L, pues:B ^ Xi por ser b\ ^ xu,3^X2 por ser 62 ^ £22,B ^ X 3 por ser 63 / 0:33,

Luego no es cierto que L fuese una lista completa de todos los elementos deA = AI x A<¿ x .̂3 x • • -.Como los elementos de A no pueden listarse (toda lista L es incompleta),tenemos que A no es numerable.

Page 182: Introduccion a la teoria de la computabilidad

A. I. PRELIMINARES 181

16. Utilizando el argumento de la diagonal, demostrar que el conjunto de númerosreales en el intervalo (0, 1) no es numerable.

Solución:Supongamos que L : ai, a-2, <*3, «24, • • • es una lista completa de todos losnúmeros reales del intervalo (0,1).Cada afc e (0,1) es de la forma O, aki^k^o-kz ' • • con a^j € {0,1,2,..., 9} es

Sea 61 e {0,1, 2,... , 9} tal que 6X ^ on62 G {0,1, 2,..., 9} tal que 62 / 02263 € {0,1, 2,..., 9} tal que 63 ̂ o33

Entonces, el número (3 = O, 616263 • • • verifica que (3 G (0,1), y sin embargo,(3 no es un elemento de la lista, pues:(3 ^ ai por ser 61 ^ a\\(3 7^ a2 por ser 62 ^ o22/3 T¿ a3 por ser 63 7^ o33

Luego no es cierto que L fuese una lista completa de todos los númerosreales de (0,1). Por lo tanto, el intervalo (0,1) no es numerable.

17. Demostrar, utilizando el argumento de la diagonal, que el conjunto de todaslas funciones totales con dominio y rango en los naturales no es numerable.

Solución:Si F = {/ : N — > N} fuese numerable, podríamos formar una lista Lnumerando todos sus elementos:

L : /i, /2, /3, /4,

Si definimos la aplicación g : N — >• N mediante g(x) = fx(x] + 1, entoncesse verifica que g no es un elemento de la lista, pues si fuese g — fm Paraalgún m, entonces tendríamos, para x = ra, la siguiente contradicción:

g(m) = fm(m) + 1 ( por definición de g )

decir:ai = 0,011012013 •••Oí2 = 0,021022^23 ' ' '

«3 = 0,031032033 • • •

g(m} = fm(m) ( por ser g = fm )

Page 183: Introduccion a la teoria de la computabilidad

182 APÉNDICE A. SOLUCIONES

Tenemos por tanto que g E F, y sin embargo g no es un elemento de la lista.Luego no es cierto que L sea una lista completa de todos los elementos deF, y en consecuencia F no es numerable.

18. Demostrar que el conjunto de todas las aplicaciones (funciones totales) deTV en {0,1} no es numerable.

Solución:Supongamos que L : /i, /2, /s, /4, ... es una lista completa de todos loselementos de C = {/ : TV ->• {0,1}}.Sea entonces g : N —> {O,1} la aplicación definida por:

entonces se verifica que g es un elemento del conjunto C, pero no es un ele-mento de la lista, pues si fuese g — fm para algún m, entonces tendríamos,para x = m, la siguiente contradicción:

* g(m) — fm(m) por ser g = /m, pero por otra parte:* g(m) ^ f m f a ] , pues tal como se definido g habría de ser g(m) = 1 sifm(m] = O, y g(m) = O si /m(m) = 1.

Tenemos por tanto que g E C, y sin embargo g no es un elemento de lalista. Luego no es cierto que L sea una lista completa de todos los elementosde C, y en consecuencia C no es numerable (pues cualquier lista resulta serincompleta).

A.2. Máquinas de Turing

1. Diseñar una máquina de Turing que reconozca el lenguajeL — {w = WR w G {0,1}*} (Cadenas palíndromas)

Solución:M = {Q,X,r,6,q0,B,F}Q - {tfo, 91»92,93,94,95,96}E = {0,1}, r = {0,l,S}, F = {q6}

g(x] =l si fx(x) — OO si fx(x) - 1

Page 184: Introduccion a la teoria de la computabilidad

A.2. MÁQUINAS DE TURING 183

2. Diseñar una máquina que reconozca el conjunto de cadenas con igual númerode ceros y unos. (Suponer que la cinta es infinita por ambos lados).

Solución:M = {Q,S,r,á,<?o,£,F}Q = {90,91,92,93,94}E -{0,1}, r = {0,l,X,B}, F = {g4}

3. Diseñar una máquina de Turing que reconozca el lenguajeL = {OnlnOn | n > 1}

Solución:M = {Q,S,r,¿,g0,£,^}Q = {90,91,92,93,94,95}s = {o, i}, r = {o, i, x, y, z, 5}, F - {<?}

6qoqiq2qsq4qsqe

0qiBDqiOL>^BIq30£>

q50/

1qzBDqilD

qBlDq5BIq5l/

Bq&BDq2BIv&BDq4BIq&BDqoBD

Sqoqiq2qsq4

0

qixnqiQDq,XIq3OI

1q?XD

q2lD

qsl/

XqoXDqiXDq2XDqsXJ

Bq±BD

qoBD

Sqoqiq2qsq4qs

0q,XDqiODqs^^qsO/

1

ViYDq2lDqsl/

X

qoXD

Y<&YDqiYD

^YI^YD

Z

qzZDq3ZIq^ZD

B

^BIq5BD

q3XI

Page 185: Introduccion a la teoria de la computabilidad

184 APÉNDICE A. SOLUCIONES

4. Para la máquina no determinista del ejemplo 2.7, responder a las siguientescuestiones:

a) Cuál de las siguientes palabras es aceptada por la máquina?Olí, 110, 111, 000.

6) Cuál es el lenguaje reconocido por M?

Solución:

a) Olí: No aceptada.110: Aceptada.111: No aceptada.000: Aceptada.

6) L(M) = { w; = oí • • • an (rí > 2) A (a2 = O V • • • V an = 0) }(Palabras que contienen algún O más allá de la primera posición).

Comentarios:Al estado qi se llega por primera vez después de saltar la primera mar-ca.Sólo se aceptan las palabras que permiten acceder al estado qs, pero aqa solamente puede accederse desde q2, y además, desde q2 siempre sepuede acceder a q%.Estando en qi sólo puede pasarse a q2 si encuentra un O en su desplaza-miento a la derecha.

5. Construir una máquina de Turing que calcule la función f ( x ) = x/2 (di-visión entera).

Solución:

6qo

qi

q2

qa

0qiO£>qiO£>q20£>q30£>

1

qil£>qil£>

q0l£>q2lD

B

qiBD

<&BD

Page 186: Introduccion a la teoria de la computabilidad

A.2. MÁQUINAS DE TURING 185

M = {Q,S,r,¿,<7o,£,F}Q = {90,91,92,93,94,95}£ = {!}, r = {!,£}, F = 0

Descripción del algoritmo:Borra de dos en dos las marcas que representan el número x. Por cadados marcas borradas se escribe un 1 a la derecha de x. Al término de lacomputación, el número ha sido borrado por completo, y a la derecha seencuentra x/1 = número de veces que se han podido borrar grupos de dosmarcas.

6. Diseñar una máquina de Turing que compute la multiplicación de dos númerospositivos.

Solución:La siguiente máquina calcula la función f ( x , y] — x • y, para x, y > 0.

M = {Q,S,r,¿,g0,£,^}Q = {90,91,92,93,94,95,96,97}E = {0,1}, r = {0,l,B,X}, F = 0

6qoqiq2qaq4qsqeq?

0q7BL>q2OD

q6OI

1

qiBDqilDqs^^q3lL>q4l¿>qsl/qel/

q7BD

B

q6BIq^BDqsl/q5^/q0BL>

X

q?XDq6l/

¿qoqiq2qsq4qs

iqi^DqiBDq2l£>03 ID

q4l/q5l/

5

qs^Z)q4llq5BIqoBD

Page 187: Introduccion a la teoria de la computabilidad

186 APÉNDICE A. SOLUCIONES

Comentarios:* Al principio se suponen impresos los dos números x, y a la izquierda de lacinta y separados por 0.* El algoritmo consiste copiar x—veces el número y.* Al término de la computación se borran todas las marcas distintas de B,quedando impreso sobre la cinta solamente el resultado final x • y.Ejemplo de la computación de 2 x 3: gollOlll -> BBBBBBq7Bllllll

1 . Construir una máquina de Turing que calcule la división entera de dosnúmeros positivos.

Solución:La siguiente máquina calcula la función g ( x , y) = x/y, para x, y > 0.

Descripción del algoritmo:Las marcas que representan el número x son borradas a tramos de longitudy. El símbolo adicional m sólo se utiliza para ir señalando en y cada vez queborramos una marca de x.

Cada vez que de x se ha borrado un grupo de y marcas, se escribe un 1 a laderecha de x e y, con lo que, al término de la computación, queda sobre lacinta a la derecha del lugar en que estaban x e y, el número x/y= númerode veces que se ha podido borrar de x, grupos de y marcas.

¿qoqiq2qaq4qsqeq?

0q7BDq20JD

q60/

q60/

1qiBD<blDq3ra£>q3l/q4!Dqsl/qel/q7BD

m

q^mDq3m/

qsl/

q7BD

B

q^BDqsl/qs^/qoBD

M = {Q,V,r,6,qoíB,F}Q = {00,01,92,03,44,95,96,47}S = {0,1}, r = {0,l,m,S}, F = 0

Page 188: Introduccion a la teoria de la computabilidad

A.2. MÁQUINAS DE TURING 187

8. Demostrar que para cualquier lenguaje r.e. existe una MT básica con el al-fabeto F = {0,1, B} que lo reconoce.

Solución:MI : máquina con TI = {0,1, B, si,..., sm}.

M2 : simula a MI con T2 = {0,1, B}.

Sea k e N tal que 2fe~1 < m+2 < 2 fe, es decir, k es el menor entero necesariopara codificar, mediante O's y l's todos los símbolos de TI excluyendo el B(m + 2 en total).

* Fundamentalmente, M2 utilizará una cinta k veces más larga. A cada celdade la cinta de MI corresponderán k celdas de MI , y una B entre símbolosde la cinta MI también será representada por k B's en la cinta M2.

* El conjunto de estados de MI puede consistir en los mismos estados q¡ deMI, y además, otros estados adicionales PJ utilizados para el trabajo extracomputacional de M2. Es decir: Q? = Qi U {pi, ...,p¿}.

* El conjunto de estados finales de M2 puede ser el mismo que el de MI, esdecir: F2 = F\.

* Si MI, en el estado q, reemplaza el símbolo s por s' y a continuaciónse desplaza a la derecha pasando al estado q', entonces M2 sustituye las kmarcas que codifican s por las k marcas que codifican s' quedando el cabezalinmediatamente a la derecha y pasando también al estado q'.

* Si MI, en el estado q, reemplaza el símbolo s por s' y a continuaciónse desplaza a la izquierda pasando al estado q', entonces M2 sustituye lask marcas que codifican s por las k marcas que codifican s' y el cabezal sedesplaza k-\-k celdas a la izquierda para quedar al comienzo de la codificacióndel símbolo anterior a s', y pasando también al estado q'.

9. Sea una MT determinista restringida cuya cinta es finita por ambos lados.Razona si esta restricción es o no equivalente al modelo sin restringir.

Solución:La restricción de que la cinta sea finita, hace que tenga menos potenciacomputacional que el modelo base.Sea K el número de celdas de la cinta (finita) que disponemos; entoncespodemos clasificar las limitaciones en dos grupos:

a) Por la complejidad del algoritmo:Por ejemplo, no podríamos calcular el menor de un conjunto finito de

Page 189: Introduccion a la teoria de la computabilidad

188 APÉNDICE A. SOLUCIONES

K+l números (pues no podrían representarse en la cinta de entrada).En general, no podría calcularse ninguna función/ : NK+1 ->• N.Además de la consideración anterior, está claro que no todos los al-goritmos podrían resolverse en un número dado K de celdas: si fuesepor ejemplo K — 2, es evidente que el conjunto de algoritmos es muylimitado. Este conjunto aumentaría para K = 200, y sería mayor paraK — 2000; pero como la complejidad de los algoritmos no está acotada,tendremos siempre que, fijado un número K, existirá un conjunto AKde algoritmos que puedan resolverse y otro conjunto A'K de algoritmosque no se puedan resolver en estas K celdas, verificándose en generalque Ap C Aq si p < q.

Por la magnitud de los datos de entrada/salida:Aún tratándose de algoritmos conceptualmente sencillos, como porejemplo el cálculo de la función / (n) = n + 1, tendremos que, de-bido a que no existe una cota superior para el tamaño de los númerosn E N, y teniendo en cuenta que los alfabetos E y F son finitos, existiráun rao G N tal que rao no pueda representarse en las K celdas de lacinta, y en consecuencia, la función ya no pueda calcularse para ningúnn > rao-

10. Demostrar si los lenguajes L\ — 0 y Z/2 = S* son recursivos o recursiva-mente enumerables. (Suponer que S = {0,1} )

Solución:

a) LI = 0 es recursivo: La siguiente máquina rechaza todas las palabrasde E*

M = {Q,S,r,(5,5o,5,F}Q =-{9o,9i}, E = {0,1}, r = {0,1,5}F = 0

6qoQi

04iO£>

1qilD

BqiBD

b) L<2 = S* es recursivo: La siguiente máquina reconoce todas las palabrasde £*.

M = {Q,S,r,(5, ío,B,F}g = {g0,gi}, s = {o,i}, r = {o,i,s}^ = {̂ 1}

b)

Page 190: Introduccion a la teoria de la computabilidad

A.2. MÁQUINAS DE TURING 189

óqoVi

0qiQD

1qilD

BqiBD

Las dos máquinas son iguales salvo que F = 0 en el primer caso, y F = {qi}en el segundo.

11. Demostrar que un lenguaje L es recursivo •& L y L son generables.

Solución:

L recursivo =>• 3M# tal que MR acepta w si w G L y MU rechaza w siu; ^ L.Hay que probar que, con la ayuda de M#, se pueden construir dos máquinasMI y M2 tales que L = G(Mi) yL = G(M2).Veamos el algoritmo de MI:

(1) i = l(2) Calcular Wi (z-ésima palabra de E* en orden lexicográfico)(3) Simular MR con w¿: si MR acepta w^ -> MI imprime #Wi(4) i = ¿ + 1. Ir a (2)

En cuanto al algoritmo de M2, sería igual que el de MI pero cambiando elpunto (3) por: Simular MR con u;¿: si M# rechaza w;¿ — > M2 imprime #u>¿.

Por ser L y L generables =^ 3MI y M2 tales que L = G(Mi) y L = G(M2).Hay que probar que, con ayuda de MI y M2, es posible construir unamáquina MR tal que MR acepte w si w € L, y que MR rechace wsiw^L.Algoritmo de MR para decidir la pertenencia a L de una palabra w 6 S*:

(1) fe = l(2) Simular MI hasta <*!#•• • #a¿ (fc-ésima palabra generada por MI)

Simular M2 hasta /3i# • • • #/3fc (fc-ésima palabra generada por M2)(3) Comparar ^ con a^ y ̂ :

Si w = ak —)• M^ acepta iu. Fin.Si w; = (3ft —> Mñ rechaza w. Fin.Si w T¿ ak y w / /3fc -> k = k + 1. Ir a (2).

Es evidente que el algoritmo de MR siempre termina tras un tiempo finito,pues o bien será w e L, en cuyo caso MI generará a^ = w para un cierto fc,o bien w e L, en cuyo caso será M2 quien genere fi^ = w.

Page 191: Introduccion a la teoria de la computabilidad

190 APÉNDICE A. SOLUCIONES

A.3. Funciones L—computables

1. Qué función computaría realmente la expansión de la siguiente macro?

Y ^ X + Y

Solución:Tal como se ha definido la macro TS f- TI + T2, tendríamos:

Y ^ XZ ^Y

(B) IF Z T¿ O GOTO AGOTO S

(A) Z--Y + +GOTO B

La función que computa realmente es Y -f- X + JT, pues en la segundainstrucción Z toma el valor de Y', que es igual a X por la primera asignación.

2. Escribe un programa en L, sin usar ninguna macro, que compute la función:f ( x ) = 3x.

(A)

(B)

ZIFIFXYYYIF

+ +x¿z¿

+ ++ ++ +z¿

00

0

GOTOGOTO

GOTO

BS

A

3. Definir la macro T «— m, en la que se asigna a la variable T un número m.

Solución:

Solución:

Page 192: Introduccion a la teoria de la computabilidad

A.3. FUNCIONES L-COMPUTADLES 191

4. En todos los ejemplos vistos, se han diseñado programas que computan fun-ciones en los que el cardinal del conjunto origen es infinito.Si el conjunto origen fuese un conjunto finito de números, ¿Se podría en-contrar siempre un programa P que compute la función?

Solución:Las funciones F : A —>• N definidas sobre un conjunto finito A — {ai,..., o^}podemos siempre definirlas explícitamente:

Y son claramente L—computables:

5. Sea f ( x ) = lsix es par y f ( x ) = O si x es impar. Escribe un programa enL que compute /.

Solución:

(B) IF X = ai GOTO Al

IF X = o2 GOTO A2

IF X = ak GOTO Ak

GOTO B(AÍ) y <- &!

GOTO S

(40 r < - & 2GOTO S

(A) Y^bk

T^raT + +

(ra líneas en total)T + +

Page 193: Introduccion a la teoria de la computabilidad

192 APÉNDICE A. SOLUCIONES

IF X T¿ O GOTO AY + +Z + +IF Z ^ O GOTO S

(A) X--IF X ¿ O GOTO BZ + +IF Z ^ O GOTO S

(B) X--IF X ¿O GOTO A

6. Sea f(x] — 1 si x es par y f(x] indefinido si x es impar. Escribe un progra-ma en L que compute /.

IF X / O GOTO Ay + +z + +IF Z ^ O GOTO S

(A) X--IF X T¿ O GOTO B

(C) Z + +IF Z T¿ O GOTO C

(B) X--IF X T¿ O GOTO Ar + +

7. Sea /(#i, #2) — 1 si x\ = X2, y /(#i, #2) = O si x\ ^ #2- Escribe un progra-ma en L, sin usar macros, que compute /.

Solución:

(Es la función característica del predicado P(xi,x-2) & x\ = x-¿).

Solución:

Y + +

Page 194: Introduccion a la teoria de la computabilidad

A.3. FUNCIONES L-COMPUTABLES 193

(A)

(B)

(C)

IF Xl ¿ 0GOTOBIF X2 ¿ 0GOTOSr + +GOTO SIF X2 ¿ 0GOTO SXi--X2--GOTO A

GOTO C

8. Sea f(x) el mayor número n tal que n2 < x. Escribe un programa en L quecompute /.

Solución:

El siguiente programa calcula la función f(x):

(A) Z + +Z2 <- Z • ZIF (Z2 > X) GOTO BGOTO A

(B) Z--Y ^ Z

Hemos utilizado la macro IF (Ti > T2) GOTO Ta, que definimos a conti-nuación:

IF (Ti > T2) GOTO T3

(Gi)

(Gt)

(Gs)

Wi <-TIW2 ^T2

IF W^i ^ 0 GOTOGOTO FIF ^2 7^ 0 GOTOGOTO T3

Wi--W2--GOTO Gi

G2

G,

Page 195: Introduccion a la teoria de la computabilidad

194 APÉNDICE A. SOLUCIONES

9. Sea mcd(^i, #2) el máximo común divisor de x\ y x2. Escribir un programaen L que compute mcd.

Solución:( m.c.d.(£i,:E2) = mayor número n tal que n \ x\ y n x2 )

(A) Z + +IF (Z>Xi) GOTO SIF (Z > X2) GOTO SIF (Z | Xi) GOTO BGOTO A

(B) IF (Z \ X2] GOTO CGOTO A

(C) Y^ZGOTO A

Z recorre valores desde 1 hasta llegar a X\ ó X2. La variable Y toma elvalor de Z cada vez que Z \ X\ y Z X2.

Además de la macro IF (Ti > T2) GOTO TS, definida en el problema ante-rior, se ha utilizado la macro IF (Ti | T2) GOTO TS, que definimos ahora:

(Nota: ti \ t2 ^> t2 — w • ti para algún w < ¿2)

10. Sea f ( x \ , X 2 ) = 2(#i — #2) S¿ Xi > X2(|a?i - #2!) + 1 s¿ ^i < ^2

Podemos considerar que la función / así definida implementa la función res-ta en una codificación de los números negativos mediante números enterospositivos. En esta codificación un número m par representa el entero posi-tivo x tal que m = 2x y un número m impar representa el entero negativoy tal que n = 1\y\ + 1, donde \y\ denota el valor absoluto de y. Escribir unprograma que compute la función /.

(Gi)IF (Ti

| T2) GOTO T3

W2 <- W • TIIF (T2 = W2)^ + +IF (W > T2)GOTO Gi

GOTO

GOTO

T3

F

Page 196: Introduccion a la teoria de la computabilidad

A.3. FUNCIONES L-COMPUTABLES 195

Solución:Teniendo en cuenta que\A-B\ = A-B siA>B\A-B\ = B-A siA<B

podemos definir la función como /(#!, x2] =

El siguiente programa calcula la función / (£1,2:2):

ZiZ2

IFY

^ 2 -< - 2 -

XiX2

(X2 > X i ) GOTO<-Zi

- Z2

A

GOTO S(A)

YY

<- Z2

+ +- Zi

11. Sea P el programa del Ejemplo 3.2 (función identidad). Escribir la compu-tación de P comenzando con la instantánea (l ,w>), donde w consiste en lasecuaciones X — 2, Y — O, Z — 0.

5i =

«2 =

53 =

84 =

55 =

«6 =

S7 =

SB =59 =

5io =

5n =

512 =

«13 =

514 =

(1,

(4,(5,(6,(7,

(1,(4,(5,(6,(7,

(1,(2,(3,(8,

{*{*{*{*{X

{X{X[X{X{X

{X{X{X{X

n

= 2!= 1,= 1,= 1)

-•-»

= 1,-o,-o,= 0,

= 0,= 0,-o,-o,

YYYYY

YYYYY

YYYY

= 0,= 0,-o,= 1,= 1,

J-?= 1,= 1,-2,= 2,

= 2,o

-2!o

ZZZZZ

ZZZZZ

ZZZZ

= 0})= 0})= 0})= 0})

= 1})= 1})= 1})= 1})-1})= 2})

= 2})-2})= 3})= 3})

instantánea inicial

Solución:

2o:i — 2a;2 si x\ > x2

2x2 — 2#i + 1 si x\ < x2

instantánea final

Page 197: Introduccion a la teoria de la computabilidad

196 APÉNDICE A. SOLUCIONES

12. Escribir un programa P tal que para cualquier computación si, ..., s¿. de P,sea k=5.

Solución:El siguiente programa, que calcula la función constante f ( x ) = 4, verificaque toda computación es de la forma si, «2, S3> ^4, «5 (es decir, k = 5).

y + +y + +Y + +Y + +

13. Escribir un programa P tal que par cualquier n > O y cualquier computa-ción si = (1, w), 52, ...Sfc de P que contenga la ecuación: JT = n en w, seaA; = 2n + l.

Solución:El siguiente programa verifica la condición requerida:

(A) X - -IF (X ¿ 0) GOTO A

Por ejemplo, para n = 2 tenemos:

55 = (3, X = 0) ^ A; = 5 - 2 • n + 1

14. Sea P el programa

IF A" T¿ O GOTO A(A) X + +

IF X / O GOTO A(A) Y + +

¿Qué función es

*i = (l,X = 2)

*2 = (2,X = 1)

83 = (1,X = 1)

54 = (2,X = 0)

Page 198: Introduccion a la teoria de la computabilidad

A.3. FUNCIONES L-COMPUTADLES 197

Solución:typ '(x) =t para todo x.El programa se cuelga por siempre en las líneas 2 y 3 pues la orden GOTOA lleva siempre a la ejecución de la línea 2, que es la primera del programacon la etiqueta (A).

15. La misma pregunta que en el ejercicio anterior para el programa:

(B) IF X ¿ O GOTO AZ + +IF Z / O GOTO B

(A) X <- X

Solución:

La función que calcula es

(Si X > Q =$- X <— X y e\ programa termina con Y — O,y si X = O =>• se ejecutan indefinidamente las líneas 1, 2 y 3).

16. La misma pregunta que en el ejercicio 14, para el programa vacío.

Solución:

El programa vacío es, de hecho, un programa.

Todos los programas tienen la variable de salida Y inicializada a 0.

El programa vacío no tiene ninguna instrucción que modifique el valorde la variable Y.

Luego, el programa vacío calcula la función typ '(x) — O para todo x.

17. Sea P el siguiente programa:

Y ±- Xi(A) IF X2 ¿ O GOTO S

y + +Y + +X2--GOTO A

Page 199: Introduccion a la teoria de la computabilidad

198 APÉNDICE A. SOLUCIONES

¿Qué función es

Solución:

18. Demuestra que para cualquier función L— computable f(x\, .. .,£„), existeun número m > O tal que / se computa por infinitos programas de longitudm.

Solución:Sea P un programa que calcule f(xi, ...xn)

* Llamamos L a la longitud de este P, y llamamos N al mayor subíndice deuna variable Z utilizada en P ( es decir, -Z/y+i, ^7v+2» ••• no son referenciadasen el programa P ).

* Entonces, la familia de programas P^) , P(2) , P(s) , ••• definidos por

verifican que todos tienen la longitud constante m — L + 1 líneas, y todoscalculan la misma función f(x\, ...xn).

19. Sean f ( x ) , g(x) dos funciones L—computables, y sea h(x) = f ( g ( x ) ) . De-mostrar que h es L—computable.

Solución:Como / y g son L—computables, se pueden definir las macro asignacionesT2 •<— /(Ti) y T2 «— g(Ti), y por lo tanto podemos definir el programa:

a) Xi — ri, Xi = O =>• Las líneas 2, 3, 4, 5 y 6 se ejecutan indefinidamente

para todo r\.

b) Xi = n, X2 = r2 =>TI SÍ T2 > O

t en otro caso

c] Igual que (b) pues r% se ignora, es decir:7*1 si r-2 > Ot en otro caso

P(k) =ZN+H + +L instrucciones de P

Page 200: Introduccion a la teoria de la computabilidad

A.3. FUNCIONES L-COMPUTABLES 199

Z<-g(X)Y <- f(Z)

que calcula la función h(x) = f(g(x}).

20. Sea P(x) un predicado L— computable total. Demostrar que la función

es L—computable.

Solución:El siguiente programa calcula la función /(#i, x^):

Y <- Xi + X2

(A) IF P(Y) GOTO SGOTO A

21. Sea P(x) un predicado L—computable total. Demostrar que1 si existen al menos x números n tales que P(n) = 1t en otro caso

es L—computable.

Solución:El siguiente programa calcula la función EXp(x):

IF X = O GOTO C(A) IF P(Zi) GOTO B

Zi + +GOTO A

(B) Z2 + +Zi + +IF (Z2 < X] GOTO A

(C) Y + +

Cada vez que se cumple P(Z) se incrementa Z%. Si £2 llega a ser igual a X,entonces el predicado se ha cumplido X veces y el programa termina consalida Y = 1.

EXP(x] =

/(xi,x2) =X\ + #2 SÍ P(x\ + #2)

en otro caso

Page 201: Introduccion a la teoria de la computabilidad

200 APÉNDICE A. SOLUCIONES

22. Sea TT una función biyectiva L—computable total, y sea TT 1 su inversa. De-mostrar que Tr"1 es L—computable total.

Solución:K~I(X) = z, siendo z el único número tal que TT(Z) — x.El siguiente programa calcula la función

(A) Z2 <- 7r(Z)IF (Z2 = X) GOTO BZ + +GOTO A

(B) Y f- Z

Z va recorriendo todos los valores O, 1, 2, 3,... hasta alcanzar el valor talque 7r(Z) = X, (por ser TT biyectiva, este valor con seguridad existe).

23. Sea / (x) una función L— computable parcial. Sea M = {mi,...,m¿} unconjunto finito de números tales que /(m) = t para todo m G Af, y sea^(x) una función L— computable arbitraria. Demostrar que

es L— computable.

Solución:El siguiente programa calcula la función h(x):

IF PM(X) GOTO AY 4- f(X)GOTO S

(A) Y<-g(X)

Se ha utilizado la macro IF PM(TI) GOTO T2 , siendo PM(X) el predicadoPM(X] •& x G M, que definimos a continuación:

h(x) = g(x] si x e Mf ( x ) e n o t r o c a s o

Page 202: Introduccion a la teoria de la computabilidad

A.4. FUNCIONES RECURSIVAS PRIMITIVAS 201

Nota: Podemos definir una macro de la forma IF P(T) GOTO T2 si y sólosi P(x) es un predicado L—computable total. En este problema, el predi-cado PM(X] •£>• x E M es L—computable total por ser M = {mi,...,mfc}un conjunto finito. Si M fuese un conjunto infinito, entonces el predicadoPM(X] O- x e M solamente sería L—computable total en el caso de ser Mun conjunto recursivo, éste concepto será introducido en el Capítulo 6 dellibro.

A.4. Funciones recursivas primitivas

1. Sea h una función recursiva primitiva y sean

/(*) = h(g(x))g(x] = h(f(x))

Demostrar que / es recursiva primitiva si y solo si g lo es.

Solución:

/ recursiva primitiva =>• g(x] = h(f(x)} es recursiva primitiva por estar gdefinida como composición de h y f .

g recursiva primitiva => f(x] — h(g(x)) es recursiva primitiva por estar /definida como composición de h y g.

2. Dar un argumento detallado de xy, p(x), monus(x,y} = x — y son recur-sivas primitivas.

Solución:

Siendo g ( x \ , X 2 , #3) = x\- x$

IF PM(T) GOTO T2

IF T = mi GOTO T2

IF T = m2 GOTO T2

IF T = mk GOTO T2

GOTO F

Page 203: Introduccion a la teoria de la computabilidad

3. Demostrar que para todo &, la función constante fk(x) = k Vx es recursivaprimitiva.

Solución:Lo demostramos por inducción sobre k:Caso base: La proposición es cierta para k = O pues fo(x) = c(x) es recursivaprimitiva.

Hipótesis de inducción: Suponemos (para k = n) que fn(x) = n es recursivaprimitiva.

Paso de inducción: Hay que probar que entonces fn+i(x) = n+1 es recursivaprimitiva, lo cual es inmediato pues fn+i(x) = s(fn(x)) es composición des y de /n, ambas recursivas primitivas.

4. Para una función unaria /(#), 1a ̂ --ésirna iteración de /, escrita /n, se definecomo:

/"(*) = /(.../(*)••.)

donde / se compone consigo misma n veces en la parte derecha de la ecuación(notar que f ° ( x ) = x). Sea gf(x,n] — fn(x). Demostrar que si / es recur-siva primitiva, entonces también lo es gf.

Solución:Lo probamos viendo que podemos definir gf mediante una recursión:

9f(x,Q) = x9 f ( x , t ) =<p(x,t- l,gf(x,t- 1))

Siendo ^(^1,^2,^3) = /(^s)-Nota:gf(x,t) = fl(x) = f(fl-l(x}} = f(gf(x,t- 1)) = <p(x,t- Il9f(x,t - 1))

202 APÉNDICE A. SOLUCIONES

b) p ( x ) :p(Q) = Op( í )=p( í - l ,p ( í - l ) )

Siendo g(xi,X2) — x\

c) x -y:monus(x,Q) — xmonus(x, t} = g(x, t — 1, monus(x, t — 1))

Siendo g(x\, x2, x$) = p(xz)

Page 204: Introduccion a la teoria de la computabilidad

A.4. FUNCIONES RECURSIVASPRIMITIVAS 203

5. Sea g(x) una función recursiva primitiva y sea / una función que cumplelas siguientes ecuaciones:

f ( x , Q ) = g ( x )/ (x ,n+l ) = /(/(ar,n),n)

Demostrar que / es recursiva primitiva.

Solución:Probamos primero que /(#, n) = g2" (x) = g(...g(x)...) (g compuesta consigomisma un total de 2n veces).

La prueba la hacemos por inducción sobre n:Caso base: La afirmación es cierta para n — O pues f ( x , 0) = g(x) = g l ( x ] =

2°/ \9 (*)•Hipótesis de inducción: Suponemos que la afirmación es cierta para n = fc,es decir que /(#, k) = g2 (x),Paso de inducción: Se ha de probar que la afirmación es cierta para n = fc+1:f ( x , k + 1) = f ( f ( x , k ) , k ) = f(g2"(x),k) = S

2V"W) =S2*+2'W =g^(x)=g*+l(x).

Una vez visto que f ( x , n ) = g2n (x) = g(...g(x)...), estamos en una situaciónanáloga a la del problema anterior. Probamos que / es recursiva primitivaviendo que podemos definirla mediante una recursión:

f ( x , Q ) = g ( x ) f ( x , t ) = <p(x,t-l,f(x,t-l))

Siendo y?(xi, x2, x3) = g ( g ( x 3 ) ) .Nota:f ( x , t ) = g2\x) = g^'\x} = 9

2(92t-1(x)} = 9

2(f(x,t- 1)) =

¥>(z , í - l , / (M- l ) )

6. Sea P(x] la función definida como

1 si x es pararrP(x) =

O si x es impar

Demostrar que P(x) es una función recursiva primitiva.

Page 205: Introduccion a la teoria de la computabilidad

204 APÉNDICE A. SOLUCIONES

Solución:El predicado par(x) es recursivo primitivo por estardefinido mediante el cuantificador existencial acotado, y en consecuencia lafunción

P(x} =1 si par(x) _O si -ipar(x)

s(c(x)) si par(x)c(x) si -ipar(x)

es recursiva primitiva por estar definida por casos.(Nota: P(x] es la función característica del predicado par(x), y siempre secumplirá que: un predicado es recursivo primitivo 44> su función caracterís-tica es recursiva primitiva.)

7. Sea H(x] la función definida como

H(x} =x/2 si x es par(x — l)/2 si x es impar

Demostrar que H(x] es una función recursiva primitiva.

Solución:Dado que tenemos que las funciones:

son recursivas primitivas al igual que el predicado par(x), y por lo tanto

H(x) =x/2 si par(x)(x — l)/2 en otro caso

es recursiva primitiva por ser una definición por casos.

8. Sea /(O) = O, /(I) = 1, /(2) = 22, /(3) = 333, etc. En general f ( x ) seescribe como x elevada x—veces a x. Demostrar que / es recursiva primitiva.

Solución:X

Definimos primero la función g(x, n) = x' (x elevada n veces a sí misma),y vemos que g es recursiva primitiva al poderse definir por recursión:

0(ar,0) = lg(x,t) = h(x,t- l,g(x,t- 1))

Page 206: Introduccion a la teoria de la computabilidad

A.4. FUNCIONES RECURSIVASPRIMITIVAS 205

Siendo h(x\,x-2,£3) =Ahora vemos que / es recursiva primitiva al definirla por casos y a partirde o:

/(*) =O si x = Og(x, x) en otro caso

9. Sea la función m(a^i, x%) la función mínimo, de forma que ra(#i, #2) = #1 sia?i #2, y m(xi,X2) = X2 en otro caso.

a) Demostrar que m es una función recursiva primitiva, dando una se-cuencia de composiciones y/o recursiones.

6) Demostrar que mn(xi, . . . ,ccn), que devuelve el valor del mínimo com-ponente de la tupia (xi,..., #n), es primitiva recursiva.

Solución:

(nota: el último factor es necesario para el caso x\ —m(xi,X2) = xi + X2 — X2 = #1, mientras que si x\último factor es nulo).

#9, pues entoncesX2, entonces el

b] Lo demostramos por inducción sobre n 2:

Caso base: La proposición es cierta para n — 2 (es lo que hemos proba-do en el apartado (a)).Hipótesis de inducción: Suponemos que la proposición es cierta paran = fe, es decir, suponemos que mk(xi, . . . ,£&) es recursiva primitiva.Paso de inducción: Hay que probar que mk+l(xi,..., Xfc+i) es recursivaprimitiva, lo cual es inmediato puesmk+l(xi,..., xk+i) = m2(mk(xí,..., xk), xk+i).

10. Sea /(#) = 2x, si x es un cuadrado perfecto y f ( x ) — 2x + 1 en otro caso.Demostrar que / es recursiva primitiva.

Solución:

/(*) = 2x si x es un cuadrado perfecto2x + 1 en otro caso

Es recursiva primitiva por estar definida por casos sobre las funciones g\ (x) =2 • #, y 92(x) = 2 • # + 1 que son recursivas primitivas, y mediante el predicado P(x) •& x es un cuadrado perfecto & (3t)<x(t • t = x) que es recursivoprimitivo por estar construido mediante el cuantificador existencial acotado.

A)

Page 207: Introduccion a la teoria de la computabilidad

206 APÉNDICE A. SOLUCIONES

11. Sea a(x) la suma de los divisores de #, si x ^ O, y <r(0) = 0. (p.e. cr(6) =1 + 2 + 3 + 6 = 12). Demostrar que <T(X) es recursiva primitiva.

Solución:

Es recursiva primitiva al poderse definir mediante el iterador sumatorioacotado.

12. Sea TT(X) el número de primos que son < x. Demostrar que TT(X) es recursivaprimitiva.

Solución:

Al igual que en el problema anterior, podemos definirla mediante el iteradorsumatorio acotado.

13. Demostrar, utilizando un único cuantificador, que el predicado

es la suma de dos cuadrados perfectos

es recursivo primitivo.

Solución:Se cumple R(x) si existen dos números y,z tales que x = y2 + z2.Cuando n recorre N, el par (/(n),r(n)) recorre todos los valores de N2 =N x N. Así pues:

es recursiva primitiva al poderse definir a partir del cuantificador existencialacotado.

Page 208: Introduccion a la teoria de la computabilidad

A.4. FUNCIONES RECURSIVAS PRIMITIVAS 207

14. Sea h(x) el entero n tal que nrecursiva primitiva.

Demostrar que h(x] es

Solución:Nótese que:

Podemos entonces definir la función mediante la minimización acotada deun predicado recursivo primitivo:

15. Sea R(x,t) un predicado recursivo primitivo. Sea

esto es, g ( x , y ) es el mayor valor de t < y para el cual R(x,t) es cierto; ysi no existe ninguno, entonces g ( x , y) = 0. Probar que g ( x , y) es recursivaprimitiva.

Solución:Expresamos la función como la minimización acotada de un predicado re-cursivo primitivo:

16. Sea mcd(x,y) el máximo común divisor de x e y. Demostrar que la funciónmcd(x, y) es recursiva primitiva.

Solución:

a) Utilizando la maximización acotada (ver problema anterior):

b) Utilizando la minimización acotada:

Page 209: Introduccion a la teoria de la computabilidad

208 APEIVDÍCEA. SOLUCIONES

17. Sea mcra(#, y) es el mínimo común múltiplo de x e y. Demostrar que lafunción es recursiva primitiva.

Solución:

18. Dar un predicado L—computable total P(xi,...,xn,y] tal que la funciónmínP(a;i, ...,xn,y) no sea L—computable total.

y

Solución:Definimos el predicado P ( x \ , X 2 , y } ^ (x\ + y] X2 que es recursivo primitivo, y por tanto es L—computable total, pero la función /(#i,#2) —mínP(£i, x<2, y] no es L—computable total pues está definida solamente para

valores x\,x<¿ tales que x\ < x% (por ejemplo:/(5,27) = 4, /(11,11) = 0), pero si x\ > x^ entonces no existe ningún ytal que (x\ + y] | x<¿. Tenemos pues:

que es sólo L—computable parcial.(Esta construcción ha sido posible porque se trata de una minimización noacotada).

A.5. Un programa universal

1. Calcular el número de los programas ejemplo 3.1 y 3.2 del capítulo 3.

Solución:

• Primer ejemplo:

(A) X--Y + +IF X = 0 GOTO A

Page 210: Introduccion a la teoria de la computabilidad

A.5. UN PROGRAMAUNIVERSAL 209

#/i =< 1, < 2,1 »=< 1,11 >= 45#/2 =< O, < 1,0 »=< 0,1 >= 2#/3 =< O, < 3,1 »=< 0,23 >= 46El número del programa es: #P = [#/i, #/2, #/a] — 1= [45,2,46]-! = 2 4 5 - 3 2 - 5 4 6 - l

• Segundo ejemplo:

#/i =< 1, < 4,1 »=< 1,47 >= 189#/2 =< O, < 1,2 »=< 0,9 >= 18#/3 =< O, < 7, 2 »=< O, 639 >= 1278#/4 =< 2, < 2,1 »=< 2,11 >= 91#/5 =< O, < 1,0 »=< 0,1 >= 2#/6 =< O, < 1,2 »=< 0,9 >= 18#/7 =< O, < 3, 2 »=< O, 39 >= 78El número del programa será: #P = [#/i, #/2? • • • ? #-^7] — 1= 2189 • 318 • 51278 • 791 • II2 • 1318 • 1778 - 1

2. Encontrar los programas P cuyos códigos son 575, 1028 y 1327103.

Solución:

. y = #P = 575#P + 1 = 575 + 1 = 576 = 26 • 32 - [6,2] = [#/!, #/2]

#/! = 6 =< 0,3 >=< O, < 2,0 »=>Etiq(l, y) = O =¿- No tiene etiqueta./nsír(l, y) = 2 => Instrucción del tipo VVar(l, y) =0 + 1 = 1 ^-La variable es YLuego /i: y

(A) IF X T¿ O GOTO BZ + +IF Z T¿ O GOTO S

(B) X--Y + +Z + +IF Z ¿O GOTO A

Page 211: Introduccion a la teoria de la computabilidad

210 APÉNDICE A. SOLUCIONES

#/2 = 2 =< 0,1 >=< O, < 1,0 »Etiq(2, y) = O => No tiene etiqueta.Instr(2, y) = 1 =$• Instrucción del tipo V + +Far(2, y) = 0 + 1 = 1 => La variable es YLuego /2i Y" + +

El programa P es el siguiente:

y--y + +

• y = #P = 1028#P + 1 = 1028 + 1 = 1029 = 2° • 31 • 5° • 73 = [0,1,0, 3] == [«L, #/2,#/3,#/4]

#/! = O =< O, O >=< O, < O, O »=>Etiq(l,y) — O =>• No tiene etiqueta.Instr(l,y) = O ̂ Instrucción del tipo V ==Far(l,y) =0 + 1 = 1 =^>La variable es YLuego /i: Y ——

#I2 = 1 =< 1,0 >=< 1,< 0,0 »=^Etiq(2, y] = 1 =>• La etiqueta es A.Instr(2, y) — O =>• Instrucción del tipo V ==Far(2, y) = 0 + 1 = 1 =4>La variable es YLuego J2: (A) Y ==

#/3 = O = #/i ̂ J3 : y ==

#/4 = 3 =< 2,0 >=< 2, < O, O »^Etiq(4:,y) = 2 =^> La etiqueta es B.7ns£r(4, y) = O =>• Instrucción del tipo V" ==Far(4, y) = 0 + 1 = 1 =^>La variable es YLuego /4: (B) y ==

El programa P es el siguiente:

y ==(A) y==

y ==(B) y==

. y = #p = 1327103#P + 1 = 1327103 + 1 = 1327104 = 214 • 34 = [14,4] = [#/i, #/2]

Page 212: Introduccion a la teoria de la computabilidad

A.5. UN PROGRAMA UNIVERSAL 211

#/! = 1 4 = < 0 , 7 > = < 0 , < 3,0 »=>Etiq(l, y) = O =4> No tiene etiqueta.7nsír(l, y) = 3 > 2 => Instrucción del tipo IF V ^ O GOTO VVar(l, y) =0 + 1 = 1 =4-La variable es YEtiq'(l, y] = 3 - 2 = 1 => L1 = A.Luego /i: IF y ^ O GOTO A.

#/2 = 4 =< O, 2 >=< O, < 0,1 »=*Etiq(1, y) = O =^ No tiene etiqueta.Instr(2,y) = O =¿> Instrucción del tipo V ==Far(2, y) = 1 + 1 = 2 ^La variable es JíLuego I<¿'. X ==

El programa P es el siguiente:

IF y ¿ O GOTO AV=

3. Calcular #P para el siguiente programa:Z + +

(C) IF X2 i- O GOTO AIF Z ^ O GOTO S

(A) IF Xi ^ O GOTO BIF Z ^ O GOTO A

(B) *!--^2--IF Z ^ O GOTO C

Solución:#/! =< O, < 1,2 »=< 0,9 >= 18

^/2 =< 3, < 3, 3 »=< 3,55 >= 887

#/3 =< O, < 7,2 »=< O, 639 >= 127

#/4=< 1,<4,1 »=< 1,47 >= 189

#/5 =< O, < 3,2 »=< 0,39 >= 78

#/6 =< 2, < 2,1 »=< 2,11 >= 91

#/7 =< O, < 2,3 »=< O, 27 >= 54

#/8 =< O, < 5,2 »=< 0,159 >= 318

Luego #P = 218 • 3887 • 51278 • 7189 • II78 • 1391 • 1754 • 19318 - 1

Page 213: Introduccion a la teoria de la computabilidad

212 APÉNDICE A. SOLUCIONES

4. Para cada k > 1, sea P'k el programa:

(C) Zk + +

Demostrar que el predicado P(x] <& x es el código de un programa de lafamilia anterior, es recursivo primitivo.

Solución:Teniendo en cuenta que #(Zi) = 3, #(Z2) = 5, #(Z3) = 7 , . . . , #(Zfc) =2fc+ ! , - • •tenemos que, para el programa P¿, el código de su única instrucción es:#/ =< 3, < 1,2k »=< 3,2*(2 • 2fc + 1) - 1 >=< 3, Sk + 1 >== 23(2(8fc + 1) + 1) - 1 = 8(16fc + 3) - 1 = I28k + 23.Luego #P¿ = [#/] - 1 = I*1 - 1 = 2128*+23 - 1.Así pues, x es el código de un programa de la familia anterior 4=> x es de laforma 2128fc+23 - 1, es decir:

P(x) <* (^k}<x(x = 2128*+23 - 1)

Por lo tanto el predicado P es recursivo primitivo.

5. Calcular los valores del predicado PASOSA (2, ?/, 8) para los códigos y cal-culados en el ejercicio 1.

Solución:PASOSA (2, y, 8) = 1 •& Existe una computación de longitud < 9 para laentrada X = 2.

. y = #p = 245 • 32 • 546 - 1

5i = (1, {X = 2, Y = 0}) Instantánea inicial

S2= (2,{x = i,y = o})53= (3,{x = i,y = i})a 4 = (i,{x = i,y = i})S5= (2,{x = o,y = i»56- (3,{JÍ = 0,y = 2})57 = (4, {X = O, y = 2}) Instantánea final

Luego PASOSA) (2, y, 8) = 1 (TRUE).

Page 214: Introduccion a la teoria de la computabilidad

A.5. UN PROGRAMA UNIVERSAL 213

. y = #P = 2189 - 318 • 51278 • 791 • II2 • 1318 • 1778 - 1

si = (1, {-X" = 2, Z = O, Y — 0}) Instantánea inicials2= (4,{X = 2,Z = 0,y = 0})

S3= (5,{x = i,z = o,y = o})5 4= (6,{x = i,z = o,y = i})S5= (7,{x = i,z = i,y = i})S6= (i,{x = i,z = i,y = i})S7=

58= (5,{x = o,z = i,y = i})59 = (6, {Jí = O, Z = 1, y = 2}) (no es una instantánea final )

Luego PASOSA) (2, y, 8) = O (FALSE).

6. Demostrar que la siguiente función es recursiva primitiva:Ref(v, #P) = Número de veces que se referencia la variable de código v enel programa #P.

Solución:

7. Demostrar que la siguiente función es L-computable:Referencia(xi,..., xn, #P, v] — Número de veces que se referencia la va-riable de código v en durante la ejecución del programa #P, cuando se lepasan las variables x i , . . . , xn como valores de entrada.Solución:

(A) Z2 <- InstpCi, . . . , Xn,Xn+i,Zi)IF FINAL(Z2,Jfn+i) GOTO SZ3 4- 1(Z2)Z44-Var(Z2 ,Xn+i)^i+ +IF Z4 7a ^n+2 GOTO Ay + +GOTO A

{x = i,z = i,y = i})

Page 215: Introduccion a la teoria de la computabilidad

214 APÉNDICE A. SOLUCIONES

8. Probar que el siguiente predicado es:

a) Recursivo primitivo.

6) L-computable.

Q(^tp) •& El programa de código #P contiene al menos una instrucciónZ + + (con o sin etiqueta).

Solución:

9. Sea la función:Nvar(xi, ...,xn, #P, í) = Número de variables con valor distinto de O, des-pués de t pasos de computación, del programa #P con las entradas #1,..., #n.Demostrar que Nvar es recursiva primitiva.

Solución:

r(Inst(x\,...,xn,#P,t)} = [y,£i,2i,£2>---] es 1a codificación del estado delas variables después de í pasos de computación.Llamando L = Long(r(Inst(xi,..., xn, #P, ¿))), tenemos que

(A) Zi + +IF Zl = Lon#(X + 1) GOTO SZ2 <-Instruí, X)IF Z2 7a 1 GOTO AZ3 ^- Var(Zi,x)IF Z3 ^ 3 GOTO Ar + +

Page 216: Introduccion a la teoria de la computabilidad

12. Sea P el programa que computa la función /(#i,..., xn), y supongamos quepara alguna función recursiva primitiva g(x\,..., xn) se cumple quePASOSA (#1, ...,£„, #P,<?(a;i,...,£n)) es cierto para todo #1, ...,xn.Demostrar que /(#i, ...,#n) es recursiva primitiva.

A.5. WV PROGRAMA UNIVERSAL 215

10. Demostrar que la siguiente función es L—computable:

PasaPor(xi,..., xn, #P, ¿) =1 si la ejecución del programa #P

pasa por la instrucción ¿-ésimaen otro caso

Solución:

Probamos que es L—computable construyendo un programa que la calcula:

(A) Z2<-l(/n<Yi, . . . ,Xn ,#P,Z))IF Z2 = i GOTO BZ + +GOTO A

(B) Y + +

11. Demostrar que la siguiente función es recursiva primitiva:VALOR(t>, y, í, #1, • • • , xn) = valor de la variable de código v en el progra-ma y después de t pasos de computación cuando éste recibe las entradasX\ = # i > - • • ,Xn = xn.

Solución:Si llamamos s¿ = Inst(n\xi, • • • , xn, y, í) (código de la instantánea í—ésima), entonces r(s¿) es la codificación del estado de las variables des-pués de t pasos de computación:r(8t) - [y, Xi, Zi,X2, Z2, • • •] = 2Y • 3Xl • 5Zl • 7*2 • 11̂ . . . =

"V V 7 lí5' 7= Pi ' Pz 1 ' PzX ' ^4 2 ' Ps2 ' ' ' (este producto es finito porque el programa ysólo utiliza un número finito de variables).El valor de la variable de código v es el exponente del número primo v—ésimoen la expresión anterior, por lo tanto:

es recursiva primitiva por ser la minimización acotada de un predicado re-cursivo primitivo.

Page 217: Introduccion a la teoria de la computabilidad

216 APÉNDICE A. SOLUCIONES

Solución:Debido a que PASOSA(#1, ...,#n, #P,g(x\, ...,xn))=TRUE, tenemos queInst(n\xi,..., a;n, #P,p(^i, ...,#„)) es el código de una instantánea final.r (/nsí(n)(;ri,...,zn,#P,#(£i,...,£n))J = [y, Xi, Zi,X2, Z2, • • •} es la codi-ficación del estado final de las variables.Y teniendo en cuenta que /(#i, ...,xn] = Y, resulta:

luego / es recursiva primitiva.

13. Demostrar que para cada w, existen infinitos números distintos v tales quepara todo #,

Solución:función calculada por el programa cuyo código es u.

Para probar que flu(x) = £lv(x) para infinitos números v, hemos de encon-trar una familia infinita de programas, todos ellos con un número de códigodiferente y tales que todos calculen la misma función

Sea P el programa tal que #P = w, y sea ra el mayor subíndice de unavariable Z¿ utilizada en P, es decir: Zm+i, Zm+2, • • • no son referenciadasen P (ra = O si P no utiliza ninguna Z).Entonces, la siguiente familia de programas P¿, (k = 1, 2, 3 , . . . ) cumple lascondiciones requeridas:

Programa P& :Z

m+kInstrucciones de P

pues si llamamos v^ = #Pk , entonces1 O Q . . .

para todo k =

14. a) Sea

Demostrar que H\(x} es L-computable parcial.

Page 218: Introduccion a la teoria de la computabilidad

A.5. UN PROGRAMA UNIVERSAL 217

b) Sea A — {ai, ...,an} un conjunto finito tal que parasea

Demostrar que H^x] es L-computable parcial.

c] Construir un conjunto infinito B tal quetal que

para todo

sea L-computable parcial.

Solución:

a) El siguiente programa calcula HI(X}:

(A) IF PASOS(X, X, Z) GOTO BZ + +GOTO A

(B) Y + +

b) El siguiente programa calcula H^x}:

IF X = ai GOTO S

IF X = an GOTO S(A) IF PASOSA, X, Z} GOTO B

Z + +GOTO A

(B) Y + +

c) Veamos primero la construcción del conjunto B:La siguiente familia de programas PÍ (i=l,2,3,...):

Zi + +

No terminan para ninguna entrada X. En particular, PÍ no termi-na para la entrada X — #P¿. Luego, si llamamos1, 2, 3,...}, entonces se cumple que fí(x, x) =t para todoSea / la función recursiva primitiva definida por

(A) IF Zi = 0 GOTO AS

Page 219: Introduccion a la teoria de la computabilidad

218 APÉNDICE A. SOLUCIONES

Entonces, el siguiente programa calcula la función H^(x):Z2 <- f(X)IF Z2 = 1 GOTO S

(A) IF PASOSA, X, Z) GOTO BZ + +GOTO A

(B) y + +

15. Siguiendo el modelo dado en la sección de Teoría, dar otras dos versionesdel Programa Universal:

a) Utilizando la función Suc

b) Utilizando el predicado PASOS.

Solución:

a) Usando la función Suc:

Z<-Inic(Xi,---,Xn)'(A) IF FINAL(Z, Xn+i) GOTO B

Z f- Suc(Z,Xn+1)GOTO A

(B) y<-(r(Z)hb) Utilizando el predicado PASOS:

(A) IFPASOS(Xlí-"íXníXn+llZ2)GOTOBZ2 + +GOTO A

(B) Z<-Inst(X 1,'",XniXn+1,Z2)Y 4- (r(Z))i

16. Demostrar que la función

es L-computable parcial, pero que la función

Page 220: Introduccion a la teoria de la computabilidad

A.6. INDECIDIBILIDAD 219

no lo es.

Solución:

(1) El siguiente programa calcula la función /:

(A) IF PASOS (X, X, Z] GOTO SZ + +GOTO A

(2) Probamos que g no es L-computable por reducción al absurdo:Supongamos que existe un programa P que calcula g. Llamamos XQ al códigode este programa. Entonces, para x = XQ tendríamos:Q(XQ] = O •€> Q(XQ,XQ) =t (Por definición de g}<t=> El programa de código XQ no termina con la entrada X = XQ4=> g(xo) =t (pues el programa de código XQ lo que calcula es precisamentela función g).Llegamos pues, a la contradicción g(#o) = O <^> g(xo) =t, y por lo tanto gno es L-computable.

A.6. Indecidibilidad

1. Demostrar por reducción al absurdo que HALT(x,:r) no es L-computabletotal.

Solución:Si HALT(x, x) fuese computable total, podríamos construir el siguienteprograma P:

(A) IF HALT(x, x} GOTO A

Sea UQ = #P, entonces, para la entrada X = yQ tendríamos:

• Si HALT(yQ,yQ} => Se verifica la condición de la primera línea y seejecuta GOTO A =$• el programa se cuelga en la primera línea =4> elprograma P (de código ?/o) no termina para la entrada X = yo =¿>-.#ALT(y0,yo).

• Si ->HALT(yQ, yo) =^ No se verifica la condición de la primera línea yel programa termina =^> H ALT (y Q, yo).

Tendríamos, pues, la contradicción HALT(t/o,2/o) ̂ ~<HALT'(yo, y'o), luegono puede suponerse que HALT(x, x) sea computable total.

Page 221: Introduccion a la teoria de la computabilidad

220 APÉNDICE A. SOLUCIONES

2. Demostrar que el conjunto PARCIAL^vamente enumerable.

no es recursi-

Solución:

Lo probamos viendo que

Para cada consideramos el siguiente programa Pn:

Z ^ n

Sea / la función L—computable total definida por /(n) — #Pn- Entonces:

no termina para ninguna en-Sitrada X (puesto que se queda colgado en la segunda línea)

Si

PARCIAL

Pn termina para todas las en-PARCIALtradas

Es decir:aquí se concluye que PARCIAL no es r.e. (ya que K no lo es).

PARCIAL, por lo tanto PARCIAL, y de

3. Sea el predicado HALT1 (x) definido como HALT1(x) & HALT(l(x},r(x}}.Demostrar por reducción al absurdo que HALT1 (x} no es L-computable to-tal.

Solución:Si HALT1(x) fuese computable total, podríamos construir el siguiente pro-grama P:

Z ^<X,X >(A) IF HALT1(Z) GOTO A

Sean yo = #P, ZQ =< ?/o>2/o >• Entonces, para la entrada X = yo ten-dríamos:

Page 222: Introduccion a la teoria de la computabilidad

A.6. INDECIDIBILIDAD 221

• Si HALT(0,y0) => HALT(l(z0),r(z0)) => tfALT1^) => Se cumplela condición de la segunda línea y se ejecuta GOTO A => El programa(de código yo) entra en un bucle sin fin y no termina (para la entradaX = y0] =>-iHALT(y0ly0).

• Si -.#ALT(y0,yo) =» -iHALT(l(zQ),r(z0)) => -ífALT1^) => No secumple la condición de la segunda línea y el programa (de código yo)termina (para la entrada X = yo) =>• H ALT (yo, yo).

Tendríamos, pues, la contradicción HALT(yQ,yo] «=> -i.ífALT'(yo,yo), P°rlo tanto, la suposición inicial de que HALTl(x] es computable total, esfalsa.

4. Sea el predicado P(x)total.

Demostrar que P(x) no es L-computable

Solución:

fuese computable total podríamos construir el si-guiente programa P:

(A) IF P(X) GOTO AY + +

Sea yo = #P. Entonces, para la entrada X = yo tendríamos:

• Si -P(yo) => Se cumple la condición de la primera línea y se ejecutaGOTO A => El programa (de código yo) entra en un bucle sin fin (parala entrada -X" = yo) No se cumple que

• Si -iP(yo) =>• No se verifica la condición de la primera línea y se ejecutala instrucción Y + + =>• El programa (de código yo) devuelve el valor1 para la entrada

Hemos llegado a la contradicción -P(yo) •£> ^P(yo}i luego P(x) no es L—com-putable total.

5. Demostrar que B = es un conjunto recursivo.

Page 223: Introduccion a la teoria de la computabilidad

222 APÉNDICE A. SOLUCIONES

Solución:B = {O, 1, 4, 9, 16, 25, ...} = # es un cuadrado perfecto}

El siguiente programa devuelve el valor Y = 1 si X pertenece aZ2 para algún Z), y el valor Y = O en caso contrario:

(A) Z2^ Z-ZIF X = Z2 GOTO BIF Z2 > X GOTO SZ + +GOTO A

(B) Y + +

6. Una tupia (ai,...,an) es palíndroma cuando [ai,...,an] = [an,...,ai]. De-mostrar que el conjunto

x es el número de Gódel de una tupia palíndroma }

es un conjunto recursivo.

Solución:Un conjunto es recursivo si existe un programa que calcule su función ca-

racterística: f ( x ) =•*.

El siguiente programa termina con Y = I si Xsi

B, y termina con Y — O

7. Sea KQ = { { x , y } \ x Wy}. Demostrar que KQ es r.e.

Solución:Podemos también expresar KQ de la siguiente forma:

Damos a continuación dos programas que semideciden el conjunto KQ:

Zi <- 1Z2 <- Long(X)

(A) IF PT)Z! ^ (X)z, GOTO SZi + +Z2--IF Zi < Z2 GOTO Ar + +

Page 224: Introduccion a la teoria de la computabilidad

A.6. INDECIDIBILIDAD 223

a) Utilizando la función

6) Utilizando el predicado PASOS:

Zl <r- l(X]Z2^r (X)

(A) IF PASOS(Zi, Z2, Z3) GOTO SZ3 + +GOTO A

8. Demostrar que el conjunto A =enumerable.

es recursivamente

Solución:tal que

El siguiente programa semidecide el conjunto A:

La función computada por el programa anterior es:

en otro caso

en otro caso

para algún z

(A) IF -, PASOS(Zi,X,Z2) GOTO BIF-.PASOS(Zi,A" + l,Z2) GOTOBGOTO S

(B) Zi + +IF Zi < Z2 GOTO AZ2 + +Zl^QGOTO A

O si x e A

Page 225: Introduccion a la teoria de la computabilidad

224 APÉNDICE A. SOLUCIONES

9. Demostrar que el siguiente conjunto C es recursivamente enumerable.

Solución:

El siguiente programa semidecide al conjunto C:

Z2 <- l(X)(A) IF PASOS(Zi, Z2, Z3) GOTO B

Zi + +IF Zi < Z3 GOTO AZi f-0Z3 + +GOTO A

(B) IF PASOS(Zi,jr,Z3) GOTO CZl + +GOTO A

(C) IF Zi e PARES GOTO SZi + +GOTO A

10. Demostrar que el siguiente conjunto A es recursivamente enumerable.

A = {x|Wa;Contiene más de un número}

Solución:

El siguiente programa semidecide al conjunto A:

Page 226: Introduccion a la teoria de la computabilidad

A.6. INDECIDIBILIDAD 225

(A) IF PASOS(Zi,A",Z2) GOTO BZi + +IF Zi < Z<¿ GOTO AZi f -0Z2 + +GOTO A

(B) IF Z3 T¿ O GOTO CZ3 + +Z4 <- ZiZi + +GOTO A

(C) IF Z4 ^ Zi GOTO SZi + +GOTO A

11. Sean /, #, /i tres funciones L-computables totales. Demostrar que el conjun-to

Solución:

El siguiente programa semidecide al conjunto A:

Zi <- /(^)Z2 ̂ p(X)Z3 ̂ h(X)

(A) IF PASOS(Zi, Z2, Z4) GOTO SIF PASOS(Zi,Z3,Z4) GOTO SZ4 + +GOTO A

12. Sean dos conjuntos A,B. Demostrar si son ciertas las siguientes proposi-ciones:

Solución:

es r.e. pero K no lo es, luego la afirmación es falsa.

a) Si A U B es r.e. entonces A y B son ambos r.e.

b) Si A C B y B es r.e. entonces A es r.e.

a)

Page 227: Introduccion a la teoria de la computabilidad

226 APÉNDICE A. SOLUCIONES

es r.e. pero K no lo es, luego la segunda afirmación tambiénes falsa.

*)

13. Sea B un subconjunto de Nm, m > 1. Decimos que B es r.e. si existe algunafunción <?(#i, ...,xn) L-computable tal que

Sea

Demostrar que B es r.e. si y solo si B1 es r.e.

Solución:

L—computable tal que

Las funcionestotales.Definimos ahora

N definidas por son L—computables

como

Se verifica entonces que pues:

Por tanto B' es r.e. (pues es el dominio de la función L—computable /).

Por ser L—computable tal que

Por otra parte, la aplicación N definida porL—computable total.

Definimos ahora medianteEntonces se verifica queefecto:

(por definición de B' )

(por definición de </?)

[por ser B' el dominio de /)

(por definición de g)

Por lo tanto B es r.e. (ya que es el dominio de la función L—computable g).

Page 228: Introduccion a la teoria de la computabilidad

A.6. INDECIDIBILIDAD 227

14. Sea

a) Demostrar que A es r.e.

6) Demostrar que A no es recursivo.

Solución:

a) El siguiente programa semidecide el conjunto A:

b) Si A fuese recursivo, entonces el predicadox sería computable total y podríamos construir el siguiente programaP:

(A) IF PA (X] GOTO AY f- XY + +

Sea í/o — #-P- Entonces, para la entrada X = yo tendríamos:

• Si PA (yo) =>Se cumple la condición de la primera línea y se ejecutaGOTO A =^E1 programa P se cuelga en la línea 1 y no termina(para la entrada X = yo) => ->HALT (yo, yo) =¿-No se cumple que

• Si ->PA (yo) =^No se cumple la condición de la primera línea y seejecutan las líneas 2 y 3 =>• El programa P termina con salida Y =

Tenemos, pues, la contradicción PA (yo) O- ~<PA (yo) • Luego A no esrecursivo.

15. Sean A, B conjuntos de números naturales. Demostrar que:

Solución:

a) La función identidad / (x) = es computable total y se verifica queluego

(A) Y <- ttx (x)IF Y > X GOTO SGOTO A

a) A < A

b) A<Bsiy solo si ~A < ~B.

Page 229: Introduccion a la teoria de la computabilidad

228 APÉNDICE A. SOLUCIONES

b)

(Bf computable total tal que:conmutable total tal que:computable total tal que:

16. Para todo n, sea

a) Demostrar que AÍ es r.e. pero no recursivo para todo i.

b) Demostrar que AÍ = Aj para todo i,j.

Solución:

AJ es r.e.: El siguiente programa semidecide el conjunto A¿:

Z <-¿(A) IF PASOS (Z, X, Z2) GOTO S

Z2 + +GOTO A

Que calcula la función en otro caso

Aj no es recursivo: Lo demostraremos viendo que KQ < AÍ :Para cada n E N Consideramos el siguiente programa Pn:

Zi «- nZ<2 i- /(Zi)^3 <- r(Zi)Y^tt(Z2,Z3)

Sea / : N —> N la funicón L—computable total definida por /(n) =#Pn. Entonces tenemos que:

Se concluye la ejecución de laSilínea 4 del programa =$• Pn termina (para cualquier entrada X) =>•En particular, Pn termina para la entrada .

. Si No termina la ejecución dela línea 4 del programa =$• Pn no termina para ninguna entradaX => En particular, Pn no termina para la entrada

Tenemos que por lo tanto

a)

Page 230: Introduccion a la teoria de la computabilidad

A.6. INDECIDIBILIDAD 229

b] (Suponemos que i < j. El caso j > i se resolvería análogamente, y sii = j entonces se verifica que AÍ = Aj => AÍ = Aj, pues en general,para todo conjunto B C N, se cumple que B = B ).(Ai < AJ} :

Para cada n e N, llamamos Pn al programa de código n, y P'n alsiguiente programa:

Xi--(j — i lineas)

*!--Instrucciones de Pn

Sea / la función computable total definida portermina para la entrada

X = i 4=> P^ termina para la entrada X — j (si X = j, entonces,después de las j — i primeras instrucciones tenemos que X = i, y acontinuación se ejecutan las instrucciones de Pn)

Tenemos pues, que n G AÍ 44> / (n) E Aj, por tanto AÍ < Aj.

Para cada n E N, llamamos Pn al programa de código n, y Pn alsiguiente programa:

Xl + +( j' — i lineas )

Xi + +Instrucciones de Pn

Sea q la función computable total definida portermina para la entrada

X = j •& Pn termina para la entrada X = i (si X = i, entonces,después de las j — i primeras instrucciones tenemos que X — j, y acontinuación se ejecutan las instrucciones de

Tenemos pues, que n € Aj •& g (n) 6 AÍ, por tanto Aj < AÍ.

se cumple que:Entonces

17. Sea es infinito }. Demostrar que INF = TOTAL.

Solución:

a) INF < TOTAL:Para cada n consideramos el siguiente programa Pn :

Entoncesse cumple que:

Page 231: Introduccion a la teoria de la computabilidad

230 APÉNDICE A. SOLUCIONES

(A) Z2 <- X + ZIF PASOS (Z2,n,T) GOTO SZ + +IF Z < T GOTO AT + +Z < - 0GOTO A

(Z2)x + Qx + Qx + lx + Qx + 1x + 2x + Q

(T)0112223

Sea / la función L—computable total definida portonces tenemos que:

En-

• Si n para infinitos números ra => Dado un Xcualquiera, PASOS (-Z2,n,T) se cumplirá cuando Z^ y T alcancenel valor necesario => Pn termina para cualquier X =$• f ( n ) =#Pn 6 TOTAL.

. Si solamente para un número finito denúmeros ra => PASOS(^2,^,r) no se cumplirá nunca si X esmayor que el mayor de los ra que cumplen Í7n(m) =\. => Pn noterminará para todas las entradas

Tenemos por lo tanto que nluego INF < TOTAL.

TOTAL,

b) TOTAL < INF:Para cada n £ N, consideramos el siguiente programa

(A) y<-í í (Z,ra)Z + +IF Z < X GOTO A

(dada una entrada X, P'n terminará si y solo si '0,1,2, . . . ,*)-Sea g la función L—computable total definida portonces tenemos que :

En-

paraZ==

• Si terminará para cualquierentrada es infinito

• Si se colgará para todoslos ja que cuando Z tome el valor ra)solamente terminará para un número finito de entradas (para X

es finito

Luego y por tanto TOTAL < INF.

Hemos visto que INF < TOTAL, y que TOTAL < INF, luego INF =TOTAL.

Page 232: Introduccion a la teoria de la computabilidad

A.6. INDECIDIBILIDAD 231

18. Demostrar que no existe ningún algoritmo para determinar, dado un pro-grama P de L, si typ(x) = x2 para todo x.

Solución:El problema es equivalente a demostrar que el conjunto CUADRADO ={n E N \ Q(#,n) = x2 Vx} no es decidible (-H- recursivo).

Probaremos que CUADRADO no es recursivo viendo que KQ < CUADRA-DO:

Para cada n e TV, consideramos el siguiente programa Pn :

Zi -f- nZ 2 < - / ( Z i )Z3^r(Z1]Y^tt(Z2,Z3}Y ^ X -X

Sea / : N —>• N la función L—computable total definida por /(n) = #Pn-Tenemos que:

• Si no se cuelgaen la línea 4 y se ejecuta, para cualquier entrada X, la instrucción

calcula la funciónCUADRADO.

• Si Pn se cuelga en lalínea 4 y el programa no termina para ninguna entrada X => Pn nocalcula la función CUADRADO.

Así pues: CUADRADO, por lo tanto#olo es.

CUADRADO, y como KQ no es recursivo CUADRADO tampoco

19. Demostrar que no existe ningún algoritmo para determinar de cualquierpareja de números u, v si íí(#,u) = £l(x,v) para todo x. (Es decir, si u y vson los códigos de dos programas que calculan la misma función).

Solución:El problema es equivalente a demostrar que, dado un u cualquiera, el con-junto lu = {v e N \ £l(x,v) = Í2(x,w) V#} no es decidible (•<->• recursivo).Para probar que I u no es recursivo distinguimos dos casos:

Page 233: Introduccion a la teoria de la computabilidad

232 APÉNDICE A. SOLUCIONES

para todo x.a)

b)

En este casoVACIO, que sabemos que no es recursivo.

para algún x.En este caso probamos que lu no es recursivo viendo que KQ < lu :Para cada n G N, consideramos el siguiente programa Pn:

Sea / la función L—computable total definida por /(n) = #Pn- En-tonces tenemos que:

• Si Pn no se cuelga en la línea 4 y se ejecuta Ycalcula la función

• Si se cuelga en la línea 4 y por tantoNo se cumple que (puesto que

para algún x

Luegoque lu no es recursivo (puesto que KQ no lo es)

por lo tanto de donde se deduce

20. Demostrar que el conjunto B — {n G N | Wn = {2, 5} } no es r.e.

Solución:

Lo probamos viendo que K < B:

Para cada n e A/", consideramos el siguiente programa Pn:

IF (X = 2) GOTO SIF (X = 5) GOTO SY <-íí(n,n)

Sea / la función L—computable total definida por /(n) = #Pn. Tenemosque:

. Si :mente para

Pn termina única y exclusiva-

Zi <- /(n)Z2 <- r(n)Z3 ^uy<-n(Zi,z2)y^í7(x,z3)

Page 234: Introduccion a la teoria de la computabilidad

A.6. INDECIDIBILIDAD 233

• Si Pn termina para todas lasentradas

Luegoes r.e. (puesto que K no lo es).

por tanto K < B, de donde se deduce que B no

Page 235: Introduccion a la teoria de la computabilidad

índice alfabético

de instrucciones, 121de pares de números, 26de programas L, 123de una descripción instantánea,

127de variables, 121del estado de un programa L, 126

colección, 13composición, 91computación, 9computación de un programa, 72configuración inicial de una MT, 44conjunto, 10

caracterización de conjuntos in-finitos mediante predicados,18

complementario, 13diferencia, 13finito, 10igualdad, 12infinito, 11intersección, 12numerable, 28partes de, 14pertenecía de un elemento, 10producto cartesiano, 15subconjunto, 12subconjunto propio, 12unión, 12vacio, 10

decisión, procedimiento de, 144DECR(<¿,2 >,#P), 129definición por casos, 102

< a, 6 >, 26A = B, 158A<B, 156Pn, 109¿(a,*), 127[x/y\, 108Q(z!,...,zn,#P), 133$(í,z), 110S(n), 141£+, 22E*, 22

alfabeto, 19algoritmo, 37, 39

BNFdefinición de un natural, 69no terminal, 68notación, 68terminal, 68

cadena, 19cadena vacía, 19concatenación, 20exponenciación, 21inversión, 21prefijo, 20subcadena, 20sufijo, 20

castor afanoso, 141cero, 90cerradura estrella, 22cerradura positiva, 22codificación, 26

de etiquetas, 121

Page 236: Introduccion a la teoria de la computabilidad

ÍNDICE ALFABÉTICO 235

descripción instantánea de una MT,43

diagonalización, 31dominio de una función, 15dovetailing, 147, 149

estado de un programa, 70Etiq(t,#P), 124Etiq«(¿,#P), 124expresión regular, 38

factorial, 95FINAL(s,#P), 132FINITO, 162función, 15

aridad, 16biyectiva, 17inyectiva, 17parcial, 16suprayectiva, 17total, 16

función característica, 19función constante (//,), 139

Gódel, K., 118

HALT(z,2/), 137Hilbert, D., 37hipótesis de inducción, 24

Identidad, programa, 66IMPARES, 11INCR(<¿,z >,#P), 129inducción, 24Inic(zi,. . . ,£„), 128Inst(xi,. . . ,o;n,#P,£), 131instantánea de un programa, 71instantánea terminal, 71Instr(¿,#P), 124

K, 152K, 154K0, 158

l(x), 28

lenguaje, 21definición de lenguajes infinitos,

38Lenguaje L

etiqueta, 67instrucción, 64, 68longitud de un programa, 68programa, 64, 68programa vac'io, 68semántica, 70sentencia, 67sintaxis, 68, 69valor de una variable, 65variable, 67variable de salida, 64variable de entrada, 64, 67variable de salida, 67variable local, 64variable local a un programa, 67

Lenguaje Rcomposición, 91recursión, 93semántica, 98sintaxis, 97

LISP, 89lista numerable, 29

Máquina de Turing, 37, 42configuración inicial, 44descripción instantánea, 43multicinta, 50universal, 117multipista, 46no determinista, 52paso de ejecución, 43

minimización acotada, 106minimización no acotada, 111monus, 95mult, 94

N, 10número de Gódel, 118

función descodificadora, 119

Page 237: Introduccion a la teoria de la computabilidad

236 ÍNDICE ALFABÉTICO

NO_VAClO, 145, 159numerabilidad, 28

no numerabilidad, 31

orden lexicográfico, 57ordenación de pares de números, 58

P(N), 31palíndromo, 21parada, el problema de la, 137PARES, 13paso de ejecución de una MT, 43PASOS(zi,.. . ,zn ,#P,í), 132pred, 94predicado, 17

conjunto asociado, 19predicados recursivos primitivos, 100Primo, 106productorio acotado, 104programa, 64

estado de un, 70programa universal, 132propiedad no trivial, 164Pseudo-identidad, programa, 65

r(ar), 28r.e., conjunto, 145rango de una función, 15recursión, 69, 93recursiva primitiva, función, 100recursiva-/¿, 112recursivamente enumerable, conjun-

to, 145recursivo, conjunto, 144reducción, 156reducción al absurdo, 23

SALTO(<¿,z >,#P), 129semidecisión, procedimiento de, 145SKIP(<¿,*>,#P), 129suc, 90Suc(s,#P), 129sucesor, 71suma, 93

sumatorio acotado, 104

Teoría de Lenguajes y Autómatas, 38Teorema de Rice, 163Tesis de Church-Turing, 37, 84, 112,

137, 156TOT, 155tupia, 14

igualdad, 15Turing, A., 37, 117Turing-computable total, función, 56Turing-computable, función, 56

VACÍO, 161valor de una variable, 70

Wn, 152