Una funcion -mixta sera llamada -efectivamente computable si hay un procedimiento efectivo tal que
(1) El conjunto de datos de entrada de es
(2) El conjunto de datos de salida esta contenido en .
(3) Si , entonces se detiene partiendo de , dando como dato de salida .
(4) Si , entonces no se detiene partiendo desde
Analogamente una funcion -mixta sera llamada -efectivamente computable si hay un procedimiento efectivo tal que
(1) El conjunto de datos de entrada de es
(2) El conjunto de datos de salida esta contenido en .
(3) Si , entonces se detiene partiendo de , dando como dato de salida .
(4) Si , entonces no se detiene partiendo desde
En ambos casos descriptos arriba diremos que computa a la funcion .
Notese que esta definicion para el caso tiene a priori cierta ambiguedad ya que cualesquiera sean y tenemos que ya que y . De todas maneras, cualesquiera sean los y elejidos, siempre hay un procedimiento efectivo que computa a , i.e. un procedimiento que nunca se detiene, cualesquiera sea el dato de entrada de . Es decir que la funcion es -efectivamente computable cualesquiera sea el alfabeto . Cabe destacar que para el caso de una funcion , nuestra definicion es inambigua ya que hay unicos y tales que .
Veamos algunos ejemplos:
E La funcion es -efectivamente computable, cualquiera sea el alfabeto ya que el procedimiento enseñado en la escuela primaria para sumar numeros en notacion decimal es efectivo y computa esta funcion. Tambien las funciones y son -efectivamente computables via los procedimientos clasicos enseñados en la escuela primaria.
E La funcion es -efectivamente computable ya que el siguiente procedimiento con conjunto de datos de entrada la computa:
- Independientemente de quien sea el dato de entrada , terminar y dar como salida el numero
E La funcion es -efectivamente computable ya que el siguiente procedimiento con conjunto de datos de entrada la computa:
- Dado el dato de entrada , terminar y dar como salida la palabra
E es -efectivamente computable. Para realizar el procedimiento efectivo que compute a necesitaremos el procedimiento de la escuela primaria que dado un numero no nulo , expresado en notacion decimal, calcula el numero , en notacion decimal. Llamemos a dicho procedimiento. El siguiente procedimiento (con conjunto de datos de entrada igual a ) computa a :
Dado como dato de entrada un elemento , realizar lo siguiente:
Etapa 1
Si , entonces ir a Etapa 3, en caso contrario ir a Etapa 2.
Etapa 2
Correr con dato de entrada obteniendo como dato de salida. Detenerse y dar como dato de salida.
Etapa 3
Si , entonces ir a Etapa 1.
Como puede notarse el procedimiento anterior es efectivo ya que debemos entender que en la Etapa 2, los sucesivos pasos efectuados al correr son todos simples y efectivamente realizables ya que es efectivo. Por supuesto si uno quisiera ser mas prolijo, deberia reemplazar la Etapa 2 por las distintas instrucciones de , referidas a .
E El predicado es -efectivamente computable cualquiera sea el alfabeto . Describiremos con palabras un procedimiento que computa a . Su conjunto de datos de entrada es . Dado un par , el procedimiento primero compara las longitudes de las palabras que en notacion decimal representan a y . Por supuesto esto lo hace borrando de a un simbolo y viendo si alguna se termina primero. Si resultan de distinta longitud, es facil darse cuenta como sigue. En caso de que las palabras resulten de igual longitud, entonces se hace el procedimiento clasico de ir comparando digitos de izquierda a derecha.
(E) Veamos que la funcion es -efectivamente computable. Como en los lenguajes de programacion, usaremos variables y asignaciones para diseñar el procedimiento. Ademas llamemos a el procedimiento de la escuela primaria que dado un numero no nulo , expresado en notacion decimal, calcula el numero , en notacion decimal. Sea el siguiente procedimiento.
Dado como dato de entrada un elemento , realizar lo siguiente:
Etapa 1: Hacer las siguientes asignaciones e ir a Etapa 2.
Etapa 2: Si no es , ir a Etapa 3. En caso contrario terminar y dar como salida .
Etapa 3: Correr con dato de entrada igual al contenido de , obteniendo como salida. Hacer la asignacion e ir a Etapa 2.
Dejamos como ejercicio convenserse que el uso de asignaciones puede realizarse usando solo lapiz y papel. Imagine como lo haria en este ejemplo y corrobore que dicho procedimiento es efectivo y ademas computa a
(E) Si es el orden total sobre dado por , entonces veremos que la funcion es -efectivamente computable. Primero es importante notar que cualquiera sea , se cumple Usaremos estas ecuaciones para dar un procedimiento efectivo (con conjunto de datos de entrada igual a ) que compute a .
Etapa 1: Dado el dato de entrada , hacer las siguientes asignaciones e ir a Etapa 2.
Etapa 2: Si comiensa con , entonces hacer las siguientes asignaciones e ir a la Etapa 2. En caso contrario ir a la Etapa 3.
Etapa 3: Si comiensa con , entonces hacer las siguientes asignaciones e ir a la Etapa 2. En caso contrario ir a la Etapa 4.
Etapa 4: Dar como salida
E Usando que es -efectivamente computable podemos ver que tambien lo es ya que es definida con las ecuaciones
Dejamos como ejercico para el lector diseñar procedimientos efectivos que computen las funciones:
- divide a
-
-
(Utilice en el diseño de los respectivos procedimientos a los procedimientos que computan las funciones , y )
Nota Importante: en lo que sigue muchas veces daremos procedimientos que son efectivos en terminos de otros que ya se han dado, es decir daremos un procedimiento que en principio no es claro que sea efectivo pero el cual se volveria efectivo si reemplazaramos ciertas instrucciones por la manera efectiva de simularlas. Para hacer mas dinamico el discurso no distinguiremos entre este tipo de procedimientos (efectivisables) y los efectivos propiamente dichos.
Hay muchos procesos constructivos que nos sirven para definir o construir una funcion en terminos de otras funciones dadas. Un ejemplo de esto es la composicion de funciones, la cual dadas dos funciones nos permite construir su composicion, a saber . Otro ejemplo es el contructor de predicados que dados dos predicados -mixtos y , con el mismo dominio, nos define el predicado Otro constructor muy importante que utilizaremos mucho es aquel que a partir de funciones , , tales que para , nos da la nueva funcion , la cual cumple
3.1. Si y son predicados -efectivamente computables, entonces , y lo son tambien.
Dadas funciones -mixtas , con , diremos que la funcion es obtenida por composicion a partir de las funciones . Para probar que la composicion preserva la computabilidad efectiva necesitaremos el siguiente lema.
3.2. Supongamos que son funciones -mixtas, con . Supongamos ademas que . Entonces hay y tales que
-
- es de tipo
- es de tipo , para cada
- es de tipo , para cada
Mas aun, en tal caso la funcion es de tipo y:
Proof. Notese que y (por que?). Ya que tenemos que hay unicos y tales que es de tipo . Ya que y , tenemos que
-
- , para cada
- , para cada
Ya que tenemos que , por lo cual los conjuntos deberan ser todos de un mismo tipo, digamos de tipo . Es decir que es de tipo , para cada y es de tipo , para cada .
Las ultimas observaciones del lema son directas de las definiciones de y de composicion de funciones
Ahora si podemos probar facilmente que se preserva la computabilidad efectiva cuando componemos
3.3. Si , con , son -efectivamente computables, entonces lo es.
Proof. Si , entonces claramente es -efectivamente computable. Supongamos entonces que . Por el lema anterior hay y tales que
-
- es de tipo
- es de tipo , para cada
- es de tipo , para cada
Sean procedimientos efectivos los cuales computen las funciones , respectivamente. Usando estos procedimientos es facil definir un procedimiento efectivo el cual compute a .
Recordemos que si , , son funciones tales que para , entonces es la funcion
3.4. Sean y . Supongamos , , son funciones -efectivamente computables tales que para . Entonces es -efectivamente computable.
Proof. Haremos el caso y . Sean y procedimientos efectivos que computen a y , respectivamente. Sea el procedimiento efectivo siguiente:
- Conjunto de datos de entrada de igual a
- Conjunto de datos de salida de contenido en
- Funcionamiento:
Etapa 1
Hacer
Etapa 2
Correr el procedimiento una cantidad de pasos. En caso de que termine guardar la salida en la variable e ir a Etapa 5. Si no termina ir a Etapa 3.
Etapa 3
Correr el procedimiento una cantidad de pasos. En caso de que termine guardar la salida en la variable e ir a Etapa 6. Si no termina ir a Etapa 4.
Etapa 4
Hacer e ir a Etapa 2
Etapa 5
Dar como salida el contenido de y terminar.
Dejamos al lector corroborar que el procedimiento computa a la funcion .