Sie sind auf Seite 1von 44

Teora de la Computacin Apuntes de Ctedra

UNIDAD 4: COMPUTABILIDAD
1 INTRODUCCIN
La teora de los lenguajes clasifica a los conjuntos segn su complejidad estructural.
Por lo tanto los conjuntos regulares se consideran como ms simples que los LLC, por que el
autmata finito tiene una estructura menos compleja que un APD. Otra clasificacin, conocida
como la complejidad computacional, est basada en la cantidad de tiempo, espacio u otro
recurso que se necesita para decidir un lenguaje en algn dispositivo de cmputo universal.
Aunque la complejidad computacional se refiere principalmente al tiempo y al espacio,
existen muchas otras medidas posibles, como el nmero de inversiones de la direccin de
movimiento de la cabeza de la cinta de una Mquina de Turing (MT) de una sola cinta. De
hecho, se puede definir una medida de la complejidad de manera abstracta y demostrar
muchos de los resultados en un marco general.
Todo problema que se presenta es factible de ser resuelto mediante algoritmo? y si es
posible resolverlo, Admite una solucin eficiente? es decir, cul es el costo computacional
del algoritmo hipottico? Se tratar de responder a estas preguntas. Sin embargo, se debe
intentar formalizar la idea de algoritmo a fin de presentar algunos resultados relacionados a la
Teora de Computabilidad, como as tambin el concepto de algoritmo eficiente.
A continuacin se presenta, una idea intuitiva de algoritmo:
Un conjunto de pasos que ejecutados en cierto orden permiten resolver un
determinado problema.

Sin embargo, esta definicin carece de elementos formales necesarios para desarrollar
una teora acorde. Alan Turing (1912-1954) fue uno de los precursores en el desarrollo de los
aspectos tericos de las Ciencias de la Computacin, aunque hizo otros aportes igualmente
importantes en IA, criptografa y biologa. El defini en los aos 30 lo que sera la primera
formalizacin de la nocin intuitiva de algoritmo. El modelo propuesto es conocido como
Mquina de Turing, teniendo la propiedad de ser el autmata o mquina abstracta ms general.
Uno de los resultados ms importantes obtenidos por Turing establece lmites sobre lo
que puede y no puede ser efectivamente computado (resuelto o decidido) mediante
algoritmo. Existen otros Modelos Formales como por ejemplo: los Sistemas de Post,
Funciones Recursivas, Funciones Lambda definibles, Mquinas RAM, etc. Todos equivalentes,
segn la Tesis de Church-Turing. Se estudiaran en esta unidad Mquina de Turing y las
Funciones Recursivas como modelos para decidir que es computable o No.
Una computadora solo puede ejecutar directamente solo un pequeo conjunto de
operaciones elementales a gran velocidad. Como hace entonces para resolver tal variedad de
problemas? La respuesta yace en el concepto de algoritmo, que es el mtodo que describe
como resolver un problema.
Es estudio de los algoritmos es el corazn de la ciencia de la computacin. Se intenta en
esta unidad mostrar como analizarlos y no como disearlos. Ciertos problemas pueden ser
resueltos rpidamente y otros no. Eso depende del algoritmo usado, pero tambin, como se
Ao 2013

Pgina 1

Teora de la Computacin Apuntes de Ctedra

ver de la complejidad intrnseca del problema. Este recorrido por el mundo de los algoritmos
pretende incorporar una visin general de las tcnicas y estructuras de datos usadas para
disear algoritmos eficientes. Adicionalmente, se podr conocer los lmites actuales de la
computadora digital, lo que permite usar mejor sus recursos.
La resolucin prctica de un problema exige por una parte un algoritmo o mtodo de
resolucin y por otra un programa o codificacin de aquel en una computadora real. Ambos
componentes tienen su importancia; pero la del algoritmo es absolutamente esencial, mientras
que la codificacin puede muchas veces pasar a segundo plano. A efectos prcticos o
ingenieriles, nos deben preocupar los recursos fsicos necesarios para que un programa se
ejecute. Aunque puede haber muchos parmetros, los ms usuales son el tiempo de ejecucin y
la cantidad de memoria (espacio). Ocurre con frecuencia que ambos parmetros estn fijados
por otras razones y se plantea la pregunta inversa: cul es el tamao del mayor problema que
se puede resolver en T segundos y/o con M bytes de memoria? En lo que sigue se centrar casi
siempre en el parmetro tiempo de ejecucin, si bien las ideas desarrolladas son fcilmente
aplicables a otro tipo de recursos.
La Teora de la Complejidad Computacional es la parte de la teora de la computacin
que estudia los recursos requeridos durante el clculo para resolver un problema. Un clculo
resulta complejo si es difcil de realizar. En este contexto se puede definir la complejidad de
clculo como la cantidad de recursos necesarios para efectuar un clculo. As, un clculo
difcil requerir ms recursos que uno de menor dificultad. Un algoritmo que resuelve un
problema pero que tarda mucho en hacerlo, difcilmente ser de utilidad. Igualmente un
algoritmo que necesite varios gigabytes de memoria no ser probablemente utilizado. A estos
recursos se les puede aadir otros, tales como el nmero de procesadores necesarios para
resolver el problema en paralelo. Si un clculo requiere ms tiempo que otro se dice que es ms
complejo y lo se llama complejidad temporal. Por otro lado, si un clculo requiere ms espacio
de almacenamiento que otro se dice que es ms complejo, en este caso se dice de una
complejidad espacial. Es claro que el tiempo que se requiere para efectuar un clculo en una
computadora moderna es menor que el requerido para hacer el mismo clculo con las mquinas
de las dcada pasadas, y seguramente que el tiempo en una mquina de la prxima generacin
ser mucho menor

2 COMPLEJIDAD DE ALGORITMOS
Un algoritmo es un procedimiento no necesariamente secuencial, que toma un conjunto
de valores de entrada y los transforma para producir un conjunto de valores de salida. El
anlisis de un algoritmo consiste en predecir la cantidad de recursos (tiempo, memoria,
comunicacin) que un algoritmo requerir para cualquier entrada. Para cada problema se
determina una medida N de su tamao (por nmero de datos) y se intentar hallar respuestas en
funcin de dicho N. El concepto exacto que mide N depende de la naturaleza del problema.
As, para un vector se suele utilizar como N su longitud; para una matriz, el nmero de
elementos que la componen; para un grafo, puede ser el nmero de nodos (a veces es ms
importante considerar el nmero de arcos, dependiendo del tipo de problema a resolver); en un
archivo se suele usar el nmero de registros, etc. Es imposible dar una regla general, pues cada
problema tiene su propia lgica de coste.
Por ejemplo
Se supone que en un grupo de 70 estudiantes (el tamao de la entrada de este problema
ser, entonces, n=70), cada uno de los estudiantes entrega una lista de sus compaeros que son
compatibles con l y otra lista con los compaeros que son incompatibles con l. Se quiere
Ao 2013

Pgina 2

Teora de la Computacin Apuntes de Ctedra

formar un equipo de futbol (con titulares y suplentes. Es decir, 20 jugadores) de amigos. As


que se quiere formar una lista de 20 estudiantes que se lleven bien entre todos ellos. Para
resolver un problema de manera computacional se disea un algoritmo. Se puede considerar un
algoritmo como una serie de instrucciones que se codifican a travs de un lenguaje de
computacin y que, al ser interpretado por la computadora, lleva a la solucin del problema.
As, para el problema planteado se puede disear un algoritmo que construya todos los
conjuntos de estudiantes compatibles de la manera siguiente: se enumera a los estudiantes del 1
al 70. Se inicia formando dos conjuntos de estudiantes compatibles; los que se llevan con el
estudiante 1, y por otro lado, los que no son amigos del estudiante 1. En cada uno de estos dos
casos, en el siguiente paso se considera que el estudiante 2 puede o no aparecer, generndose
cuatro posibilidades. En el tercer paso se considera para cada uno de los cuatro conjuntos que
se estn formando si el estudiante 3 est o no. As se tendr que despus de n = 70 pasos se han
construido del orden de 1.180.591.620.717.411.303.424 (270) diferentes trayectorias que
representan todos los posibles conjuntos de estudiantes compatibles.
Un algoritmo que busque las soluciones exactas tratar de construir todas estas
trayectorias y despus revisar cules de estos conjuntos contienen al menos 20 estudiantes
compatibles. Usando una computadora de alta velocidad que construye una trayectoria en, por
ejemplo, un 1 microsegundo, se requerira de ms de 374 millones de aos para construir el
total de trayectorias y as, despus de esto, determinar si se puede formar el equipo de futbol de
20 amigos.
La proporcin de tiempo necesario para realizar este proceso exhaustivo es lo que ha
alejado a cualquier programador y usuario de resolver esta clase de problemas de manera
exacta. El que se requiera tiempos de computacin de orden exponencial (por ejemplo, 2 n
pasos) es lo que define un problema intratable. Estos problemas intratables tienen
inherentemente un nmero exponencial de soluciones factibles.
En cambio, la accin de comprobar si 20 estudiantes de un conjunto dado son
compatibles o no, es una tarea sencilla, ya que slo se tendra que revisar para cada miembro
del conjunto si los restantes (19) miembros son compatibles con l o no. Lo que requiere de a
lo ms 20*19 (380) operaciones de comparacin. Al utilizar el mismo equipo de cmputo para
revisar si un conjunto contiene 20 estudiantes que sean compatibles o no requiere del orden de
.0049 segundos.
Entonces, puede verse que el proceso de comprobacin est acotado por una funcin
polinomial, por ejemplo 20 * 19 < n2 (recuerde que n =70, el total de estudiantes). A este tipo
de algoritmos que trabajan dentro de cotas polinomiales de tiempo de acuerdo al tamao de su
entrada, se le conoce como de algoritmos eficientes. As, el comprobar si un conjunto contiene
miembros compatibles es un proceso eficiente, mientras que construir un conjunto con al
menos 20 estudiantes compatibles requiere de tiempos de computacin de orden exponencial,
lo que lo hace un problema intratable.

3 RELACIN ENTRE
COMPLEJIDAD

LA

TEORA

DE

COMPUTABILIDAD

LA

DE

La Teora de la Complejidad estudia la eficiencia de los algoritmos en funcin de los


recursos que utiliza en un sistema computacional. La Teora de la Computabilidad pretende
abstraer los detalles de los sistemas computacionales y busca un algoritmo para efectuar un
Ao 2013

Pgina 3

Teora de la Computacin Apuntes de Ctedra

clculo sin preocuparse por los detalles de implementacin; en este caso se dice que la funcin
es computable o calculable. Puede verificarse si una funcin es computable utilizando una
mquina de Turing como un modelo de mquina isomorfa a cualquier otro sistema
computacional. El inters de Turing acerca de la capacidad de las mquinas para pensar lo
llev a desempear un papel importante en el desarrollo de las computadoras, no solo tericas
sino reales. As, se refuerza la tesis de Church-Turing que dice que si una mquina de Turing
no puede resolver un problema, entonces ninguna computadora puede hacerlo, ya que no existe
algoritmo para obtener una solucin. Por tanto, las limitaciones corresponden a procesos
computacionales y no a la tecnologa.

