Você está na página 1de 15

El Teorema de Universalidad

EL TEOREMA DE UNIVERSALIDAD
1. Introduccin
Uno de los pilares sobre los que descansa la Teora de la Computabilidad y que ha de
estar presente en todo sistema de computacin aceptable es sin duda el Teorema de
Universalidad. Este resultado, considerado bajo el modelo de los Programas While,
garantiza la existencia de un programa Universal, capaz de simular el comportamiento
de cualquier otro programa ante una entrada dada. Como se puede observar, dicho
programa Universal debe admitir como parte de su entrada a otro programa while. As
pues, teniendo en cuenta el hecho de que las entradas de un programa while han de ser
vectores de nmeros naturales, nos veremos en la necesidad de construir un proceso de
codificacin de los programas while. Este proceso traer como consecuencia la
enumeracin efectiva de los programas y por consiguiente de las funciones
computables.
Una vez puestas de manifiesto las enumeraciones efectivas tanto de programas
como de funciones computables, se proceder al enunciado y justificacin mediante la
Tesis de Church, del Teorema de Universalidad. Aunque esta demostracin puede
resultar convincente, queremos resaltar que no lo debe ser tanto, debido a cierta
dificultad que ha de ser salvada mediante un resultado terico. La dificultad estriba en
cmo un programa fijo, y por tanto con un nmero concreto de variables, puede simular
el comportamiento de otro programa que eventualmente puede tener ms variables. La
idea clave reside, como se ver, en tratar de almacenar la informacin de un conjunto de
variables, en una nica variable. Se procede por tanto a la construccin de biyecciones
entre el conjunto de los naturales y cualquier potencia del mismo, as como las
correspondientes proyecciones.

2. Enumeracin de los Programas While


Teniendo en cuenta que el alfabeto asociado a los programas while es finito y que se
pueden construir una infinidad de estos programas (por ejemplo los programas que
computan las funciones constantes), podemos deducir que el conjunto de todos los
programas while es numerable. De hecho dicho conjunto podra ser ordenado, por
ejemplo alfabticamente. Sin embargo esta ordenacin no es til para nuestros
propsitos, pues aunque dados dos programas podramos decidir cul de ellos va antes
en el orden, no sera posible saber qu lugar ocupa un programa determinado, ni
construir el programa que ocupa un lugar concreto.
Considerando el conjunto de caracteres del lenguaje de los programas while y el
hecho de que hemos convenido que los nombres de las variables son de la forma Xn con
n perteneciente a los naturales, se puede representar dicho conjunto mediante cdigos
binarios de seis dgitos de acuerdo a la siguiente tabla:

Smbolo
begin
end
while
do
:=
;
succ
pred

(
)
X
0
1
2
3
4
5
6
7
8
9

Cdigo binario
100000
100001
100010
100011
100100
100101
100110
100111
101000
101001
101010
101011
101100
101101
101110
101111
110000
110001
110010
110011
110100
110101

Cdigo decimal
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

Teniendo en cuenta la tabla anterior, podemos definir una funcin codificadora,


que denominaremos Cod, que va del conjunto de los programas while (WP) al conjunto
de los naturales: Cod : WP N; de manera que dado un programa P, Cod (P) ser el
nmero natural representado por la expansin binaria obtenida mediante la
concatenacin de los bloques de seis bits asociados a los caracteres de P en el orden de
la secuencia. As el programa P begin X1 : = 0 end, tendr como imagen por la
funcin Cod al nmero cuya espansin binaria es:
100000 101011 101101 100100 101100 100001
Es claro que el tamao de los nmeros que surgen de este proceso de
codificacin resulta enormemente grande, pero afortunadamente esto no afectar a
nuestros intereses; ya que lo que realmente nos importa es que programas distintos den
lugar a nmeros naturales diferentes y que podamos construir un programa a partir de su
nmero asociado.
2.1. Observaciones
a) Como se puede ver, la funcin Cod anteriormente definida es inyectiva, ya que dos
programas distintos deben distinguirse por alguno de sus caracteres, lo que trae
como consecuencia que los respectivos bloques de seis bits sean diferentes y por
tanto los nmeros a los que dan lugar las expansiones binarias de los programas.
b) En cambio Cod no es suprayectiva, ya que por ejemplo el nmero natural 1 no es
imagen de ningn programa. Igualmente el nmero 2082, cuya expansin binaria es:

