EL TEOREMA DE UNIVERSALIDAD 1. Introducción 2. Enumeración

Anuncio
El Teorema de Universalidad
EL TEOREMA DE UNIVERSALIDAD
1. Introducción
Uno de los pilares sobre los que descansa la Teoría de la Computabilidad y que ha de
estar presente en todo sistema de computación 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 números naturales, nos veremos en la necesidad de construir un proceso de
codificación de los programas while. Este proceso traerá como consecuencia la
enumeración 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 justificación mediante la
Tesis de Church, del Teorema de Universalidad. Aunque esta demostración puede
resultar convincente, queremos resaltar que no lo debe ser tanto, debido a cierta
dificultad que ha de ser salvada mediante un resultado teórico. La dificultad estriba en
cómo un programa fijo, y por tanto con un número concreto de variables, puede simular
el comportamiento de otro programa que eventualmente puede tener más variables. La
idea clave reside, como se verá, en tratar de almacenar la información de un conjunto de
variables, en una única variable. Se procede por tanto a la construcción de biyecciones
entre el conjunto de los naturales y cualquier potencia del mismo, así como las
correspondientes proyecciones.
2. Enumeración 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 podría ser ordenado, por
ejemplo alfabéticamente. Sin embargo esta ordenación no es útil para nuestros
propósitos, pues aunque dados dos programas podríamos decidir cuál de ellos va antes
en el orden, no sería 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 códigos
binarios de seis dígitos de acuerdo a la siguiente tabla:
1
El Teorema de Universalidad
Símbolo
begin
end
while
do
:=
;
succ
pred
≠
(
)
X
0
1
2
3
4
5
6
7
8
9
Código binario
100000
100001
100010
100011
100100
100101
100110
100111
101000
101001
101010
101011
101100
101101
101110
101111
110000
110001
110010
110011
110100
110101
Código 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 función 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
número natural representado por la expansión binaria obtenida mediante la
concatenación 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
función Cod al número cuya espansión binaria es:
100000 101011 101101 100100 101100 100001
Es claro que el tamaño de los números que surgen de este proceso de
codificación 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 números naturales diferentes y que podamos construir un programa a partir de su
número asociado.
2.1. Observaciones
a) Como se puede ver, la función 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 números a los que dan lugar las expansiones binarias de los programas.
b) En cambio Cod no es suprayectiva, ya que por ejemplo el número natural 1 no es
imagen de ningún programa. Igualmente el número 2082, cuya expansión binaria es:
2
El Teorema de Universalidad
100000 100010
sería el asociado a la cadena de caracteres formada por: begin while, que como se
puede observar no es un programa while sintácticamente correcto.
A pesar de que la función codificadora definida anteriormente no sea una
biyección, podemos definir una inversa a izquierda enviando a un programa concreto,
aquellos naturales que no son el código de ningún 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 definición sea el conjunto vacio. Por ejemplo:
Q ≡ begin X2 := succ (X1) while X1 ≠ X2 do begin end end
2.2. Observaciones
a) Nótese que la función Decod no es inyectiva pues una infinidad de números
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. Proposición
Las funciones Decod y Cod son computables.
Demostración
Aplicando la tesis de Chuch según la cual todo proceso que pueda de alguna manera
describirse mediante un conjunto finito de instrucciones y en un lenguaje
pseudoalgorítmico es computable y considerando el siguiente proceso se demuestra la
computabilidad de Decod:
1.- Escribir la entrada n en binario.
2.- Descomponer la expansión binaria anterior en bloques de seis bits.
3.- Buscar el significado de cada bloque según la tabla anterior.
4.- Si el texto que resulta es un programa while sintácticamente correcto P,
definimos Decod (n) = P.
5.- Si en 2, 3, ó 4 falla el proceso, se define Decod (n) = Q.
Análogamente se puede definir un proceso para el cálculo de la función Cod.
♦
2.4. Observación
En el proceso definido anteriormente para la función Decod, la demostración estricta del
carácter algorítmico del paso 4 resulta ser lo más complejo. En este sentido y mediante
técnicas de procesamiento de cadenas (utilizando las funciones head y tail que aplicadas
a una cadena devuelven respectivamente el primer símbolo y la subcadena formada por
3
El Teorema de Universalidad
todos los símbolos excepto el primero), puede construirse una demostración rigurosa de
este hecho. De todas formas no resulta un excesivo acto de fe admitir que el paso 4 es
algorítmico, pues la comprobación de la corrección sintáctica de programas resulta
habitual en cualquier compilador.
Por todo lo anterior, podemos establecer una enumeración de los programas
mediante la función Decod como sigue:
∀ n ≥ 0, Pn = Decod (n)
Tenemos así que el conjunto WP = { P0, P1, ... ,Pn, ... }, siendo ésta una
enumeración donde el programa Q aparece una infinidad de veces.
3. Enumeración de las Funciones Computables
Recordemos que fijada la aridad j ≥ 1, se definió la función semántica asociada a un
programa P, denotándola como ϕ P( j ) : Nj → N.
Ahora, tras la enumeración efectiva de los programas while, podemos considerar
la siguiente enumeración efectiva de las funciones computables de aridad j ≥ 1:
ϕ 0( j ) , ϕ1( j ) ,L, ϕ n( j ) ,L
donde ϕ i( j ) es la función semántica de aridad j del programa Pi. Es esta una
enumeración con repetición, ya que diferentes programas pueden tener la misma
función semántica de aridad j.
Además el conjunto de todas las funciones computables se puede poner como:
U {ϕ
j ≥1
( j)
0
}
, ϕ 1( j ) , L , ϕ n( j ) , L
con lo que es una unión 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 continuación uno de los conceptos más importantes en Teoría de la
Computabilidad: el concepto de índice de una función computable.
3.1. Definición
Sea f : Nj → N, una función computable. Cualquier i ≥ 0 tal que f = ϕ i( j ) es un índice de
f.
3.2. Observación
Una función computable tiene infinitos índices, ya que dado un programa que la
compute, éste puede modificarse de manera que no afecte a su función semántica. Por
ejemplo incrementando primero y decrementando después una misma variable. Esto
hace que el programa sea distinto (y por tanto con otro índice) sin que varíen sus
funciones semánticas.
4
El Teorema de Universalidad
4. Teorema de Universalidad
A continuación enunciaremos el teorema de Universalidad y daremos una demostración
basada en la tesis de Church y en la función Decod definida anteriormente. Este teorema
pone de manifiesto la existencia de un programa while Universal cuya función
semántica de aridad j+1 engloba todas las funciones computables de aridad j.
4.1. Teorema
Para cada j ≥ 1 existe una función computable Φ : Nj+1 → N que es universal para la
enumeración de las funciones computables dada, en el sentido siguiente:
Φ (e, a1 , a 2 , L , a j ) = ϕ e( j ) (a1 , a 2 , L , a j ) ∀ e ∈ N , ∀ (a1 , a 2 , L , a j ) ∈ N j
Demostración
Este 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
dimensión j, (a1, ... ,aj), obtiene como salida el resultado de computar el programa Pe
con entrada (a1, ... ,aj). Es decir, un número natural si Pe para con dicha entrada, ó
indeterminado si no para.
Un proceso algorítmico para computar la función Φ es el siguiente:
1.- Aplicar Decod a e, obteniendo Pe (programa k-variables).
2.- Simular la computación de Pe mediante una secuencia de
computación con vector estado inicial (a1, ... ,ak) si k ≤ j ó
(a1, ... ,aj,0 ...k – j... ,0) si k > j.
Asumiendo que estos dos pasos son algorítmicos y aplicando la Tesis de Church
queda demostrada la computabilidad de la función Φ.
♦
Este teorema también se conoce como Teorema de Enumeración, ya que al
variar el primer argumento de la función Universal se van enumerando las funciones
computables de aridad j.
4.2. Observación
Una vez que la demostración anterior del Teorema de Universalidad nos ha convencido
de la existencia del intérprete Universal PU, hagamos la siguiente reflexión:
Si PU existe tendrá un número fijo de variables, digamos k0. Como por otro lado
PU interpreta cualquier programa Pe, existirán programas de entre estos últimos con un
número de variables mucho mayor que k0. Así pues nuestro intérprete no puede simular
Pe utilizando una variable Xi siempre que éste la utilice. ¿Cómo se realiza entonces la
simulación?. El siguiente resultado da la idea clave para responder a esta pregunta.
5
El Teorema de Universalidad
4.3. Proposición
∀ j ≥ 1 existe un número natural r y una función total y computable Short : N → N tal
que:
( j)
a) ϕ e( j ) = ϕ Short
(e)
∀ e∈ N
b) El programa PShort(e) utiliza j + r variables.
Para acometer la demostración de esta proposición es necesario conocer antes
algunos conceptos y resultados sobre ciertas funciones capaces de comprimir los
contenidos de un vector k-dimensional en un solo número natural, así como las
respectivas proyecciones que juegan el papel de funciones inversas.
5. Funciones Codificadoras de vectores
En esta sección veremos la forma de codificar cualquier vector de dimensión k en un
número, 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
función biyectiva entre el conjunto de los números racionales y el conjunto de los
naturales. En nuestro caso definiremos una biyección entre N2 y N que responde a la
ordenación de N2 de acuerdo a las sucesivas diagonales, según 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), después el (1,0),
el (0,2) y así sucesivamente.
5.1. Lema
La función así definida la denotaremos por τ : N2 → N, y su definición formal es:
τ (i,j) = ½ (i + j) (i + j + 1) + i
Demostración
Nótese 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.
6
El Teorema de Universalidad
Así pues la diagonal de suma n, cuyos vectores son:
(0,n),
(1,n-1),
...
, (n,0)
tienen respectivamente por imagen los números:
½ 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. Proposición
τ : N2 → N, definida anteriormente, es computable.
Demostración
Evidente teniendo en cuenta el lema anterior, pues se trata de una expresión en donde
todas las funciones que intervienen son computables.
♦
Una vez definida la función τ, que codifica vectores de dimensión dos en
números naturales, se definirán las proyecciones capaces de obtener las dos
componentes del vector a partir del número en que están codificadas.
5.3. Definición
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. Observación
Nótese que tanto π1 como π2 son suprayectivas debido a que τ es una biyección. Sin
embargo no son inyectivas, pues por ejemplo π1(0) = π1(1) = 0; y π2(1) = π2(4) = 1.
5.5. Proposición
Tanto π1 como π2 son funciones totales y computables.
Demostración
La totalidad de π1 y π2 surge de manera inmediata de la suprayectividad de la función τ.
En cuanto a la computabilidad, debemos hacer unas consideraciones previas:
obsérvese en primer lugar que τ es monótona creciente en sus dos argumentos, es decir:
τ(i,j) < τ(i + 1,j)
τ(i,j) < τ(i ,j + 1)
Además también se verifica:
i ≤ τ(i,j) ∀ i ∈ N
j ≤ τ(i,j) ∀ j ∈ N
7
El Teorema de Universalidad
En consecuencia, dado un número natural n, una estrategia para el cálculo de π1(n) y
π2(n) sería 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 función τ 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 algún 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);
X4 : = τ(X2,X3)
end
if X4 > X1 then X3 : = pred(X3)
while X4 ≠ X1 do
begin
X3 : = pred(X3);
X2 : = succ(X2);
X4 : = τ(X2,X3)
end
end
♦
A continuación generalizaremos este proceso de codificación a dimensiones
mayores que dos, de la siguiente forma:
5.6. Definición
Se definen las funciones τk : Nk → N, y sus respectivas proyecciones πk m : N → N; con
k ≥ 1, k ≥ m ≥ 1; de la siguiente forma:
8
El Teorema de Universalidad
τk(i1, ... ,ik) = τ(τk-1(i1, ... ,ik-1),ik)
πk m (n) = im
tal que τk(i1, ... ,ik) = n
5.7. Observación
Apoyándose en las consideraciones y resultados demostrados para el caso
bidimensional (τ = τ2, π1 = π2 1, π2 = π2 2), se puede ver fácilmente que estas
generalizaciones son también funciones totales y computables. Asimismo es sencillo ver
que si la función τ se computa con un programa while que utiliza s variables, entonces
τk es computable mediante un programa que no usa más de s + k variables. La idea es
que sólo necesitamos guardar a lo sumo la entrada de tamaño k, pues el resto del
programa resulta de repetir el proceso de computación de τ un número finito de veces.
El hecho de que mediante un número fijo de variables se pueda computar
cualquier πk m ∀ k ≥ 1, 1 ≤ m ≤ k, como demuestra el siguiente lema, resulta más
sorprendente.
5.8. Lema
Existe un número fijo t tal que πk m (k ≥ 1, 1 ≤ m ≤ k) es computada por un programa
while que no usa más de t variables
Demostración
Obsérvese que el programa while para calcular π1 y π2 utilizaba no más de s + 4
variables (siendo s el número de variables necesario para computar τ). Igualmente
debemos observar lo siguiente:
⎧π k − m (n) si m = 1
π k m ( n) = ⎨ 1 k − m
⎩π 2 (π 1 (n)) si 2 ≤ m ≤ k
es decir cualquier proyección puede ponerse en función de π1 y π2. Así pues si
llamamos P al programa descrito anteriormente para calcular π1 y π2, tenemos que el
siguiente programa computa πk 1, tomando X1 como variable usada tanto para el input
como para el output:
begin
P; X1 : = X2;
.................... (k – 1) veces
P; X1 : = X2
end
9
El Teorema de Universalidad
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
Nótese 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 función Short
Una vez introducidas las definiciones y los resultados anteriores referidos a las
denominadas funciones codificadoras de vectores, estamos en condiciones de demostrar
la proposición 4.3, relativa a la existencia de la función Short. La idea fundamental es
construir, a partir de un programa dado P k-variables, un nuevo programa P’ cuya
función semántica de aridad j coincida con la respectiva de P; verificándose además que
P’ sea (j + r)-variables (donde r es la constante que aparece en 4.3.). Obsérvese que el
número de variables de P’ no depende en absoluto del número de variables de P, sino
sólo de la aridad j considerada. El siguiente lema produce el método de construcción de
P’.
6.1. Lema
Existe un número natural r, tal que si ϕ P( j ) : N j → N es una función computable de
aridad j calculada por un programa while P, entonces se puede construir un programa
while P’, (j + r)-variables, verificando: ϕ P( j' ) = ϕ P( j ) .
Demostración
Supongamos que el programa P no posee macros y utiliza un total de k variables,
digamos X1, ... , Xk. Utilizaremos la función τ 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 aproximación al programa P’, éste tendrá la siguiente forma
general:
10
El Teorema de Universalidad
begin
U : = τ(X1,X2);
U : = τ(U,X3);
.......................
U : = τ(U,Xj);
U : = τ(U,0);
.....(k-j) veces........
U : = τ(U,0)
Versión modificada de P
X1 : = πk 1(U)
end
El primer bloque del programa anterior corresponde a la codificación 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 versión modificada de P, éste se construye
siguiendo las siguientes pautas, secuencialmente para las instrucciones de P:
Sentencias de asignación:
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 : = τ(πk 1(U),πk 2(U));
W : = τ(W,πk 3(U));
...................................
W : = τ(W,V);
W : = τ(W,πk (i+1)(U));
...................................
W : = τ(W,πk k(U));
Línea (i-1)
U:=W
11
El Teorema de Universalidad
En primer lugar obtenemos la información relativa al contenido de la variable Xh
y modificamos el mismo en una variable auxiliar V. Posteriormente reconstruimos el
vector U con la modificación dada por la sentencia de asignación. Para esta
reconstrucción 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
“ versión modificada de δ”
V : = πk i(U);
W : = πk h(U)
end
En este caso rescatamos en las variables V y W la información sobre los
contenidos de las variables de P involucradas en la sentencia while. A continuación se
construye una nueva sentencia while en términos del programa P’, incluyendo al final la
obtención de los nuevos valores de las variables del test, necesarios para su verificación
de parada.
A partir de todo lo anterior no es difícil aceptar que P y P’ poseen iguales
funciones semánticas de aridad j. Además nótese que teniendo en cuenta resultados
anteriores sobre el número 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. Proposición (Proposición 4.3.)
∀ j ≥ 1 existe un número natural r y una función total y computable Short : N → N tal
que:
( j)
a) ϕ e( j ) = ϕ Short
(e)
∀ e∈ N
b) El programa PShort(e) utiliza j + r variables.
Demostración
El número natural r es el mismo que el tratado en el lema anterior. Respecto a la función
Short, un proceso algorítmico para calcular Short(e) sería:
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 función Cod a P’, tomando Short(e) como Cod(P’).
Resulta evidente por construcción la verificación de las condiciones a) y b).
♦
12
El Teorema de Universalidad
Veamos a continuación un ejemplo de construcción 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’:
begin
U : = τ(X1,X2);
U : = τ(U,0);
Codificación de (X1,X2,0)
V : = π3 2(U);
V : = succ(V);
W : = τ(V,π3 2(U));
W : = τ(W,π3 3(U));
U : = W;
Versión en P’ de X1 : = succ(X2)
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;
Versión en P’ de while X2 ≠ X3 do
X2 : = 0
V : = π3 2(U);
W : = π3 3(U);
end
X1 : = π3 1(U);
Obtención del contenido de X1
end
13
El Teorema de Universalidad
7. Conclusión
En consecuencia, fijada una aridad j mayor o igual que uno, se ha demostrado la
existencia de un programa while cuya función semántica de aridad j + 1 es el resultado
de la simulación de cualquier función 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 función computable Φ : Nj+1 → N que es universal para la
enumeración de las funciones computables dada, en el sentido siguiente:
Φ (e, a1 , a 2 , L , a j ) = ϕ e( j ) (a1 , a 2 , L , a j ) ∀ e ∈ N , ∀ (a1 , a 2 , L , a j ) ∈ N j
Demostración
Un proceso algorítmico para computar la función Φ 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 computación de PShort (e) mediante una secuencia de
computación con vector estado inicial:
(a1, ... ,aj,0 ... r ... ,0)
Aplicando ahora la Tesis de Church queda demostrada la computabilidad de la
función Φ.
♦
8. Bibliografía
[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.
14
Descargar