3.1 LA COMPLEJIDAD DE LOS ALGORITMOS


En un sentido amplio, dado un problema y un dispositivo donde resolverlo, es necesario
proporcionar un mtodo preciso que lo resuelva, adecuado al dispositivo. A tal mtodo se lo
denomina algoritmo.
El estudio de los algoritmos se centrar en dos aspectos muy importantes de los
algoritmos, como son su diseo y el estudio de su eficiencia.
El primero se refiere a la bsqueda de mtodos o procedimientos, secuencias finitas de
instrucciones adecuadas al dispositivo que se dispone, y que permitan resolver el problema. Por
otra parte, el segundo permite medir de alguna forma el coste que consume un algoritmo para
encontrar la solucin y ofrece la posibilidad de comparar distintos algoritmos que resuelven un
mismo problema. Esta Unidad, est dedicada al segundo de estos aspectos: la eficiencia.

3.2 EFICIENCIA Y COMPLEJIDAD


Una vez que se dispone de un algoritmo que funciona correctamente, es necesario
definir criterios para medir su rendimiento o comportamiento. Estos criterios se centran
principalmente en su simplicidad y en el uso eficiente de los recursos.
A menudo se piensa que un algoritmo sencillo no es muy eficiente. Sin embargo, la
sencillez es una caracterstica muy interesante a la hora de disear un algoritmo, pues facilita
su verificacin, el estudio de su eficiencia y su mantenimiento. De ah que muchas veces prime
la simplicidad y legibilidad del cdigo frente a alternativas ms crpticas y eficientes del
algoritmo.
Respecto al uso eficiente de los recursos, ste suele medirse en funcin de dos
parmetros: el espacio, es decir, memoria que utiliza, y el tiempo, lo que tarda en ejecutarse.
Ambos representan los costes que supone encontrar la solucin al problema planteado
mediante un algoritmo. Dichos parmetros van a servir adems para comparar algoritmos entre
s, permitiendo determinar el ms adecuado de entre varios que solucionan un mismo
problema. El anlisis se va a centrar solamente en la eficiencia temporal.
El tiempo de ejecucin de un algoritmo va a depender de diversos factores como son:
los datos de entrada que le se suministran, la calidad del cdigo generado por el compilador
para crear el programa objeto, la naturaleza y rapidez de las instrucciones mquina del
procesador concreto que ejecute el programa, y la complejidad intrnseca del algoritmo. Hay
dos estudios posibles sobre el tiempo:
1- Uno que proporciona una medida terica (a priori), que consiste en obtener una
funcin que acote (por arriba o por abajo) el tiempo de ejecucin del algoritmo para
unos valores de entrada dados.
2- Otro que ofrece una medida real (a posteriori), consistente en medir el tiempo de
Ao 2013

Pgina 4

Teora de la Computacin Apuntes de Ctedra

ejecucin del algoritmo para unos valores de entrada dados y en una computadora
concreta.
Ambas medidas son importantes puesto que, si bien la primera ofrece estimaciones del
comportamiento de los algoritmos de forma independiente de la computadora en donde sern
implementados y sin necesidad de ejecutarlos, la segunda representa las medidas reales del
comportamiento del algoritmo. Estas medidas son funciones temporales de los datos de
entradas.
Se entiende por tamao de la entrada el nmero de componentes sobre los que se va a
ejecutar el algoritmo. Por ejemplo, la dimensin del vector a ordenar o el tamao de las
matrices a multiplicar.
La unidad de tiempo a la que debe hacer referencia estas medidas de eficiencia no
puede ser expresada en segundos o en otra unidad de tiempo concreta, pues no existe una
computadora estndar al que puedan hacer referencia todas las medidas. Se denotar por T(n) el
tiempo de ejecucin de un algoritmo para una entrada de tamao n.
Tericamente T(n) debe indicar el nmero de instrucciones ejecutadas por una
computadora idealizada. Se debe buscar por tanto medidas simples y abstractas, independientes
de la computadora a utilizar. Para ello es necesario acotar de alguna forma la diferencia que se
puede producir entre distintas implementaciones de un mismo algoritmo, ya sea del mismo
cdigo ejecutado por dos mquinas de distinta velocidad, como de dos cdigos que
implementen el mismo mtodo. Esta diferencia es la que acota el siguiente principio:
Principio de Invariancia
Dado un algoritmo y dos implementaciones suyas I1 e I2, que tardan T1(n) y T2(n)
segundos respectivamente, el Principio de Invariancia afirma que existe una constante real c
>0 y un nmero natural no tales que para todo n no se verifica que T1(n) T2(n).
Es decir, el tiempo de ejecucin de dos implementaciones distintas de un algoritmo
dado no va a diferir ms que en una constante multiplicativa.
Con esto se puede definir sin problemas que un algoritmo tarda un tiempo del orden de
T(n) si existen una constante real c > 0 y una implementacin I del algoritmo que tarda menos
que cT(n), para todo n tamao de la entrada.
Dos factores a tener muy en cuenta son la constante multiplicativa y el no para los que
se verifican las condiciones, pues si bien a priori un algoritmo de orden cuadrtico es mejor que
uno de orden cbico, en el caso de tener dos algoritmos cuyos tiempos de ejecucin son 106n2 y
5n3 el primero slo ser mejor que el segundo para tamaos de la entrada superiores a 200.000.
Tambin es importante hacer notar que el comportamiento de un algoritmo puede
cambiar notablemente para diferentes entradas (por ejemplo, que tan ordenados se encuentran
los datos en el vector). De hecho, para muchos programas el tiempo de ejecucin es en realidad
una funcin de la entrada especfica, y no slo del tamao de sta. As suelen estudiarse tres
casos para un mismo algoritmo: caso peor, caso mejor y caso medio.
El caso mejor corresponde a la traza (secuencia de sentencias) del algoritmo que realiza
menos instrucciones. Anlogamente, el caso peor corresponde a la traza del algoritmo que
realiza ms instrucciones. Respecto al caso medio, corresponde a la traza del algoritmo que
realiza un nmero de instrucciones igual a la esperanza matemtica de la variable aleatoria
definida por todas las posibles trazas del algoritmo para un tamao de la entrada dado, con las
probabilidades de que stas ocurran para esa entrada.
Es muy importante destacar que esos casos corresponden a un tamao de la entrada
dado, puesto que es un error comn confundir el caso mejor con el que menos instrucciones
realiza en cualquier caso, y por lo tanto contabilizar las instrucciones que hace para n = 1.
A la hora de medir el tiempo, siempre se har en funcin del nmero de operaciones
Ao 2013

Pgina 5

Teora de la Computacin Apuntes de Ctedra

elementales que realiza dicho algoritmo, entendiendo por operaciones elementales (en adelante
OE) aquellas que la computadora realiza en tiempo acotado por una constante. As, se
considera OE las operaciones aritmticas bsicas, asignaciones a variables de tipo predefinido
por el compilador, los saltos (llamadas a funciones y procedimientos, retomo desde ellos, etc.),
las comparaciones lgicas y el acceso a estructuras indexadas bsicas, como son los vectores y
matrices. Cada una de ellas contabilizar como l OE.
Resumiendo, el tiempo de ejecucin de un algoritmo va a ser una funcin que mide el
nmero de operaciones elementales que realiza el algoritmo para un tamao de entrada dado.
En general, es posible realizar el estudio de la complejidad de un algoritmo slo en base
a un conjunto reducido de sentencias, aquellas que caracterizan que el algoritmo sea lento o
rpido en el sentido que interese. Tambin es posible distinguir entre los tiempos de ejecucin
de las diferentes operaciones elementales, lo cual es necesario a veces por las caractersticas
especficas de la computadora (por ejemplo, se podra considerar que las operaciones + y
presentan complejidades diferentes debido a su implementacin). Sin embargo, en este texto se
tendr en cuenta, a menos que se indique lo contrario, todas las operaciones elementales del
lenguaje, y se supondr que sus tiempos de ejecucin son todos iguales.
Para hacer un estudio del tiempo de ejecucin de un algoritmo para los tres casos
citados se comenzar con un ejemplo concreto. Se supone entonces que se dispone de la
definicin de los siguientes tipos y constantes:
CONSTANTE n = ... ; (* num. mximo de elementos de un vector *);
TIP0 vector = Arreglo [1 .. n] de entero
y de un algoritmo cuya implementacin en Pseudocdigo es:
Funcion Buscar (a: vector, c: entero): entero
Variables j:entero
Comienzo
J:=1;
Mientras(a[j]<c) y j<n hacer
J:=j+1;
FinMeintras
Si a[j]==c Entonces
Retorna j
Sino Retorna 0
FinSi
Fin

(*1*)
(*2*)
(*3*)
(*4*)
(*5*)
(*6*)
(*7*)
(*8*)

Para determinar el tiempo de ejecucin, se calcular primero el nmero de operaciones


elementales (OE) que se realizan:
- En la la lnea (1) se ejecuta 1 OE (una asignacin).
- En la lnea (2) se efecta la condicin del bucle, con un total de 4 OE (dos
comparaciones, un acceso al vector, y un Y).
- La lnea (3) est compuesta por un incremento y una asignacin (2 OE).
- La lnea (5) est formada por una condicin y un acceso al vector (2 OE).
- La lnea (6) contiene un Retorna (1 OE) si la condicin se cumple.
- La lnea (7) contiene un Retorna (1 OE), cuando la condicin del SI anterior es
falsa.
Obsrvese cmo no se contabiliza la copia del vector a la pila de ejecucin del
Ao 2013

Pgina 6

Teora de la Computacin Apuntes de Ctedra

programa, pues se pasa por referencia y no por valor (est declarado como un argumento VAR,
aunque no se modifique dentro de la funcin). En caso de pasarlo por valor, se necesitara tener
en cuenta el coste que esto supone (un incremento de n OE). Con esto:
-

En el caso mejor para el algoritmo, se efectuar la lnea (1) y de la lnea (2) slo la
primera mitad de la condicin, que supone 2 OE (se supone que las expresiones se
evalan de izquierda a derecha, y con "cortocircuito", es decir, una expresin lgica
deja de ser evaluada en el momento que se conoce su valor, aunque no hayan sido
evaluados todos sus trminos). Tras ellas la funcin acaba ejecutando las lneas (5)
a (7). En consecuencia, T(n)=1 + 2 + 3 = 6.

En el caso peor, se efecta la lnea (1), el bucle se repite n-l veces hasta que se
cumple la segunda condicin, despus se efecta la condicin de la lnea (5) y la
funcin acaba al ejecutarse la lnea (7). Cada iteracin del bucle est compuesta por
las lneas (2) y (3), junto con una ejecucin adicional de la lnea (2) que es la que
ocasiona la salida del bucle. Por lo tanto:

En el caso medio, el bucle se ejecutar un nmero de veces entre 0 y n-l, y se