100000 100010
sera el asociado a la cadena de caracteres formada por: begin while, que como se
puede observar no es un programa while sintcticamente correcto.
A pesar de que la funcin codificadora definida anteriormente no sea una
biyeccin, podemos definir una inversa a izquierda enviando a un programa concreto,
aquellos naturales que no son el cdigo de ningn programa while. De esta forma se
define Decod: N WP como sigue:
P si P correcto con Cod (P) = n
Decod (n) =
Q si no
donde Q es un programa cuyo dominio de definicin sea el conjunto vacio. Por ejemplo:

Q begin X2 := succ (X1) while X1 X2 do begin end end

2.2. Observaciones
a) Ntese que la funcin Decod no es inyectiva pues una infinidad de nmeros
naturales tienen por imagen al programa Q. En cualquier caso s resulta ser
suprayectiva.
b) Igualmente resulta evidente que Decod (Cod (P)) = P. Con lo que Decod es inversa
a izquierda de Cod.
2.3. Proposicin
Las funciones Decod y Cod son computables.
Demostracin
Aplicando la tesis de Chuch segn la cual todo proceso que pueda de alguna manera
describirse mediante un conjunto finito de instrucciones y en un lenguaje
pseudoalgortmico es computable y considerando el siguiente proceso se demuestra la
computabilidad de Decod:
1.- Escribir la entrada n en binario.
2.- Descomponer la expansin binaria anterior en bloques de seis bits.
3.- Buscar el significado de cada bloque segn la tabla anterior.
4.- Si el texto que resulta es un programa while sintcticamente correcto P,
definimos Decod (n) = P.
5.- Si en 2, 3, 4 falla el proceso, se define Decod (n) = Q.
Anlogamente se puede definir un proceso para el clculo de la funcin Cod.

2.4. Observacin
En el proceso definido anteriormente para la funcin Decod, la demostracin estricta del
carcter algortmico del paso 4 resulta ser lo ms complejo. En este sentido y mediante
tcnicas de procesamiento de cadenas (utilizando las funciones head y tail que aplicadas
a una cadena devuelven respectivamente el primer smbolo y la subcadena formada por

todos los smbolos excepto el primero), puede construirse una demostracin rigurosa de
este hecho. De todas formas no resulta un excesivo acto de fe admitir que el paso 4 es
algortmico, pues la comprobacin de la correccin sintctica de programas resulta
habitual en cualquier compilador.
Por todo lo anterior, podemos establecer una enumeracin de los programas
mediante la funcin Decod como sigue:
n 0, Pn = Decod (n)

Tenemos as que el conjunto WP = { P0, P1, ... ,Pn, ... }, siendo sta una
enumeracin donde el programa Q aparece una infinidad de veces.

3. Enumeracin de las Funciones Computables


(j)
j
Recordemos
que fijada la
aridad
programa P, denotndola
como
j :N 1,seN.defini la funcin semntica asociada a un
Ahora, tras la enumeracinP efectiva de los programas while, podemos considerar
la siguiente enumeracin efectiva de las funciones computables de aridad j 1:

(j)

,
1

(j)

,L,
,L n

(j)

donde
es la funcin semntica de aridad j del programa Pi. Es esta una
enumeracin con repeticin, ya que diferentes programas pueden tener la misma
funcin semntica de aridad j.
(j)
i

Adems el conjunto de todas las funciones computables se puede poner como:

U {
j 1

(j)
0

(j)

,
, 1

L,

(j)

L
, }

con lo que es una unin numerable de numerables, y en consecuencia numerable. Esto


debe poner de manifiesto la existencia de funciones no computables, ya que por ejemplo
el conjunto de todas las posibles funciones de N en N no es numerable.
Se define a continuacin uno de los conceptos ms importantes en Teora de la
Computabilidad: el concepto de ndice de una funcin computable.
3.1. Definicin
j
Sea f : N N, una funcin computable. Cualquier i 0 tal que f = i
de
f.

(j)

es un ndice

3.2. Observacin
Una funcin computable tiene infinitos ndices, ya que dado un programa que la
compute, ste puede modificarse de manera que no afecte a su funcin semntica. Por
ejemplo incrementando primero y decrementando despus una misma variable. Esto
hace que el programa sea distinto (y por tanto con otro ndice) sin que varen sus
funciones semnticas.

