Académique Documents
Professionnel Documents
Culture Documents
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
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
3 RELACIN ENTRE
COMPLEJIDAD
LA
TEORA
DE
COMPUTABILIDAD
LA
DE
Pgina 3
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.
Pgina 4
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
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*)
Pgina 6
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:
Tenemos pues:
Pgina 7
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).
Ao 2013
Pgina 8
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.
orden constante
orden logartmico
orden lineal
orden n*logartmico
Pgina 9
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
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)
Ao 2013
Pgina 11
4. Funciones
(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
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.
Pgina 13
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.
Ao 2013
Pgina 14
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
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
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
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
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.
v)
vi)
Funcin signo :
vii)
Igualdad:
.
.
:X{0,1} por :
(x) =
(x) =
.
.
Es importante notar que existe una correspondencia biunvoca entre funciones caractersticas y
Ao 2013
Pgina 17
)={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:
son recursivos
Pgina 18
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.
Ao 2013
sii
R AxB.
Pgina 19
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
Pgina 20
(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:
.
de n-lugares
es computable.
es
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
[f(n);
Pgina 22
FRP
Ao 2013
f0
f1
f2
f3
Pgina 23
FRP
f0
f1
f2
f3
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)
Pgina 24
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.
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
Pgina 26
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.
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
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:
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
Funciones -Recursivas
Se definen utilizando el operador de minimizacin y extienden el conjunto de funciones recursivas primitivas.
Minimizacin:
Observacin: la secuencia de computaciones puede continuar infinitamente sin obtener un resultado para f(x) .
Cuadro 2
Ao 2013
Pgina 29
Grficamente:
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
Ao 2013
Pgina 31
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)
......
...
...
...
...
...
......
Pgina 32
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:
Ejemplo:
Puede surgir la pregunta:
Q =
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
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
Ao 2013
Pgina 34
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
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
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
Pgina 37
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
b 11
c 111
Segn lo anterior, se tiene:
S AB
0#00#000,
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
si o no
Algoritmo
para B
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
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:
Grficamente problema A:
2
1
4
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:
Ao 2013
Pgina 40
Grficamente:
A
T
T(x)
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
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
xn
Ao 2013
B
wi
w1
w2
w3
wn
Pgina 42
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
<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
B
Xi
X1
X2
Xn
Ao 2013
Wi
W1
W2
..
Wn
Pgina 43
A
1
1011
10
B
111
10
0
10111110=101111110
X2
X1X1X3 = W2 W1
Ao 2013
W1 W3
Pgina 44