supone que cada una de ellas tiene la misma probabilidad de suceder. Como existen
n posibilidades (puede que el nmero buscado no est) se supone a priori que son
equiprobables y por tanto cada una tendr una probabilidad asociada de l/n. Con
esto, el nmero medio de veces que se efectuar el bucle es de:

Tenemos pues:

Es importante observar que no es necesario conocer el propsito del algoritmo para


analizar su tiempo de ejecucin y determinar sus casos mejor, peor y medio, sino que basta con
estudiar su cdigo. Suele ser un error muy frecuente el determinar tales casos basndose slo
en la funcionalidad para la que el algoritmo fue concebido, olvidando que es el cdigo
implementado el que los determina.
En este caso, un examen ms detallado de la funcin (y no de su nombre!) nos muestra
que tras su ejecucin, la funcin devuelve la posicin de un entero dado e dentro de un vector
ordenado de enteros, devolviendo si el elemento no est en el vector. Lo que acabamos de
probar es que su caso mejor se da cuando el elemento est en la primera posicin del vector. El
caso peor se produce cuando el elemento no est en el vector, y el caso medio ocurre cuando
Ao 2013

Pgina 7

Teora de la Computacin Apuntes de Ctedra

consideramos equiprobables cada una de las posiciones en las que puede encontrarse el
elemento dentro del vector (incluyendo la posicin especial 0, que indica que el elemento a
buscar no se encuentra en el vector).

3.3 COTAS DE COMPLEJIDAD. MEDIDAS ASINTTICAS.


Una vez vista la forma de calcular el tiempo de ejecucin T de un algoritmo, nuestro
propsito es intentar clasificar dichas funciones de forma que se pueda compararlas. Para ello,
se define clases de equivalencia, correspondientes a las funciones que "crecen de la misma
forma.
En las siguientes definiciones N denotar el conjunto de los nmeros naturales y R el de
los reales.
3.3.1 Cota Superior. Notacin O
Dada una funcin f, se quiere estudiar aquellas funciones g que a lo sumo crecen tan
deprisa como f Al conjunto de tales funciones se le llama cota superior de f y se lo denomina
0(f). Conociendo la cota superior de un algoritmo donde se puede asegurar que, en ningn caso,
el tiempo empleado ser de un orden superior al de la cota.
Definicin:
Sea f: N [0, ) se define el conjunto de funciones de orden O (omicron) de f como:

Diremos que una funcin t: N [0,) es de orden O de f si t 0(f)


En el ejemplo del algoritmo Buscar analizado anteriormente obtenemos que su tiempo
de ejecucin en el mejor caso es 0(1), mientras que sus tiempos de ejecucin para los casos
peor y medio son O(n)
3.3.2 Cota Inferior. Notacin
Dada una funcin, queremos estudiar aquellas funciones g que a lo sumo crecen tan
lentamente como f Al conjunto de tales funciones se le llama cota inferior de f y lo
denominamos (f). Conociendo la cota inferior de un algoritmo podemos asegurar que, en
ningn caso, el tiempo empleado ser de un orden inferior al de la cota.
Definicin
Sea f: N [0, ) se define el conjunto de funciones de orden (omega) de f como:

Diremos que una funcin t: N [0,) es de orden de f si t (f)

Ao 2013

Pgina 8

Teora de la Computacin Apuntes de Ctedra

Intuitivamente, t (f) indica que t est acotada inferiormente por algn mltiplo de f
Normalmente estaremos interesados en la mayor funcin f tal que t pertenezca a (f), a la que
se denomina cota inferior.
3.3.3 Orden Exacto. Notacin
Como ltima cota asinttica, definiremos los conjuntos de funciones que crecen
asintticamente de la misma forma:
Definicin
Sea f: N [0, ) se define el conjunto de funciones de orden ( Theta) de f como:
(f) = O(f) (f)
O lo que es igual:

Intuitivamente , t (f) indica que t est acotada tanto superior como inferiormente por
mltiplos de f, es decir, que t y f crecen de la misma forma.
Observaciones de las Observaciones sobre las cotas asintticas:
1- La utilizacin de las cotas asintticas para comparar funciones de tiempo de
ejecucin se basa en la hiptesis de que son suficientes para decidir el mejor
algoritmo, prescindiendo de las constantes de proporcionalidad. Sin embargo, esta
hiptesis puede no ser cierta cuando el tamao de la entrada es pequeo.
2- Para un algoritmo dado se pueden obtener tres funciones que miden su tiempo de
ejecucin, que corresponden a sus casos mejor, medio y peor, y que denominaremos
respectivamente Tm(n), Tl/2(n) y Tp(n). Para cada una de ellas podemos dar tres cotas
asintticas de crecimiento, por lo que se obtiene un total de nueve cotas para el
algoritmo.
3- simplificar, dado un algoritmo diremos que su orden de complejidad es O(f) si su
tiempo de ejecucin para el peor caso es de orden O de f, es decir, Tm(n) es de orden
O(f). De forma anloga diremos que su orden de complejidad para el mejor caso es
Q(g) si su tiempo de ejecucin para el mejor caso es de orden Q de g, es decir, Tm(n)
es de orden Q(g).
4- Por ltimo, diremos que un algoritmo es de orden exacto 0(f) si su tiempo de
ejecucin en el caso medio Tl!2(n) es de este orden.

3.4 RDENES DE COMPLEJIDAD


Se dice que O(f(n)) define un "orden de complejidad". Se escoger como
representante de este orden a la funcin f(n) ms sencilla del mismo. As se tendr:
O(1)
O(log n)
O(n)
O(n log n)
Ao 2013

orden constante
orden logartmico
orden lineal
orden n*logartmico
Pgina 9

Teora de la Computacin Apuntes de Ctedra

O(n2)
orden cuadrtico
a
O(n )
orden polinomial (a >= 2)
n
O(a )
orden exponencial (a >= 2)
O(n!)
orden factorial
Es ms, se puede identificar una jerarqua de rdenes de complejidad que coincide con
el orden de la tabla anterior; jerarqua en el sentido de que cada orden de complejidad superior
tiene a los inferiores como subconjuntos. Si un algoritmo A se puede demostrar de un cierto
orden O1, es cierto que tambin pertenece a todos los rdenes superiores (la relacin de orden
cota superior es transitiva); pero en la prctica lo til es encontrar la "menor cota superior", es
decir el menor orden de complejidad que lo cubra.
3.5 Impacto Prctico
Para captar la importancia relativa de los rdenes de complejidad conviene hacer
algunas cuentas. Sea un problema que se sabe resolver con algoritmos de diferentes
complejidades. Para compararlos entre s, se supone que todos ellos requieren 1 hora de
computadora para resolver un problema de tamao N=100.
Qu ocurre si se dispone del doble de tiempo? Ntese que esto es lo mismo que
disponer del mismo tiempo en una computadora el doble de potente, y que el ritmo actual de
progreso del hardware es exactamente ese:
"duplicacin del nmero de instrucciones por segundo".
Qu ocurre si queremos resolver un problema de tamao 2n?
O(f(n))
N=100 t=2h
N=200
log n

1h

10000

1.15 h

1h

200

2h

1h

199

2.30 h

1h

141

4h

1h

126

8h

1h

101

1030 h

n log n

Los algoritmos de complejidad O(n) y O(n log n) son los que muestran un
comportamiento ms "natural": prcticamente a doble de tiempo, doble de datos procesables.
Los algoritmos de complejidad logartmica son un descubrimiento fenomenal, pues en
el doble de tiempo permiten atacar problemas notablemente mayores, y para resolver un
problema el doble de grande slo hace falta un poco ms de tiempo .
Los algoritmos de tipo polinmico no son una maravilla, y se enfrentan con dificultad a
problemas de tamao creciente. En la prctica se dice que son el lmite de lo "tratable". Sobre
la tratabilidad de los algoritmos de complejidad polinmica habra mucho que hablar, y a veces
semejante calificativo es puro eufemismo. Mientras complejidades del orden O(n2) y O(n3)
suelen ser efectivamente abordables, prcticamente nadie acepta algoritmos de orden O(n100),
por muy polinmicos que sean. La frontera es imprecisa.
Cualquier algoritmo por encima de una complejidad polinmica se dice "intratable" y
slo ser aplicable a problemas muy pequeos. A la vista de lo anterior se comprende que los
programadores busquen algoritmos de complejidad lineal. Es un golpe de suerte encontrar algo
de complejidad logartmica. Si se encuentran soluciones polinomiales, se puede vivir con ellas;
pero ante soluciones de complejidad exponencial, ms vale seguir buscando.
No obstante lo anterior ...
... si un programa se va a ejecutar muy pocas veces, los costes de codificacin y
Ao 2013

Pgina 10

Teora de la Computacin Apuntes de Ctedra

depuracin son los que ms importan, relegando la complejidad a un papel secundario.


... si a un programa se le prev larga vida, hay que pensar que le tocar mantenerlo a
otra persona y, por tanto, conviene tener en cuenta su legibilidad, incluso a costa de la
complejidad de los algoritmos empleados.
... si se puede garantizar que un programa slo va a trabajar sobre datos pequeos
(valores bajos de N), el orden de complejidad del algoritmo que usemos suele ser
irrelevante, pudiendo llegar a ser incluso contraproducente.
Por ejemplo, si se dispone de dos algoritmos para el mismo problema, con tiempos de
ejecucin respectivos:
algoritmo
tiempo
complejidad
f
g

100 n
2

O(n)
O(n2)

Asintticamente, "f" es mejor algoritmo que "g"; pero esto es cierto a partir de N > 100.
Si el problema no va a tratar jams problemas de tamao mayor que 100, es mejor solucin
usar el algoritmo "g".
El ejemplo anterior muestra que las constantes que aparecen en las frmulas para T(n),
y que desaparecen al calcular las funciones de complejidad, pueden ser decisivas desde el
punto de vista de ingeniera. Pueden darse incluso ejemplos ms dramticos:
algoritmo
f

tiempo
n

complejidad
O(n)

100 n

O(n)

An siendo dos algoritmos con idntico comportamiento asinttico, es obvio que el


algoritmo "f" es siempre 100 veces ms rpido que el "g" y candidato primero a ser utilizado.
... usualmente un programa de baja complejidad en cuanto a tiempo de ejecucin, suele
conllevar un alto consumo de memoria; y viceversa. A veces hay que sopesar ambos
factores, quedndonos en algn punto de compromiso.
... en problemas de clculo numrico hay que tener en cuenta ms factores que su
complejidad pura y dura, o incluso que su tiempo de ejecucin: queda por considerar la
precisin del clculo, el mximo error introducido en clculos intermedios, la
estabilidad del algoritmo, etc. etc.

Ao 2013

Pgina 11

Teora de la Computacin Apuntes de Ctedra

4. Funciones

Recursivas Primitivas (FRP) y Funciones Recursivas