4. Teorema de Universalidad
A continuacin enunciaremos el teorema de Universalidad y daremos una demostracin
basada en la tesis de Church y en la funcin Decod definida anteriormente. Este teorema
pone de manifiesto la existencia de un programa while Universal cuya funcin
semntica de aridad j+1 engloba todas las funciones computables de aridad j.
4.1. Teorema
Para cada j 1 existe una funcin computable : N

j+1

N que es universal para

la
enumeracin de las funciones computables dada, en el sentido siguiente:
(e, a1 , a2 ,L, aj ) = e (a1 , a 2 ,L, a j
)

eN,

(a1 , a2 ,L, a j )

(j)

Demostracin
NEste resultado quedar probado si se logra demostrar la existencia de un programa
universal PU tal que si se le introduce como entrada un ndice e y un vector de
dimensin j, (a1, ... ,aj), obtiene como salida el resultado de computar el programa Pe
con entrada (a1, ... ,aj). Es decir, un nmero natural si Pe para con dicha entrada,
indeterminado si no para.

Un proceso algortmico para computar la funcin es el siguiente:

1.- Aplicar Decod a e, obteniendo Pe (programa k-variables).


2.- Simular la computacin de Pe mediante una secuencia de
computacin con vector estado inicial (a1, ... ,ak) si k j
(a1, ... ,aj,0 ...k j... ,0) si k > j.

Asumiendo que estos dos pasos son algortmicos y aplicando la Tesis de Church
queda demostrada la computabilidad de la funcin .

Este teorema tambin se conoce como Teorema de Enumeracin, ya que al


variar el primer argumento de la funcin Universal se van enumerando las funciones
computables de aridad j.
4.2. Observacin
Una vez que la demostracin anterior del Teorema de Universalidad nos ha convencido
de la existencia del intrprete Universal PU, hagamos la siguiente reflexin:
Si PU existe tendr un nmero fijo de variables, digamos k0. Como por otro lado
PU interpreta cualquier programa Pe, existirn programas de entre estos ltimos con un
nmero de variables mucho mayor que k0. As pues nuestro intrprete no puede simular
Pe utilizando una variable Xi siempre que ste la utilice. Cmo se realiza entonces la
simulacin?. El siguiente resultado da la idea clave para responder a esta pregunta.

4.3. Proposicin
j 1 existe un nmero natural r y una funcin total y computable Short : N N tal
que:
(j)
(j
a)
e N
=
)
e

Short (e)

b) El programa PShort(e) utiliza j + r variables.


Para acometer la demostracin de esta proposicin es necesario conocer antes
algunos conceptos y resultados sobre ciertas funciones capaces de comprimir los
contenidos de un vector k-dimensional en un solo nmero natural, as como las
respectivas proyecciones que juegan el papel de funciones inversas.

5. Funciones Codificadoras de vectores


En esta seccin veremos la forma de codificar cualquier vector de dimensin k en un
nmero, del cual podremos rescatar de nuevo cada una de las componentes del vector
original. Para ello nos basaremos esencialmente en la idea de Cantor para definir una
funcin biyectiva entre el conjunto de los nmeros racionales y el conjunto de los
2
naturales. En nuestro caso definiremos una biyeccin entre N y N que responde a la
2
ordenacin de N de acuerdo a las sucesivas diagonales, segn puede apreciarse en la
siguiente figura:
(0,0)

(0,1)

(0,2)

...

(0,n)

...

(1,0)

(1,1)

(1,2)

...

(1,n)

...

(2,0)

(2,1)

(2,2)

...

(2,n)

...

.
.
.
(n,0) (n,1) (n,2) ...
(n,n) ...
...............................................................
De esta forma el vector (0,0) tendr por imagen el 0, le seguir el (0,1), despus el (1,0),
el (0,2) y as sucesivamente.
5.1. Lema
La funcin as definida la denotaremos por : N N, y su definicin formal es:
2

(i,j) = (i + j) (i + j + 1) + i

Demostracin
Ntese que para cada n 1 hay exactamente n vectores cuya suma de sus componentes
es n 1. En consecuencia tenemos n (n + 1) vectores cuyas componentes suman a lo
sumo n - 1.

As pues la diagonal de suma n, cuyos vectores son:


(0,n),

(1,n-1),

...

, (n,0)

tienen respectivamente por imagen los nmeros:


n (n + 1), n (n + 1) + 1, ... , n (n + 1) + n.
Por tanto, en general el vector (i,j), situado en la diagonal de suma i + j, tendr por
imagen (i + j) (i + j + 1) + i.