(FR)
4.1 Introduccin:
Unas de las cuestiones bsicas de las ciencias de la computacin es: lo que se puede computar
y lo que no se puede computar. Ms concretamente, si se nos da un problema computacional en
particular, la cuestin es si existe o no un mtodo efectivo para resolver este problema
computacional. Con esto queremos decir si existe alguna computadora que pueda resolver el
problema dentro de un perodo finito de tiempo. A efectos de la presente discusin, es
irrelevante la cantidad de tiempo que se necesite para encontrar la solucin, tanto si son das,
aos o siglos. Slo nos concierne la posibilidad de que exista, en principio, una solucin.
Es importante distinguir entre un problema en general y un caso particular de un problema.
Por ejemplo, determinar la validez de una expresin lgica arbitraria es un problema general.
Un caso concreto de este problema es la determinacin de la validez de una expresin lgica
concreta. Un procedimiento por computadora correspondiente a este problema tendra entonces
un caso concreto del problema como entrada, e indicara en su salida si ese caso concreto era o
no vlido. Ahora la cuestin es si existen o no procedimientos que puedan resolver todos los
casos de un cierto problema en un perodo de tiempo finito. Para nuestro ejemplo, esta cuestin
pasa a ser; Existe un procedimiento que pueda decidir si es vlida o no cualquier expresin
lgica? Para las expresiones lgicas del clculo de proposiciones, existe ciertamente un
procedimiento as. El problema de la validez en el clculo de proposiciones es, en este sentido,
decidible. Sin embargo, no existe un procedimiento que pueda determinar si es o no vlida una
expresin arbitraria del clculo de predicados. El problema de demostrar la validez de una
expresin general del clculo de predicados es indecidible. Es importante ver lo que significa
esto. Es muy posible que se pueda disear un procedimiento que indique si son o no vlidas la
mayora de las expresiones lgicas que contienen predicados. Sin embargo, es un hecho que
existen algunas expresiones para las cuales no es posible determinar la validez por ningn
procedimiento. Especficamente, el procedimiento no termina nunca. Obsrvese que en nuestra
discusin hemos empleado la palabra procedimiento y no algoritmo. La diferencia entre un
procedimiento y un algoritmo es que un algoritmo siempre concluye, mientras que es posible
que un procedimiento no llegue a terminar. Por tanto, un problema es indecidible si y slo si no
existe un algoritmo para l.
Hay varias maneras de enunciar en forma matemtica lo que se puede calcular y lo que no se
puede calcular. En 1936, Alan Turing defini una mquina, que ahora se llama mquina de
Turing, y demostr que todo aquello que se pueda computar en un sentido intuitivo se podr
calcular tambin en una mquina de Turing. En 1931, Gdel present un conjunto de funciones
que denomin recursivas. Estas funciones fueron generalizadas por Kleene en 1934, y esto dio
lugar posteriormente a que Church formulase su famosa tesis en que indica que todo aquello
que se pueda computar en un sentido intuitivo puede expresarse en trminos de funciones
recursivas generalizadas.
En la actualidad, el trmino funcin recursiva (FR) se utiliza para describir lo que Kleene
denominara funciones recursivas generalizadas, y para las funciones descubiertas por Gdel se
emplea el trmino funciones recursivas primitivas.
Kleene muestra que existe la equivalencia entre lo que puede ser computado con una MT y lo
que puede expresado por una FR, de modo que:
MT FR

Ao 2013

Pgina 12

Teora de la Computacin Apuntes de Ctedra

Antes de comenzar vale mencionar los elementos que caracterizan a las definiciones recursivas,
ya que nos sern de utilidad.
Los elementos de una definicin recursiva son:
Bases (condiciones lmites o axiomas).
Valores conocidos (del conjunto, relacin
funcin).
Reglas de construccin recursivas.
La forma de obtener nuevos valores desde valores
previamente conocidos.
Interpretacin de los valores que puede tomar la
funcin, relacin o conjunto.
Los valores (del conjunto, relacin funcin) se
obtienen desde la aplicacin de un nmero finito de
veces de las reglas de construccin a los valores bases.

Desde , y se puede especificar un procedimiento efectivo para evaluar una funcin


(siempre que este definida para todo argumento).
Ejemplo1: Definicin Recursiva de Conjuntos
Cmo definir el conjunto de los nmeros naturales?
N = {1, 2, 3, 4, 5, }

Definicin recursiva de los nmeros naturales:


1N
nN s(n)=n+1N
Los nicos elementos de N son los que se obtienen de aplicar las reglas y un numero
finito de veces.
Ejemplo2: La expresin algebraica de la Funcin de Fibonacci f(n) para algn n N es:
.
Esta puede redefinirse en forma recursiva como sigue:
f(0) = 0 y f(1) = 1
f(n+2) = f(n) + f(n+1)

4.2 Funciones Recursivas Primitivas (FRP)


En bsqueda de encontrar un modelo de lo que entendemos por calculable, construiremos un
conjunto de funciones que llamaremos Funciones Recursivas Primitivas.
Comenzaremos con una coleccin de funciones cuya sencillez sea tal que no haya duda a
acerca de su computabilidad. A este conjunto de funciones que utilizaremos como los ladrillos
de construccin, lo llamaremos Funciones Base. Luego mostraremos que estas funciones base
Ao 2013

Pgina 13

Teora de la Computacin Apuntes de Ctedra

combinadas con otras nuevas, que servirn de reglas de construccin, nos permiten formar
otras cuya computabilidad se desprenda de las originales.
4.2.1 Funciones Numricas
Definicin: Llamaremos funcin numrica a toda funcin
f:N0nN0 , con dominio D N0n y n N0 , siendo N0 el conjunto de
los nmeros naturales donde el 0(cero) es uno de sus
elementos.
Nota :
- A los elementos de N0n, los notaremos con las letras x, y, (en negrita) , son n-uplas de
nmeros naturales.
- En el caso particular que el dominio de la funcin numrica f cumple: D= N0n, diremos
que f es una funcin total (definida para toda n-upla de N0n). Mientras que si D N0n

diremos que f es una funcin parcial (puede o no estar definida para toda n-upla de N0
n
). Es claro que el conjunto de todas las funciones numricas parciales incluye a todas
las totales.
Desde aqu en adelante todos los nmeros que consideraremos sern elementos de N0.
Para simplificar, notaremos f(m) a una funcin numrica con dominio incluido en N0 m.
Por convencin f: N00 N0, con D N00 (funcin con cero variables) representa un
elemento de su codominio. De esta manera podremos referirnos a elementos de N0,
haciendo referencia a funciones con cero variables.

4.2.2 Funciones Base


La base de la jerarqua de funciones computables consiste en una familia de funciones finita,
que sern clave a la hora de definir las FRP.
Definicin: Llamaremos funcin sucesor, y la simbolizaremos
s, a la funcin s: N0N0 tal que s(x)=x+1.
Es decir, s hace corresponder a cada nmero, x, su respectivo sucesor, x+1. Vindolo de esta
manera, s es una funcin computable, ya que conocemos desde hace tiempo un proceso
efectivo para la suma de naturales.
Definicin:
Llamaremos
funcin
cero
(zero),
y
la
simbolizaremos z, a la funcin z: N0N0 tal que z(x)=0.
Aceptamos con facilidad que debemos clasificar a z como computable, ya que el proceso no es
ms que reemplazar cualquier valor de entrada por 0, y ste (el proceso) es efectivo.

Ao 2013

Pgina 14

Teora de la Computacin Apuntes de Ctedra

Definicin: Llamaremos funcin proyeccin en la k-sima


componente, y la simbolizaremos I(n)k, a la funcin
I(n)k: N0nN0
tal que
I(n)k(x1,x2,,xk, ,xn)=xk ,
para 1 k
n.
Ejemplo2:
I(4)3(x, y+1 , f(x,y+1) ,0)= f(x,y+1)
Al igual que las dems funciones iniciales (z y s) , es fcil establecer que las proyecciones
deben estar en la clase de funciones computables.
Un caso especial es la funcin proyeccin de un slo argumento I (1)1(x)=x. Esta funcin se
denomina funcin identidad y la simbolizaremos I (esto es, I(x)=x).
Definicin: Llamaremos
funciones base a cualquier funcin
numrica del conjunto conformado por las funciones s , z y
todas las proyecciones I(n)k , con k
N
y 1 k n.
4.2.3 Reglas de Construccin
Las funciones referidas anteriormente, por s solas, no pueden lograr mucho. Por lo tanto,
estudiaremos como estas pueden emplearse para construir otras funciones ms complejas.
La composicin

Definicin: Dada una funcin numrica h(m) y una familia


finita de funciones numricas {gi(n)}mi=1 , definimos una nueva
funcin f(n) de manera que:
f(n):N0nN0
y
f(n)(x)= h(g1(x),g2(x),,gm(x)),
con
x=( x1,x2,,xk, ,xn) N0n.
Se puede ver que:
la composicin de funciones computables es computable,

ya que si h (m) y el conjunto de funciones gi(n) , para i=1,2,,m son computables, basta con
calcular las diferentes gi(n) y usar sus salidas como entradas de la funcin h (m) .
Notacin:

f= (h,g1,g2,,gm)

se lee

f se obtiene de componer h con las funciones g1, g2,, gm.

rbol de evaluacin:

Ejemplo3: Intentemos definir la funcin numrica uno: N0 N0 tal que uno(x)=1, x N0.
Vemos que: uno(1)= (s,z)
Luego: dos(1)= (s, (s,z))= (s,uno)
Realizando un proceso similar, toda funcin constante se puede expresar utilizando las
funciones bases y la composicin, un nmero finito de veces.
La recursin (o recursin primitiva)
Ao 2013

Pgina 15

Teora de la Computacin Apuntes de Ctedra

Por ltimo veremos el constructor llamado recursin. ste combinado con lo dado hasta
ahora nos dar la posibilidad de representar muchas funciones computables.
Definicin: Sea k N0
y sean
g(k) y
h(k+2) dos funciones
numricas. Definimos una nueva funcin numrica
f(k+1) de la
siguiente manera:
f(xk,0)=g(xk)
f(xk,y+1)=h(xk,y,f(xk,y))
Notacin: f= (g,h)
rbol de evaluacin:

se lee

f se obtiene por recursin primitiva por medio de las funciones g y h.

Observamos que la definicin admite la posibilidad de que k sea igual a cero. En ese caso nos
encontraremos que g es una funcin de cero variables. Recordemos nuestra convencin de
representar las funciones de ese tipo con elementos de N0.
Para concluir observemos que:
toda funcin construida por recursin, a partir de funciones computables , es computable.

Pues si f se define por recursin sobre dos funciones g y h computables, podemos calcular
f(x,y) calculando primero f(x,0)=g(x) ( la cual es computable), luego f(x,1), despus f(x,2)
hasta llegar a f(x,y).
Ejemplo 4: Definamos la funcin suma (suma de nmeros naturales) tal que suma(x,y)=x+y, a
travs de la regla de recursin:
Tenemos que: suma(x,0)= x=I(x)
y adems: suma(x, y+1)= x+(y+1)=(x+y)+1=s(x+y)=s(suma(x,y))=s(I(3)3(x,y,suma(x,y)).
Formalmente:
1) suma(x,0)= g(x)
2) suma(x, y+1)= h(x,y,suma(x,y))
donde: g=I y h(x,y,z)= s(I(3)3(x,y,z)).
Notacin: suma=R(g,h)=R(I, (s, I(3)3))
Estamos ahora en condiciones de definir el conjunto de funciones recursivas primitivas:
Definicin:
a) Todas las funciones base son recursivas primitivas.
b) Las funciones obtenidas a partir de funciones recursivas
primitivas aplicando un nmero finito de composiciones y
recursiones son funciones recursivas primitivas.
c) Las funciones obtenidas segn a) y b) son todas las
funciones recursivas primitivas.

Proposicin 1: Dada una funcin numrica f(1) definimos una nueva funcin numrica F(2),
llamada potencia de f, de manera que:
Ao 2013

Pgina 16

Teora de la Computacin Apuntes de Ctedra

x N0 : F(x,0)=x , y
x N0 y N0: F(x,y+1)=f(F(x,y)).
Entonces, si f FRP, resulta que F FRP. Notaremos f y(x)=F(x,y).
Demostracin: Sea f FRP y como F=R(I, (f, I(3)3)) entonces podemos concluir que
F FRP.

4.2.4 Ejemplos de funciones recursivas primitivas


Las siguientes funciones numricas pertenecen al conjunto de las FRP:
i)Funcin predecesor:
ii)
iii)
iv)

Funcin Multiplicacin: mult(x,y)=x.y


Funcin Factorial: Fac(x)=x!
Funcin exponencial: Exp(x,y)=xy, con la convencin de que 00=1.

v)

Funcin iszero (es cero) :

vi)

Funcin signo :

vii)

Igualdad:

.
.

Demostramos el apartado i). (Dejamos como ejercicio el resto.)


Intentemos definir la funcin Pr(x) que cumpla con lo especificado anteriormente.
Tenemos que: Pr(0) = 0 = z(0)
y adems Pr(y + 1) = y = I(2)1 (y; Pr(y))
De esto deducimos que se puede construir Pd por recursin a partir de z(0) y I(2)1 ; Pr =
R(z(0); I(2)1 )) .
Por lo tanto: Pr FRP.

4.2.4 Conjuntos recursivos primitivos (CRP)


Definicin: Dado un conjunto X, para cada subconjunto A X
definimos su funcin caracterstica

:X{0,1} por :

Ejemplo 5: Si consideramos X={0,1,2}, los subconjuntos de X son: , {0}, {1}, {2},


{0,1},{0,2},{1,2} y X. ( 23=8 subconjuntos que son los elementos de partes de X, P(X).)
Podemos definir 8 funciones caractersticas, una para cada subconjunto de X, donde algunas de
ellas se muestran a continuacin:
Para
A=
(x) = 0.
A= {1}
A= {0,2}

(x) =
(x) =

.
.

Es importante notar que existe una correspondencia biunvoca entre funciones caractersticas y
Ao 2013

Pgina 17

Teora de la Computacin Apuntes de Ctedra

el subconjunto que la determina.


Formalizamos esta idea:
Proposicin 2: Sea X un conjunto, P(X) su conjunto partes, y F el conjunto de todas las
funciones caractersticas
:X{0,1}, con A
. Entonces la aplicacin : P(X) F tal que
A

es una funcin biyectiva, cuya inversa es

: F P(X) tal que

)={x

:
.
Demostracin: Se da como ejercicio. (Basta probar que:
).
Lo que nos dice esta proposicin es que:
trabajar con subconjuntos de X y con funciones caractersticas de F es esencialmente lo
mismo.
Nuestro inters en las funciones caractersticas es que nos permiten expresar las operaciones
booleanas entre conjuntos de forma algebraica. Ms precisamente tenemos la siguiente
proposicin.
Proposicin 3: Sea un conjunto X. Para cada A,B X se tiene que:
a)
b)
c)
.
Demostracin: Ejercicio.
Esta idea se conecta con las FRP mediante la siguiente definicin:
Definicin: Sea
. Diremos que un subconjunto A de N0 es un
conjunto recursivo primitivo si su funcin caracterstica
es recursiva primitiva.
Con esta definicin y usando la Proposicin 3 podemos enunciar la siguiente proposicin.
Proposicin 4: Sea
, y sean A y B dos subconjuntos de N0k. Si A y B son conjuntos
recursivos primitivos, entonces A ,
son conjuntos recursivos primitivos.
Demostracin: Ejercicio.
Para introducir algn ejemplo de conjunto recursivo primitivo, incluiremos la siguiente
proposicin.
Proposicin 5: Sea
. Todos los subconjuntos finitos de
son recursivos primitivos.
Demostracin: Sea A un subconjunto finito de
. Luego: i) A= ii) A=
(A es
unin finita de subconjuntos unitarios de A).
Si vale i) sabemos que
(x) = 0 = z(I1(k)(x)). Por lo tanto
(z,I1(k)) la cual es FRP. Luego el conjunto vacio es recursivo primitivo.
Si vale ii) ( trabajamos por induccin sobre la k-upla de elementos de
.)
P(k):
- Paso Base:

Sea k=1, x=a


0 . Debemos mostrar que A={a}
0 es conjunto recursivo primitivo. Para
(1)
esto slo hay que verificar que
= (E,I,a ) lo cual es trivial. ( recordemos que a(1) es la
funcin constante de una variable cuyo valor es a, y que E est definida en la seccin vii).
- Hiptesis Inductiva:
Supongamos ahora, para
Ao 2013

, que todos los subconjuntos unitarios de

son recursivos
Pgina 18

Teora de la Computacin Apuntes de Ctedra

primitivos.
- Mostremos que esto tambin vale para todo subconjunto de un elemento de

Sea x = (a1, a2, , ak+1) N0k+1. Pongamos y = (a1, a2, , ak ). Entonces sabemos que {y}(k)
es FRP por hiptesis inductiva. Pero
(k+1)
= (mutl; ( {y},I1(k+1),, Ik(k+1)); (E; I(k+1)k+1 ; ak+1))
{x}
lo que nos dice que {x} es FRP.
Luego si cada conjunto
de A=
es CRP, luego ( por propiedad 4) la unin finita

de CRP es CRP.

Enunciaremos ahora una proposicin, la cual en muchos casos facilitara la demostracin de que
una funcin es recursiva primitiva.
Proposicin 6.
(a) Sea m N, y A;B Nm0 conjuntos recursivos primitivos tales que
=Nm0 y
= ,
m
(m)
(m)
es decir, A y B representan una particin de N 0 . Si adems, f y g son ambas funciones
recursivas primitivas, entonces la funcin h(m) definida por:

h(x) =

es

recursiva primitiva.
(b) Si {Ai }i=l l P (Nm0) es una particin finita de N0k , donde Ai CRP, i, y adems {fi(m)}
l
FRP es una familia de funciones recursivas primitivas, entonces la funcin F(m) definida
i=l
por
F(x) = fi(x); si x Ai
es una funcin recursiva primitiva.
Demostracin: Para el primer apartado, se tiene
h = f. A + g . B = (suma; (mult; f, A); (mult; g, B))
Ya que A y B son CRP, podemos asegurar que A y B son FRP, por lo que h es FRP.
La segunda parte del enunciando se deja como ejercicio.

Corolario: Sea f(m) una funcin numrica tal que el conjunto { x N0m : f(x) 0} resulte finito.
Entonces f FRP.
Demostracin: Se desprende de la proposicin anterior, y del hecho que los conjuntos de
exactamente un elemento son recursivos primitivos.

4.2.5 Relaciones recursivas primitivas (RRP)


Por ltimo, presentamos las relaciones recursivas primitivas. Antes, vale recordar la siguiente
definicin.
Definicin: Llamaremos relacin R entre dos conjuntos A y B
a todo subconjunto del producto cartesiano AxB.
R relacin de A en B

Ao 2013

sii

R AxB.

Pgina 19

Teora de la Computacin Apuntes de Ctedra

Ahora estamos en condiciones de dar la siguiente definicin.


Definicin: Decimos que R N0xN0 es una relacin
primitiva si el conjunto que la define es
primitivo.

recursiva
recursivo

Se puede deducir de la definicin anterior, que una relacin es recursiva primitiva si la funcin
caracterstica del conjunto que define es recursiva primitiva.
Ejemplo 6. Mostraremos como ejemplo que la relacin '=' (igualdad) es recursiva primitiva.
La relacin igual define el conjunto R= = {(x; x)/ x N0}.
La idea ser encontrar una funcin recursiva primitiva f que caracterice al conjunto R=.
Observemos que la funcin de igualdad E(x; y) definida anteriormente es la funcin que
estamos buscando.
Por lo tanto:
=E
y resulta la relacin '=' recursiva primitiva.
Ejercicio: Mostrar que la relacin (menor o igual que) en N es recursiva primitiva.
4.2.6 Procedimientos y funciones recursivas primitivas
- Procedimientos con sentencias if

Frecuentemente, se necesitan funciones que estn definidas por distintas expresiones y


en distintos dominios. Para hacer posible esto se define la funcin if en la siguiente
forma:
if = f. A + g . B
donde f , g , A y B son FRP.
Procedimientos con sentencias for ( procedimiento con bucle anidado con
contador)
Segn lo visto anteriormente la sentencia if es recursiva primitiva. Ahora mostraremos
que la sentencia for se puede transformar en una funcin recursiva primitiva. Para
hacer esto, supongamos que el bucle va desde 1 hasta m, y que se utiliza n como ndice.
Adems supondremos que todas las variables salvo m se combinan en una sola variable
y. El cuerpo de la sentencia for se puede expresar ahora como una nica funcin,
digamos y=G(y,n), en donde n es el ndice del bucle. La funcin correspondiente a este
bucle es f. En otras palabras f se puede expresar, por ejemplo en Pascal, en la forma:
f=(for n:=1 to m do y:=G(y,n))
Es posible expresar f en trminos de una recursividad primitiva. De hecho, se tiene:
f(y,0)=y
donde g=I.
f(y,n)=h(y,n-1,f(y,n-1)) donde h(y,n,z)=G(z,n).
Las llamadas recursivas a procedimientos como las sentencias de bucles sin contador,
tal como las sentencias while y repeat, pueden dar lugar a programas que no terminen,
se concluye que ninguna de estas estructuras se puede expresar en trminos de una
recursividad primitiva.

4.2.7 Predicados recursivos primitivos (PRP)


Varias de las funciones definidas en la seccin 2.4, como Pr o sg, se han definido por casos
Ao 2013

Pgina 20

Teora de la Computacin Apuntes de Ctedra

(son funciones definidas a trozos). Estas funciones responden a la forma general:


.

(A)

Recordemos que una condicin P que depende de una variable xN0n, de modo que P(X) es
verdadera o falsa se llama predicado. Dicho de otra manera, un predicado P de n-lugares es una
funcin parcial P:N0n{ verdadero, falso} que asigna a cada n-upla x , de 0 1, un nico valor
de { verdadero, falso}. Se relaciona estrechamente un predicado con su funcin caracterstica:
: N0n{0,1} definida por :
De tal forma que (A) es equivalente a:
.
Nota: En la prctica, en la expresin (A) se sobreentiende la verdad de la condicin P(x) y se
escribe:
.