5.2. Proposicin
: N2 N, definida anteriormente, es computable.

Demostracin
Evidente teniendo en cuenta el lema anterior, pues se trata de una expresin en donde
todas las funciones que intervienen son computables.

Una vez definida la funcin , que codifica vectores de dimensin dos en


nmeros naturales, se definirn las proyecciones capaces de obtener las dos
componentes del vector a partir del nmero en que estn codificadas.
5.3. Definicin
Se definen las proyecciones 1 y 2 , ambas de N en N, de la siguiente forma:

1(n) = i

2(n) = j

tal que (i,j) =


n
tal que (i,j) = n

5.4. Observacin
Ntese que
1 como pues
2 son
una
embargo
no tanto
son inyectivas,
porsuprayectivas
ejemplo 1(0)debido
= 1(1)a =que
0; y es
= biyeccin.
2(1)
2(4) = 1. Sin
5.5. Proposicin
Tanto 1 como 2 son funciones totales y computables.

Demostracin

La totalidad de 1 y 2 surge de manera inmediata de la suprayectividad de la funcin .

En cuanto a la computabilidad, debemos hacer unas consideraciones previas:


obsrvese en primer lugar que es montona creciente en sus dos argumentos, es decir:
(i,j) < (i + 1,j)
Adems tambin se verifica:

(i,j) < (i ,j + 1)

i (i,j) i N
j (i,j) j

En consecuencia, dado un nmero natural n, una estrategia para el clculo de 1(n) y


2(n) sera como sigue:

En primer lugar es claro que el par (i,j) tal que (i,j) = n se encuentra en el
siguiente segmento de tabla:
(0,0), ...

,(0,n)

................................
(n,0), ...

,(n,n)

As pues la idea es ir calculando la imagen de la funcin para los elementos de


la
primera fila del segmento de tabla anterior hasta que encontremos un par (0,k+1) tal que
se verifique que (0,k+1) n. Esto ocurrir en algn momento debido a
las
consideraciones previas. Si la anterior desigualdad resulta ser en realidad una igualdad,
tenemos que el par (i,j) buscado es el (0,k+1). En caso contrario tendremos la seguridad
de que el par buscado se encuentra en la diagonal anterior a la que comienza con
(0,k+1), es decir la que comienza en (0,k). Una vez identificado el par (i,j) resulta
evidente que 1(n) = i, y 2(n) = j. El siguiente programa while, que supone la entrada
n
en la variable X1, utiliza esta estrategia dejando respectivamente en las variable X2 y X3
los valores de 1(n) y 2(n).
begin
X2 : = 0; X3 : = 0; X4 : = 0;
while X4 < X1 do
begin
X3 : = succ(X3);
X : = (X ,X )
4
2 3
end
if X4 > X1 then X3 : = pred(X3)
while X4 X1 do
begin
X3 : = pred(X3);
X2 : = succ(X2);
end
end

X4 : = (X2,X3)

A continuacin generalizaremos este proceso de codificacin a dimensiones


mayores que dos, de la siguiente forma:
5.6. Definicin
Se definen las funciones k : N N, y sus respectivas proyecciones k m : N N; con
k

k 1, k m 1; de la siguiente forma

k(i1, ... ,ik) = (k-1(i1, ... ,ik-1),ik)


k m (n) = im

tal que k(i1, ... ,ik) = n

5.7. Observacin
Apoyndose en las consideraciones y resultados demostrados para el caso
bidimensional ( = 2, 1 = 2 1, 2 = 2 2), se puede ver fcilmente que estas
generalizaciones son tambin funciones totales y computables. Asimismo es sencillo ver
que si la funcin se computa con un programa while que utiliza s variables, entonces
k es computable mediante un programa que no usa ms de s + k variables. La idea es
que slo necesitamos guardar a lo sumo la entrada de tamao k, pues el resto del
programa resulta de repetir el proceso de computacin de un nmero finito de veces.

El hecho de que mediante un nmero fijo de variables se pueda computar