Definicin: Decimos que un predicado


computable, si su funcin caracterstica

de n-lugares
es computable.

es

Definicin: Decimos que un predicado P de n-lugares es un


predicado recursivo primitivo, si su funcin caracterstica
es recursiva primitiva.

Proposicin 7: Si P1 y P2 son dos predicados recursivos primitivos de n-lugares, entonces


tambin lo son P1 P2, P1 P2 y P1.
Demostracin: Ejercicio.
Proposicin 8: Si f1, f2, , fn son funciones recursivas primitivas de N0n en N0.; y P1, P2,
,Pn son predicados recursivos primitivos de n-lugares y, para cada x N0n exactamente una y
slo una de las condiciones P1(x), P2(x), ,Pn(x) es verdadera. Entonces la funcin numrica f:
N0n N0 definida por:

es recursiva primitiva.
Demostracin: Ejercicio.
Proposicin 9: Si P es un predicado recursivo primitivo de (n+1) lugares. La cuantificacin
existencial limitada:
Ao 2013

Pgina 21

Teora de la Computacin Apuntes de Ctedra

EP(x,k)=(existe y con 0yk tal que P(x,y) es verdadero);


y la cuantificacin universal limitada:
AP(x,k)=(para cada y que satisface 0yk; P(x,y) es verdadero)
son predicados recursivos primitivos.
Demostracin: (Ver Capitulo 4 -pags. 456 y 457- Libro de John Martin(2004) Lenguajes
formales y teora de la computacin (3 Edicin) Ed. Mc Graw Hill.)
Ejemplo: El resto y el cociente div son funciones recursivas primitivas, pues:
resto(0,x)=0
resto(y+1,x)=
y
div(0,x)=0
div(y+1,x)=

4.3 Ms all de las FRP


4.3.1 Introduccin
En nuestra bsqueda por encontrar un modelo de clculo, hemos definido el conjunto de las
funciones recursivas, y despus de haber visto una gran cantidad de ejemplos de estas
podramos pensar que las FRP son el modelo de clculo que buscbamos. Pero bien, veamos
habr alguna funcin que no podemos representar como funcin recursiva primitiva? Ms
adelante podremos ver que s, existen funciones que no podremos representar como FRP. Para
aclarar mejor esto veamos algunas caractersticas que presentan las FRP.

4.3.2 Caractersticas de las FRP


La clase de FRP tiene entre sus propiedades:
i)
Son todas funciones totales.
ii)
Son posibles de caracterizar a travs de las derivaciones recursivas
primitivas.
Definicin: Una funcin f
tiene una derivacin recursiva
primitiva si existe una secuencia finita de funciones f1,f2,
, fn tal que f=fn y cada fi de la secuencia es una funcin
base o puede obtenerse de funciones previas de la secuencia
por composicin o recursin primitiva.
La definicin anterior muestra un proceso para obtener un algoritmo para evaluar una funcin f
desde una secuencia: f1 f2 . . . fn = f .
A continuacin se demuestra slo la primer propiedad (la segunda queda como ejercicio).
Teorema: Si f es FRP entonces f es total.
Demostracin. Observemos que las funciones base estn definidas para todo su conjunto de
partida, con lo cual las funciones base son totales. Adems, los procesos de composicin y
recursin tienen la caracterstica de ser conservativos respecto de la propiedad de ser totales.
Veamos la prueba para la composicin.
Sea f(n). Sean g1(m) ; g2(m) ;; gn(m) n- funciones totales, queremos probar que h(m) =
Ao 2013

[f(n);

Pgina 22

Teora de la Computacin Apuntes de Ctedra

g1(m) ; g2(m) ;; gn(m) ] es total.


Sea x N0m podemos calcular xi = gi(x); i = 1 ,, n pues gi es total.
Entonces
y: y = f(x1; x2;; xn) ,
Pues f es total.
Por lo tanto:
y N0: y = f(x)
Para la recursin se utiliza un razonamiento similar. Esto nos permite afirmar que toda FRP es
total.

En nuestra primera aproximacin a los procesos de clculo que desebamos modelizar,


partamos de que deban ser capaces de representar algunos algoritmos de clculo elementales,
como por ejemplo el que determinaba la raz cuadrada de un nmero natural. Claramente, el
clculo de la raz cuadrada de un nmero no es una funcin total, por lo que nos encontramos
con que hay funciones calculables que no pueden ser representadas por una funcin recursiva
primitiva.
Por otro lado se puede demostrar la incompletitud de la clase de FRP para representar todas las
funciones totales computables. Existe una demostracin constructiva (funcin de Wilhelm
Ackermann, 1928) y otra no constructiva (argumento de diagonalizacin de Cantor).
Nosotros veremos a continuacin la demostracin no constructiva. Esta se basa en mostrar que
existe una enumeracin de las funciones recursivas primitivas. Sobre la enumeracin se utiliza
el mtodo de demostracin por diagonalizacin, y se construye una funcin total que no est en
la enumeracin. Es decir, se obtiene una funcin total que no es recursiva primitiva.
Teorema: Existe una funcin computable total de N0 en N0 que no es recursiva primitiva.
D/:
o Para enumerar las funciones recursivas primitivas se necesita codificar sobre un
alfabeto finito (por ejemplo {0,1}) el sistema de ecuaciones que las representa. El
alfabeto debe contener smbolos para la funcin proyeccin, sucesor, la funcin cero,
para la recursin y la composicin, adems para los parntesis, y los ndices de las
funciones bsicas como I71 .
Sea un alfabeto que contiene todos los smbolos que podran ser necesarios para
describir funciones numricas de N0 en N0. Toda funcin recursiva primitiva puede ser
especificada por medio de las funciones bsicas que lo representan, que a su vez puede
ser representada por una cadena en .
o Las cadenas sobre el alfabeto que representan a FRP (es decir que corresponden a
una codificacin vlida de una FRP) se ordenan por longitud, y cadenas de igual
longitud se ordenan alfabticamente (ordenamiento cannico), pudiendo ser colocadas
en las filas de una matriz.

FRP
Ao 2013

f0
f1
f2
f3
Pgina 23

Teora de la Computacin Apuntes de Ctedra

En la demostracin, se consideran slo funciones recursivas primitivas con un nico


argumento. Por ello, en las columnas de la matriz se coloca el conjunto de los nmeros
naturales:
N0
0

FRP

f0
f1
f2
f3

o Y cada posicin (i,j) de la matriz es el valor resultante de evaluar a fi para el argumento


xj.
N0

FRP

f0
f1
f2
f3

0
f0(0)
f1(0)
f2(0)
f3(0)

1
f0(1)
f1(1)
f2(1)
f3(1)

2
f0(2)
f1(2)
f2(2)
f3(2)

En principio, podemos ver que para cada n0 existe la imagen de la funcin recursiva
primitiva n-sima , del listado, fn(n). Por lo tanto se puede computar fn(n). Se define una
nueva funcin g(n) = fn(n) + 1, para cada n0.
Es decir que g se define sumndoles 1 a cada elemento de la diagonal de la matriz.
N0

FRP

f0
f1
f2
f3

0
f0(0)
f1(0)
f2(0)
f3(0)

1
f0(1)
f1(1)
f2(1)
f3(1)

2
f0(2)
f1(2)
f2(2)
f3(2)

g es una funcin total , pues est definida para todo natural de N0 .


g es computable, pues acabamos de esbozar como realizar su cmputo.
Probemos ahora que g no es FRP.
Supongamos que la funcin g es FRP, debera estar en la enumeracin ya que estn
enumeradas todas las FRP.
Luego, existe un j N tal que g(n) = fj(n) para todo n N .
En particular la igualdad anterior se cumple para un n=j, y con lo cual :
Ao 2013

Pgina 24

Teora de la Computacin Apuntes de Ctedra

El absurdo surge de haber supuesto que g estaba en la enumeracin, con lo cual g es total y no
es FRP.
Por lo tanto existen funciones totales computables que no son FRP.

4. Funciones Recursivas (FR)


En la seccin anterior hemos demostrado que existen funciones totales que no son funciones
recursivas primitivas. En esta seccin agregaremos un nuevo operador con el objetivo de
definir una nueva familia de funciones, la cual llamaremos funciones recursivas.
4.4.1 El minimizador
A los procedimientos constructivos que tenamos (composicin y recursin), agregaremos un
nuevo mecanismo de fabricacin de funciones a partir de otras. Lo llamaremos minimizacin
(minimalization) y se define de la siguiente manera.
Definicin: Dada una funcin numrica total
g(n+1), decimos
(n)
que la funcin numrica parcial
f
se construye por
minimizacin de g, si:
f(n)(x) =
}
es decir:
f(n)(x): es el mnimo valor , dentro del conjunto de los
naturales, que verifican g(x,m)=0, en caso de existir.
Notaremos:
f(n)(x) =
.

Observacin:
- En base a la definicin de minimizacin de una funcin g podemos notar que en
general no existe un mtodo claro para el clculo de los valores imgenes, inclusive an
si sabemos cmo calcular g. Obviamente el procedimiento a aplicar es:
m:=0;
while g(x,m)0 do m:=m+1;
(I)
output m
que puede no ser un algoritmo, en el caso en que no termine.
Definicin: Diremos que una funcin numrica g(n+1) es
minimizable si verifica la propiedad:
n
para
hay un valor mN tal que g(x,m)=0.Pgina 25
Ao
2013 cada xN0

Teora de la Computacin Apuntes de Ctedra

Es claro que si en el procedimiento (I) g(x,m) es minimizable, ste (el procedimiento)


es un algoritmo.

Las funciones numricas definidas con el operador minimizacin, minimizando una


funcin g minimizable, son totales.

Definicin: El conjunto de funciones


- recursivas son aquellas
que se pueden obtener desde las funciones bsicas utilizando las
reglas de composicin, recursin primitiva, y minimizacin de
funciones minimizables, un nmero finito de veces.
Se puede probar que: Toda funcin
es computable por Mquina de Turing.
Ejemplo 7. Intentemos definir la funcin raz cuadrada, raiz(x) = , para nmeros naturales.
Vale decir que para valores cuya raz cuadrada no es un nmero natural, la funcin no est
definida.
raiz(x) = = min{m N0 /m2 = x}
Observemos que:
m2 = x E(m2; x) = 1 dif(1,E(m2; x)) = 0
g(x,m) = dif(1,E(m2; x)) funcin total, recursiva primitiva pero no minimizable.
El procedimiento de bsqueda del valor m lo podemos acotar para cada caso particular x, ya
que se sabe que m nunca puede superar al valor de x.
Ahora estamos en condiciones de definir las funciones recursivas.

Definicin: Conjunto de Funciones Recursivas (FR)(o funciones recursivas parciales)


(i) Si f FRP, entonces f es FR.
(ii) Para cada n0 y cada funcin numrica total g(n+1) de FR, la
funcin parcial fn:N0n N0 definida por
fn(x)=
es una FR.
(iii) Ninguna otra funcin est en FR.

4.4.2 Tesis de Church


Desde el comienzo, nuestro objetivo fue encontrar una forma de modelar lo que entendemos
por clculo. Para eso definimos las FRP, luego las FR y ahora nos preguntamos: sern estas
ltimas el conjunto de todas las funciones calculables que pretendemos abarcar con nuestro
modelo?.
La respuesta a este interrogante es conocida como la Tesis de Church.
Toda funcin calculable puede ser expresada como una funcin recursiva. Si esta tesis es
Ao 2013

Pgina 26

Teora de la Computacin Apuntes de Ctedra

cierta, implica que si una funcin no puede ser expresada como una funcin recursiva entonces
no es calculable.
Esta tesis es ms que nada una expresin de deseo. Lo que se trata de decir es que se considera
casi imposible que podamos encontrar alguna funcin de las que consideramos calculables, de
acuerdo a nuestra idea intuitiva, y que sta no sea una funcin recursiva.
A pesar de esto, el hecho de que en bsqueda de otros modelos del clculo (Mquinas de
Turing, Funciones de Listas) no se haya podido ampliar el campo, ayuda a fortalecer la
credibilidad de la afirmacin hecha por Church.
La tesis de Church es equivalente a la tesis de Turing.

5. Nota Complementaria Trataremos ahora un problema famoso, el problema de


detencin.
Problema de la detencin: Sera deseable poder determinar para cada programa si ste
termina o no para todas las posibles entradas. Si existiera tal procedimiento, uno podra decidir
por adelantado si existe el riesgo de que un programa no termine nunca. Desafortunadamente,
ese procedimiento no existe. Ese es el famoso problema de la detencin. Concretamente, el
problema de la detencin implica el diseo de un procedimiento que pueda predecir, para un
programa arbitrario, si ste llegar alguna vez a una conclusin. Desafortunadamente, vamos a
demostrar que el problema de la detencin es indecidible.
Considere una funcin, digamos finaliza(x), que tiene como argumento un programa, y que
vale 0 si el programa se detiene, o bien 1 en caso contrario. Por supuesto, los programas se
pueden considerar como cadenas, y todo carcter de una cadena posee una representacin
numrica. En este sentido, se puede decir que x es un entero dado por la representacin interna
(en la computadora) del programa x.
Para demostrar que finaliza(x) es indecidible, supondremos que finaliza siempre concluye, y
derivaremos una contradiccin. Para esto considere el siguiente esqueleto de programa, que
denotaremos con B.
read(x);
while finaliza(x)=1 do print(sigue en marcha)
Podemos dar la entrada x cualquier valor, incluyendo x=B. Por tanto, ejecutamos B tomando
como entrada al propio B.
Supongamos ahora que finaliza es una funcin decidible.

Si B concluye entonces finaliza(B) tiene que proporcionar el valor 1, lo cual significa que la
sentencia while se ejecuta indefinidamente. Consiguientemente, la finalizacin de B implica
que B no llega a terminar. Contradiccin, por lo cual concluimos que la premisa que B termina
es falsa.
Ahora si consideramos que finaliza(B)=0, entonces la sentencia while de B concluye. Una vez
ms se deriva en una contradiccin.
Por tanto si B termina como si no, termina en una contradiccin. Esto significa de que la
suposicin de que finaliza(B) concluye tiene que ser falsa, y por tanto el problema es
indecidible.
Ao 2013

Pgina 27

Teora de la Computacin Apuntes de Ctedra

Cuadros Resumen
Formalmente, las funciones recursivas primitivas se pueden definir teniendo en cuenta un conjunto de
funciones bases y un conjunto de reglas de construccin:
Funciones Bases

Reglas de Construccin
Composicin:

Cero: z(x) = 0 (informal 0)


Sucesor: s(x) = x+1 ( x N) (informal x+1)
Proyeccin: Ik(x) = xk ( x = (x1, x2, . . . , xn), 1 k n ) (informal xk)
(Si n=1 entonces I(x) es la funcin identidad)

Recursin:

Interpretacin: Las funciones recursivas primitivas son todas las funciones bases y todas aquellas que
se pueden obtener a partir de las funciones bases por la aplicacin sucesiva de un nmero finito de
veces de las reglas de construccin: composicin y recursin.

Cuadro 1

Ao 2013

Pgina 28

Teora de la Computacin Apuntes de Ctedra

Funciones -Recursivas
Se definen utilizando el operador de minimizacin y extienden el conjunto de funciones recursivas primitivas.
Minimizacin:

El resultado de f(x) se obtiene desde:

Observacin: la secuencia de computaciones puede continuar infinitamente sin obtener un resultado para f(x) .

Cuadro 2

Ao 2013

Pgina 29

Teora de la Computacin Apuntes de Ctedra

5. Mquina de Turing (M. T.)


Es un Modelo que se estudi en la anterior unidad, pero se recuerda, que es un modelo
abstracto de computacin.
Denicin: Una MT estndar determinstica, es una 6-upla M=(Q,,,,q0,qf) donde:
Q: conjunto de estados
: alfabeto de entrada
: alfabeto de la cinta, con
: funcin de transicin, : Q Q{I,D,N}
q0: estado inicial
qf: estado nal

Grficamente:

5.1 Lenguajes Recursivos y Recursivamente Enumerables


La familia de Lenguajes aceptados por MT es la familia de los lenguajes Tipo 0 o
lenguajes recursivamente enumerables (r.e.) Lenguajes generados por Gramticas
Irrestrictas.
Incluidos en la familia de lenguajes r.e. se encuentran los lenguajes recursivos (rec.) y
dentro de ellos, los generados por Gramticas Dependiente del Contexto lenguajes aceptados
por ALA (Autmata Linealmente Acotado).
Definicin:
Un lenguaje (conjunto) L es recursivamente enumerable (r.e.) si existe una funcin f : N
L, total, sobreyectiva y computable. Esto signica que los elementos de L pueden ser
enumerados, es decir, asignarle un ndice natural.
Denicin de funcin caracterstica:
Sea L r.e, luego L es recursivo si la funcin caracterstica asociada a L, c : {0, 1} y
denida de la siguiente manera:

es una funcin total. Es decir que para un lenguaje (conjunto) recursivo siempre es posible
determinar la pertenencia de un elemento dado.

Ao 2013

Pgina 30

Teora de la Computacin Apuntes de Ctedra

Un lenguaje L es enumerable recursivamente si existe una MT que acepte a L, y


recursivo si existe una MT que dcide a L. En algunas ocasiones se les suele llamar lenguajes
aceptables por MT y lenguajes que pueden decidirse con MT, respectivamente.
De lo anterior se desprende que cada lenguaje recursivo es enumerables
recursivamente. Los lenguajes recursivamente enumerables, forman la clase ms general entre
los conjuntos de lenguajes computables, para los que se pueden construir MT que los aceptan.
Los lenguajes recursivamente enumerables pueden ser generados por una gramtica sin
restricciones, tambin llamada de Tipo 0, segn la Jerarqua de Chomsky. Esta categora
incluye los lenguajes sensibles al contexto.
Tanto la operacin de unin como la interseccin conservan la propiedad de ser
enumerables de manera recursiva.

5.2 Relacin entre lenguajes recursivos y la nocin de algoritmo:


Un problema est definido por la especificacin genrica del mismo, por ejemplo dado un
vector, calcular el promedio de sus componentes, mientras que una instancia de un problema
est definido por los argumentos de cada parmetro que determina el problema por ejemplo
5
7
6 6
promedio = 6
Los problemas se modelan mediante algoritmos, es decir, todo problema puede tratar de
implementarse por medio de un algoritmo.
Un algoritmo puede definirse como un procedimiento de cmputo que siempre entrega
una respuesta o resultado, cualquiera sea la entrada. En este sentido, se puede decir que un
algoritmo computa una funcin total.
Si se codifica instancia de un problema, estos se transforman en cadenas que pueden
alimentar una maquina de Turing para determinar si es decidible o No decidible.
Un lenguaje decidible es que para toda instancia del problema (cadenas) hay una MT
que decide por Si o por NO y siempre se detiene, es decir es un lenguaje recursivo.
Un lenguaje No decidible es que para toda instancia del problema (cadenas) hay una
MT que decide por Si o por NO o no se detiene (posee un lazo infinito), es decir es un lenguaje
recursivo enumerable.

La familia de lenguajes recursivos es un subconjunto propio de la familia de los


lenguajes r.e., es decir que:
o Si L es un lenguaje recursivo, luego L es r.e.. Para mostrar esta parte, es posible
usar la funcin caracterstica como hiptesis.
o Por otro lado, no siempre se cumple, que un lenguaje r.e. sea recursivo. Esto se
visualiza a travs de un contra ejemplo:
o L = {n N |n = p q, con p, q primos }
o L es r.e. pero no recursivo.

L puede ser enumerado usando una matriz innita de la siguiente manera:

Ao 2013

Pgina 31

Teora de la Computacin Apuntes de Ctedra

p/q

.....

(1,1)

(1,2)

(1,3)

(1,4)

......

(2,1)

(2,2)

(2,3)

(2,4)

......

(3,1)

(3,2)

(3,3)

(3,4)

......
...

...

...

...

...

......

El algoritmo para computar f : N L ...


Se obtiene lo valores para:
f (1) =? f (4) =? f (5) =?
L puede ser enumerado, pero la funcin caracterstica c es total?.
5.3 Cardinalidad de conjuntos
A esta altura, pueden surgir las siguientes preguntas: qu puede ser computable y que
no? Es decir, que es decidible y que no es decidible? En lo referente a decidible, se ver la
complejidad. En el anlisis de cardinalidad de conjunto, se tiene:
= {0,1} alfabeto
* son todas las posibles cadenas a partir de
2 * representa un conjunto, y corresponde a todos los posibles lenguajes que se pueden formar
con *
Preguntas asociadas:

Qu carnalidad tiene *?, es decir * ?


Qu carnalidad tiene 2 * ?, es decir 2 * ?
En el infinito sern iguales * = 2 * ?

Se ver la cardinalidad de los nmeros Naturales, .


=

La cardinalidad del conjunto de los nmeros naturales es (aleph cero), no es un nmero, es un


smbolo para poder diferenciarlo de otras cardinalidades infinitas, este es una cardinalidad
infinita.
Ahora, puede surgir como cuestionamiento:
=?
Ao 2013

Pgina 32

Teora de la Computacin Apuntes de Ctedra

Se pueden contar los enteros con los naturales? Se puede asignar un nmero natural a
cada nmero entero?
Ambos conjuntos, son infinitamente contables, pues por ejemplo, para cada elemento
de los , se le hace corresponder un natural. La correspondencia se hace de la siguiente forma:

Los nmeros enteros son contablemente infinitos, por esto sera:


=

Ejemplo:
Puede surgir la pregunta:
Q =

0 ? Qu cardinalidad tendra Q? Siendo;