cualquier k m k 1, 1 m k, como demuestra el siguiente lema, resulta
ms
sorprendente.
5.8. Lema
Existe un nmero fijo t tal que k m (k 1, 1 m k) es computada por un programa
while que no usa ms de t variables
Demostracin
Obsrveseobservar
debemos
que el lo
siguiente:
while
para calcular
1 y para
no ).
msIgualmente
de s + 4
variables
(siendo
sprograma
el
nmero
de variables
necesario
computar
2 utilizaba
k m

(n) si m = 1
k m (n) = 1 k m
2 ( 1 (n)) si 2 m k
es decir
cualquier
proyeccin
ponerse
en
de1y1 tanto
. Asel pues
si
como
llamamos
paraprograma
Pel al
output:
programa
descrito
anteriormente
parafuncin
calcularusada
y2,tenemos
que el
2para
siguiente
computa
k 1, puede
tomando
X1 como
variable
input

begin
P; X1 : = X2;
.................... (k 1) veces
P; X1 : = X2
end

Igualmente mediante este otro programa se puede calcular k m k m 2


begin
P; X1 : = X2;
.................... (k m) veces
P; X1 : = X2
P; X1 : = X3
end
Ntese que los dos programas anteriores utilizan s + 4 variables. En consecuencia
podemos tomar t = s + 4, que es independiente de k y de m.

6. La funcin Short
Una vez introducidas las definiciones y los resultados anteriores referidos a las
denominadas funciones codificadoras de vectores, estamos en condiciones de demostrar
la proposicin 4.3, relativa a la existencia de la funcin Short. La idea fundamental es
construir, a partir de un programa dado P k-variables, un nuevo programa P cuya
funcin semntica de aridad j coincida con la respectiva de P; verificndose adems que
P sea (j + r)-variables (donde r es la constante que aparece en 4.3.). Obsrvese que el
nmero de variables de P no depende en absoluto del nmero de variables de P, sino
slo de la aridad j considerada. El siguiente lema produce el mtodo de construccin de
P.
6.1. Lema
es una funcin computable de
Existe un nmero natural r, tal que si P( j ) : N j
N
aridad j calculada por un programa while P, entonces se puede construir un programa
while P, (j + r)-variables, verificando: P( 'j ) = P( j ) .
Demostracin
Supongamos que el programa P no posee macros y utiliza un total de k variables,
digamos X1, ... , Xk. Utilizaremos la funcin sucesivas veces para tratar de codificar en
cada momento el contenido de las k variables en una sola variable U cuyo contenido
ser k(X1, ... , Xk). Nos restringiremos al caso en el que la aridad j es menor o igual que
k, ya que en caso contrario se puede tomar P = P. (recordemos que un programa es nvariables si utiliza a lo sumo n variables).
En una primera aproximacin al programa P, ste tendr la siguiente forma
general:
begin
U : = (X1,X2);
U : = (U,X3);
.......................
U : = (U,Xj);

U : = (U,0);
.....(k-j) veces........

U : = (U,0)

Versin modificada de P
X1 : = k 1(U)
end
El primer bloque del programa anterior corresponde a la codificacin en la variable U
k j

del vector estado inicial a 0 = ( X 1 ,L, X j ,0, L,0) . Es decir el contenido de U es k( a 0


).
En cuanto al bloque correspondiente a la versin modificada de P, ste se construye
siguiendo las siguientes pautas, secuencialmente para las instrucciones de P:
Sentencias de asignacin:
Xi : = g(Xh); (1 i, h k; g {succ, pred, zero})

Cuando aparezca una sentencia de este tipo debemos introducir en P los


siguientes bloques:
V : = k h(U);
V : = g(V);
...................................
W
: = (
(W,
k 1(U),
k 2(U));
k 3(U));
W : = (W,V);
W : = (W,k (i+1)(U));
...................................
W : = (W,k k(U));

U:=W

Lnea (i-1)

En primer lugar obtenemos la informacin relativa al contenido de la variable Xh


y modificamos el mismo en una variable auxiliar V. Posteriormente reconstruimos el
vector U con la modificacin dada por la sentencia de asignacin. Para esta
reconstruccin utilizamos una variable de paso W.
Sentencias while :
while Xi Xh do ; (1 i, h k; una sentencia arbitraria)

Este tipo de sentencias se traducen en P por el siguiente conjunto de


instrucciones:
V : = k i(U);
W : = k h(U);
While V W do
begin
versin modificada de
V : = k i(U);
end

W : = k h(U

En este caso rescatamos en las variables V y W la informacin sobre los


contenidos de las variables de P involucradas en la sentencia while. A continuacin se
construye una nueva sentencia while en trminos del programa P, incluyendo al final la
obtencin de los nuevos valores de las variables del test, necesarios para su verificacin
de parada.
A partir de todo lo anterior no es difcil aceptar que P y P poseen iguales
funciones semnticas de aridad j. Adems ntese que teniendo en cuenta resultados
anteriores sobre el nmero de variables necesarias para las computaciones de las
funciones codificadoras de vectores (s variables para y t = s + 4 variables a lo sumo
para las proyecciones) as como las variables auxiliares U, V y W, tenemos que P es un
programa (j + s + t + 3)-variables. En consecuencia podemos tomar r = s + t + 3

6.2. Proposicin (Proposicin 4.3.)


j 1 existe un nmero natural r y una funcin total y computable Short : N N tal
que:
(j)
(j
a)
e N
=
)
e

Short (e)

b) El programa PShort(e) utiliza j + r variables.


Demostracin
El nmero natural r es el mismo que el tratado en el lema anterior. Respecto a la funcin
Short, un proceso algortmico para calcular Short(e) sera:
1.- Obtener Decod(e), que ser un programa P que utiliza k variables.
2.- Construir P a partir de P siguiendo el proceso del lema anterior.
3.- Aplicar la funcin Cod a P, tomando Short(e) como Cod(P).
Resulta evidente por construccin la verificacin de las condiciones a) y b).