Recordar que entre dos nmero racionales, existen infinitos nmero racionales, no
cubre la recta de los nmero reales. Ahora, se puede hacer corresponder a cada racional un
nmero natural? Es decir, dado un natural, se puede encontrar un racional y hacerlo
corresponder? Lo anterior se lleva a cabo mediante una matriz, como la que sigue:
a/b

.....

1/1

1/3

1/4

......

2/1

2/2

2/3

2/4

......

3/1

3/2

3/3

3/4

......
...

...

...

...

...

......

Cualquier nmero racional est dentro de la matriz y el sentido de las flechas indica el
sentido del barrido o de asignacin. En la matriz anterior, notar que faltan los nmeros
negativos, para ello se realizan los crculos en otros cuadrantes, como sigue:

Ao 2013

Pgina 33

Teora de la Computacin Apuntes de Ctedra

Por lo anterior, se tiene que * =

Se pude llegar a ver la cardinalidad de los nmeros reales, es decir, R , para demostrar
esto, se puede utilizar la Diagonal de Canto.
Con lo anterior se obtiene que:
R= 2

Se dice que son enumerables si a cada elemento de un conjunto se le hace corresponder un


nmero natural.
La cardinalidad de * 2 * pues se sobreentiende que * es menor que 2 *. Se
ver en el siguiente grfico:

Ao 2013

Pgina 34

Teora de la Computacin Apuntes de Ctedra

5.4 CODIFICACIN DE UNA MAQUINA DE TURING


Lo que sigue es una M. T.:

Cuando se dice que un lenguaje L es decidible, es porque la M. T. puede decidir por s o


por no, pues la manera de decidir si acepta o no una cadena del lenguaje L.

Por lo tanto, L *
Ejemplo:
Sea una Gramtica G, Tipo 2, surge la siguiente pregunta G es ambigua? El anterior es
un problema de decisin, pues es por un si o por un no.

Para el ejemplo:
G: cuyas producciones son:
1. S aS
2. S Sa
3. S a

Grfico de una M. T.

Ao 2013

Pgina 35

Teora de la Computacin Apuntes de Ctedra

Se va a codificar la gramtica G, G , para realizar lo anterior, se utiliza un alfabeto y


as codificar la Gramtica G. Siguiendo con el ejemplo:
S # aS ## S # Sa ## S # a * es una cadena
Es decir, que si la codificacin es introducida a la M. T. del grfico, la respuesta sera
Si. Pues la M. T. recibe una cadena como S # aS ## S # Sa ## S # a , y puede decidir si
es o no ambigua, por lo tanto es una codificacin vlida.
El es { S, #, a} surge la siguiente pregunta: Qu lenguaje L est decidiendo la M.
T.?

Son todas las


codificaciones de la
Gramtica G, tal que
son ambiguas, es decir:
L= { G * / G

es ambigua}

Resumiendo grficamente:

Toda MT se puede codificar como una secuencia binaria finita, es decir una secuencia
finita de ceros y unos. Para simplificar la codificacin, se supone que toda MT tiene un nico
estado inicial denotado por q1, y un nico estado final denotado q2. Se tendr que para una MT
Ao 2013

Pgina 36

Teora de la Computacin Apuntes de Ctedra

M de la forma: = {s1,s2,.....,sm,....,sp}, donde s1 representa el smbolo blanco 0, o b (segn


se desee denotar), = {s2,.....,sm} es alfabeto de entrada y sm + 1,...,sp son los smbolos
auxiliares utilizados por M(cada MT utiliza su propia coleccin finito de smbolos auxiliares).
Todos estos smbolos se codifican como secuencias de unos:

Los estados de una MT, q1,q2,q3,...,qn, se codifican tambin con secuencias de unos:

Smbolo Codificacin

q1(inicial)

q2(final)

11

.
.
.

.
.
.

qn

1n

Las directrices de desplazamiento D (derecha), I (izquierda) y S se codifican con 1, 11,


111, respectivamente. Una transicin (q, a ) = (p, c, D) se codifica usando ceros como
separadores entre los estados, los smbolos del alfabeto de cinta y la directriz de
desplazamiento D.
Ao 2013

Pgina 37

Teora de la Computacin Apuntes de Ctedra

As, la transicin (q3,s2) = (q5,s3, D) se codifica como 01110110111110111010. En


general, la codificacin de una transicin cualquiera (qi,sk) = (qj,st, D) es 01i01k01j01l01t
donde t= 1 2 3, segn la direccin sea derecha(D), izquierda(I), esperar(S).
Una MT se codifica escribiendo consecutivamente las secuencias de las modificaciones
de todas sus transiciones. Mas precisamente, la codificacin de una MT M es de la forma
C1C2...Ci donde Ci son las codificaciones de las transiciones de M. Puesto que el orden en que
se representen las transiciones de una MT no es relevante, una misma MT tiene varias
codificaciones diferentes. Esto no representa ninguna desventaja prctica o conceptual ya que
no se pretende que las codificaciones sean nicas.

Ejemplo:
Sea G, una gramtica, cuyos elementos son:
N = { S, A, B}
= {a, b, c}
P:
S AB
A aA | a
Bb
Se realiza la codificacin de G:
S0
A 00
B 000
a1

Se asocia un orden, con un ndice.


Se va a codificar a como #

b 11
c 111
Segn lo anterior, se tiene:
S AB
0#00#000,

Se concatena con , (con comas) y para marcar el final, se coloca


##. Por lo tanto la codificacin completa de G es:

A aA
00#1#000,
Aa

0#00#000,00#1#00,00#1,000#11##

00#1,
Bb
000#11,
Ao 2013

Pgina 38

Teora de la Computacin Apuntes de Ctedra

Es un problema que no tiene un algoritmo asociado, pues demostrar que G no es


ambigua, no es decidible.
Un lenguaje decidible es que para toda instancia del problema o cadena, existe una M.
T. que decida por s o por no. Es decir, un lenguaje recursivo es decidible, pues para cada
cadena de entrada, la M. T. decide por un s o por un no. Un lenguaje recursivamente
enumerable, no es decidible, pues la M. T. puede decidir por un si, por un no o nunca
detenerse, es decir, entra en un loop infinito. Notar que la familia de lenguajes recursivos es un
subconjunto de la familia de lenguajes recursivamente enumerables.
6. REDUCCIN DE PROBLEMAS
Dado dos problemas A y B, reducir A B, significa:

Transformar una instancia de A en una instancia de B


Resolver el problema B para luego obtener una solucin de A

Algoritmo para A donde A reduce a B (es una M. T.)


T(x)

si o no
Algoritmo
para B

Del grfico anterior se desprende:

Que x es una instancia de A y T(x) es una instancia de B.


No es la llamada a un procedimiento. Se transforma la instancia e A que es x y con el
algoritmo de B, se puede dar como respuesta si o no.
Usamos una solucin de B para resolver A. B es ms general que A.

Grficamente, el conjunto de instancias de A (IA ) y un conjunto de instancias de B (IB).


IA

IB

La funcin T es total, para toda instancias de A, hay alguna IB, pero no es subyectiva, porque
B es ms general, es decir, efectivamente computable.
Ao 2013

Pgina 39

Teora de la Computacin Apuntes de Ctedra

Ejemplo:
Problema A: Dado un grafo G, donde G = (V, E), obtener el tamao del mximo clique para
G.
Problema B: Dado un grafo G, donde G = (V, E), obtener el tamao del mximo conjunto
independiente en G
Se observa que:

El problema B es el problema inverso de A


La respuesta para ambos problemas es un nmero natural
Ambos son problemas resolubles

Grficamente problema A:
2

1
4

Cuntos subgrafos completos hay?


(1, 2) (2,3) (1,4) (4,5) (2,4) (1,2,4)
El mximo cliqu es (1,2,3), que es la respuesta al Problema A.
Grficamente problema B:
1

3
4

Conjunto independiente:
Tamao 2
{1,3}
{1,5}
{1,4}
{1,6}

Tamao 3
{1,3,5}
{2,4,5}

5
6

Se nota que:

Se quiere resolver A, pero se tiene resuelto B


La respuesta de B, sirve para responder A

Ao 2013

Pgina 40

Teora de la Computacin Apuntes de Ctedra

Grficamente:
A
T

T(x)

Surge la pregunta, quin es T?


T (G=(V,E)) = G= (V, )

Por lo anterior quedara:


2

Conjunto mximo independiente es:


{1, 2, 4}

1
5

T
x

B
n

T(x)

T (G=(V,E)) = G= (V, )

Por lo anterior:
B es un problema resoluble porque B tiene un algoritmo A B, se lee, A reduce a B, B es
decidible; luego A es decidible.
A
x

Ao 2013

T(x)

B
RB

RA

Pgina 41

Teora de la Computacin Apuntes de Ctedra

Definicin:
Un problema a se reduce a un problema B, si existe una funcin de Transformacin T:
IA IB total, donde los IA, IB conjuntos son conjuntos de instancias de los problemas
A y B respectivamente.

Grficamente:
IA

IB

Se ver que A B A es no decidible, luego B es no decidible, puede notarse que A es ms


particular que B y que B es ms general.
B

Problema de Correspondencia de Post, se reduce a un problema de ambigedad (PCP AMB)


Existe un algoritmo de ambigedad si se introduce una codificacin de una gramtica del Tipo
2, donde la codificacin de la M. T., contesta, s o no. Como se observa en el grfico:
AMB
si
G
no

Para analizar el Problema de Post, se parte de dos listas:


A
xi
X1
X2
X3

xn
Ao 2013

B
wi
w1
w2
w3

wn
Pgina 42

Teora de la Computacin Apuntes de Ctedra

Notar que xi y wi *

Ejemplo: Problema:
Se debe encontrar un conjunto de ndices i1, im; ik {1,,n} tal que cumple que x1 x2 x3
xim = wi1 wi2 wi3 wim existe al menos una lista de ndices.
Ejemplo:
ai (ndices)
1
2
3

A
xi
1
1011
10

B
wi
111
10
0

Se va a demostrar que PCP AMB


Se parte de la hiptesis que PCP es no decidible. Se debe demostrar que PCP AMB, luego
AMB de Libre de Contexto es decidible.
Grficamente:
PCP
<A,B>

<GA,B
>

AMB

Si

No

Si

No

Notar que:
<A,B> es la codificacin de las dos listas A y B
<GA,B> es la codificacin de las gramticas

PCP Problema de Correspondencia de Post


Se parte de dos listas de n componentes (cadenas), el problema plantea encontrar una secuencia
de ndices tal que cumple i1,i2,,im ik {1..n} xi1 xi2xim=wi1 wi2 wim Existe al menos
una lista de ndices con m componentes
A

B
Xi

X1
X2

Xn

Ao 2013

Wi
W1
W2
..
Wn

Pgina 43

Teora de la Computacin Apuntes de Ctedra

Ejemplo: sean las Ay B con n=3


ai
1
2
3

A
1
1011
10

B
111
10
0

Existe una instancia de solucin PCP con m=4


Si , por ejemplo la secuencia 2,11,3

10111110=101111110
X2

X1X1X3 = W2 W1

Ao 2013

W1 W3

Pgina 44