Veamos a continuacin un ejemplo de construccin de P a partir de un programa dado


P.
6.3. Ejemplo
Sea P el siguiente programa while:
begin

X1 : = succ(X2);
while X2 X3 do
X2 : = 0

end
Consideremos en este caso j = 2.
Teniendo en cuenta que k = 3 se obtiene el siguiente programa P:
Codificacin de (X1,X2,0)

begin
U : = (X1,X2);
U : = (U,0);

V : = 3 2(U);
V : = succ(V);
W : = (V,3 2(U));
W : = (W,3 3(U));
U : = W;

Versin en P de X1 : = succ(X2)

Versin en P de while X2 X3 do
X2 : = 0

V : = 3 2(U);
W : = 3 3(U);
while V W do
begin
V : = 3 2(U);
V : = 0;
W : = (3 1(U),V);
W : = (W,3 3(U));
U : = W;

V : = 3 2(U);
W : = 3 3(U);
end
Obtencin del contenido de X1

X1 : = 3 1(U);
end

7. Conclusin
En consecuencia, fijada una aridad j mayor o igual que uno, se ha demostrado la
existencia de un programa while cuya funcin semntica de aridad j + 1 es el resultado
de la simulacin de cualquier funcin computable de aridad j ante cualquier entrada.
Como punto final enunciamos de nuevo y demostramos el Teorema de Universalidad,
de acuerdo a todo lo visto anteriormente:
Teorema de Universalidad (Teorema 4.1.)
Para cada j 1 existe una funcin computable : N

j+1

N que es universal para

la
enumeracin de las funciones computables dada, en el sentido siguiente:
(e, a1 , a2 ,L, aj ) = e (a1 , a 2 ,L, a j
)
(j)

Demostracin

eN,

(a1 , a2 ,L, a j )

NUn proceso algortmico para computar la funcin es el siguiente:

1.- Aplicar Decod a e, obteniendo Pe (programa k-variables).


2.- Obtener PShort (e), (j + r) variables, a partir de Pe.
3.- Simular la computacin de PShort (e) mediante una secuencia de
computacin con vector estado inicial: r
(a1, ... ,aj,0 ... ... ,0)

Aplicando ahora la Tesis de Church queda demostrada la computabilidad de la


funcin .

8. Bibliografa
[Kfoury et al 82] Kfoury, A. J., Moll, R. N., Arbib, M. A., A Programming Approach to
Computability, Springer-Verlag, New York, 1982.
[Cutland 80] Cutland, N. J., Computability: An Introduction to Recursive Function
Theory, Cambridge University Press, 1980.
[Smith 94] Smith, C. H., A Recursive Introduction to the Theory of Computation,
Springer-Verlag, 1994.
[Machtey, Young 79] Machtey, M., Young, P., An Introduction to the General Theory
of Algorithms, North-Holland, New York, 1979.
[Davis, Weyuker 83] Davis, M., Weyuker, E. J., Computability, Complexity, and
Languages. Fundamentals of Theoretical Computer Science, Academic Press, New
York, 1983.

Você também pode gostar