CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y...

112
FATR, RMB 1 29/09/2004 CAPITULO I: INTRODUCCION HISTORICA AL CONCEPTO DE ALGORITMO En las secciones 1 a 4 hacemos un breve recorrido histórico en el cual se pone de manifiesto como partiendo de una idea informal de algoritmo, se llegan a definir unos modelos formales de lo que es un cálculo o cómputo bien definido, con cuyo empleo de puede razonar matemáticamente sobre qué es calculable y qué no lo es. Usando estos modelos, en la sección 5 hacemos una justificación no constructiva de la existencia de problemas incalculables, para acabar comentando en las secciones 6 y 7 dos problemas concretos. I.1 Aparición y desarrollo de la idea de algoritmo Se puede decir que, al menos desde los babilonios, los científicos han estado siempre interesados en los cálculos. Han buscado caminos para hacer los cálculos más fáciles y han intentado reducir la resolución de problemas a una cuestión de realizar cálculos. Muchas discusiones ha habido sobre el origen de la palabra algoritmo. Actualmente parece que hay acuerdo en asociarla al autor de cierto libro de aritmética. El nombre del autor y del libro son los siguientes: Autor: Abu Yafar Mohammed ibn Musa al-Jowarizmi (825) (padre de Jafar, Mohammed, hijo de Moisés, natural de Jowarizm, que es una pequeña ciudad rusa de Jiva). Libro: Kitab al jabr walal-muqabala (Reglas de restauración y reducción) La ciudad citada pertenecía en esa época a Persia.

Transcript of CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y...

Page 1: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 1 29/09/2004

CAPITULO I: INTRODUCCION HISTORICA AL CONCEPTO DE ALGORITMO

En las secciones 1 a 4 hacemos un breve recorrido histórico en el cual se pone de

manifiesto como partiendo de una idea informal de algoritmo, se llegan a definir unos

modelos formales de lo que es un cálculo o cómputo bien definido, con cuyo empleo de

puede razonar matemáticamente sobre qué es calculable y qué no lo es.

Usando estos modelos, en la sección 5 hacemos una justificación no constructiva

de la existencia de problemas incalculables, para acabar comentando en las secciones 6

y 7 dos problemas concretos.

I.1 Aparición y desarrollo de la idea de algoritmo

Se puede decir que, al menos desde los babilonios, los científicos han estado

siempre interesados en los cálculos. Han buscado caminos para hacer los cálculos más

fáciles y han intentado reducir la resolución de problemas a una cuestión de realizar

cálculos.

Muchas discusiones ha habido sobre el origen de la palabra algoritmo.

Actualmente parece que hay acuerdo en asociarla al autor de cierto libro de aritmética.

El nombre del autor y del libro son los siguientes:

Autor: Abu Yafar Mohammed ibn Musa al-Jowarizmi (825)

(padre de Jafar, Mohammed, hijo de Moisés, natural de Jowarizm, que es una pequeña

ciudad rusa de Jiva).

Libro: Kitab al jabr walal-muqabala

(Reglas de restauración y reducción)

La ciudad citada pertenecía en esa época a Persia.

Page 2: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 2 29/09/2004

Los resaltes en negrita son para indicar el origen de la palabra algoritmo y otra,

sacada del título del libro, y de amplio uso actual: álgebra.

La forma original de la palabra algoritmo era algorismo, que se vio corrompida

por la influencia de la palabra aritmética.

El significado de álgebra como restauración y reducción “de miembros” era de

uso común todavía en el siglo XVI en España; así en el Quijote se usa el término

algebrista en el sentido de traumatólogo (reductor de miembros).

Sabemos que la matemática persa influyó en los árabes y a través de ellos llegó a

España y desde aquí al resto de Europa.

En concreto, los árabes inspiraron a Raimundo Lulio, que hacia 1300 desarrolla

su “Ars Magna”, como un procedimiento general de base combinatoria para hallar todas

las “verdades”. Considerados desde un punto de vista sensato, los procedimientos

aducidos por Lulio no tiene mucho valor. Lo importante sin embargo, es que concibió

una idea ciertamente espléndida.

El trabajo de Lulio tuvo una gran influencia en la matemática posterior, y así,

200 años después Cardano(1545) titula su libro sobre algoritmos algebraicos remedando

el título de la obra de Lulio:

Artis magnae seu de regulis algebraicis liber unus

El mismo objetivo de reducir a cálculos la determinación de todas las verdades

lógicas fue perseguido por Leibniz (1646-1716). Determinó que había dos conceptos

que se deberían considerar por separado: El ars inveniendi o procedimiento de

generación y el ars iudicandi o procedimiento de decisión. (nótese que, al menos

informalmente, estos dos conceptos se pueden asociar con la pareja recursivamente

enumerable y recursivamente decidible que se estudiaran en el capitulo VII).

Page 3: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 3 29/09/2004

Leibniz vio con claridad la posibilidad de confiar a una máquina la ejecución de

un procedimiento general, siendo el primero en construir una máquina de cálculo con

las cuatro operaciones básicas.

Sin embargo su sueño era tener un calculus ratiocinator para “decidir” las

verdades lógicas.

Pensaba que se podría llegar a un procedimiento tal que si una persona opina que

A es verdad y otra que no-A es verdad, para ponerse de acuerdo solo necesitarían papel

y lápiz y realizar ciertos cálculos que darían la razón a uno de los dos.

I.2 La Lógica formal

La Lógica es la ciencia mas general de todas, puesto que da las reglas que

determinan la validez del razonamiento. Por tanto, si deseamos crear algoritmos que

sean aplicables con el mayor grado de universalidad posible, parece aconsejable recurrir

a la formación de procedimientos generales en el dominio de la lógica.

La silogística de Aristóteles fue un primer intento en esta dirección.

Pero fue en el siglo XIX fue cuando se produjo el desarrollo de la lógica

moderna.

Los métodos de cálculo de George Boole (1815-1869) se constituyeron, en gran

medida, de acuerdo con los métodos usuales del álgebra, de manera que a fines del siglo

XIX solía hablarse de un álgebra de la lógica.

Estos desarrollos tuvieron su continuación en los trabajos de G. Peano (1858-

1932) y G. Frege (1848-1932) y alcanzaron su primera conclusión en la monumental

obra de A.N. Whitehead y B. Russell, los Principia Matematica (3 vol. 1910-1913), en

la cual se establece que gran parte de la matemática puede ser deducida con la ayuda de

un cálculo lógico.

Page 4: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 4 29/09/2004

La tesis logicista es que la Matemática es una rama de la Lógica. Las nociones

matemáticas han de ser definidas en términos de las nociones lógicas. Los teoremas de

la matemática han de ser demostrados como teoremas de lógica.

Observamos como todos estos desarrollos perseguían reducir los procesos de

demostración a meros cálculos o procedimientos mecánicos que no dependan del

ejecutor.

I.3 Hilbert y el problema de la decisión

La escuela formalista o axiomática de D. Hilbert surge a principios del siglo XX

y se propone “Formular la matemática clásica como una teoría axiomática formal, y

deberá demostrarse que esta teoría es consistente, esto es, libre de contradicción”

(Hilbert).

Este programa fue acometido por Hilbert y su equipo desde 1920.

El problema mas grave era la demostración de la no contradicción. El método

habitualmente utilizado era el de proporcionar un modelo, con lo cual sólo se alcanzaba

una demostración de consistencia relativa: si el modelo era consistente, la teoría

también lo era. Este método no ofrecía soluciones para casos como la teoría clásica de

números o la teoría de conjuntos.

En este ámbito se sitúa el problema de la decisión como uno de los mas

ambiciosos de la metamatemática.

En la Matemática, hay cuestiones generales tales que cualquier instancia

particular se puede responder mediante un método efectivo, que aplicado a ese caso nos

dará una respuesta SI o NO.

Así por ejemplo, hay métodos para saber, dados dos polinomios con coeficientes

enteros, si uno es factor del otro. Basta realizar la división y observar si el resto es cero.

Page 5: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 5 29/09/2004

Esto se puede hacer de manera mecánica y en un número finito de pasos.

Un método de este tipo se denomina un procedimiento de decisión.

El problema de la decisión es determinar si existen tales métodos para saber si

una fórmula es verdadera o no en un lenguaje formalizado.

Este problema se asocia habitualmente con Hilbert por los grandes esfuerzos que

dedicó a su resolución, pero aparece anteriormente en Schröder y en Löwenheim.

Hay que tener en cuenta que “método” o “procedimiento” es aún un concepto

informal; de manera que mas o menos, en esa época había cierto consenso en lo que se

podía considerar como método, en el sentido de usar un espacio finito, usar un tiempo

finito y no dependencia de quién aplica el método.

Siguiendo con su programa de trabajo, Hilbert junto con Ackermann, en 1928,

delimitaron de un modo claro la lógica de primer orden y presentaron un cálculo

deductivo para ella.

Hilbert y Ackermann se plantearon la cuestión de si ese cálculo deductivo era

semánticamente suficiente, esto es, si permitía deducir todas las fórmulas válidas.

En su libro “Elementos de Lógica Teórica” manifiestan explícitamente que aún

no habían encontrado respuesta a esa pregunta.

Dos años después, K. Gödel le da respuesta afirmativa en su artículo sobre "la

suficiencia de los axiomas del cálculo lógico de primer orden", donde demuestra que

mediante los axiomas y las reglas de inferencia de la lógica, en el ámbito de la lógica de

primer orden, toda fórmula válida es deducible.

Con esto el programa de Hilbert obtenía un primer y esperanzador éxito.

Page 6: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 6 29/09/2004

Sin embargo Gödel continuó sus trabajos y al año siguiente publicó su trabajo

"Sobre las sentencias formalmente indecidibles de los Principia Matematica y sistemas

afines" en el cual demostraba la imposibilidad de llevar a cabo el programa de Hilbert

(recuérdese que el objetivo era desarrollar sistemas formales y demostrar su

consistencia).

Gödel demostró que todos los sistemas formales de la Matemática clásica

(incluidos el de los “Principia Mathematica”, la aritmética de Peano, la teoría

axiomática de conjuntos, y en general, cualquier sistema formal que cumpliese ciertas

condiciones de aceptabilidad) son incompletos, es decir se puede construir de manera

efectiva (por métodos finitistas) una sentencia indecidible (tal que ni ella ni su negación

es deducible).

Además esta incompletitud no tiene remedio: por muchos axiomas que

añadamos, el sistema sigue siendo incompleto.

También demostró que es imposible probar la consistencia de un sistema formal

dentro del propio sistema (se puede probar desde una teoría mas potente que el propio

sistema formal, pero eso es de dudosa utilidad)

En este trabajo, Gödel define y utiliza las funciones recursivas primitivas (que el

llama recursivas) de las que afirma que: “... tienen la importante propiedad de que para

cada conjunto dado de argumentos el valor de la función puede computarse mediante un

procedimiento finito.” (notese la referencia a procedimiento; ya nos vamos acercando al

concepto de algoritmo).

Observamos que para poder demostrar la indecidibilidad del cálculo de

predicados era necesario conocer formalmente el significado de la palabra "decidible".

Pues bien, alrededor de los años 30 estas cuestiones estaban suficientemente

maduras como para que en 1936 aparecieran una serie de artículos que convergían en el

concepto de algoritmo.

Page 7: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 7 29/09/2004

I.4 La confluencia de ideas de 1936

En ese año aparecen cuatro modelos que formalizan la idea de algoritmo. Los

modelos y sus autores son los siguientes:

máquina de Turing A. M. Turing

función recursiva S.C. Kleene

λ-cálculo A. Church

máquina de Post E.L. Post

En primer lugar, y por la influencia que ha tenido posteriormente, desde el punto

de vista teórico (desarrollo de la teoría de la calculabilidad y de la teoría de la

complejidad) y desde el punto de vista práctico (estructura básica de los ordenadores

actuales), citamos el trabajo de Turing en el cual define un modelo de máquina que

lleva su nombre.

En segundo lugar, siguiendo los desarrollos de Gödel al definir las funciones

recursivas primitivas tenemos el concepto de función recursiva debido a Kleene. Gödel

consideraba que su concepto de función recursiva primitiva se correspondía con la idea

de calculable de manera efectiva, sin embargo Peter, mediante un procedimiento

diagonal, y Ackermann, de manera constructiva, definen funciones intuitivamente

calculables que no son recursivas primitivas. Kleene introdujo el operador de

minimización y completó el concepto de función µ-recursiva.

En tercer lugar citamos el lambda-calculo de Church y la clase de funciones

lambda definibles.

Por último, Post define el modelo que lleva su nombre. Muy parecido al modelo

de Turing, lo publicó en un artículo con pocos meses de diferencia y de manera

totalmente independiente.

Page 8: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 8 29/09/2004

Todos estos conceptos intentan capturar la idea la idea intuitiva de algoritmo.

Así, por ejemplo, Turing explica en su artículo que desea simular el comportamiento de

un calculador humano, que a partir de unos datos y unas reglas de operación escribe

resultados intemedios, borra, consulta estos resultados hasta alcanzar un resultado final

y durante este proceso va evolucionando a través de diversos estados que reflejan como

evoluciona el proceso desde el punto de partida hasta un punto final.

De hecho, Turing afirma en su trabajo que: Toda función que sea calculable

efectivamente por un humano siguiendo una rutina fija es calculable efectivamente por

una máquina de Turing y viceversa.

En un sentido análogo se expresa Church en relación con el modelo definido por

Kleene, al afirmar que: “La noción de calculabilidad efectiva de funciones de enteros

positivos se identifica con la noción función recursiva de enteros positivos”.

Estas tesis en las que se ponen en relación los conceptos formales y el concepto

informal de algoritmo, se vieron refrendadas al demostrarse la equivalencia entre todos

los conceptos anteriores, es decir, si una función es calculable por una máquina de

Turing, entonces es recursiva, y una recursiva es lambda definible y una lambda

definible es calculable por una máquina de Post, y una de este tipo es calculable por una

máquina de Turing.

A partir de estos desarrollos Church expresó la tesis que lleva su nombre, la cual afirma

que la máquina de Turing y cualquiera de sus modelos equivalentes formalizan el

concepto intuitivo de algoritmo.

Las evidencias a favor de esta tesis son de diversos tipos:

(A) Equivalencia entre los distintos modelos. (que ya hemos citado)

(B) El concepto de máquina de Turing está diseñado explícitamente para reproducir las

operaciones que un calculador humano puede realizar.

(C) Evidencia heurística

(C1) Toda función particular efectivamente calculable y toda operación para

definir de manera efectiva una función a partir de otras, han resultado calculables por

máquinas de Turing

Page 9: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 9 29/09/2004

(C2) La exploración de varios métodos de los que se podría esperar que

condujesen a una función externa a la clase de las Turing-calculables han mostrado o

bien el método no conduce al exterior de la clase o que la nueva función obtenida no

puede ser considerada como efectivamente calculable.

Una vez que tenemos definido formalmente el concepto de algoritmo, podemos

hablar de que es calculable y que no lo es y plantearnos la pregunta sobre la existencia

de problemas o funciones no calculables.

I.5 Existencia de funciones no calculables

Una primera aproximación a esta cuestión de manera existencial es la siguiente:

Las máquinas de Turing se pueden numerar, es decir ponerse en biyección con

los números naturales, así pues, solo hay una cantidad infinita numerable de funciones

calculables.

Sin embargo, hay una cantidad infinita no numerable de funciones de enteros

positivos, por lo cual existen funciones no calculables; aún más, hablando

informalmente podemos decir que hay muchas mas no calculables que calculables.

Nuestro objetivo ahora es exhibir algunos ejemplos de tales funciones o

problemas no calculables.

Presentamos seguidamente dos problemas típicos y de indudable utilidad

práctica, cuya insolubilidad se demostrará formalmente en el capítulo VII.

I.6 El problema de la parada

El primer problema que presentamos es el problema de la parada, que

representaremos con la letra H mayúscula.

Este problema ya aparece como incalculable o insoluble en el trabajo de Turing

en el que define su máquina.

La cuestión expresada en términos de programación es la siguiente:

Page 10: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 10 29/09/2004

¿Es posible escribir un programa de ordenador que tenga como entrada alguna

representación de un programa P y los datos de entrada a ese programa d y produzca

como salida 1 si P sobre d acaba , o como salida 0 si P sobre d no acaba?

Si esto fuera posible sería de gran utilidad pues para comprobar un programa P,

antes de ponerlo a funcionar , le pasamos el chequeo para saber si acaba, pues en caso

contrario deberemos corregirlo pues no funciona correctamente.

Desgraciadamente no es posible escribir tal superprograma.

Expresado en términos de programación:

No es posible escribir un programa de ordenador que tenga como entrada alguna

representación de un programa cualquiera P y unos datos d para ese programa y que

produzca como salida 1 si P al ejecutarse sobre d acaba en un tiempo finito, y como

salida 0 si P al ejecutarse sobre d no acaba.

I.7 El problema de la equivalencia

El segundo problema que planteamos también tiene su vertiente práctica, que la

vamos a mostrar mediante dos ejemplos: uno académico y otro profesional.

El ejemplo académico surge de la corrección de un examen de programación de

ordenadores que consiste en el desarrollo de un programa (el mismo para todos los

alumnos).

Supongamos que el profesor ha desarrollado un programa y ha verificado

formalmente que resuelve el problema planteado.

Entonces le sería de gran utilidad disponer de un programa que verificara la

equivalencia del suyo con el que presenta cada alumno, respecto a las relaciones datos

de entrada, resultados de salida.

Esto mismo en el ámbito profesional sería útil en la siguiente situación:

Supongamos que el Colegio Profesional de Informáticos desarrolla y verifica

formalmente un programa de contabilidad, en el cual lo esencial son las entradas y las

salidas, sin unas bonitas pantallas de presentación.

Page 11: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 11 29/09/2004

Cualquier empresa que desarrolle un programa de contabilidad de uso comercial

(con un aspecto amigable), va al citado Colegio que se encarga de hacer la

correspondiente comparación y si son equivalentes le proporciona un certificado de

validez, que garantizaría a los futuros compradores la corrección del programa.

El problema planteado en estos dos ejemplos es el problema de la equivalencia

(que representamos con la letra E mayúscula). La cuestión es la siguientes:

¿Es posible construir un programa de ordenador que tenga como entrada alguna

representación de dos programas P y Q y produzca como salida 1 si los dos programas

calculan la misma función y 0 en caso contrario?

De nuevo la respuesta a esta pregunta es negativa.

No es posible escribir un programa de ordenador que tenga como entrada alguna

representación de dos programas P y Q y produzca como salida 1 si los dos programas

calculan la misma función, y como salida 0 si calculan funciones distintas.

Planteamos ahora una cuestión en relación con estos dos problemas. Ya sabemos

que ambos son insolubles, pero ¿son los dos igualmente difíciles o uno es más difícil

que el otro?

Este pregunta la responderemos en el capítulo VII.

Page 12: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 12 29/09/2004

CAPITULO II: MODELOS DE CALCULO

Realizamos un recorrido desde la máquina de Turing hasta esbozar el modelo

que utilizaremos como nuestro modelo fundamental.

La trayectoria será lineal, omitiendo muchos modelos. Ponemos de manifiesto el

desarrollo paralelo entre la evolución de los ordenadores desde el punto de vista teórico

y desde el punto de vista práctico.

La sección 1 trata de la máquina de Turing, que dio origen al modelo de von Newman.

La sección 2 trata del modelo de registros que se sitúa próximo a los lenguajes

ensambladores. La sección 3 está dedicada a los modelos basados en lenguajes no

estructurados. Por último, la sección 4 describe brevemente y de manera informal un

modelo basada en lenguajes estructurados.

II.1 Máquinas de Turing (1936)

Alan Turing (1912-1954) fue un matemático que formuló la máquina de Turing (MT)

para aportar un sustituto exacto del concepto de algoritmo. El término máquina es

apropiado en tanto que implica dos rasgos importantes a la hora de ejecutar un

algoritmo: objetividad y funcionamiento automático. Si un algoritmo ha de estar

exento de ambigüedad una máquina debe ser capaz de realizarlo ya que no aporta

ningún componente creativo.

La MT presenta las propiedades fundamentales de los actuales lenguajes de

programación: condicionales, saltos (control del flujo de ejecución) y manejo de un

medio de almacenamiento.

Una MT tiene un conjunto finito de estados para definir el funcionamiento de su

mecanismo de control. Uno es el estado inicial (cM), que representa el estado en el que

inicia la computación. Otro es el estado de parada, que cuando se alcanza cesa la

computación (la MT debe parar). Estos dos estados no pueden coincidir puesto que en

tal caso la máquina no realizaría ningún proceso.

Page 13: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 13 29/09/2004

Una diferencia importante de la MT con el resto de autómatas es que puede leer y

escribir símbolos en un medio de almacenamiento denominado cinta de cálculo. Esta

cinta es infinita por ambos lados (aunque puede definirse también como infinita sólo

por la derecha) y está dividida en una secuencia lineal de cuadrados, en cada uno de los

cuales se almacena un símbolo del alfabeto sobre el que se define la MT o bien la

palabra vacía. Dicha lista de símbolos es lo que se denomina expresión de cinta. Si

numeramos cada uno de los cuadrados de la cinta en una secuencia de -∞ a +∞,

entonces podemos definir la expresión de cinta como una función B(x) que para un

número entero x (que identifica a un cuadrado de la cinta) devuelve el carácter

contenido en ese cuadrado. La MT podrá leer y escribir en un sólo cuadrado de la cinta

en cada momento. Existen definiciones de la MT en que se puede leer de un cuadrado

(cuadrado observado) y escribir en otro (cuadrado escrutado), pero esta no es una

característica muy deseable, por lo que la MT sólo operará sobre un cuadrado que

llamaremos escrutado (CE).

Aunque todo proceso es continuo (como en el ejemplo de la fabricación de tornillos),

para su descripción podemos dividirlo en unidades más pequeñas que identifiquen

subprocesos independientes.

k i

Para describir el tipo de computación que realiza una MT dividiremos el cómputo en 3

niveles de abstracción:

• Paso de computación: es el nivel más elemental de procesamiento. Existen 4

instrucciones básicas:

− ak: escribir en el CE el símbolo ak

− l: situar la MT sobre el cuadrado a la izquierda del CE actual

Page 14: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 14 29/09/2004

− r: situar la MT sobre el cuadrado a la derecha del CE actual

− h: parar la computación

• Instrucción parcial de cálculo (o k-ésimo estado): consiste en una tabla de la

forma:

k a0 b0 k0

k a1 b1 k1

...

k aN bN kN

donde las dos primeras columnas representan las condiciones que se deben dar

para que se realice la operación, siendo k el número del estado en que se debe

encontrar la máquina y ai el símbolo que debe haber en el CE. bi es el paso de

computación a realizar y ki el próximo estado de la MT. Así, podremos tener

un número ilimitado de estados, N+1 posibles símbolos y N+4 posibles pasos

de cálculo. Cada línea puede interpretarse como una instrucción condicional (if

... then ...).

• Instrucción de cálculo: es el proceso que realiza la MT y está descrito por la

tabla de Turing o tabla de máquina que resulta de colocar las instrucciones

parciales de cálculo unas debajo de otras. Esta tabla tiene 4 columnas y

M(N+1) filas, siendo M el número de estados.

El funcionamiento de la MT viene dado por la transición entre configuraciones. La

configuración k-ésima es una tripla del modo K=(A,B,C), donde:

• A es el CE actual, • B es la expresión de cinta actual, y • C es el estado actual.

Se denomina línea de la configuración k a aquella línea de la MT de la forma:

C B(A) b c’

y dirá configuración terminal si b=h. Si b≠h la configuración es no terminal y en tal

caso tiene una configuración consecutiva que viene dada por la función

F(K)=(A’, B’, C’)

con:

A'A 1 si b = lA si b r y b lA 1 si b = r

=−

≠ ≠+

��

��

Page 15: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 15 29/09/2004

B'(x)B(x) si x AB(x) si x = A y (b r o b l)b si x = A y b r y b l

=≠

= =≠ ≠

��

��

C’=c’

Llamaremos configuración 0-ésima (K0) a la inicial, en la que C=cM.

Algunas definiciones sobre MT’s:

- Dada una MT M, un número A y una función B, colocar la máquina M en la

expresión de cinta B sobre el cuadrado A se expresa como

K0=(A, B, cM)

- Si K0 no es terminal, entonces existe una configuración consecutiva K1=F(K0) y se

dice que M cambia en el primer paso de K0 a K1. Si K1 tampoco es terminal

entonces existe K2=F(K1), y así sucesivamente. Pueden darse 2 casos: (1) que

ninguna de las configuraciones K0, K1, K2, ... sea terminal, con lo que M no se

detendrá jamás y Kn está definido para todo n; o (2) que exista un n tal que Kn sea

una configuración terminal, por lo que Kn+1 no está definido y se dice que M deja de

operar (para) tras el n-ésimo paso y si Kn=(An, Bn, Cn) se dice que M cesa de operar

en la expresión de cinta Bn y sobre el cuadrado An. Es muy importante que la

máquina se pare sobre un CE determinado, no sólo el resultado que deje en la cinta.

- Colocar M detrás de W significa que elegimos una expresión de cinta que contiene

en los cuadrados sucesivos las letras de W en el mismo orden y cuyos cuadrados

restantes contienen la palabra vacía y que tomamos como cuadrado inicial el primer

cuadrado vacío a la derecha de W.

- Equivalencia de MT’s:

M1 es equivalente a M2 si existe una aplicación biunívoca ϕϕϕϕ de los estados de M1

en los de M2 tal que:

(1) toda línea de la forma

c a b c’

de M1 se pueda traduce en una línea

ϕ(c) a b ϕ(c’)

de M2, y

(2) ϕ(cM1)= cM2.

Si M1 da lugar a las configuraciones (An, Bn, Cn) y M2 es equivalente a M1 por la

aplicación ϕ, entonces si se coloca M2 sobre B en A da lugar a las configuraciones

Page 16: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 16 29/09/2004

(An, Bn, ϕ(Cn)); por lo que MT’s equivalentes originan la misma secuencia (An,

Bn) si se las coloca en la misma expresión de cinta y sobre el mismo cuadrado.

Una MT M1 sobre un alfabeto U1 es equivalente en sentido amplio a otra MT M2

sobre el alfabeto U2 si existen dos aplicaciones biunívocas ϕϕϕϕ y ψψψψ tal que:

(1) ψ es una aplicación de U1 en U2 y tenemos que: ψ(l)=l; ψ(r)=r y ψ(h)=h,

(2) ϕ es una aplicación de los estados de M1 en los de M2,

(3) toda línea de la forma

c a b c’

de M1 se pueda traduce en una línea

ϕ(c) ψ(a) ψ(b) ϕ(c’)

de M2, y

(4) ϕ(cM1)= cM2.

Consecuencias: la equivalencia de MT’s nos demuestra que los estados de la MT no

son más que etiquetas y que si alternamos los valores de dichos estados

manteniendo igual las transiciones entre estados, entonces la MT funciona del mismo

modo. La equivalencia en sentido amplio nos dice que la representación utilizada

para los argumentos y valores del cómputo es irrelevante y que podemos realizarla

exactamente igual con otros símbolos diferentes.

Denominaremos funciones computables a aquellas para las que existe un algoritmo

conclusivo que proporciona, para cualquier argumento dado, el valor de la función.

Para una función computable f, el dominio de argumentos de f consta de todas las

palabras W sobre un alfabeto finito U, y los valores de f son palabras sobre un alfabeto

finito B. Que una función es computable significa que existe un procedimiento general

que puede describirse en un número finito de enunciados y con cuya ayuda se puede

obtener el valor de la función f(W ) para todo W .

Ejemplos de funciones computables son: x+y, xy, xy, cuando x e y son palabras sobre el

alfabeto {0,1,2,3,4,5,6,7,8,9}.

El concepto de computabilidad tiene sentido cuando los argumentos y valores de una

función sean números naturales, enteros o racionales, pero no cuando sean reales. No se

puede representar todo número real por una palabra de un alfabeto finito dado, ya que

sólo hay un número numerable de tales palabras y existe un número no-numerable de

números reales.

Page 17: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 17 29/09/2004

A partir de esta idea intuitiva, podemos definir formalmente el concepto de función

Turing-computable:

Sea f una función unaria cuyos argumentos y valores son palabras sobre un alfabeto; f

es Turing-computable (TC) si existe una MT M sobre U, con U0⊂U tal que si

imprimimos una palabra arbitraria W (sobre U0) en la cinta, que excepto esa palabra

estará vacía, y si colocamos M sobre un cuadrado arbitrario de la cinta, entonces M se

detendrá en un número finito de pasos tras una palabra que represente el valor f(W ) de

la función.

Sea f(W 1, W 2, ..., W k) una función k-aria cuyos argumentos son palabras arbitrarias

sobre Uo. f es TC si existe una MT M sobre U con U0⊂U tal que si se imprimen en la

cinta, que en lo demás está vacía, los argumentos W 1, W 2, ..., W k dejando un cuadrado

vacío entre cada dos palabras (W 1aoW 2ao ... aoW k) y se coloca M sobre un cuadrado

arbitrario de la cinta, entonces M cesará de operar después de un número finito de pasos

detrás de la palabra f(W 1, W 2, ..., W k).

Una función f de cero argumentos es TC si existe una MT que si se coloca sobre una

cinta vacía cesará de operar detrás del valor de la función (que es un valor constante)

después de un número finito de pasos. Es trivial que toda función de cero argumentos

es TC, ya que siempre existe una MT que imprime la palabra W (que es un conjunto

finito de símbolos) sobre la cinta y para detrás.

La clase de funciones Turing-computables está formada por todas las funciones para las

que existe una MT que la calcula.

Solo existe una cantidad numerable de instrucciones de computación de longitud finita.

Luego la clase de las funciones TC es numerable. Existe un número no-numerable de

funciones definidas para todos los números naturales y cuyos valores son naturales. Por

lo que, es una excepción que una función sea computable.

II.2 El modelo de registros (1963).

J.C. Shepherdson y H.E. Sturgis plantean en su trabajo “Calculabilidad de las

funciones recursivas” la dificultad de realizar demostraciones haciendo uso de las

máquinas de Turing. Las demostraciones son complicadas y tediosas por dos razones:

Page 18: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 18 29/09/2004

(1) Una máquina de Turing tiene una sola cabeza. Esto obliga a descomponer los

cálculos en pasos muy pequeños que realizan operaciones sobre un solo símbolo.

(2) Una máquina de Turing tiene una sola cinta. Esto obliga a ir a alguna posición

inicial para encontrar el número con el que se desea trabajar y guardarlo separado de

otros valores.

El modelo URM(máquina de registros ilimitada) de Shepherdson y Sturgis, relaja estas

restricciones y presenta un ordenador idealizado que es lo suficientemente flexible

como para que podamos convertir un proceso de cálculo intuitivo en un programa para

esa máquina.

El modelo URM consta de una sucesión de registros numerados 1, 2, …, cada uno de

los cuales puede almacenar un número natural. Cada programa concreto usa solo un

número finito de registros, los restantes quedan vacíos (conteniendo 0). Para describir

las instrucciones básicas, usaremos <n> para referirnos al contenido del registro n antes

de ejecutarse la instrucción y <n’> para el contenido después de ejecutarse la

instrucción.

P(n): <n’> = <n> +1

D(n): <n’> = <n> -1 (<n> ≠ 0)

O(n): <n’> = 0

C(m, n): <n’> =<m>

J[i]: salto a línea i

J(m)[i]: salto a línea i si <m>= 0

Este juego de instrucciones no es mínimo, pero facilita la programación.

Esta lista consta de infinitas instrucciones al variar n y m.

Los registros no involucrados en una instrucción no modifican su contenido.

Un programa para este modelo es una sucesión finita de líneas, donde cada línea tiene

un número de 1 en adelante, seguido de una instrucción.

Page 19: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 19 29/09/2004

Un programa (digamos con i líneas) se ejecuta con unos datos de entrada (supongamos

k componentes) que se sitúan en los registros 1 hasta k, comenzando por la línea nº 1, si

la instrucción es de salto, se continua en la línea de nº especificado, en caso contrario se

continua en la línea nº 2 y así sucesivamente hasta alcanzar el número de línea i+1,

momento en el cual el programa acaba. El contenido del registro 1 es la salida del

programa.

El concepto de programa se puede generalizar considerando que las entradas están en

registros especificados r1, r2, …, rk y que la salida se obtiene en otro registro r.

Ejemplo: Veamos un programa para la URM, con registros de entrada y salida n.

1. J(n)[4]

2. D(n)

3. J[1]

1. si n no esta vacío ir a la línea 2, si no ir a la línea 4

2. restar 1 al número que hay en el registro n

3. saltar a la línea 1

Este programa tiene el mismo efecto que O(n).

Una variante de este modelo que incluye muchas de las características de los

ensambladores es la definida por Aho, Hopcroft, Ullman (74). Su modelo se llama

RAM (random access machine). Obsérvese en la tabla que sigue la sintaxis de las

instrucciones a base de mnemotécnicos tipo ensamblador; con operaciones mas potentes

como multiplicar o dividir

Código de operación Dirección

LOAD operando

STORE operando

ADD operando

SUB operando

Page 20: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 20 29/09/2004

MULT operando

DIV operando

READ operando

WRITE operando

JUMP etiqueta

JGTZ etiqueta

JZERO etiqueta

HALT

Además, solo como comentario diremos que este modelo incluye direccionamiento

indirecto e indexado.

En estos modelos de registros se define el concepto de computabilidad de manera

parecida a como se ha hecho para las máquinas de Turing.

II.3 Modelos basados en lenguajes no estructurados. Hacer uso de registros, hace referencia a posiciones de memoria fijas. El

desarrollo de los lenguajes de programación de alto nivel, con su capacidad de código

reubicable, hace aparecer el concepto de variable. En correspondencia con este

desarrollo práctico nace el correspondiente modelo teórico. Tomaremos como ejemplo

el que definen Davis, Weyuker (1983).

Variables de entrada: Xi

Variables locales: Zi

Variable de salida: Y

Etiquetas: [A|B|C|D|E]

Instrucciones:

V ← V + 1

V ← V - 1

IF V ≠ 0 GOTO L

Solo se etiquetan las líneas a las que se transfiere el control por causa de una instrucción

de salto. La semántica de este lenguaje a nivel intuitivo es la siguiente:

- Las variables de uso interno (Zi) y la de salida (Y) se inicializan implícitamente a 0.

- La ejecución es secuencial, desde la primera línea en adelante.

Page 21: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 21 29/09/2004

- En la instrucción de salto condicional, si la variable de control es no nula, la ejecución

continua en la línea de etiqueta especificada; caso contrario, continua en la siguiente

línea.

- La ejecución acaba cuando superamos la última línea del código.

Ejemplo: Sea la función de N en N que si la entrada es 0 la salida es 1, y si la entrada es

no nula entonces la salida coincide con la entrada. Veamos un programa para esta

función:

[A] X1←X1-1

Y←Y+1

IF X1≠0 GOTO A

II.4 Modelos basados en lenguajes estructurados.

Hacia 1960 aparece el lenguaje de programación ALGOL, y posteriormente

aparece el PASCAL. En 1966 Böhm y Jacopini publican un trabajo en el cual se pone

de manifiesto que con solo secuencia y bucles se puede realizar cualquier proceso

algorítmico. En esta línea, A.R. Meyer dirige la Tesis Doctoral a D.M. Ritchie y

publican sus primeros resultados en 1967.

Pasamos a describir brevemente un lenguaje derivado de ese trabajo.

Es un lenguaje imperativo en el que se usa una notación tipo Pascal o Módula-2.

Maneja como tipo de datos sólo naturales. Los identificadores de variables son

la letra X seguida de un número mayor que cero.

Las instrucciones básicas son de asignación y se corresponden con la idea de

proyección, sucesor, predecesor e inicialización (asignación cero).

Para formar una secuencia con estas instrucciones se usa el separador punto y

coma.

La única estructura de control es un bucle indefinido con control al principio

tipo while, siendo la condición que una variable sea no nula.

Un código es una secuencia entre un principio (begin) y un fin (end).

Un programa es una terna (n, p, P), donde se especifica el número de variables

de entrada (n, con identificadores X1, X2, …, Xn), el número de variables que usa (p) y

el código.

Page 22: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 22 29/09/2004

La semántica de este lenguaje es similar a la que se asocia a lenguajes como los

ya citados PASCAL o MODULA-2. No obstante tiene una características especiales

que pasamos a comentar:

No hay instrucciones de entrada ni de salida.

Las variables que no son de entrada (en el caso anterior Xn+1, …, Xp) se

inicializan implícitamente a cero.

Un programa en este lenguaje expresa una relación funcional entre entradas

(naturales) y una salida (natural); así pues, una única función de Nn en N se puede

asociar a cada programa Q en este lenguaje.

Quede claro que todo lo dicho en esta sección no es mas que un esbozo informal.

El siguiente capítulo está dedicado al desarrollo de este lenguaje con todo detalle.

Page 23: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 23 29/09/2004

CAPITULO III: LOS LENGUAJES WHILE Y LOOP En este capítulo desarrollamos nuestro representante formal del concepto de

algoritmo basado en un lenguaje estructurado.

Comenzaremos con la sintaxis. Tras una aproximación informal a la semántica,

definimos formalmente una semántica operacional. Mejoraremos la legibilidad de

programas con las macrosentencias. Posteriormente veremos que su única estructura de

control no limita al lenguaje, pues puede simular cualquiera de las habituales en los

lenguajes de uso común. Por último, al restringir los bucles indefinidos a bucles

definidos obtenemos un sublenguaje que tiene interés por derecho propio.

III.1 Sintaxis.

Identificadores: X1, X2, X3, ...

Instrucciones de asignación:

Xi:= Xj

Xi:= Xj + 1

Xi:= Xj - 1 ( 0 - 1=0)

Xi:= 0

Estructuras:

-Secuencia: ";" separa dos instrucciones

- Bucle indefinido:

while Xi ≠ 0 do ...sentencias... od Código: ...sentencias... Programa: (n, p, código)

Nota: En el cuerpo de un bucle debe haber al menos una sentencia; es decir, prohibimos explícitamente los bucles vacíos.

Page 24: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 24 29/09/2004

Ejemplo 3.1: El programa (1, 2, P) P: X2:= X1; while X2 ≠ 0 do X1:= X1+1; X2:= X2 - 1 od tiene una variable de entrada (X1), usa dos variables (X1, X2) de las cuales la segunda se inicializa implícitamente a 0, y su código es el expresado arriba. Ejemplo 3.2: El siguiente también es un programa en el lenguaje WHILE (1, 1, P), P: X1:=X1 + 1; while X1≠0 do X1:= X1 od

III.2 Semántica informal.

Este lenguaje maneja como tipo de datos solo números naturales.

No hay instrucciones de entrada ni de salida.

Para un programa (n, p, P):

- n variables de entrada: X1, …, Xn.

- 1 variable de salida: X1.

- p variables de uso: p ≥ n

(las que no son de entrada se inicializan implícitamente a cero).

Un programa en este lenguaje expresa una relación funcional entre entradas y una

salida.

Una única función de Nn en N se puede asociar a cada programa .

Ejemplo 3.3: Sea el programa del ejemplo 1, (1, 2, P) P: X2:= X1; while X2 ≠ 0 do X1:= X1+1; X2:= X2 - 1 od

Page 25: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 25 29/09/2004

Observamos que al asignar a la variable X2 el valor de X1, la suma de los

valores de las dos variables es el doble del valor inicial de X1; y esta relación se

conserva pues en cada ejecución del bucle, X1 aumenta en una unidad y X2 disminuye

en una unidad.

Por tanto, como al acabar la ejecución X2 vale cero, resulta que X1 vale el doble

de lo que valía inicialmente; en resumen este programa calcula la función f(x)=2x.

(Este razonamiento no ha sido una demostración, es una justificación informal)

Ejemplo 3.4: Sea el programa (1, 1, P), P: X1:=X1 + 1; while X1≠0 do X1:= X1 od

Independientemente del valor inicial de X1, tras la primera sentencia X1 vale al

menos 1, con lo cual la cabecera del bucle se cumple; como el cuerpo del bucle no

modifica el contenido de X1, el bucle se ejecuta indefinidamente; el programa nunca

acaba. Este programa calcula la función de N en N que está indefinida para cualquier

valor. Esta función la representamos por ( f(x)=⊥ ∀x , f(x) igual a indefinido para todo

x), o bien (f(x)↑ ∀x, f(x) diverge para todo x).

III.3 Semántica formal

En este apartado vamos a desarrollar en paralelo los conceptos teóricos y el

ejemplo anterior con detalle.

Definición 3.5: (Versión etiquetada de un programa)

Dado un programa WHILE (n, p, P) lo escribimos de manera que cada línea

contenga:

- una instrucción de asignación

- Una cabecera de while: while Xi≠0 do

- Una cola while: od

Numeramos las líneas de 1 en adelante.

Tras una cabecera de while ponemos el número que le ha correspondido a su cola.

Page 26: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 26 29/09/2004

Tras una cola de while ponemos el número que le ha correspondido a su cabecera.

A un programa así escrito lo llamaremos versión etiquetada del programa.

Ejercicio 3.6: Escribir al versión etiquetada del programa del ejemplo 3.3

Solución: 1: X2:= X1; 2: while X2 ≠ 0 do :5 3: X1:= X1+1; 4: X2:= X2 - 1 5: od :2

Definición 3.7 (concepto de configuración):

Sea Q=(n, p, P) un programa WHILE, con líneas numeradas de 1 a f. Una

configuración de Q es una (p+1)-tupla (s, x), s∈{1, 2, 3,…, f, f+1}, x∈Np.

Una configuración se llama inicial si s=1 y xn+1= …=xp=0.

Una configuración se llama final si s=f+1.

CQ denota al conjunto de las configuraciones del programa Q.

Ejercicio 3.8: Consideremos el programa del ejercicio anterior. Para cada una de los

siguientes vectores decir si es una configuración, si es inicial o final en base a la

definición anterior.

(1,3,5), (1, 5, 0), (6, 8, 3), (2, 2, 2), (0, 3, 5).

Solución:

Todas son configuraciones menos la última. La primera no es inicial, la segunda es

inicial y la tercera es final. (otra cuestión es si son o no alcanzables).

Definición 3.9: (concepto de cálculo en un paso)

Sea Q=(n, p, P) un programa WHILE, con líneas numeradas de 1 a f.

La configuración c1 = (s, x)∈CQ se transforma en la configuración c2 = (t, y)∈CQ en un

paso de cálculo y lo representamos por c1�Q c2 si y solo si:

(1) s: “asignación” aparece en la versión etiquetada de Q, entonces

t=s+1,

yr=xr para todo r tal que 1≤r≤p y r≠i

Page 27: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 27 29/09/2004

el valor de yi depende de la sentencia de asignación:

asignación valor de yi

Xi :=0 0

Xi := Xj xj

Xi := Xj+1 xj+1

Xi := Xj-1 xj-1

(2) En otro caso , la línea de número s contiene una cabecera o cola de while.

Entonces

y=x

el valor de t se determina como sigue:

(a) si la línea es s: while Xi≠0 do : s’

y si xi≠0 entonces t=s+1 sino t=s’+1

(b) si la línea es s: od : s’

y si xi≠0 entonces t=s’+1 sino t=s+1

Ejercicio 3.10: Decir si los que siguen son cálculos correctos en un paso, con relación a

nuestro programa del ejercicio 3.6:

(1, 2, 0) �Q (1, 2, 2), (1, 2, 0) �Q(2, 2, 2), (3, 4, 6) �Q(4, 5, 6), (2, 6, 0) �Q(6, 6, 0)

Ejercicio 3.11: Para cada una de las siguientes configuraciones para nuestro programa,

escribir cual sería la configuración siguiente: (1, 6, 0), (2, 3, 7), (5, 4, 2), (5, 8, 0)

Solución: (2, 6, 6), (3, 3, 7), (3, 4, 2), (6, 8, 0).

Es conveniente extender el concepto de cálculo en un paso a todos los vectores del

número de componentes adecuado, sean o no configuraciones. Esta extensión se hace en

forma de función. Esta función, para orígenes que no son configuraciones se define

como la identidad.

Definición 3.12: (concepto de función siguiente, SIG):

Page 28: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 28 29/09/2004

Sea Q=(n, p, P) un programa WHILE y CQ el conjunto de todas las

configuraciones de Q. La función siguiente SIGQ: Np+1→Np+1 está dada por:

SIGQ(c)= c' si c c'c si c C o no existe c' tal que c c'

Q

Q Q

∉ �

���

Ejercicio 3.13: Desarrollar la función siguiente para el programa del ejercicio 3.6.

Solución:

SIG(a, b, c) =

������

������

≠≠

−+

5>a sic)b,(a,0cy 5=a sic)b,1,+(a0cy 5=a sic)b,(3,

4=a si1)cb,1,+(a3=a sic)1,b1,+(a

0=cy 2=a sic)b,(6,0cy 2=a sic)b,1,+(a

1=a sib)b,1,+(a0=a sic)b,(a,

La relación �Q es una relación binaria entre configuraciones. Podemos definir su cierre

reflexivo y transitivo como cálculo en 0 o más pasos. Es decir, un cálculo en k pasos

inducido por un programa Q=(n, p, P) es una sucesión c0, c1, …, ck de configuraciones,

tal que c0 es una configuración inicial y SIGQ(ci)=ci+1, i=0,…, k-1.

Nos interesa determinar la configuración alcanzada tras k pasos a partir de unos

valores dados. Para ello definimos una función que realiza este proceso.

Definición 3.14: (concepto de función cálculo, CAL)

Sea Q=(n, p, P) un programa WHILE, con líneas numeradas de 1 a f. La función cálculo

del programa Q es la función CALQ: Np+1→Np+1 definida como sigue:

Sea a∈Np y (1,a) �Q c1�Q c2 �Q … �Q ci=(t, b) el cálculo de Q en i pasos, que

comienza con valores a de las variables que usa el programa, entonces:

CALQ(a, i) = (t, b).

En cero pasos (es decir, i=0), CALQ(a, 0) = (1, a).

Page 29: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 29 29/09/2004

Ejercicio 3.15: Para el programa anterior determinar CALQ((6,0), 4)

Solución:

(1, 6, 0) �Q(2, 6, 6) �Q(3, 6, 6) �Q(4, 7, 6) �Q(5, 7, 5)

Luego CALQ(6, 0, 4) = (5, 7, 5).

Veamos ahora el concepto de complejidad temporal entendido como el número de pasos

de un cálculo que acaba.

Sea un cálculo de un programa que comienza con una configuración inicial dada c0. En

un número finito de pasos, digamos s, alcanza una configuración final (cs, cuya primera

componente, el número de línea, es f+1). Entonces diremos que el programa ha

acabado. Sabemos que, a partir de que se alcanza una configuración final cs, las

siguientes configuraciones, por la función SIG, coinciden con cs. Así, el número de

pasos de un cálculo finalista que comienza con c0 esta definido por s=min{j |

SIGQ(cj)=cj} = min{j | π11p+ (cj)= f+1}, si tal s existe.

Esto se puede expresar con más precisión haciendo uso de la función CALQ.

Definición 3.16: Sea Q=(n, p, P) un programa WHILE, con líneas numeradas de 1 a f.

La función complejidad temporal del programa Q es la función TQ:Nn→N definida

como sigue:

TQ(x)=���

↑+=π

restosSi1f)s),0,x((CAL(se Q existe tal que tal menor l 1p+

1

Ejercicio 3.17: Determinar la función complejidad temporal del programa del ejercicio

3.6

Solución: Realizamos un cálculo a partir de una configuración inicial genérica.

(1, a, 0) �Q (2, a, a) �Q(3, a, a) �Q(4, a+1, a) �Q(5, a+1, a-1) �Q

�Q(3, a+1, a-1)�Q(4, a+2, a-1) �Q(5, a+2, a-2) �Q

�Q(3, 2a-1, 1) �Q(4, 2a, 1) �Q(5, 2a, 0) �Q

�Q(6, 2a, 0)

Luego, TQ(a) = 3a + 2

Page 30: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 30 29/09/2004

Veamos por último el concepto de función calculada por un programa, lo que completa

la semántica operacional del lenguaje WHILE.

Definición 3.17:(concepto de función calculada)

La función fQ: Nn→N calculada por el programa Q=(n, p, P) se define como sigue:

fQ(x) = π21p+ ( CALQ( (x, 0), TQ(x) ) ), x∈Nn, 0∈Np-n.

Expresado informalmente, dados unos valores para las variables de entrada, x, los

completo con ceros para las restantes variables que usa el programa. Realizo pasos de

cálculo hasta alcanzar una configuración final. De ella tomo la segunda componente (la

primera es el número de línea, y la segunda es el contenido de la variable X1).

Si no es posible alcanzar tal configuración final, entonces el programa, para esos

valores de entrada, no acaba y la función calculada, para esos argumentos, queda

indefinida.

Ejercicio 3.18: Para el programa anterior determinar la función calculada y comprobar

que es f(x) = 2x.

Solución:

fQ tiene como variables solo a∈N, necesito determinar la función complejidad temporal,

pero ahora, los valores iniciales son (a, 0), y la configuración inicial es (1, a, 0). Esta

sutileza no afecta al resultado, pues en el primer paso ya la configuración coincide con

la del ejercicio anterior.

(1, a, 0) �Q (2, a, a) �Q(3, a, a) �Q(4, a+1, a) �Q(5, a+1, a-1) �Q

�Q(3, a+1, a-1)�Q(4, a+2, a+1) �Q(5, a+2, a-2) �Q

�Q(3, 2a-1, 1) �Q(4, 2a, 1) �Q(5, 2a, 0) �Q

�Q(6, 2a, 0)

A partir de este desarrollo observamos que TQ(a) = 3a + 2. Entonces

fQ(a)= π 23( CALQ( (a, 0), 3a+2 ) )= π 2

3(6, 2a, 0) = 2a.

Definición 3.19:(la clase de funciones WHILE-calculables)

Page 31: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 31 29/09/2004

Fn(WHILE) es el conjunto de todas las funciones f: Nn→N tales que existe un programa

WHILE, con n variables de entrada, que calcula f.

F(WHILE) es la unión de todas las Fn(WHILE), para n≥0.

Si f∈F(WHILE) diremos que f es una función WHILE-calculable

Ejercicio 3.20: Para cada una de las siguientes funciones demostrar que es WHILE-

calculable, construyendo las funciones SIG, T y f: Suma, resta, Signo, complementario

del signo, producto, la función constante K(n, c):Nn→N, K(n,c)(x) = c ∀x.

La función que siempre diverge, la función identidad de N en N.

Nota: resta (x,y) = 0 si x<y

= x-y si x≥y

Solución: Para cada función damos un programa que la calcula. Se deja al lector el

desarrollo de las funciones SIG, T y f.

(2, 2, suma), suma: while X2≠0 do X1:= X1 + 1; X2:= X2 - 1 od

(2, 2, resta), resta: while X2≠0 do X1:= X1 - 1; X2:= X2 - 1 od

(1, 2, sg), sg: while X1≠0 do

X2:=X2 + 1;

X1:=0

od;

X1:=X2

(1, 2, -sg), -sg: X2:=X1+1;

while X1≠0 do

X2:=0;

X1:=0

od;

Page 32: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 32 29/09/2004

X1:=X2

(2, 4, producto), producto: while X2≠0 do

X4:=X1;

while X4≠0 do

X3:=X3 + 1;

X4:=X4 - 1

od;

X2:=X2 - 1

od;

X1:=X3

(n, n, cte-c), cte-c

: X1:=0;

X1:=X1 + 1;

…(c veces)

X1:=X1 + 1;

para cada c, existe un programa de longitud fija (c+1 líneas) que calcula la función

constante c.

(1, 1, div), div:X1:=X1 + 1;

while X1≠0 do

X1:=X1

od;

(1, 1, id), id: X1:=X1;

III.4 Macroprogramas

Ya hemos visto en el ejemplo del producto que los programas while se hacen

rápidamente largos (por el juego de instrucciones tan reducido) e ilegibles (por la poca

Page 33: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 33 29/09/2004

expresividad de las denominaciones de las variables). Para evitar estas molestias

ampliamos las características del lenguaje mostrando como, todo lo que expresemos en

el lenguaje ampliado se puede expresar en el lenguaje while.

Paso 1: Denominaciones libres para las variables de entrada y para la variable de salida.

Entonces hay que especificar cuáles son de entrada y cuáles de salida.

Ejemplo 3.21: El programa que calcula el doble se escribe como sigue:

Entradas: dato

Salida: doble (* = 2×dato *)

Método:

doble:= dato;

while dato≠0 do

doble:= doble + 1;

dato:=dato - 1

od;

Un programa con denominaciones libres para las variables se convierte en un programa

while como sigue:

- Remplazar la primera variable de entrada por X1, la segunda por X2, …, la n-ésima

por Xn.

- Reemplazar la variable de salida por Xn+1.

- Reemplazar las variables de uso interno, según su orden de aparición por Xn+2, …

- Añadir al final del código resultante la instrucción X1:= Xn+1.

Ejercicio 3.22: Realizar la conversión del programa del ejemplo anterior.

Solución: dato se transforma en X1, doble se transforma en X2, añadir al final X2:=X1.

El programa queda:

X2:= X1; while X1 ≠ 0 do X2:= X2+1; X1:= X1 - 1 od; X2:=X1;

Page 34: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 34 29/09/2004

Paso 2: Macrosentencias

Una vez que hemos demostrado que una función es while-calculable, permitiremos en el

lenguaje ampliado incluir instrucciones de asignación cuyo miembro de la derecha sea

una activación de esa función.

Ejemplo 3.23: Sea el siguiente programa que calcula la función f(x)=2x.

(1, 2, exp), exp: X2:=X2+1;

while X1≠0 do

X2:= doble(X2); (* llamada a la función f(x) = 2x *)

X1:=X1 - 1

od;

X1:=X2;

La línea X2:= doble(X2) es una macrosentencia relativa a una función que sabemos es

while-calculable.

Un programa con una macrosentencia se convierte en un programa while como sigue:

Sea la macrosentencia Xi:= f(Xj1, …, Xjn), donde f es calculada por el programa

(n, p, P).

Sea Q un macroprograma que usa q variables en el cual aparece la

macrosentencia anterior.

La expansión PQ de la macrosentencia en Q se produce como sigue:

Xq+1:= Xj1; …; Xq+n:= Xjn;

Xq+n+1:=0; …; Xq+p:=0;

“el código de P sustituyendo Xi por Xq+i, 1≤i≤p”

Xi:=Xq+1

Un macroprograma con mas de una macrosentencia se convierte en un programa while

expandiendo las macrosentencias una tras otra.

Ejercicio 3.24: Realizar según se ha explicado la conversión del programa del ejemplo

anterior.

Solución: La expansión de la macrosentencia quedaría:

Page 35: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 35 29/09/2004

X3:=X2; (*inicialización*) X4:=0; X4:=X3; (*renombramiento*) while X4≠0 do X3:= X3+1; X4:= X4-1 od;

X2:=X3; (*devolver salida en la variables adecuada *)

Con lo cual el programa while sería:

X2:=X2+1;

while X1≠0 do

X3:=X2; X4:=0; X4:=X3; while X4≠0 do X3:= X3+1; X4:= X4-1 od; X2:=X3; X1:=X1 - 1 od; X1:=X2; Ejercicio 3.25: Desarrollar una versión mas breve del programa que calcula 2x.

Solución: (1, 2, exp), exp: X2:= X2+1; while X1≠0 do X3:=X2; while X3≠0 do X2:= X2+1; X3:= X3-1 od; X1:= X1 - 1; od X1:=X2

La expansión de una macro no garantiza el programa while mas breve, pero es un

método seguro, en el cual no se mezclan variables del macroprograma y del programa

correspondiente a la macrosentencia.

Ejercicio 3.26: Demostrar que el programa propuesto en el ejercicio anterior

efectivamente calcula la función 2x.

Page 36: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 36 29/09/2004

Solución: Solo diremos como pista que la corrección del programa se puede razonar

viendo que el invariante del bucle principal es la suma del contenido de X1 y el

logaritmo en base 2 del contenido de X2.

Paso 3: Combinación de las dos características anteriores.

A los programas resultantes los llamaremos macroprogramas, y su conversión se realiza

aplicando el método del paso 1, y el método del paso 2 las veces que sea necesario.

Ejemplo 3.27: Un macroprograma para el producto, usando variables libres y

macrosentencias sería el siguiente:

Entradas: x, y;

Salida: prod; (* = x×y *)

Método:

while y≠0 do

prod:=suma(prod,x);

y:=y-1

od

Paso 4: Para las macrosentencias relativas a funciones conocidas y con representación

infija, estándar en matemáticas, usaremos dicha representación.

Así la macro Z:=suma(X,Y) se escribirá Z:=X + Y

la macro Z:=resta(X,Y) se escribirá Z:=X - Y

la macro Z:=producto(X,Y) se escribirá Z:=X × Y

la macro Z:=exp(X) se escribirá Z:=2X

Paso 5: Permitiremos que en una macrosentencia aparezca mas de una función while-

calculable (es decir, permitiremos expresiones)

Ejemplo 3.28: Z:= A + B× 2C

Page 37: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 37 29/09/2004

Ejercicio 3.29: Para cada c número natural, describir que hace la macro Z:=c, y como

sería su expansión.

A partir de ahora, para demostrar que una función es while-calculable podemos:

a) escribir un programa while para ella.

b) escribir un macroprograma, con o sin variables libres y usando macrosentencias

relativas a funciones que ya hemos demostrado son while calculables.

Ejercicio 3.30: Demostrar que son while calculables las siguientes funciones: máximo,

diferencia en valor absoluto, igualdad (definida como una función de dos argumentos

que vale 1 si coinciden los dos argumentos y 0 si son distintos), potencia.

Solución:

máximo: z:= (x-y) + y. (La representaremos por max(x,y)).

Diferencia en valor absoluto: z:= (x-y) + (y-x). (la representaremos por |x-y| )

igualdad: z:= sg(|x-y|)

potencia:

Entradas: x, y; Salida: z; (* = xy *) Método: z:=z+1; while y≠0 do z:= z×x; y:=y-1; od;

Nota: Al usarla como macro la representaremos por xy.

Ejercicio 3.31: Sean f y g dos funciones de N en N que son while-calculables.

Demostrar que la composición de ellas gof, también es una función while-calculable.

Solución: Sea (1, p, Q) el programa while que calcula f :N → N y sea (1, p’, R) el

programa que calcula g :N → N. El siguiente macroprograma calcula la composición:

Entrada: x;

Salida: y;

Método:

Page 38: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 38 29/09/2004

x:=f(x);

y:=g(x);

Nótese que, si la entrada es cierto valor a, tras la ejecución de la primera

macrosentencia, en la variable x tenemos f(a); y al ejecutar la segunda macrosentencia,

y toma el valor g(f(a)).

Observamos además, que la conversión de este macroprograma a un programa while,

con el adecuado renombramiento de variables consiste básicamente en la concatenación

secuencial del código Q (correspondiente a la función f) con el código R

(correspondiente a la función g). Así pues podemos decir, de manera informal, que la

composición de funciones equivale a la concatenación secuencial de programas

III.5 Capacidad expresiva del lenguaje WHILE. Vemos en esta sección que el lenguaje while, con su reducido juego de

instrucciones es capaz de simular las estructuras de control mas habituales en un

lenguaje de programación imperativo estructurado.

Para cada estructura de control, vamos a proponer un ejercicio donde se da la

sintaxis y la semántica de dicha estructura, y se pide desarrollar un conjunto de

sentencias while que se corresponda con la semántica dada. Una vez resuelto el

ejercicio, usaremos libremente la nueva estructura en sucesivos desarrollos.

Ejercicio 3.32: (Bucle definido)

Desarrollar la secuencia de sentencias while equivalente al bucle definido dado por la

sintaxis (S representa una secuencia de sentencias):

do x times S od

y cuya semántica es la siguiente:

Se ejecuta tantas veces como el valor de x antes de entrar en el bucle.

El valor de x no cambia, salvo que se modifique en el cuerpo del bucle.

Page 39: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 39 29/09/2004

Solución: Supongamos que en un macroprograma aparece la sentencia de bucle definido

dada anteriormente y que z es una nueva variable. Entonces el código while equivalente

es:

z := x; while z ≠ 0 do S z := z - 1 od

(Notese que una posible modificación del valor de x en el cuerpo del bucle no afecta al

número de ejecuciones del mismo).

Ejercicio 3.33:(Sentencia condicional incompleta)

Desarrollar la secuencia de sentencias equivalente a la sentencia condicional incompleta

dada por la sintaxis:

if x ≠ 0 then S fi

y cuya semántica es:

Si la variable x es no nula, se ejecuta la secuencia de sentencias S.

Si la variable x es nula, no se ejecuta la secuencia de sentencias S.

No cambia el valor de x.

Solución: Se construye como sigue, haciendo uso de la macrosentencia signo y del

bucle definido:

z := sg(x); (*z es una nueva variable*) do z times S od

Ejercicio 3.34:(Sentencia condicional completa)

Desarrollar la secuencia de sentencias equivalente a la sentencia condicional incompleta

dada por la sintaxis (S y T son secuencias de sentencias):

if x ≠ 0 then S else T fi

y cuya semántica es:

Si la variable Xi es no nula, se ejecuta la secuencia de sentencias S.

Si la variable Xi es nula, no se ejecuta la secuencia de sentencias T.

No cambia el valor de Xi.

Solución: Se construye como sigue, haciendo uso de las macrosentencias signo y signo-

complementario y del bucle definido:

Page 40: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 40 29/09/2004

y := sg(x); (* y es una nueva variable *) z:= sg(x); (*z es una nueva variable *) do y times S od do z times T od

Vamos a estudiar ahora que la restricción en la expresión de control de bucles

indefinidos y en sentencias condicionales (x≠0) se puede eliminar y permitir cualquier

expresión booleana.

Para ello vemos que para cualquier condición dada C, se puede construir una expresión

EC tal que si la condición es verdadera la expresión vale 1 y si la condición es falsa, la

expresión vale 0.

Ejemplo 3.35: Sea la condición C ≡ X > Y. Vamos a construir la expresión asociada a

esta condición:

Si X>Y, entonces X-Y>0, y esto lleva a que (X-Y)≠(X-Y)-1, y además la diferencia

entre estos dos valores es 1.

Si X≤Y, entonces X-Y=0, y esto lleva a que (X-Y)=(X-Y)-1, y entonces la diferencia

entre estos dos valores es 0.

Por tanto la expresión correspondiente es EC ≡ (Y - X) - [(Y - X) - 1]

En resumen:

Para C ≡ X < Y la expresión es EC ≡ (Y - X) - [(Y - X) - 1]

Ejercicio 3.36: Dar expresiones para las condiciones siguientes: C≡ X = Y, C1 ∨ C2, C1

∧ C2, ¬C

Solución:

Para C≡ X = Y la expresión es EC ≡ 1 - [(Y - X) + (X - Y)] Para C1 ∨ C2 la expresión es E1∨2 ≡ sg(E1 + E2) Para C1 ∧ C2 la expresión es E1∧2 ≡ (E1 + E2) - 1 Para ¬C la expresión es E¬C ≡ 1 - EC

A partir del resultado de este ejercicio tenemos cualquier comparación de variables y

combinaciones de ellas mediante los operadores booleanos.

Sea C una condición. El bucle definido con condición C:

Page 41: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 41 29/09/2004

while C do se corresponde con z:= EC; S while z≠0 do od S z:= EC; od

Análogamente, sea C una condición. La sentencia condicional completa con

condición C:

if C then S1 else S2 fi

se corresponde con el siguiente desarrollo:

y := EC; z:= E¬C; do y times S1 od; do z times S2 od;

En la misma idea de los desarrollos anteriores, si f y g son funciones de N en N while-

calculables, y S, S1 y S2 son secuencias de sentencias, permitiremos escribir

macrosentencias de la forma:

do f(x) times S od

while f(x)≠0 do S od

if f(x)≠g(x) then S1 else S2 fi

if f(x)≠0 then S fi

Las cuales se pueden expandir de la siguiente forma:

w:=f(x); do w times S od

w:=f(x); while w≠0 do S; w:=f(x) od

w:=|f(x)-g(x)|; if w≠0 then S1 else S2 fi

w:=f(x); if w≠0 then S fi

Ejercicio 3.37: Sea una sentencia while de la forma “while P do S od”. Por las

características semánticas de la condición P sabemos que ese bucle se ejecuta a lo sumo

z veces. Demostrar que esta sentencia se puede sustituir por un bucle definido.

Solución:

t:=t + 1; (*t es una nueva variable*) do z times if P ∧(t=1) then S else t:=0 fi od

Page 42: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 42 29/09/2004

Ejercicio 3.38: Dar programas en el lenguaje while que muestren que las siguientes

funciones son while-calculables: Cociente, resto, raíz cuadrada (por defecto y por

exceso), logaritmo en base 2 (por defecto y por exceso), Primo(si el argumento es primo

vale 1, sino vale 0), p(n)=primo que ocupa el lugar n (p(0)=2, p(1)=3, p(2)=5, etc.

Ejercicio 3.39: Sea f una función de N en N while-calculable y biyectiva. Demostrar

que su inversa también es while-calculable. Una vez desarrollado el programa

correspondiente estudiar que características tiene la inversa (total, parcial, inyectiva,

sobreyectiva, valores no accesibles a través del programa) al relajar las restricciones de

la función de partida f en el orden siguiente (siempre es while-calculable): inyectiva y

total, sobreyectiva y total, sobreyectiva y parcial, total, parcial.

III.6 El lenguaje LOOP En esta sección desarrollamos un sublenguaje del lenguaje WHILE. La única

diferencia es que no hay bucle indefinido y en su lugar hay un bucle definido. Esta

diferencia es suficientemente importante.

SINTAXIS:

Tipo de datos: Enteros positivos

Identificadores: X1, X2, X3, ...

Instrucciones de asignación:

Xi:= Xj

Xi:= Xj + 1

Xi:= Xj - 1 ( 0 - 1=0)

Xi:= 0

Estructuras:

- Secuencia: ";" separa dos instrucciones

- Bucle definido:

do Xi times

... sentencias...

od

Código: ...sentencias...

Page 43: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 43 29/09/2004

Programa: (n, p, código)

SEMANTICA

La semántica se deriva de la correspondiente al lenguaje WHILE, y el bucle

definido con la semántica ya dicha, que repetimos a continuación:

- Se ejecuta tantas veces como el valor de la variable de control antes de entrar

en el bucle.

- El valor de la variable de control no cambia, salvo que se modifique en el

cuerpo del bucle.

Definición 3.40:(la clase de funciones LOOP-calculables)

Fn(LOOP) es el conjunto de todas las funciones f: Nn→N tales que existe un programa

LOOP, con n variables de entrada, que calcula f.

F(LOOP) es la unión de todas las Fn(LOOP), para n≥0.

Si f∈F(LOOP) diremos que f es una función LOOP-calculable

Ejercicio 3.41: Demostrar que F(LOOP) es una subclase de F(WHILE).

Solución: En el lenguaje LOOP, todos los programas acaban en un número finito de

pasos. Las funciones LOOP-calculables son todas totales (dicho de otra forma, en el

lenguaje LOOP no existe el problema de la parada). Así pues, cualquier función parcial

que sea while-calculable es un ejemplo de función no loop-calculable. En concreto, la

función que siempre diverge (descrita en el ejercicio XX).

Observamos que el juego de instrucciones no es mínimo, en el sentido de que la

instrucción de decremento, se puede simular mediante un programa LOOP.

Ejercicio 3.42: Desarrollar un programa para calcular la función f(x)=x-1

Solución: (1, 3, P)

P: X2:= X1; do X2 times X1:= X3; X3:= X3+1 od

Page 44: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 44 29/09/2004

En la simulación de las sentencias condicionales hemos usado continuamente la función signo. Para esta función desarrollamos en su momento programas while. Vemos que es loop-calculable. Ejercicio 3.43: Demostrar que las funciones signo es loop-calculable. Solución: Entrada: x; Salida: y; Método: do x times y:= 0; y:= y+1 od;

A partir de esto observamos que todo el desarrollo realizado en la sección anterior es

válido restringiéndonos a funciones loop-calculables. Dicho con mas detalles, en el

lenguaje LOOP tenemos macrosentencias para la sentencia condicional (completa o

incompleta), con una amplia variedad de expresiones para el predicado de control; así

mismo, tenemos bucles definidos controlados por expresiones de las variables usadas en

el programa.

Ejemplo 3.44: La sentencia condicional incompleta, if x≠0 then S fi se expresaría

como

z:=sg(x); do z times S od

III.7 Jerarquía de funciones y programas en el lenguaje LOOP.

En el lenguaje LOOP el nivel de anidamiento de bucles determina una jerarquía

cuyo estudio se inicia en esta sección y continua en los capítulos 5 y 6.

Definición 3.45: (lenguajes LOOPi)

Para cada i≥0, se define el lenguaje LOOPi como el sublenguaje de LOOP formado por

los programas que tiene nivel de anidamiento de bucles a lo sumo i.

F(LOOPi) es la clase de funciones calculadas por programas LOOPi.

Page 45: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 45 29/09/2004

Es claro, por la forma de definir los lenguajes que si una función pertenece a una

clase, entonces pertenece a todas las que están por encima de ella. Luego tenemos la

siguiente jerarquía:

F(LOOP0) ⊆ F(LOOP1) ⊆ F(LOOP2) ⊆ F(LOOP3) ⊆ … ⊆ F(LOOP)

Ejercicio 3.46: Para cada uno de los ejemplos y ejercicios de este capítulo determinar si

la función correspondiente es loop-calculable. Caso afirmativo determinar el menor i tal

que la función correspondiente pertenece a F(LOOPi).

Ejercicio 3.47: Determinar la estructura de las funciones en F(LOOP0) y estudiar el

número de pasos que da un programa en LOOP0.

Ejercicio 3.48: Sea P un programa en LOOP1 con n variables de entrada. Demostrar

que existe números naturales A y B tales que TP(x)< A×max(x) + B.

Ejercicio 3.49: Demostrar que si un programa P pertenece a LOOPi entonces la función número de pasos TP, también pertenece a LOOPi.

Page 46: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 46 29/09/2004

CAPITULO IV: LAS FUNCIONES µµµµ-RECURSIVAS En este capítulo desarrollamos otro representante formal del concepto de

algoritmo. Se basa en la idea de cierre de cierto conjunto de funciones iniciales con

respecto a ciertos operadores funcionales. Las funciones iniciales, que se verán en

breve, son intuitivamente calculables. Lo mismo se puede decir de los operadores

funcionales. En primer lugar estudiaremos la clase de la funciones recursivas primitivas,

que fueron utilizadas por Gödel en su trabajo de 1936 sobre indecidibilidad. Esta clase

no captura a todas las funciones que se pueden considerar calculables: este hecho lo

justificaremos mediante el procedimiento diagonal desarrollado por Peter y mediante la

función de Ackermann. Razonando de manera intuitiva introduciremos un nuevo

operador funcional: la minimización. Por último definiremos la clase de las funciones

µ-recursivas.

IV.1 Las funciones recursivas primitivas.

Definición 4.1: (funciones iniciales) Denominamos funciones iniciales a las siguientes:

(a) La función cero de 0 argumentos, Z:N0→N, está definida por Z( )=0

(b) Para cada k≥1 y para cada 1≤i≤k, la función i-ésima proyección de k argumentos,

πik :Nk→N, definida por πi

k (n) = ni, donde n = (n1, n2, …, nk)

(c) La función sucesor, σ:N→N, definida por σ(n) = n+1

Es razonable pensar que estas funciones son intuitivamente calculables. La función

cero, simplemente dice que sin entrada alguna, dar como salida 0. Cada proyección

supone seleccionar una componente de un vector, dicho de otra forma, dar como salida

una entrada, especificada por la propia proyección. Por último, la función sucesor

produce como imagen el número sucesor de la entrada.

Ejercicio 4.2: Demostrar que la función identidad (I) de N en N es una función inicial.

Solución:

Page 47: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 47 29/09/2004

I = π11.

Pasamos ahora a definir cada uno de los operadores funcionales.

Definición 4.3: (Composición). Sea m>0 y k≥0, sea g una función de m argumentos, y

sean h1, h2, …, hm funciones de k argumentos. Sea f la función de k argumentos definida

por

f(n)=g(h1(n), h2(n), …, hm(n)).

Entonces se dice que f se ha obtenido a partir g, h1, h2, …, hm por composición.

Si la función g y las h’s son intuitivamente calculables, es claro que f también lo es.

Dados unos argumentos n el proceso a realizar es el siguiente:

- Calcular cada una de las h’s para estos argumentos.

- Tomar esos valores calculados como argumentos para g.

- Calcular g para esos argumentos.

El valor obtenido es la imagen de f.

Ejercicio 4.4: Demostrar que la función suc-2 de N en N definida por suc-2(n)=n+2, se

puede obtener por composición a partir de las funciones iniciales.

Solución:

Busco una g y unas h’s de manera que la f de la definición se corresponda con suc-2.

m=1, k=1, g=σ, h1=σ, f=g(h1), es decir, suc-2=σ(σ)

Ejercicio 4.5: Demostrar que la función suc3 de N3 en N definida por suc3(x, y, z)=z+1,

se puede obtener por composición a partir de funciones iniciales.

Solución:

Repitiendo el razonamiento anterior para esta nueva función resulta:

m=1, k=3, h1=π33, g=σ, f=g(h1), es decir, suc3=σ(π3

3).

Definición 4.6: (Recursión primitiva) Sea k≥0, sea g una función de k argumentos, y

sea h una función de (k+2) argumentos. sea f la función de (k+1) argumentos definida

por

f(n,0) = g(n);

f(n, m+1) = h(n, m, f(n, m)).

Page 48: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 48 29/09/2004

Entonces se dice que f se ha obtenido a partir g y h por recursión primitiva.

Razonemos ahora que si g y h son intuitivamente calculables, f también lo es:

Para fijar ideas, supongamos que queremos calcular f(n, 3), el proceso a seguir es el

siguiente:

- Dado n, calcular g(n) y obtenemos f(n,0).

- Calcular h(n, 0, f(n, 0)) (f(n,0) del paso anterior) y obtenemos f(n, 1).

- Calcular h(n, 1, f(n, 1)) y obtenemos f(n, 2)

- Calcular h(n, 2, f(n, 2)) y obtenemos f(n, 3).

Este razonamiento fija ideas pero no es totalmente preciso, pues podría parecer que el

valor 3 no es un argumento y que habría que describir un proceso diferente para cada m

dado. Esto no es cierto: teniendo en cuenta que m es un argumento, el proceso general

para calcular f(n, m) sería como sigue:

- Dado n, calcular g(n) y obtener f(n,0) que se guarda en X.

- Tomar Y con valor 0

- Repetir m veces (m es un argumento)

- Calcular h(n, Y, f(n, Y)) y obtener f(n, Y+1), que se guarda en X.

- Incrementar el valor de Y en 1.

Ejercicio 4.7: Demostrar que la función predecesor (pred) de N en N definida por:

pred(m)=0 si m = 0

m -1 si m > 0

���

Se puede obtener por recursión primitiva a partir de funciones iniciales.

Solución: Nótese que k=0.

pred(0)=0, así que g debe ser una función sin argumentos cuya imagen es 0; ¿Qué

función es? Evidentemente Z.

pred(m+1) = m.

Para h, observamos que la expresión del esquema de recursión primitiva particularizado

a este caso es:

pred( m+1) = h( m, pred(m) ), es decir: h( m, pred(m) )=m

¿Qué función de dos argumentos tiene como imagen su primer argumento? Pues π12 .

En resumen:

- pred(0)=Z( )

Page 49: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 49 29/09/2004

- pred(m+1) = π12(m, pred(m)).

Por tanto pred se obtiene por recursión primitiva a partir de funciones iniciales.

Definimos la clase de las funciones recursivas primitivas.

Definición 4.8: (Concepto de función recursiva primitiva) La clase de las funciones

recursivas primitivas (PRIM) es la menor clase que contiene la funciones iniciales y es

cerrada por las operaciones de composición y recursión primitiva.

Dicho de otra forma:

(1) Si una función es inicial entonces es recursiva primitiva.

(2) Si g, h1, h2, …, hl son funciones recursivas primitivas, entonces la función f obtenida

desde g, h1, h2, …, hl por composición, también es recursiva primitiva.

(3) Si g y h son funciones recursivas primitivas, entonces la función f obtenida desde g

y h por recursión primitiva, también es una función recursiva primitiva.

(4) ninguna otra función es recursiva primitiva.

PRIMk es la clase de funciones recursivas primitivas de k argumentos.

PRIM= PRIMk

k≥0� .

Observamos que en los ejercicios anteriores hemos demostrado que las funciones

identidad I y suc-2 están en PRIM1, suc3 está en PRIM3 y pred está en PRIM1; y todas

estas demostraciones han sido en base a funciones iniciales. Ahora, teniendo en cuenta

la segunda forma de definición en sus apartados (2) y (3), podemos usar estas funciones

para construir nuevas funciones recursivas primitivas.

Dicho de otra forma, partimos de una librería de funciones que son las iniciales;

cada vez que demostramos que una función está en PRIM se incorpora a la librería y se

puede usar para construir nuevas funciones.

Ejercicio 4.9: Demostrar que suma: N2→N definida por suma(n, m) = n+ m es PRIM.

Solución:

Vamos a realizar sucesivas aproximaciones a la solución.

Page 50: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 50 29/09/2004

Es imposible expresarla por composición, pues tendríamos que componer un

número de veces dado por el segundo argumento y eso no es posible.

Vamos a expresarla por recursión primitiva. Comenzamos poniendo la función

en un aspecto parecido a dicho operador funcional:

k=1,

suma(n, 0) = n

suma(n, m+1) = n + (m+1) = (n+m) + 1

Para la primera línea debe corresponder con

suma(n, 0) = g(n).

¿Cual es la función dada por g(n)=n? La identidad I de N en N.

Para la segunda línea, observando la colocación de los paréntesis vemos que podemos

escribir

suma(n, m+1) = suma(n, m) + 1

Entonces, como por definición debe ser:

suma(n, m+1) = h(n, m, suma(n, m))

¿Cual es la función dada por h(n, m, suma(n, m))= suma(n, m) + 1?, dicho de forma mas

general, ¿Cual es la función dada por h(n, m, x)= x + 1?, pues suc3, que vimos en un

ejercicio anterior.

En resumen:

suma(n, 0) = I(n)

suma(n, m+1)= suc3(n, m, suma(n,m))

Luego suma es recursiva primitiva porque se define por recursión primitiva a partir de

las funciones identidad I, y suc3.

Ejercicio 4.10: Demostrar que suma-3:N3→N definida por suma-3(n1, n2, n3) = n1+ n2+

n3 es PRIM.

Solución: Está será la última vez que haremos un desarrollo detallado. En los siguiente

ejercicio solo daremos la idea básica.

En esencia, suma-3(n1, n2, n3) = suma(n1,suma( n2, n3)), es decir, es una composición,

pero en la composición todas las h’s han de tener el mismo número de argumentos. este

problema se soluciona con las proyecciones:

suma-3(n1, n2, n3) = suma (π13(n1, n2, n3), suma (π2

3(n1, n2, n3), π33(n1, n2, n3))

Page 51: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 51 29/09/2004

Nótese que hacemos dos niveles de composición:

- Composición mas interna: con g= suma, h1= π23 y h2=π3

3, obtenemos una f que actúa

como h para el siguiente nivel.

- Composición externa: con g= suma, h1=π13 y h2=f, obtenemos suma-3.

Estos razonamientos tan detallados se omiten en lo que sigue.

Definición 4.11: (función constante): Para cada k≥0 y j≥0, la función constante “j” de k

argumentos, C jk :Nk→N, está definida por C j

k (x) = j.

Ejercicio 4.12: Demostrar que C00 es PRIM.

Solución: Basta observar que C00 = Z, que es una función inicial.

Ejercicio 4.13: Demostrar por inducción doble que todas las funciones constantes son

PRIM.

Solución:

Para k=0:

Para j=0, tenemos C00 que ya se ha demostrado es PRIM

Lo suponemos para j

Lo demostramos para j+1:

C j+10 =σ(C j

0())

σ es PRIM por ser inicial, C j0 es PRIM por hipótesis de inducción,

se ha usado el esquema de composición, luego C j+10 es PRIM.

Queda pues demostrado que C j0 es PRIM, para todo j.

Lo suponemos para k:

C jk es PRIM para k y para todo j.

Lo demostramos para k+1:

C jk+1(n, m) = C j

k (π11k+ (n, m), π2

1k+ (n, m), …, πkk+1(n, m))

Page 52: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 52 29/09/2004

que es un esquema de composición a partir de C jk , que es PRIM por hipótesis de

inducción, y de proyecciones que son PRIM por ser iniciales.

Definición 4.14:(transformación explícita) Sea g una función de k-argumentos y f una

función de j argumentos, con k,j≥0. Supongamos que existen funciones h1, h2, …, hk:

Nj→N, cada una de las cuales es o bien una proyección o bien una función constante,

tales que

f(n) = =g(h1(n), h2(n), …, hk(n)).

Entonces decimos que f se ha obtenido a partir de g por transformación explícita.

En otras palabras, f se obtiene por transformación explícita a partir de g, si f se obtiene a

partir de g eliminando, duplicando, permutando o sustituyendo por constantes

argumentos de g.

Ejemplo 4.15: Veamos que la función f de N en N definida por f(n) = 2n + 17 se

obtiene por transformación explícita a partir de suma-3: f(n) = suma-3(n, n, 17)

Ejercicio 4.16: Demostrar que si g es PRIM, entonces cualquier función obtenida desde

g por transformación explícita también es PRIM.

Solución: El esquema de transformación explícita es una composición, donde las h’s

son proyecciones o constantes, las cuales son PRIM; por tanto la función obtenida es

PRIM.

Ejercicio 4.17: (esquema de recursión primitiva simplificado) Sea k≥0, sea g una

función de k argumentos, y sea h una función de 1 argumento. sea f la función de (k+1)

argumentos definida por

f(n,0) = g(n);

f(n, m+1) = h’(f(n, m)).

Demostrar que si g y h’ son PRIM, entonces, f también lo es.

Solución:

La primera línea coincide con el esquema de recursión primitiva. La segunda

línea es algo diferente porque en el esquema de recursión primitiva tenemos

Page 53: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 53 29/09/2004

f(n, m+1) = h(n, m, f(n, m)).

¿Como definir h? h = h’(πkk

++

22 )

Ejercicio 4.18: Demostrar que las siguientes funciones son PRIM

(a) Resta. resta: N2→N definida por

resta(n,m)= 0 si n ≤�

��

mn - m si n > m

(b) Producto. prod: N2→N definida por producto(n, m) = n·m

(c) Potencia. pot: N2→N definida por potencia(n, m) = nm

(d) Factorial

(e) Signo. sg: N→N definida por

sg(m)= 0 si m = 01 si m > 0

���

(f) Valor absoluto de la resta. absresta: N2→N definida por

absresta(n,m)= m n si n− ≤���

mn - m si n > m

En lo que sigue, usaremos la resta, el producto, la potencia y el factorial con su notación

habitual en Matemáticas; así mismo absresta(n,m) en la forma |n-m|.

Definición 4.21: (predicado definido en base a una función)

(1) Sea P un predicado de k argumentos. El conjunto de valores de verdad

correspondientes al predicado P, VP, se define por VP={x∈Nk | P(x) =V}

(2) Sea k≥0. Sea f una función de k argumentos. El predicado Pf

correspondiente a f se define por: Pf(x)=V si y solo si sg(f(x))=1 (esto es,

f(x)>0).

(3) Sea V un subconjunto de Nk. La función característica de V, χV:Nk→N, se

define por:

χV(x)= 1 si V

si Vx

0 x∈∉

���

Definición 4.22: (Clases de predicados definidos en base a funciones)

Sea C una clase de funciones de k-argumentos. La clase de predicados definidos

en base a la clase de funciones C se define por:

Page 54: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 54 29/09/2004

PRED(C) = { Pf | f∈C}

Definición 4.23: La clase de predicados recursivos primitivos es PRED(PRIM), es

decir, los predicados definidos en base a funciones recursivas primitivas.

Nota: Al ser todas las funciones PRIM totales, dada una función recursiva primitiva f la

función característica del conjunto de valores de verdad del predicado definido por f

( χVPf) también es recursiva primitiva; es mas, χVPf

=sg(f).

Ejercicio 4.24: Demostrar que los siguientes predicados son recursivos primitivos

(a) mayor (n,m)

(b) igual(n, m)

Solución: Buscamos una función de dos argumentos tal que si se cumple n>m entonces

tome un valor positivo y en caso contrario tome valor 0. Claramente es f>(n,m)=n-m.

Razonando de forma similar, f=(n,m) = 1- |n-m|.

Definición 4.25:(transformación explícita de predicados) Si un predicado P se obtiene a

partir de otro Q eliminando, duplicando, permutando o sustituyendo por valores

constantes argumentos de Q, entonces se dice que P se ha obtenido a partir de Q por

transformación explícita. (la definición formal es similar a la dada para funciones).

Ejercicio 4.26: Si Q∈PRED(PRIM), entonces también es recursivo primitivo cualquier

predicado obtenido desde Q por transformación explícita.

Solución: El predicado Q está definido en base a una función g que pertenece a PRIM.

Si le aplicamos a g una transformación explícita obtenemos f que también pertenece a

PRIM. Esta función f define un predicado P, que es la transformación explícita de Q; y

como f∈PRIM, resulta que P∈PRED(PRIM).

Definición 4.27: (Conectivas lógicas )

Sean k, l≥0. Sea Q un predicado de k argumentos y R un predicado de l argumentos.

La conjunción de Q y R es el predicado S de (k+l) argumentos definido por:

C(n, m)=V si y solo si Q(n)=V y R(m)=V, para todo n∈Nk, m∈Nl.

Page 55: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 55 29/09/2004

La disyunción de Q y R es el predicado T de (k+l) argumentos definido por:

D(n, m)=V si y solo si Q(n)=V o R(m)=V, para todo n∈Nk, m∈Nl.

La negación de Q es el predicado P de k argumentos definido por:

N(n)=V si y solo si ¬Q(n)=V, para todo n∈Nk.

Ejercicio 4.28: Demostrar que si Q y R∈PRED(PRIM), entonces también son

recursivos primitivos su conjunción, su disyunción y la negación de Q.

Solución: Sean g y h las funciones recursivas primitivas que definen a los predicados Q

y R. Entonces, las funciones para las tres conectivas, fC, fD y fN son las siguientes:

fC(n, m) = g(n)×h(m)

fD(n, m) = g(n)+h(m)

fN(n, m) = 1- g(m)

Notación: Para representar la conjunción, disyunción y negación, usaremos la notación

infija con los símbolos habituales ( ∧, ∨ y ¬ respectivamente).

Ejercicio 4.29: Demostrar que son recursivos primitivos los predicados de 2

argumentos siguientes: mayor-o-igual, menor, menor-o-igual, distinto, implica.

Solución:

mayor-o-igual(n, m) = mayor(n,m) ∨ igual(n,m)

menor(n,m) = ¬(mayor-o-igual(n,m))

menor-o-igual(n, m) = menor(n,m) ∨ igual(n,m)

distinto(n,m)= mayor(n,m) ∨ menor(n,m)

Dados dos predicados Q y R,

implica(Q, R) = ¬Q ∨ R

Notación: Para representar las comparaciones usaremos la notación infija habitual: >,

=, ≥, <, ≤, ≠; así mismo, “implica lo representaremos por �.

Page 56: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 56 29/09/2004

Comentario: Las operaciones lógicas se extienden para combinar cualquier número

finito de predicados.

Definición 4.19: (Los procesos Π -producto acotado- y Σ -suma acotada-)

Sea k≥0. Sea h una función de (k+1) argumentos. las funciones f y g de (k+1)

argumentos se definen por:

f(n, m) = h n ii

m

( , )=

∏0

= h(n,0). h(n,1).… h(n,m)

g(n, m) = h n ii

m

( , )=�

0 = h(n,0)+ h(n,1)+…+ h(n,m)

Ejercicio 4.20: Demostrar que si h es PRIMk+1 entonces las funciones f y g obtenidas

por producto acotado y suma acotada también son PRIMk+1.

Solución:

f(n, 0) = h(n,0) f(n, m+1) = f(n, m) × h(n, m+1)

g(n, 0) = h(n,0) g(n, m+1) = f(n, m) + h(n, m+1)

Definición 4.30: (Cuantificación acotada). Sea k≥0. Sea Q un predicado con (k+1)

argumentos. La cuantificación existencial acotada de Q es el predicado E de (k+1)

argumentos tal que, para cualquier n∈Nk y m∈N, E(n, m)=V si y solo si existe un i,

0≤i≤m, tal que Q(n, i)=V. Brevemente escribiremos:

E(n, m)=V si y solo si ∃i≤m[Q(n, i)=V].

La cuantificación universal acotada de Q es el predicado U de (k+1) argumentos tal

que, para cualquier n∈Nk y m∈N, U(n, m)=V si y solo si para todo i, 0≤i≤m, Q(n, i)=V.

Brevemente escribiremos:

U(n, m)=V si y solo si ∀i≤m[Q(n, i)=V].

Ejercicio 4.31: Si Q∈PRED(PRIM), también son recursivos primitivos los predicados

obtenidos desde Q por cuantificación existencial y universal acotada.

Page 57: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 57 29/09/2004

Solución: Sea f la función PRIM asociada a Q. Busco una función g para asociarla a E,

de manera que g(n, m) sea mayor que 0 sii f(n, 0)>0 o f(n, 1)>0 o …o f(n, m)>0.

Entonces defino g(n, m) = f n ii

m

( , )=�

0.

Análogamente, para el predicado U la función sería h(n, m) = f n ii

m

( , )=

∏0

Por un ejercicio anterior, tanto g como h son PRIM.

Ejercicio 4.32: Demostrar que el predicado div(p, q) que es verdad sii “p≥1, q≥1 y p

divide a q” (q es múltiplo de p) es PRED(PRIM).

Solución:

div(p, q) = (p≥1) ∧ (q≥1) ∧ (∃i≤q [q = p×i]).

Ejercicio 4.33: Demostrar que el predicado primo(p) que es verdad sii “p es un número

primo” es PRED(PRIM)

Solución:

primo(p) = ∀i≤p [div(i,p) � (i=1) ∨ (i=p)].

Definición 4.34:(función definida por casos). Sean g1, g2, …, gl funciones de k

argumentos. Sean P1, P2, …, Pl predicados de k argumentos tales que para cada n∈Nk,

se verifica exactamente uno de los predicados Pi. Se dice que la función f de k

argumentos está definida por casos a partir de g1, g2, …, gl y P1, P2, …, Pl si:

f(n)=g n si P n V

g n si P n Vl

1( ) ( ). . .( ) ( )l

1

=

=

��

��

Ejercicio 4.35: Demostrar que si g1, g2, …, gl∈PRIMk y P1, P2, …, Pl∈PRED(PRIMk)

entonces la función f definida por casos a partir de g1, g2, …, gl y P1, P2, …, Pl también

es recursiva primitiva.

Solución: Sean h1, h2, …, hl las funciones PRIM asociadas a P1, P2, …, Pl. Para cada n

solo una de ellas es mayor que 0 y las demás son 0. Si tomo “el signo”, entonces solo

una de ellas es 1 y las demás son 0. Si esos valores los multiplico por las

Page 58: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 58 29/09/2004

correspondientes gi (i=1, …, l), obtengo el valor de la gj correspondiente al “único”

predicado Pj que es verdad.

Por tanto, f(n) = g1(n) × h1(n) + g2(n) × h2(n) + … + gl(n) × hl(n).

Ejercicio 4.36: Definir adecuadamente el concepto de función definida por casos con la

opción “otherwise” (en otro caso).

Demostrar que si las funciones y predicados de partida son recursivos

primitivos, entonces también lo es la función definida por casos con la opción

“otherwise”.

Definición 4.37:(minimización acotada).

Sea k≥0. Sea Q un predicado con (k+1) argumentos. La minimización acotada de Q es

la función f de (k+1) argumentos definida por:

f(n, m) = el menor p

en otro ca, 0 p m tal que Qnp si tal p existe entre 0 y m

so≤ ≤�

�� 0

Brevemente: f(n, m) =µp≤m[Q(n, p)]

Nota: la segunda alternativa en la definición de f se elige arbitrariamente.

Ejercicio 4.38: Demostrar que si Q∈PRED(PRIMk+1), entonces la función obtenida

desde Q por minimización acotada es recursiva primitiva de (k+1) argumentos.

Solución: Observamos que si p es el menor valor tal que Qnp=V, entonces f(n, 0) =

f(n,1) =…= f(n, p-1) =0 y f(n, p) = f(n, p+1) =…=p. Luego, si el predicado ha sido falso

hasta ese valor y en ese valor también es falso, entonces la función toma valor 0; si el

predicado ha sido falso hasta ese valor y en ese valor es verdadero, entonces la función

toma ese valor; si ya era verdad el valor del predicado antes del último argumento,

entonces la función toma el mismo valor que tenía.

En base a este razonamiento, expresamos f mediante recursión primitiva:

Sea

Page 59: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 59 29/09/2004

h(n, m, p) = [ ]

[ ][ ]

01 1

Si i m + 1 QnSi i m Qn Qn m Si i m Qn

∀ ≤ ¬+ ∀ ≤ ¬ ∧ +

∃ ≤

��

��

im ip i

( )

Entonces,

f(n, 0) =0

f(n, m+1) =h(n, m, f(n, m))

Ejercicio 4.29: (Variante extendida de la minimización acotada). Demostrar que si

Q∈PRED(PRIMk+1) y g∈ PRIMk+1, entonces la función f obtenida desde Q mediante el

siguiente proceso:

f(n, m) =µp≤ g(n, m)[Q(n, p)=V]

también es recursiva primitiva.

Ejercicio 4.40: Demostrar que la función de un argumento Pr, que a cada m le hace

corresponder el número primo de lugar m, es PRIM.

Ejemplos: Pr(0)=2, Pr(1)=3, Pr(2)=5, Pr(3)=7, Pr(4)=11.

Ayuda: Si un número es el primo p-ésimo, entonces no puede ser mayor que p!+1.

Solución:

Pr(0) = 2

Pr(m+1) = µk≤m! [ k>Pr(m) ∧ primo(k)]

IV.2 Necesidad de ampliar la clase PRIM. Vamos a razonar en esta sección que la clase PRIM no agota a todas las

funciones intuitivamente calculables. Lo haremos en base a tres argumentos:

(a) El argumento diagonal de R. Peter.

(b) Exhibiendo una función que es intuitivamente calculable que no es PRIM

(ejemplo debido a W. Ackermann).

Page 60: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 60 29/09/2004

(c) Mediante una justificación intuitiva sobre la necesidad de ampliar la

minimización acotada.

(a) EL ARGUMENTO DIAGONAL DE R. PETER

Consideremos las funciones PRIM1. Estas funciones se obtienen mediante el uso

de composición y recursión primitiva aplicadas a funciones iniciales. Desde un punto de

vista sintáctico, podemos expresar las funciones iniciales y las ecuaciones relativas a

procesos de composición y recursión primitiva mediante cadenas C sobre un alfabeto

finito. Ordenamos estas cadenas lexicográficamente. A cada una le asignamos, según su

posición, un número (0, 1, 2, …). Cada cadena Ci representa una función de PRIM1 fi y

todas las funciones PRIM1 están en esa lista. Definimos la función f(n)=fn(n) +1.

Esta función es intuitivamente calculable pues, para cada n, tomo la cadena Cn,

veo que función define fn, calculo esta función en el punto n, y le sumo 1.

Supongamos que PRIM abarca a todas las funciones calculables, entonces f está

en PRIM, luego debe existir un k tal que f=fk.

Ejercicio 4.41: Estudiar que ocurre con el valor de f en el punto k.

Solución:

Por la definición (f(n)=fn(n) +1), tenemos f(k)=fk(k) +1

Por ser f PRIM, f=fk, tenemos f(k)=fk(k)

Todas las funciones PRIM son totales, y por tanto f también es total, luego en las dos

igualdades todos los miembros están definidos y resulta que fk(k) +1=fk(k), ABSURDO.

Luego lo que ocurre es que la función f en el punto k tiene una definición absurda.

Este resultado se debe a la suposición de que PRIM abarca a todas las funciones

calculables. Luego la suposición es falsa y por tanto:

Existen funciones calculables que no son recursivas primitivas.

(b) LA FUNCION DE ACKERMANN

La idea es construir una función que crezca más rápido que cualquier función

PRIM.

Page 61: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 61 29/09/2004

Sabemos que la sucesión de operaciones: sucesor, suma, producto, potencia …

producen funciones que crecen cada vez más rápido.

Sabemos que cada una de estas operaciones se define por el mismo esquema de

recursión primitiva a partir de la anterior.

Si representamos cada operación de la lista anterior por f0, f1, f2, f3 tenemos que:

f0(n, m) = n+1

f1(n, 0) =n f1(n, m+1) = f0(f1(n, m), m)

f2(n, 0) =0 f2(n, m+1) = f1(f2(n, m), m)

f3(n, 0) =1 f3(n, m+1) = f2(f3(n, m), m)

Esto define una sucesión infinita de funciones de 2 argumentos fk(n,m).

Pasamos a considerar una función de 3 argumentos g(k,n,m) = fk(n,m).

Esta función es claramente calculable y satisface la ecuación:

g(k+1, n, m+1)=g(k, g(k+1, n, m), n)

En este esquema, la variable n no tiene una misión esencial.

Prescindimos de ella y definimos ahora la función de Ackermann de dos argumentos:

A(0, m) = m+1 A(k+1,0) = A(k, 1) A(k+1, m+1) = A(k, A(k+1, m)) Es claro que esta función es intuitivamente calculable. Se puede demostrar que no es

PRIM, debido a que crece más rápido que cualquier función PRIM.

Nota: Para una demostración de este resultado véase [HER69]. Para otra variante de la

función de Ackermann se puede ver [DAV85].

(c) NECESIDAD DE AMPLIAR LA MINIMIZACIÓN ACOTADA.

Sea una función f∈PRIM1 y biyectiva. su inversa f-1 existe y es biyectiva.

¿Podemos asegurar que f-1∈PRIM1?.

La respuesta es negativa, pues dado un argumento n, tenemos que localizar el

origen p, tal que f(p)=n, y no sabemos donde se sitúa ese origen p.

Page 62: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 62 29/09/2004

Si tuviéramos alguna información adicional sobre donde está el origen p, quizás

podríamos hacerlo, aplicando minimización acotada (en forma básica o extendida), en la

forma:

f-1(n) = µp≤m[f(p)=n]

Sin embargo, esta función f-1 es intuitivamente calculable mediante el siguiente

proceso:

tomar p=0 mientras (f(p)≠n) hacer p = p+1 fin-mientras Y este proceso acaba en un número finito de pasos, pues f es biyectiva.

Supongamos ahora que f solo es sobreyectiva. En este caso, dado un n, puede

hacer varios p origen de él. ¿Qué p localiza el proceso anterior? el menor (el cual es

único) y que existe por ser la función de partida sobreyectiva.

Supongamos ahora que f es no inyectiva y no sobreyectiva. En este caso, si

existe origen localiza el menor y si no existe el proceso no acaba.

Este proceso se puede generalizar en dos sentidos:

(1) Tomar como función de partida g(x) = f(x)-n. Entonces, en vez de obtener el menor

p tal que f(p)=n, se pide obtener el menor p tal que g(p)=0 y el proceso anterior queda:

tomar p=0 mientras (g(p)≠0) hacer p = p+1 fin-mientras (2) Considerar funciones de mas de un argumentos y realizar el proceso de inversión

con relación al último argumento, es decir

Dada h de (k+1) argumentos, construir f de (k+1) argumentos tal que si h(m, p)=n, y p

es el menor que cumple esta igualdad, entonces f(m, n) =p.

La combinación de las dos generalizaciones da origen a una nueva operación

para generar funciones.

IV.3 Las funciones µµµµ-recursivas.

Definición 4.42:(minimización no acotada). Sea k≥0. Sea g una función de (k+1)

argumentos. La minimización no acotada de g es la función f de k argumentos definida

por:

Page 63: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 63 29/09/2004

f(n) = el menor m tal que g(n, m) = 0 si tal m existe

en otro caso↑���

Brevemente: f(n) = µm[g(n, m)=0]

Definición 4.43:(funciones µ-recursivas)

La clase de las funciones µ-recursivas (µ-REC) es la menor clase que contiene la

funciones iniciales y es cerrada por las operaciones de composición, recursión primitiva

y minimización no acotada.

Dicho de otra forma:

(1) Si una función es inicial entonces es recursiva.

(2) Si g, h1, h2, …, hl son funciones recursivas, entonces la función f obtenida desde g,

h1, h2, …, hl por composición, también es recursiva.

(3) Si g y h son funciones recursivas, entonces la función f obtenida desde g y h por

recursión primitiva, también es una función recursiva.

(4) Si g es una función recursiva, entonces la función f obtenida desde g por

minimización no acotada, también es una función recursiva.

(5) ninguna otra función es recursiva.

Nota: La minimización no acotada da origen a funciones parciales.

Se define la clase µ-TREC como la clase de las funciones recursivas totales.

µ-RECk es la clase de la funciones recursivas de k argumentos.

µ-TRECk es la clase de la funciones recursivas totales de k argumentos.

µ-REC=k≥0� µ-RECk; µ-TREC=

k≥0� µ-TRECk.

Definición 4.43:(Predicados y conjuntos µ-recursivos).

Page 64: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 64 29/09/2004

Al igual que hicimos para definir predicados a partir de la funciones recursivas

primitivas, se definen las siguientes clases de predicados y conjuntos:

Predicados recursivamente decidibles: PRED(TREC)= { Pf | f∈TREC}

Predicados recursivamente enumerables: PRED(REC)= { Pf | f∈REC}

Conjuntos recursivamente decidibles: DEC = {VP | P∈ PRED(TREC)}

Conjuntos recursivamente enumerables: ENUM = {VP | P∈ PRED(REC)}

Nota: para abreviar se omite la palabra “recursivamente” y se habla de decidibles y

enumerables.

Page 65: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 65 29/09/2004

CAPITULO V: TEOREMA DE EQUIVALENCIA. LA TESIS DE CHURCH.

En este capítulo vamos a demostrar que los dos modelos desarrollados en los

capítulos anteriores son equivalentes, en el sentido de que definen la misma clase de

funciones. Este mismo resultado se puede demostrar entre cualesquiera otros dos

modelos que se consideren, de entre los citados en el capítulo 2 y otros más que no

hemos citado. Esas equivalencias justifican la afirmación conocida como Tesis de

Church Concluye este capítulo con un apéndice sobre la capacidad expresiva del

lenguaje WHILE con respecto a las estructuras de datos estáticas.

Comenzamos enuncinando el teorema de equivalencia:

Teorema 5.1: La clase de las funciones recursivas coincide con la clase de las

funciones calculables mediante programas WHILE: µ-REC=F(WHILE).

La demostración se estructura en dos lemas, relativos al doble contenido de una

clase en otra. Estos lemas a su vez se descomponen según el cuadro siguiente:

µ-REC=F(WHILE)

REC F WHILE

funciones

F WHILE REC

función siguiente

���

���

���

���

�����

�����

( )

( )

inicialescomposiciónminimizaciónrecursión primitiva

función cálculofunción tiempofunción calculada

V.1 µµµµ-REC⊆⊆⊆⊆F(WHILE)

Page 66: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 66 29/09/2004

Veamos en primer lugar que toda función µ-REC es calculable mediante un programa

WHILE.

La demostración procede según el cuadro anterior. Planteamos cada parte como

un ejercicio.

Ejercicio 5.2: Demostrar que las funciones iniciales dadas para µ-REC, se pueden calcular mediante programas WHILE. Solución: La función cero, Z, es calculada por el programa (0,1, P) cuyo código P es: begin X1:=0 end La función sucesor, σ, es calculada por el programa (1, 1, Q) cuyo código es. begin X1:= X1 + 1 end Para cada k≥0, para cada i, 0≤i≤k, la función proyección pi(k,i) es calculada por el programa (k,k, R) cuyo código es: begin X1:=Xi end Ejercicio 5.3: Sea l>0 y k≥0. Sea g∈Fl(WHILE) y sean h1, h2, …, hl∈Fk(WHILE). Demostrar que la función f de k argumentos obtenida por composición a partir de estas funciones tambien es calculable mediante un programa WHILE. Solución: La función f es calculada por el macroprograma (k, k+l, S) cuyo código es: begin Xk+1 := h1(X1, …, Xk); Xk+2 := h2(X1, …, Xk); … Xk+l := hl(X1, …, Xk); X1 := g(Xk+1, …, Xk+l) end Ejercicio 5.4: Sea k≥0. Sea g∈Fk(WHILE) y sea h∈Fk+2(WHILE). Demostrar que la función f de (k+1) argumentos obtenida a partir de g y h por recursión primitiva también es calculable mediante un programa WHILE. Solución: La función f es calculada por el macroprograma (k+1, k+3, S) cuyo código es: begin

Page 67: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 67 29/09/2004

Xk+2:= g(X1, …, Xk); do Xk+1 times Xk+2:= h(X1, …, Xk, Xk+3, Xk+2); Xk+3:= Xk+3 + 1; od: X1:= Xk+2 end Ejercicio 5.5: Sea k≥0. Sea g∈Fk+1(WHILE). Demostrar que la función f de k argumentos obtenida a partir de g por minimización no acotada también es calculable mediante un programa WHILE. Solución: La función f es calculada por el programa (k, k+1, S) cuyo código es: begin while g(X1, …, Xk, Xk+1)≠0 do Xk+1:= Xk+1 + 1 od; X1:= Xk+1 end Lema 5.6: µ-REC ⊆ F(WHILE). Demostración: Hemos visto en los ejercicios anteriores como las funciones iniciales y los operadores funcionales que definen las funciones recursivas son calculables mediante programas WHILE. Luego, dada f∈µ-REC, esta se construye a partir de las funciones iniciales (WHILE-calculables) por sucesivas aplicaciones de los operadores funcionales (WHILE-calculables). Por tanto, f∈F(WHILE).

V.2 Codificación de Cantor Para ver el contenido inverso, que toda función calculable mediante un

programa WHILE es µ-REC, necesitamos representar mediante número naturales,

configuraciones de programas. Para ello vamos a usar la posibilidad de representar

vectores de números naturales de longitud dada fija, mediante números naturales.

G. Cantor demostró que el orden de infinitud de N2 es el mismo que el de N,

estableciendo una función biyectiva entre ambos conjuntos. Vamos a desarrollar esa

función y demostrar que tanto ella como las proyecciones de su inversa son funciones

recursivas primitivas.

Construir una función biyectiva σ12 :N2→N es equivalente a buscar un recorrido

en N2, que pase exactamente una vez por cada punto.

El recorrido lo hacemos por las diagonales inversas es decir:

Page 68: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 68 29/09/2004

(0,0) (1,0), (0,1) (2,0), (1,1), (0,2) … (n,0), …, (n-k, k), … (0,n) …

Notese que al recorrer una diagonal inversa, la suma de las dos componentes se

mantiene constante e igual a la primera componente de la base de esa diagonal.

Ejercicio 5.7: Encontrar una expresión para σ12 y demostrar que es PRIM

Solución:

σ12 (x,0) = 1+2+3+ …+x = x(x+1)/2

σ12 (x, y) = nº de unidades para llegar a la base de su diagonal +

nº de unidades para llegar al punto (x,y)=

σ12 (x+y, 0) + y=

(x+y)(x+y+1)/2 + y

Esta función es PRIM, pues solo hay sumas, productos y cociente entre 2 (que da

exacto, pues de dos número consecutivos uno siempre es par).

Ejercicio 5.8: Construir las proyecciones de la función inversa de σ12 , es decir:

σ2 11

, :N→N, que, dado un número natural z imagen de un par ordenado (x,y), calcula la

primera componente de ese par, x.

σ2 21

, :N→N, que, dado un número natural z imagen de un par ordenado (x,y), calcula la

segunda componente de ese par, y.

Y demostrar que son PRIM.

Solución:

Buscar la diagonal a la cual pertenece el número.

Para ello calcular σ12 (t, 0) para t=0,1,2, … hasta que nos quedemos lo mas cerca de z sin

pasarnos (o lo que es lo mismo, hasta que nos pasemos de z por primera vez y

quedarnos con el anterior):

d(z) = (µt≤z[σ12 (t, 0)>z])-1

Como d(z) es la diagonal, el valor de y es la distancia hasta alcanzar z, luego:

σ2 21

, (z) = z- σ12 (d(z), 0).

Page 69: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 69 29/09/2004

Como d(z) es la diagonal (suma de x e y) y ya conocemos y (σ2 21

, (z)), resulta:

σ2 11

, (z) = d(z) - σ2 21

, (z)

Hemos usado minimización acotada, resta y composición de funciones PRIM,

luego las dos funciones construidas son PRIM.

Ejercicio 5.9: Generalizar los resultados anteriores para obtener aplicaciones biyectivas

de Nk en N que sean PRIM

Solución:

σ13(x,y,z) = σ1

2 (x, σ12 (y,z)).

σ3 11

, (w) = σ2 11

, (w)

σ3 21

, (w) = σ2 11

, (σ2 21

, (w))

σ3 31

, (w) = σ2 21

, (σ2 21

, (w))

En general, el esquema de codificación de Cantor para k+1, se define a partir del

esquema para k:

σ11k+ (x1, …,xk+1) = σ1

2 (x1, σ1k (x2, …, xk+1)).

σk+1 11

, (w) = σ2 11

, (w)

σk i+11

, (w) = σk i, −11 (σ2 2

1, (w)), para 2≤i≤k+1

Y por la forma de construcción es claro que todas son funciones de PRIM.

Ejercicio 5.10: Sea Q=(n, p, P) un programa WHILE. Sea CQ el conjunto de las configuraciones para Q. Aplicar la codificación de Cantor, para representar estas configuraciones mediante números naturales. Solución: Como el programa de partida usa p variables, las configuraciones tienen p+1 componentes (una más para el número de línea de la versión etiquetada). Luego estamos hablando de elementos de Np+1, que se codifican mediante σ1

1p+ . Ejercicio 5.11: Desarrollar la función extraer, extr:N2→N, tal que, si z es la codificación de una configuración, extr(z, i) es el valor de la componente i, 1≤i≤p+1. Y demostrar que es PRIM. Solución: extr(z, i) = σp i+1

1, (z)

Esta función es PRIM, por ser una codificación de Cantor.

Page 70: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 70 29/09/2004

Ejercicio 5.12: Desarrollar la función reemplazar, reem:N3→N, tal que, si z es la codificación de una configuración, reem(z,x,k) es el número de la configuración resultante de reemplazar en z la componente k por el valor x, 1≤k≤p+1. Solución: reem(z,k,x)= σ1

1p+ (extr(z,1), …, extr(z,k-1), x, extr(z, k+1), …, extr(z,p+1)). Esta función es PRIM por ser composición de funciones PRIM. Ejercicio 5.13: Desarrollar la función actualizar, actu:N3→N, tal que, si z es la codificación de una configuración, actu(z,x,k) es el número de la configuración resultante de reemplazar en z la componente k por el valor x, 1≤k≤p+1 e incrementar en 1 el número de línea. Solución: actu(z,k,x)= σ1

1p+ (extr(z,1)+1, …, extr(z,k-1), x, extr(z, k+1), …, extr(z,p+1)). Esta función es PRIM por ser composición de funciones PRIM. V.3 F(WHILE)⊆⊆⊆⊆ µµµµ-REC El resultado de esta sección se alcanza por un procedimiento distinto del seguido en la sección V.1. Ahora, dada una función en F(WHILE) sabemos que existe un programa que la calcula. Desarrollando la semántica operacional de ese programa, según los pasos especificados en el cuadro siguiente:

F WHILE REC

función siguiente

( ) ⊆

���

���

función cálculofunción tiempofunción calculada

veremos que cada función de las descritas es µ-recursiva, con lo que alcanzaremos el resultado deseado. Lema 5.13: F(WHILE) ⊆ µ-REC Demostración (comienzo): Sea f∈F(WHILE), entonces existe un programa WHILE Q=(n, p, P) que calcula f. Consideremos la versión etiquetada de Q y las configuraciones asociadas a Q, codificadas según el ejercicio anterior. Veamos que f es una función µ-recursiva, demostrando que la función siguiente (SIGQ), la función cálculo (CALQ), la función tiempo (TQ) y, por último, la función calculada (fQ, que es la propia f) son µ-recursivas. Mas aún, veremos que el operador de minimización solo se aplica una vez al determinar TQ. Ejercicio 5.14: Dado un programa WHILE Q=(n, p, P) cuya versión etiquetada tiene líneas numeradas de 1 a f, sea la función configuración siguiente (SIGQ ) definida en el capítulo 1. Considérese definida de N en N aplicando codificaciones de configuraciones en codificaciones de configuraciones. Demostrar que es PRIM. Solución:

Page 71: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 71 29/09/2004

SIGQ: N→N está definida por:

SIGQ(z) =

���

���

+≥ 1f extr(z,1) siz

f = extr(z,1) si)z(fsig

...

1 = extr(z,1) si)z(1sig

0=1) extr(z, siz

Esta función está definida por casos. Los predicados son recursivos primitivos y la primera y última parte es la función identidad que es recursiva primitiva. Queda demostrar que cada sigk es una función recursiva primitiva. Consideramos una genérica y veamos como se define según la sentencia que aparezca en esa línea. (a) asignación k: Xi:=0 sigk(z) = actu(z, i+1, 0) k: Xi:= Xj sigk(z) = actu (z, i+1, extr(z,j+1)) k: Xi:= Xj + 1 sigk(z) = actu (z, i+1, extr(z,j+1)+1) k: Xi:= Xj - 1 sigk(z) = actu (z, i+1, extr(z,j+1)-1) (b) cabacera de while k: while Xi≠0 do :k’

sigk(z) = reem z k si extr(z,reem z k si extr(z,

( , , )( , , ' )

1 11 1

+ ≠+ =

���

i +1) 0 i +1) 0

(c) cola de while k: od :k’ (supuesto que la variable de control en la cabecera es Xi)

sigk(z) = reem z k si extr(z,reem z k si extr(z,

( , , ' )( , , )

1 11 1

+ ≠+ =

���

i +1) 0 i +1) 0

Ejercicio 5.15: Dado un programa WHILE Q=(n, p, P) cuya versión etiquetada tiene líneas numeradas de 1 a f, sea la función cálculo (CALQ ) definida en el capítulo 3 (con

Page 72: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 72 29/09/2004

la imagen codificada). Haciendo uso del ejercicio anterior, demostrar que la función cálculo es PRIM. Solución: CALQ(x, 0) = σ1

1p+ (1,x) CALQ(x, y+1) = SIGQ(CALQ(x, y)) Luego la función se expresa mediante un esquema de recursión primitiva simplificado en base a funciones PRIM. Por tanto es PRIM. Ejercicio 5.16: Dado un programa WHILE Q=(n, p, P) cuya versión etiquetada tiene líneas numeradas de 1 a f, sea la función tiempo (TQ ) definida en el capítulo 1. Haciendo uso del ejercicio anterior, demostrar que la función tiempo es µ-REC. Solución: TQ(x) = µt[extr(CALQ(x, t), 1 )= f+1] Luego la función tiempo se expresa mediante la minimización de una función PRIM, por tanto es µ-REC. Ejercicio 5.17: Dado un programa WHILE Q=(n, p, P) cuya versión etiquetada tiene líneas numeradas de 1 a f, sea la función calculada (fQ ) definida en el capítulo 1. Haciendo uso de los dos ejercicios anteriores, demostrar que la función calculada es µ-REC. Solución: Sea x∈Nn y sea 0∈Np-n, el vector con (p-n) ceros. Entonces la expresión de fQ es: fQ(x) =extr( CALQ(x, 0, TQ(x, 0)), 2) que es una composición de funciones recursivas y por tanto es µ-REC. Demostración del lema 5.13(conclusión): Como fQ es la función f de partida, hemos demostrado con este último ejercicio que f es µ-REC . Con la demostración de este lema queda demostrada el teorema enunciado al principio del capítulo: µ-REC=F(WHILE). Teorema 5.18(forma normal de Kleene): Toda función recursiva admite una expresión

con una sola aplicación del operador de minimización.

Demostración: Dada una función recursiva, por la primera parte del teorema sabemos

que existe un programa WHILE que la calcula. A partir de ese programa WHILE y

Page 73: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 73 29/09/2004

siguiendo el proceso de demostración de la segunda parte vemos que la función admite

una expresión con una sola aplicación del operador de minimización (en TQ).

Corolario 5.19: Cualquier programa WHILE admite uno equivalente con un solo bucle

indefinido.

Demostración: Dado un programa WHILE, siguiendo la segunda parte del teorema

tenemos que la función calculada admite una expresión con una sola aplicación de la

minimización. Esta expresión se transforma en un programa (siguiendo la primera parte

de la demostración) en el cual cada aplicación de la composición se transforma en

secuencia, la recursión primitiva se transforma en bucles definidos y la única aparición

de la minimización se trasforma en el único bucle indefinido.

Ejercicio 5.20: ¿Por qué no se estudió en el capítulo 3 la jerarquía definida por

anidamiento de bucles indefinidos, al igual que se hizo para LOOP con los bucles

definidos?

Solución: Porque según el corolario anterior los bucles indefinidos anidados se pueden

reducir no solo a un nivel de anidamiento, más aún, a un solo bucle.

V.4 Tesis de Church La equivalencia demostrada entre los dos modelos desarrollados en los capítulos

3 y 4 se cumple también, mediante demostraciones similares, entre los restantes

modelos del concepto de algoritmo ( ver capítulo 1).

A partir de estos desarrollos Churh expresó la tesis que lleva su nombre, la cual

afirma que la máquina de Turing y cualquiera de sus modelos equivalentes formalizan

el concepto intuitivo de algoritmo.

Veanse las evidencias a favor de esta tesis en el capítulo 1.

A partir de este momento, a esta clase la denominaremos clase de las funciones

recursivas o efectivamente calculables y la representaremos por REC, con sus variantes

relativas a número de argumentos (REC1, REC2, …) y a totalidad (TREC).

Page 74: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 74 29/09/2004

A partir de este momento, cuando se pida o se pretenda demostrar que una

función es efectivamente calculable bastará o bien escribir un programa WHILE que la

calcule o dar una expresión como función µ-recursiva.

V.5 Apéndice: Capacidad expresiva del lenguaje WHILE respecto a las

estructuras de datos estáticas. En el capítulo 3 vimos la capacidad expresiva de WHILE respecto al control.

Ahora considerense las codificaciones de Cantor. Ellas permiten representar muchos

tipos de datos y estructuras de datos mediante número naturales.

Ejercicio 5.21: Demostrar que se pueden representar los números enteros mediante

números naturales.

Solución: Un número entero z se representa de infinitas formas como sigue:

Si z>0 {(z, 0), (z+1,1), …}

Si z<0 {(0, z), (1, z+1), …}

Esto se codifica de manera inmediata con un número natural.

Solo quedaría definir adecuadamente las operaciones en esta codificación.

Ejercicio 5.22: Demostrar que se pueden representar los números racionales mediante

números naturales.

Solución: Un número racional q se representa de infinitas formas como fracción, y por

tanto, como un par ordenado (n, d) (numerador, denominador).

Esto se codifica de manera inmediata con un número natural.

Solo quedaría definir adecuadamente las operaciones en esta codificación.

Ejercicio 5.23: Razonar sobre la represetación mediate número naturales de estructuras

tales como registros, arrays, etc.

Ejercicio 5.24: ¿Por qué no podemos representar estructuras dinámicas?

Solución: Porque su tamaño puede variar según las operaciones a las que se someta la

estructura y las codificaciones de Cantor exigen un tamaño fijo y conocido a priori.

Page 75: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 75 29/09/2004

No obstante esta cuestión quedará resuelta de forma satisfactoria en el próximo capítulo

mediante las codificaciones de Gödel.

Page 76: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 76 29/09/2004

CAPITULO VI: INDEXACIONES Y UNIVERSALIDAD

Los programas WHILE toman como entrada números naturales y producen

como salida un número natural.

¿Es posible que un programa tenga como entrada otro programa?

Desde un punto de vista práctico la respuesta es SI, por ejemplo los compiladores.

¿Es posible que un programa WHILE tenga como entrada otro programa

WHILE?

La respuesta será afirmativa si somos capaces de representar programas WHILE

mediante números naturales.

Los programas WHILE no tiene longitud fija. No podemos usar codificaciones

de Cantor. Para resolver este problema introducimos las codificaciones de Gödel.

¿Es posible construir un programa U (universal) que tenga como entrada un

programa P (representado por un número natural) y los datos de entrada D a ese

programa, de manera que la ejecución de U sobre (P, D) simule la ejecución de P sobre

D?

La respuesta será afirmativa, y construiremos ese programa universal, que será

un programa WHILE; y por tanto tendremos una función universal U (la calculada por

el programa U), que será REC.

Y para subclases de REC: TREC, PRIM, F(LOOPi), Su correspondiente función

universal, ¿está dentro de cada subclase?

La respuesta será negativa, REC es la menor clase tal que la función universal

pertenece a REC.

Cerraremos esta capítulo con el uso de las codificaciones de Gödel para

representar estructuras de datos dinámicas.

VI.1 Indexaciones

Page 77: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 77 29/09/2004

Los comentarios con que hemos acabado la sección anterior describe un nuevo

concepto, una indexación concreta de las funciones RECn. Veamos ahora la definición

general.

Definición 6.1:(indexación)

Sea F un conjunto numerable de funciones. Una indexación de F es una función

sobreyectiva h:N→F. Un índice de una función f∈F es cualquier número natural i tal

que h(i) = f.

Ejemplo 6.2: La numeración de Gödel de programas WHILE es una indexación de

RECn para cada n≥0. Una función dada de RECn tiene infinitos índices bajo esta

indexación, como ya hemos dicho.

Ejercicio 6.3: Definir una indexación para la clase de las funciones lineales de N en N,

de la forma f(x)=mx+n.

Solución:(esbozo)

Dado un número natural, mediante decodificación de Cantor lo descomponemos

en dos, el primero es el coeficiente de la x, y el segundo es el término independiente.

VI.2 Codificaciones de Gödel.

Permiten representar como números naturales sucesiones finitas de elementos de

N pero de longitud arbitraria.

Definición 6.4: El conjunto de las naturales sucesiones finitas de elementos de N, N*,

se define como sigue:

(1) (), la sucesión de longitud 0, también representada por ε, pertenece a N*

(2) (n)∈N*, para todo n∈N, son las sucesiones de longitud 1.

(3) (n1, …, nm)∈N*, para todo (n1, …, nm)∈Nm, sucesiones de longitud m, para m≥2.

Page 78: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 78 29/09/2004

La longitud de un elemento x de N* se representa por L(x). Mas formalmente,

definimos la función L:N* →N como sigue:

L(ε)=0, L(n)=1 ∀n∈N, L(n)=m ∀n∈Nm.

Definición 6.5: Una codificación de Gödel es una aplicación biyectiva de N* en N.

Una primera aproximación a una codificación de Gödel sería codificar el vector

segun Cantor, y después codificar dos componentes: longitud del vector y la

codificación antes obtenida.

Ejercicio 6.6: Dar una definición formal de esta codificación

Solución:

cod(x)= 0 si L(x) = 0 (L(x), (x)) resto1

21L(x)σ σ

���

Ejercicio 6.7: Estudiar si esta función es biyectiva

Solución:

No es biyectiva, porque σ12 (0, x) está definido y no es el código de una sucesión finita.

Este problema es evitable con pequeñas modificaciones.

Definición 6.8: (codificación de Gödel que usaremos)

god(x)= 0 si L(x) = 01+ (L(x) -1, (x)) resto1

21L(x)σ σ

���

Ejercicio 6.9: Desarrollar la función l:N→N, definida por l(z)= la longitud de la

sucesión codificada por z.

Solución: l(z) = 1 + σ2 11

, (z-1)

Page 79: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 79 29/09/2004

Ejercicio 6.10: Desarrollar la función extraer, extr:N2→N, definida por extr(z, k)=

extraer la componente k de la sucesión finita codificada por x; si tal k no existe,

devolver 0.

Solución:

extr(z, k)= 0 si z = 0 o k > l(z)

( (z -1)) restol(z),k1

2,21σ σ

���

Ejercicio 6.11: Desarrollar la función reemplazar, reem: N3→N, definida por reem(z, k,

x) = reemplazar en la secuencia codificada por z, la componente k por el valor x y

obtener el código de la nueva secuencia.

Solución:

reem(z, k, x)=

��

��

≠≤−σ−σ

σ−σσ−σ

0ky l(z)k sil(z))))extr(z, ..., 1),+kextr(z, x,),1k,z(extr),...,1,z(extr(,1)z(l(+10=k z

0=l(z)y l(z)>k si x))0, ..., 0,(,1k(+10>l(z)y l(z)>k six))0, ..., l(z)),0,extr(z,),...,1,z(extr(,1k(+1

l(z)1

21

k1

21

k1

21

Nota: las funciones l, extr y reem son WHILE-calculables, pero la función god no es

WHILE-calculable. Esta función es calculable en sentido intuitivo, pero no puede ser

WHILE-calculable, por que los programas WHILE tienen por definición un número

finito fijo de variables de entrada. la función god es WHILE-calculable relativa a una

codificación, por ejemplo:

Dada una sucesión finita de naturales (x1, …, xn)

- escribir cada xi en binario sin ceros superfluos(bi)

- sea y el número cuya representación ternaria es b12b22b32…2bn.

- escribir un programa WHILE que dado y calcule god(x1, …, xn).

VI.3 Codificación de Gödel de programas WHILE

Desarrollamos ahora un esquema de codificación de programas WHILE.

Comenzamos definiendo la codificación de instrucciones, después la codificación de

sucesiones de instrucciones y por último de programas.

Page 80: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 80 29/09/2004

Instrucción Código

Xi:=0 5(i-1)

Xi:=Xj 5σ12 (i-1, j-1) + 1

Xi:=Xj + 1 5σ12 (i-1, j-1) + 2

Xi:=Xj - 1 5σ12 (i-1, j-1) + 3

while Xi≠0 do S od 5σ12 (i-1, codi(S)) + 4

Sea S = S1, S2, …, Sm una sucesión de instrucciones. Entonces se define su código como

codi(S) = god(codi(S1), codi(S2), …, codi(Sm)) - 1

De este modo, podríamos definir una función comp que obtenga los componentes que

caracterizan a una instrucción WHILE de la siguiente forma:

Funcion: comp Entradas: S, i (* S es el código de una instrucción e i indica el componente ∈ {1, 2} *) Salida: x Método: begin if (Tipo(S)=0 ∧ i=1) x:=S/5+1; else if (i=1)

x:= 1+σ2 11

, ((S-Tipo(S))/5); else x:= 1+σ2 2

1, ((S-Tipo(S))/5);

fi fi end

Hemos descrito cómo encontrar el código de una sucesión de instrucciones P. Queda

asignar códigos a los programas. Un programa WHILE es una terna (n, p, P). El uso de

los números de Gödel de programas WHILE está restringido al caso donde n es fijo.

Esto es, para cada n supondremos una numeración de Gödel fija. En este caso, n y p no

son de nuestra incumbencia (n es fijo y p se puede tomar igual al índice de la variable

con mayor índice que aparece en la sucesión P). Por tanto, el código de (n, p, P) es

codi(P).

Page 81: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 81 29/09/2004

No obstante, por completitud veamos cómo codificar (n, p, P). n y p no son

independientes. Si m es el índice de la variable de mayor índice que aparece en P,

entonces p≥max(n, m). Por tanto, definimos

codi((n, p, P)) = σ13(n, p-max(n, m), codi(P)).

Ejercicio 6.12: Calcular el código del siguiente programa: (1, 2, P)

P: X2:= X1;

while X2 ≠ 0 do

X1:= X1+1;

X2:= X2 - 1

od

Ejercicio 6.13: Calcular el código de programas desarrollados en capítulos anteriores,

que calculan las siguientes funciones: cero, sucesor, suma, resta, signo, proyección,

función constante (con salida fija, y con salida variable c).

Resumen:

Hemos estudiado la numeración de Gödel de sucesiones finitas (pero de longitud

arbitraria) de números naturales y también la numeración de Gödel de programas

WHILE. Así pues, tenemos:

(1) un número natural g

(2) el correspondiente programa WHILE Pg cuyo número es g

(3) la función fg calculada por este programa Pg.

Dado un número, se puede encontrar de manera única el programa que lo tiene como

código. Recíprocamente, dado un programa se puede encontrar de manera única su

número.

Sin embargo, la correspondencia entre números de Gödel y RECn no es biyectiva. Dado

un número existe un único programa y una única función; pero dada una función en

RECn hay infinitos programas y por tanto infinitos números de Gödel que corresponden

a esa función.

Ejercicio 6.14: Justificar razonadamente, con ejemplos, la última afirmación realizada.

Page 82: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 82 29/09/2004

VI.4 Un programa universal

Como dijimos al comienzo del capítulo, vamos a demostrar que el programa

universal existe y es un programa WHILE, lo cual dicho en términos de funciones es el

siguiente teorema.

Definición 6.15:(función universal).

Sea F un conjunto numerable de funciones de Nn en N, y h una indexación de F.

La función U:Nn+1→N es universal para la clase F relativa a la indexación h, si y solo si

U(i, x) = h(i)(x), para todo i∈N y x∈Nn.

Ejercicio 6.16: Definir la función universal para la clase del ejercicio anterior.

Si U es universal es frecuente escribir Ui en lugar de hi. Esta notación lleva implícita la

indexación relativa a la cual U es universal para la clase F, y la igualdad anterior queda:

U(i, x) = Ui(x), para todo i∈N y x∈Nn.

Teorema 6.17: La función universal para RECn pertenece a RECn+1.

Demostración:

Vamos a desarrollar un macroprograma que tiene como entradas un número g (el

código de un programa WHILE - función codi -), y las entradas x al programa de

número de Gödel g, y produce como salida, la salida del programa g al ejecutarse sobre

las entradas x.

Lo hacemos por refinamiento progresivo:

Sea M una variable que representa la memoria; M almacena los valores de las

variables del programa g. Inicialmente está a cero.

Entonces el primer nivel de refinamiento es:

inicializar(M);

simular(g, M);

salida(M)

Page 83: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 83 29/09/2004

Ejercicio 6.18: Desarrollar la macrosentencia inicializar, que asigna a M el número de

Gödel de las variables de entrada al programa g.

Solución:

M:= god(x)

Ejercicio 6.19: Desarrollar la macrosentencia salida, que copia desde M el primer valor

en la variable X1.

Solución:

X1:= extr(M, 1)

La macrosentencia simular es la parte principal del programa universal. Informalmente

esta macro hace lo que sigue:

- convertir g de código de programa a número de Gödel.

- mientras la longitud restante sea no nula hacer:

- localizar la primera instrucción

- si es una asignación, ejecutarla y eliminar la instrucción de g.

- si es una instrucción while, con cuerpo la sucesión de instrucciones S:

- si la variable de control es no nula (se obtiene de M), añadir a g las

instrucción del cuerpo del bucle

- si la variable de control es cero (se obtiene de M), eliminar el bucle de

g.

La macroinstrucción simular(g, M) queda como sigue:

g:=g+1; while (l(g)≠0) do S:=extr(g,1); if (Tipo(S)≤3) then M:=Ejecutar(S,M); g:=redu(g); else if (extr(M,Indice(S,1)) ≠0) then g:=añad(g,Comp(S,2)); else g:=redu(g); end; end;

Page 84: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 84 29/09/2004

end; La macroinstrucción ejecutar actualiza los valores de las variables del programa según

determine la instrucción de asignación que estemos considerando.

Ejercicio 6.20: Desarrollar la macro instrucción Ejecutar(S, r, M)

Solución:

Funcion: Ejecutar Entradas: S, M (* S es el código de una instrucción y M codifica las variables *) Salida: x Método: begin case (Tipo(S)) of 0: x:=reem(M, comp(S,1), 0); 1: x:=reem(M, comp(S,1), extr(M, comp(S, 2))); 2: x:=reem(M, comp(S,1), extr(M, comp(S, 2))); 3: x:=reem(M, comp(S,1), extr(M, comp(S, 2))); end; end;

Finalmente, las macros redu y añad sirven para actualizar la sucesión de instrucciones

que quedan por ejecutar.

Ejercicio 6.21: desarrollar las macros redu(g) y añad(g)

Solución:

redu(g)

g:= 1+σ12 (l(g) - 2, σ2 2

1, (σ2 2

1, (g-1)));

añad(g, z)

g:= σ12 (l(z)+l(g)-1, 1)g(l

1+σ (extr(z,1), … , extr(z,l(z)), σ2 2

1, (g-1)))

Fin de la demostración del teorema.

Ejercicio 6.22: Dar al menos dos índices para la función que siempre diverge.

Ejercicio 6.23: Demostrar que existe una función F en PRIM1 tal que para todo n, el

programa de número n calcula la misma función que el programa de número F(n).

Ejercicio 6.24: Demostrar que existen infinitas funciones con el comportamiento de la

F del ejercicio anterior.

VI.5 La función universal para subclases de REC

Page 85: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 85 29/09/2004

Notese que hemos demostrado que la función universal para la clase REC es una

función REC. Pues bien, esto no es cierto para subclases de REC como prueban los

siguientes resultados.

Ejercicio 6.25: Demostrar, haciendo uso del método diagonal que la función universal

para PRIM1 no es PRIM.

Solución:

Igual que hemos asignado números de Gödel a los programas WHILE, los

podemos asignar a los programas LOOP (cuyas funciones calculadas coinciden con

PRIM). Sea UP la función universal para PRIM1. Veamos que no puede ser PRIM por

reducción al absurdo.

Supongamos que UP (universal para las PRIM1) es PRIM. Entonces, la función

f(x) = UP(x,x) +1

esta definida por transformación explícita a partir de UP y del sucesor, luego f es PRIM1

luego le corresponde un número de Gödel g.

Por ser g el número de f y por ser UP universal tenemos que f(g) = UP(g,g)

Por la definición de f tenemos que f(g) = UP(g,g) +1.

Por ser todas las funciones de PRIM1 totales resulta que UP es total luego

UP(g,g) está definido. Igualando las dos expresiones anteriores tenemos que

UP(g,g) = UP(g,g) + 1 absurdo.

Nota: UP pertenece a TREC2, pero no pertenece a PRIM.

Ejercicio 6.26: Demostrar haciendo uso del método diagonal que la función universal

para F(LOOPi) no pertenece a F(LOOPi).

Ejercicio 6.27: Demostrar haciendo uso del método diagonal que la función universal

para TREC no es recursiva.

Solución:

Sea UT una función que es universal para TREC1 respecto a cierta indexación. Entonces

UT es total. Aplicando exactamente el mismo razonamiento anterior cambiando PRIM

por TREC llegamos a contradicción.

La contradicción a que llegamos es que no puede ser recursiva y total. Sabemos

que es total, luego no puede ser recursiva.

Page 86: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 86 29/09/2004

Teorema 6.28: No es posible definir un lenguaje de programación tal que los

programas de ese lenguaje calculen todas y solo las funciones recursivas totales, y tal

que uno pueda listar de manera efectiva todos los programas válidos del lenguaje.

Demostración:

Si los programas válidos se pudieran listar de manera efectiva, entonces se

podrían asignar de manera efectiva números de Gödel a estos programas válidos, y

entonces, se podría construir una función recursiva universal para TREC, lo que

contradice el ejercicio anterior.

Ejercicio 6.29: Demostrar que la clase de todas las funciones totales de N en N es no

numerable.

Solución: razonamiento análogo a los dos ejercicios anteriores.

Ejercicio 6.30: Demostrar que la clase de todas las funciones de N en N es no

numerable

Solución:

El método diagonal no se puede aplicar porque al trabajar con funciones

parciales, la igualdad fi(i) = fi(i) + 1 puede ser cierta cuando fi(i) no esté definida.

La demostración procede de una forma mas directa. Como las funciones totales

constituyen una subclase de las parciales. Si las totales son no numerables, las parciales,

que son más, tampoco.

VI.6 Apéndice: Capacidad expresiva del lenguaje WHILE respecto a

las estructuras de datos dinámicas.

Mediante codificaciones de Gödel, podemos representar sucesiones finitas de

longitud no prefijada, y cuya longitud cambia durante la ejecución de un programa.

Dejo al interés del lector el estudio de la representación de listas, arboles, grafos etc.

Page 87: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 87 29/09/2004

CAPITULO VII: PROBLEMAS NO RESOLUBLES

Este último capítulo está dedicado a mostrar la incapacidad de cualquier modelo

de cálculo para resolver determinados problemas. Comenzaremos introduciendo el

concepto de problema. Veremos que el problema de la parada no se puede resolver por

medios algorítmicos. Seguidamente definiremos la función “castor afanoso” y

demostraremos que no es computable. Continuaremos completando el estudio de los

predicados recursivamente enumerables y recursivamente decidibles. Seguidamente,

mediante una técnica estándar, demostraremos la imposibilidad de resolver una amplia

variedad de problemas. Por último, demostraremos un resultado debido a Rice cuya

consecuencia inmediata es la imposibilidad de la verificación formal de programas y,

derivado de esto, la insolubilidad de toda una familia de problemas que cumplen ciertas

características.

Incluimos en los preliminares de este capítulo el concepto de problema.

Definición 7.1:(problema). Sea P un predicado con n variables libres x1, …, xn que

toman valores en N. El problema P es la siguiente pregunta:

Dados unos valores particulares a1, …, an, ¿satisfacen el predicado P?, es decir,

¿P(a1, …, an)=V?.

Una instancia de un problema es una sucesión de valores que se pueden sustituir por las

variables en el predicado. Así, una instancia del problema P es (a1, …, an)∈Nn.

Las denominaciones de los problemas proceden de las correspondientes de los

predicados que los definen, según la siguiente tabla:

Page 88: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 88 29/09/2004

Problema Predicado Función asociada

recursivamente soluble recursivamente decidible recursiva total

parcialmente recursivam. soluble recursivamente enumerable recursiva parcial

recursivamente insoluble no recursivamente decidible no recursiva o no total

totalmente insoluble no recursivam. enumerable no recursiva

En lo que sigue, al referirnos a problemas y predicados omitiremos a veces la

palabra “recursivamente” y escribiremos problema soluble, parcialmente soluble,

insoluble o totalmente insoluble; así mismo escribiremos predicado decidible,

enumerable, no decidible o no enumerable. Tambien usaremos las abreviaturas rec.,

sol., insol., dec. y enum.

VII.1 El problema de la parada Hemos tenido serios problemas con las funciones recursivas totales. No se pueden

indexar y como consecuencia, no admiten una función universal recursiva.

¿Es que hay algún problema con decidir si una función es total o no?. Mas en concreto

¿Hay algún problema para saber si un programa concreto ante una entrada dada acaba?.

Notese que, como dijimos en el capítulo 1, si existiera un programa, tipo

universal UH (universal halting) que tuviera como entrada el número de Gödel de otro

programa P y la entrada x a ese programa y produjera como salida 1 si el programa P

con la entrada x acaba, o salida 0 si el programa P con la entrada x no acaba, sería de

gran utilidad pues antes de poner a funcionar P, le pasamos el chequeo para saber si

acaba, pues en caso contrario deberemos corregirlo pues no funciona correctamente.

El problema de la parada H tiene asociado el predicado H definido por:

H(g, x)=V si el programa de número g con la entrada x acabaF si el programa de número g con la entrada x no acaba

���

Para la función H relativa a programas con n entradas, se especifica el número

de entradas que estamos considerando escribiendo Hn (H1 es el problema de la parada

Page 89: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 89 29/09/2004

para programas con 1 entrada). Al escribir solo H indicamos que estamos considerando

el caso general, independientemente del número de entradas.

Ejercicio 7.2: Demostrar que el problema de la parada H1 es recursivamente insoluble.

Solución:

Por reducción al absurdo.

Supongamos que H1 es rec. sol., entonces la función asociada H1 definida por:

H1(g, x)=1 si el programa de número g con la entrada x acaba0 si el programa de número g con la entrada x no acaba

���

es TREC, luego hay un programa que calcula H y acaba en un número finito de pasos

para todas sus entradas.

Sea la función Mala definida por:

Mala(x) =1 0

1si H x xsi H x x

1

1

( , )( , )

=↑ =

���

Esta función la calcula el siguiente macroprograma:

X2:= X2 + 1;

while H1(X1, X1)≠0 do

X2:=0

od;

X1:=X2;

Luego Mala es efectivamente calculable y tiene un número de Gödel n.

Ejercicio 7.3: Si ha leído la solución hasta aquí, intente responder a la siguiente

pregunta: ¿Cuanto vale H1(n,n)?

Solución:

Page 90: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 90 29/09/2004

Si H1(n,n)=1, entonces el programa n (Mala) con la entrada n acaba; Mala sólo puede

acabar con un 1, y entonces H1(n,n)=0≠1.

Si H1(n,n)=0, entonces el programa n (Mala) con la entrada n no acaba; entonces

H1(n,n)=1≠0.

Resulta que H1(n,n) no puede ser ni 0 ni 1, pero por su definición debe ser 0 o 1.

Absurdo.

El absurdo proviene de suponer que H1 era total. Luego H1 no es total, luego el

problema de la parada es recursivamente insoluble.

Ejercicio 7.4: Demostrar que H1 es parcialmente rec. sol.

Solución:

Tengo que buscar una función que tome valor mayor que cero sii el programa i con la

entrada x acaba y que tome valor 0 ó diverja sii el programa i con la entrada x no acaba.

Una primera aproximación sería tomar la función universal para REC1, U1. Esta función

cumple que U1(i, x)↑ sii el programa i con la entrada x no acaba; pero no tenemos

garantizado el mayor que cero en caso de acabar (porque el programa i con la entrada x

puede dar salida 0) ¿Cómo resolver este problema? Asegurando que la salida es mayor

que 0, así pues una función REC2 asociada a H1 es:

F(i,x) = U1(i, x)+1.

Como U1 es parcial, F es parcial y por tanto H1 es parcialmente rec. sol.

VII.2 La función castor afanoso

Desarrollamos en esta sección, en base al lenguaje WHILE una función no

computable. La restricción de esta función al lenguaje LOOP dará origen a una función

computable que no es PRIM. Por último veremos que ocurre al restringirla a la jerarquía

subrecursiva definida respecto al nivel de anidamiento de bucles definidos.

Vamos a considerar en esta sección la clase REC1, es decir programas con una

sola entrada (X1).

Definición 7.5: Sea P un programa en el lenguaje WHILE. Se define la longitud de P

como su número de líneas, contando cada asignación y cada "do" como una línea.

Page 91: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 91 29/09/2004

Ejemplo 7.6: El siguiente programa

X2:= X1; while X2 ≠ 0 do X1:= X1+1; X2:= X2 - 1 od

tiene longitud 4.

Definición 7.7: La función castor afanoso (busy-beaver) Σ se define como sigue:

Para cada n, Σ(n) es el mayor valor que puede almacenarse en la variable X1 usando un

programa de longitud exactamente n que acaba comenzando con X1=0.

Explicación intuitiva: Dado un valor para n, p.e. 15,

- escribir todos los programas de longitud 15,

- poner como entrada X1=0, y seleccionar los que acaban

- para estos ver su salida, y tomar el valor mayor.

Teorema 7.8: La función castor afanoso Σ es no calculable, es decir, no puede haber un

programa en el lenguaje WHILE que la calcule.

Demostración:

Necesitamos dos resultados previos.

Ejercicio 7.9: Demostrar que para cada n, Σ(n+1) > Σ(n).

Solución: Sea P el programa que calcula Σ(n), esto es, P es de longitud n y con entrada

X1=0, acaba y produce la mayor salida.

Sea P’ el programa siguiente:

P

X1:=X1+1

Este programa tiene longitud n+1 y produce como salida Σ(n)+1, y puede haber algun

otro programa de longitud n+1 que produzca una salida mayor, luego

Σ(n+1)≥ Σ(n)+1>Σ(n).

Page 92: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 92 29/09/2004

Ejercicio 7.10: Demostrar que si f es calculable mediante un programa de longitud k,

entonces para cada n Σ(n+k) ≥ f(n).

Solución: Sea P el programa de longitud k que calcula f. Sea P’el siguiente programa:

X1:=X1 + 1;

…(n veces)

X1:=X1 + 1;

P

Este programa tiene longitud n+k; con entrada X1=0, tras las n primeras líneas X1 vale

n, y tras la ejecución de P, que calcula f, produce como salida f(n). Luego tenemos un

programa de longitud n+k cuya salida es f(n) y puede haber algun otro de esa longitud

que produzca una salida mayor, luego Σ(n+k) ≥ f(n).

Demostración del teorema 7.8:

Supongamos que Σ es calculable.

f(x)= 2x es calculable.

La composición de funciones calculables es calculable.

Entonces ß(n) = Σ(2n) será calculable mediante un programa P' de longitud k.

Aplicando el segundo ejercicio a ß(n), tenemos que para cada n:

Σ(n+k) ≥ ß(n) = Σ(2n)

Tomando n=k+1, resulta Σ(2k+1) ≥ Σ(2k+2),

contradicción con el primer ejercicio (crecimiento estricto de la función Σ).

Ejercicio 7.11: Demostrar la insolubilidad del problema de la parada a partir de la

incalculabilidad de la función castor afanoso.

Solución: Supongamos que el problema de la parada es resoluble. Para cada longitud n

dada, solo hay un número finito de programas distintos. Como suponemos que el

problema de la parada es resoluble, seleccionar los que acaban y obtener su salida. La

mayor salida es Σ(n).

Con lo cual la función castor afanoso sería calculable, en contra de lo que acabamos de

demostrar; por tanto, el problema de la parada es recursivamente insoluble.

Ejercicio 7.12: Denominamos ahora Σ a la función castor afanoso para el lenguaje

LOOP y denominamos Σi para Li. Demostar que la función Σ y cada una de las Σi son

efectivamente calculables y totales.

Page 93: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 93 29/09/2004

Solución: En estos lenguajes no existe el problema de la parada. Para cada n solo hay

un número finito de programas. Ejecutar todos y quedarnos con la salida mayor.

Ejercicio 7.13: Demostrar que no existe un programa LOOP que calcule la función Σ.

Solución: Repetir la demostración anterior paso a paso, en particular, la función f(x)=2x

es recursiva primitiva, luego se puede calcular por un programa LOOP.

Ejercicio 7.14: Adaptar el enunciado del ejercicio anterior para la jerarquía Li. ¿Para

que niveles i se verifica?.

Solución: No existe un programa en Li que calcule la función Σi.

Como la función f(x)=2x se puede calcular con solo nivel de anidamiento 1, el

enunciado se verifica para cada i>0.

Ejercicio 7.15: ¿Cual es la función castor afanoso en L0 (Σ0 )?. ¿A que clase pertenece?

Solución: En L0 no se puede usar bucles. El aumento de X1 solo se consigue con

asignaciones de incremento a X1. Para longitud n, la salida máxima se obtiene con n

incrementos, que producen salida n, luego es la identidad: Σ0(n) = n, ∀n. Y por tanto,

Σ0 ∈ F0.

En resumen:

La función Σ para el lenguaje WHILE no es efectivamente calculable.

La función Σ para el lenguaje LOOP es efectivamente calculable, total, pero no

es recursiva primitiva.

Para i > 0, cada una de las funciones Σi (para el lenguaje Li) no es calculable en

su propio lenguaje (Σi ∉ Fi).

En L0, Σ0 es la identidad: Σ0(n) = n, ∀n; Σ0 ∈ F0.

VII.3 Predicados recursivamente enumerables y recursiv. decidibles. En el capítulo 4 hemos estudiado los predicados recursivos primitivos y hemos

demostrado que son cerrados por disyunción, conjunción, negación, y cuantificación

acotada. Vamos ahora a completar este estudio en dos sentidos. Por una parte ver para

Page 94: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 94 29/09/2004

que operaciones de las antes citadas son cerrados los predicados r.e. y r.d. y por otra

vamos a estudiar que ocurre con la cuantificación no acotada.

Via codificación, un vector de naturales se puede representar como un solo

natural. Por ello, cuando interese, consideraremos predicados sobre N, teniendo en

cuenta que, mediante la decodificación adecuada, podemos estar representando

predicado de cualquier Nk dado.

Para realizar este estudio, introducimos seguidamente el predicado T de Kleene,

que se asocia a cada programa Q en el lenguaje WHILE.

Definición 7.16: (predicado KQ) Para cada programa Q con n entradas se define un

predicado KQ de n+1 argumentos:

Dados x∈Nn y t∈N, KQ(x, t)=V sii el programa Q con las entradas x acaba en a lo sumo

t pasos.

Ejercicio 7.17: Demostrar que KQ es un predicado recursivo primitivo.

Solución: Buscamos una expresión para este predicado que haga uso de predicados y

funciones recursivas primitivas:

KQ(x, t) = [extr(CALQ((x, 0), t), 1) = f+1]

donde los ceros correponden a las restantes variables que no son de entrada.

Ya se demostró en un capítulo anterior que extr y CALQ son funciones PRIM, y la

igualdad es un predicado PRIM, luego el predicado KQ es PRIM.

De forma más general, se define el predicado K de Kleene, que toma como otro

argumento más el código del programa.

Definición 7.18: (predicado K) Para programas con n entradas se define un predicado K

de n+2 argumentos de la siguiente forma:

Page 95: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 95 29/09/2004

Dados i∈N, x∈Nn y t∈N, K(i, x, t)=V sii el programa de número i con las entradas x

acaba en a lo sumo t pasos.

Ejercicio 7.19: Demostrar que K es un predicado recursivo primitivo.

Solución: Buscamos una expresión para este predicado que haga uso de predicados y

funciones recursivas primitivas. Sea U el programa universal para funciones de n

variables de entrada; U con líneas numeradas de 1 a f. Entonces la expresión de K es:

K(i, x, t) = [extr(CALU((i, x, 0), t), 1) = f+1]

donde los ceros correponden a las restantes variables que no son de entrada.

El mismo razonamiento del ejercicio anterior lleva a que es un predicado recursivo

primitivo y, por tanto, recursivamente decidible.

Ejercicio 7.20: Desarrollar de manera explícita un programa que calcule la función

asociada al predicado K. Demostrar que solo usa bucles definidos (con lo cual se

demuestra de nuevo que K está en PRED(PRIM)).

Solución:

Dado el programa universal añadir una variable que aumente en uno por cada

ejecución de una instrucción; el bucle principal que quede controlado además de por la

longitud del codigo restante no nula, porque el valor de esa variable no supere la cota t

(dada como entrada). Al salir del bucle, si la longitud del código restante es 0, el

programa que se estaba simulando ha acabado y la salida del programa debe ser 1; caso

contrario, el bucle ha acabado porque se ha superado la cota t y la salida del programa

debe ser 0.

El único bucle while que hay en ese programa es el bucle principal, que a lo

sumo se ejecuta t veces, y por un ejercicio anterior sabemos que se puede transformar

en un bucle definido; por tanto el predicado T es recursivo primitivo.

El siguiente resultado muestra que los valores de verdad de un predicado r.e. se pueden

enumerar mediante una función recursiva total, de ahí el nombre de estos predicados y

el nombre del conjunto de sus valores de verdad (recursivamente enumerable).

Page 96: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 96 29/09/2004

Teorema 7.21: Sea P un predicado con un argumento; P es r.e. sii P es siempre falso o

existe f∈TREC tal que {f(m) / m∈N} = VP ( ={ x∈N / P(x)=V} )

Demostración: Supongamos que P es r.e. Si es siempre falso, no hay nada que

demostrar; en otro caso existe un a tal que P(a)=V.

P r.e. está definido por una función F recursiva parcial (que como P(a)=V, resulta

F(a)>0). Esta función es calculada por un programa Q.

Sea KQ el predicado de Kleene asociado a este programa Q.

Desarrollamos un macroprograma que calcula la función f pedida.

La idea es tomar un número natural como entrada, via decodificación de Cantor,

descomponerlo en dos partes. Interpretar una como entrada y otra como número de

pasos. Mediante el predicado de Kleene, ver si el programa Q, con esa entrada y ese

número de pasos acaba;

si no acaba dar como salida un valor de verdad para P (el a)

si acaba, entonces calcular F (la función que define a P) para esa entrada.

si da mayor que 0 producir esa salida

si da 0 dar como salida, de nuevo, a (para que siempre salgan valores

donde P es verdad).

begin X2:= σ2 1

1, (X1);

X3:= σ2 21

, (X1); if TQ(X2, X3) then if F(X2)>0 then X1:=X2 else X1:=a fi else X1:=a fi end Recíprocamente, sea P un predicado que siempre es falso o que existe una función f

recursiva total en las condiciones del teorema.

Si P es siempre falso, entonces claramente es r.e. (mas aún, r.d., mediante la función

constante de un argumento, que devuelve 0).

Supongamos entonces que existe una función recursiva total que al recorrer el

argumento los valores de N, la imagen recorre los valores de verdad de P.

En este caso, la función que define a P es como sigue:

Page 97: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 97 29/09/2004

F(x) = 1 + µz[f(z)=x] c.q.d.

Si un predicado es r.d., entonces su negación también es r.d.. Por tanto, el conjunto de

valores de verdad y el conjunto de valores de falsedad se puede listar de manera

efectiva.

El inverso de este resultado también es cierto.

Teorema 7.22: Un predicado P es r.d. sii P y ¬P son r.e.

Demostración:

P r.d. � P r.e; P r.d. � ¬P r.d. � ¬P r.e.

Veamos el recíproco.

Como el predicado que siempre es falso es r.d., solo tenemos que considerar el caso en

que P y ¬P no son siempre falso. Por el teorema anterior, sean f y g las funciones

recursivas totales que enumeran los valores de verdad de P y ¬P respectivamente.

Vamos a construir un programa que calcule una función recursiva total que defina al

predicado P.

La idea es, dada una entrada x, ir calculando, para valores X2 desde 0 en adelante, f(X2)

y g(X2); en algun momento obien f o bien g toma el valor x, según quien lo tome damos

salida mayor que cero o cero.

El programa sería como sigue:

begin while f(X2)≠X1 ∧ g(X2)≠X1 do X2:=X2 + 1 od if f(X2)=X1 then X1:=X1+1 else X1:=0 fi end

Resumen: Si un problema es rec. sol., y deseamos determinar cuál es la solución para

una instancia dada x, podemos buscar sistemáticamente el conjunto de todas las

instancias “si”, y simultaneamente el conjunto de todas las instancias “no”. Está

garantizado que en esta búsqueda encontramos nuestra instancia x en algún momento.

Por otra parte, si el problema sólo es parcialm. rec, sol., entonces no se puede

hacer nada mejor que buscar el conjunto de las instancias “si”, y simultaneamente un

subconjunto propio (quizás vacío) del conjunto de las instancias “no” (ese subconjunto

corresponde a cuando la función que define al predicado, produce imagen 0). Si la

Page 98: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 98 29/09/2004

instancia era “si” la encontraremos por este método de búsqueda; pero si la instancia es

“no” la búsqueda puede no acabar. Podría ser que para cierto subconjunto de instancias

el problema se pudiera resolver fácilmente por otro método; pero no hay procedimiento

general mejor que el anteriormente descrito.

Ejercicio 7.23: Demostrar que un predicado es r.d. sii existe una función recursiva total

que enumera sus valores de verdad en orden creciente.

Ejercicio 7.24: Demostrar que los predicados r.d. son cerrados por disyunción,

conjunción, negación, cuantificación existencial acotada y cuantificación universal

acotada.

Ejercicio 7.25: Demostrar que la clase de los predicados r.e. es cerrada por disyunción.

Ejercicio 7.26: Demostrar que la clase de los predicados r.e. es cerrada por conjunción.

Ejercicio 7.27: Demostrar que la clase de los predicados r.e. es no cerrada por

negación.

Solución: Si lo fuera, como H1 es r.e., ¬H1 seria r.e. y por tanto H1 seria r.d., absurdo.

Ejercicio 7.28: Demostrar que la clase de los predicados r.e. es cerrada por

cuantificación existencial.

Ejercicio 7.29: Demostrar que la clase de los predicados r.d. es no cerrada por

cuantificación existencial.

Solución: H1(i, x) = ∃t(T(i, x, t)

Ejercicio 7.30: Demostrar que la clase de los predicados r.d. es no cerrada por

cuantificación universal.

VII.4 Otros problemas recursivamente insolubles. En la demostración de la insolubilidad recursiva de otros problemas, vamos a

seguir un método general llamado reducción. Pasamos a describir el método:

Sea A un problema del cual sabemos que es rec. insol.

Queremos demostrar que otro problema B es rec. insol.

Para ello, demostramos que

B rec. sol. � A rec. sol.

Page 99: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 99 29/09/2004

Entonces, el contrarrecíproco es: A rec. insol. � B rec. insol.

Y por tanto de (A rec. insol.) y de (A rec. insol. � B rec. insol) se obtiene B rec.

insol.

En resumen, solo hay que demostrar B rec. soluble � A rec. soluble.

El esquema para demostrar esta implicación es estandar:

Si B es rec. sol., entonces, como predicado de n variables B es rec. dec., luego le está

asociada una función F∈TRECn.

A partir de F, por composición con alguna función recursiva total h, construyo G:

G = F(h, …)

tal que G esté asociada a A.

Por hipótesis F∈TREC; por construcción h∈TREC, entonces resulta que G∈TREC,

luego A como predicado es rec. dec. y como problema es rec. sol.

Gráficamente la idea es como sigue:

>0; B(entradas)=V

=0; B(entradas)=F

FEntradas a B

>0; A(entradas)=V

=0; A(entradas)=F

Fa A h entradas a B

Ejercicio 7.31: Demostrar que el problema de la parada Hn es recursivamente insoluble.

Solución:

Veamos, usando el método descrito que si Hn es rec. sol., entonces H1 es rec. sol.

Supongamos que Hn es rec. sol., luego el predicado Hn(i, x) es rec. dec, es decir, existe

F∈TRECn+1, tal que:

F(i, x)=0 sii Hn(i, x)= F (el programa número i con las n entradas x no acaba) y

F(i, x)>0 sii Hn(i, x)= V (el programa número i con las n entradas x acaba).

Buscamos G∈TREC2 asociada a H1. Construimos G(i, x).

Page 100: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 100 29/09/2004

Dados i, x, veo i como un programa con n entradas de las cuales la primera es x y las

demas son 0.

Sea entonces el programa (n, P)

begin

X2:=X1;

X1:=i;

X1:=U(X1, X2)

end

La última línea es una activación directa del programa universal, que tiene número de

Gödel g.

Según varíen los valores de i este programa P tiene un número asociado en función de i,

h(i).

Sabemos que h∈TREC1 (ver el ejercicio que sigue a la demostración).

Entonces defino G(i, x)= F(h(i), x, 0), 0∈Nn-1.

Veamos que G está asociada a H1:

Si el programa nº i con entrada x acaba, entonces por la construcción realizada, el

programa nº h(i) con entrada (x, 0) acaba, luego F(h(i), x, 0)>0, es decir G(i, x)>0.

Si el programa nº i con entrada x no acaba, entonces por la construcción realizada, el

programa nº h(i) con entrada (x, 0) no acaba, luego F(h(i), x, 0)=0, es decir G(i, x)=0.

Luego G es una función que define el predicado H1 y es total, porque está definida

como composición de funciones totales, luego el problema H1 es rec. sol. contradicción

con le resultado del teorema anterior.

Ejercicio 7.32:

Page 101: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 101 29/09/2004

Demostrar que la función h(i) de la demostración anterior es TREC (mas aún, es

PRIM).

Solución:

X2:=X1 se codifica como 5σ12 (1,0)+1= 6

X1:=i se expande como una asignación 0, e i asignaciones de incremento a X1

La asignación 0 tiene código 5.0=0

Cada incremento tiene código 5σ12 (0,0)+2=2

Luego h(i) se puede calcular como sigue:

begin (*entrada i en la variable X1*)

X2:= g;

do X1 times

X2:= añad(2, X2)

od;

X1:=añad(0,X2);

X1:=añad(6,X1)

end

donde las macros añad son PRIM y el programa solo tiene un bucle definido, es decir

pertenece a LOOP, luego la función que calcula es PRIM, y por tanto TREC.

Ejercicio 7.33: Demostrar que el problema de la parada (para programas con cualquier

número de entradas) es parcialm. rec. sol.

Solución:

La función que define el predicado H es U(i,x)+1.

En efecto, si el programa i con las entradas x acaba, entonces U(i,x) acaba con un valor

mayor o igual que 0, y al sumarle 1, toma un valor mayor que 0.

Si el programa i con las entradas x no acaba, entonces U(i,x) no acaba.

Luego H(i, x)=V sii U(i,x)+1>0.

Page 102: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 102 29/09/2004

Como U es una función recursiva parcial, entonces H es unpredicado recursivam.

enumerable y el problema H es parcialm. recursivam. soluble.

Ejercicio 7.34: Sea K⊆N el predicado que es verdad si el programa de número x con la

entrada x acaba y falso si no acaba. Demostrar que el predicado K es recursivamente

enumerable y no es recursivamente decidible.

Solución:

K es rec. enum. mediante la función F(x) =U(x,x)+1.

Veamos que K es rec. sol. implica que H1 también lo es.

Supongamos K rec. sol, entonces como predicado, K es rec. dec.. Sea F∈TREC1 una

función que lo define.

Buscamos construir G∈TREC2 que defina H1.

Dados i, x, sea el programa siguiente:

begin

X2:=i;

X3:=x;

X2:=U(X2,X3);

X2:=X2 + 1;

X2:= sg(X2);

X1:=X1*X2

end

Este programa traslada la entrada x a X2, calcula el resultado de ejecutar el programa i

sobre x.

Si este cálculo no acaba, el programa propuesto no acaba.

Si este cálculo acaba, produce en X1 un valor ≥0, al sumarle 1, da ≥1, al tomar el

signo es 1, y al multiplicarlo por X2 da la x de entrada (es decir, si el cálculo acaba,

produce como salida la entrada).

Según el mismo razonamiento que hicimos antes, dados i, x, este programa tiene

un número h(i,x), donde h∈TREC( sabemos que petenece a PRIM, pero solo

necesitamos la totalidad).

Page 103: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 103 29/09/2004

Entonces definimos G(i, x) = F(h(i, x)).

Si el programa nº i con la entrada x acaba, entonce el programa h(i, x) calcula la función

identidad, en particular, el programa h(i, x), con la entrada h(i, x) acaba, luego

F(h(i,x))>0, y por tanto, G(i,x)>0.

Si el programa nº i con la entrada x no acaba, entonce el programa h(i, x) no acaba para

ninguna entrada, en particular, el programa h(i, x), con la entrada h(i, x) no acaba, luego

F(h(i, x))=0, y por tanto, G(i,x)=0.

Como F y h son totales, G, obtenida por composición tambien es total, luego H1 es rec.

sol.

Ejercicio 7.35: Demostrar que los problemas ¬Hn, y ¬K son rec. insol.

Solución:

Si fueran rec. sol. los predicados asociados serían rec. dec. y como son cerrados

por negación, los predicados Hn, y K serían rec. dec. y los correspondientes problemas

rec. sol., absurdo por anteriores ressultados.

Definición 7.36: (El problema de la Equivalencia) Dados x e y números naturales se

define el predicado E(x, y) como sigue:

E(x, y) =V sii la función calculada por el programa x, coincide con la función calculada

por el programa y.

Recordemos aqui lo que se dijo en el capítulo 1 sobre la utilidad práctica que

tendría la solubilidad total de este problema mediante dos ejemplos: uno académico y

otro profesional.

El ejemplo académico surge de la corrección de un examen de programación de

ordenadores que consiste en el desarrollo de un programa (el mismo para todos los

alumnos).

Supongamos que el profesor ha desarrollado un programa y ha verificado

formalmente que resuelve el problema planteado.

Page 104: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 104 29/09/2004

Entonces le sería de gran utilidad disponer de un programa que verificara la

equivalencia del suyo con el que presenta cada alumno, respecto a las relaciones datos

de entrada, resultados de salida.

Esto mismo en el ámbito profesional sería util en la siguiente situación:

Supongamos que el Colegio Profesional de Informáticos desarrolla y verifica

formalmente un programa de contabilidad, en el cual lo esencial son las entradas y las

salidas, sin unas bonitas pantallas de presentación.

Cualquier empresa que desarrolle un programa de contabilidad de uso comercial

(con un aspecto amigable), va al citado Colegio que se encarga de hacer la

correspondiente comparación y si son equivalentes le proporciona un certificado de

validez, que garantizaría a los futuros compradores la corrección del programa.

Desgraciadamente este problema es recursivamente insoluble.

Teorema 7.37: El problema de la equivalencia es rec. insol.

Demostración:

Veamos que E rec. sol. implica ¬K rec. sol..

Supongamos que E es rec. sol., entonces el predicado E es rec. dec. y está definido por

una función F∈TREC2.

Sea n el número de Gödel de un programa que calcula la función que siempre

diverge.

Buscamos una función G recursiva total que defina el predicado ¬K, G∈TREC1.

Sea el programa (1,2, P)

begin

X1:=x;

X2:= X1;

X1:=U(X1, X2);

end

La última línea es una activación directa del programa universal, que tiene número de

Gödel g.

Page 105: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 105 29/09/2004

Según varíen los valores de x este programa P tiene un número asociado en función de

x, h(x).

Para cada x este programa tiene nº h(x), donde h es TREC(más aún, PRIM)

Defino G(x) = F(h(x), n)

Si el programa x con la entrada x acaba, entonces el programa h(x) acaba para toda

entrada, luego la función que calcula es distinta de la calculada por el programa n (que

es la función que siempre diverge), luego F(h(x), n)=0, y por tanto G(x)=0.

Si el programa x con la entrada x no acaba, entonces el programa h(x) no acaba para

ninguna entrada, luego la función que calcula coincide con la calculada por el programa

n (que es la función que siempre diverge), luego F(h(x), n)>0, y por tanto G(x)>0.

c.q.d.

Nota.- En el capítulo 1 nos preguntabamos sobre la dificultad relativa de los problemas

de la parada (H) y de la equivalencia (E). La respuesta es que el problema de la

equivalencia es estrictamente más difícil que el problema de la parada, pues al

considerar el lenguaje LOOP, y la clase de funciones asociada (PRIM), el problema de

la parada no existe; sin embargo, el problema de la equivalencia sigue existiendo en Ln,

para n>1.

Ejercicio 7.38: Encontrar un valor para n del teorema anterior.

Solución:

Calcular el número del siguiente programa (1, P):

begin X1:=X1 + 1; WHILE X1≠0 Do X1:=X1 od end

Ejercicio 7.39: Demostrar que la función h(x) de la demostración anterior es TREC

(mas aún, es PRIM).

Page 106: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 106 29/09/2004

Solución:

X2:=X1 se codifica como 5σ12 (1,0)+1= 6

X1:=x se expande como una asignación 0, e i asignaciones de incremento a X1

La asignación 0 tiene código 5.0=0

Cada incremento tiene código 5σ12 (0,0)+2=2

Luego h(x) se puede calcular como sigue:

begin (* entrada x en X1 *) X2:= g; X2:= añad(6, g); (*g es el número de Gödel del programa universal *) do X1 times X2:= añad(2,g) od; X1:=añad(0,X2); end

donde las macros añad son PRIM y el programa solo tiene un bucle definido, es decir

pertenece a LOOP, luego la función que calcula es PRIM, y pro tanto TREC.

Ejercicio 7.40: Sea VAC (vacío) el predicado de un argumento que es verdad para x sii

el programa x no acaba para ninguna entrada.

Demostrar que VAC no es recursivamente decidible ( como problema es rec. insol.)

Solución

Veamos que VAC decidible implica ¬K decidible.

Sup. VAC rec. dec. con función asociada F∈TREC1.

Buscamos una función G recursiva total que defina el predicado ¬K. G∈TREC1.

Sea el programa (1, 1, P)

begin

X1:=i;

X1:=U(X1, X1);

end

Para cada i este programa tiene nº h(i), donde h es TREC(PRIM)

Defino G(i) = F(h(i))

Page 107: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 107 29/09/2004

Si el programa i con la entrada i acaba, entonces el programa h(i) acaba para toda

entrada, luego F(h(i))=0, y por tanto G(i)=0.

Si el programa i con la entrada i no acaba, entonces el programa h(i) no acaba para

ninguna entrada, luego F(h(i))>0, y por tanto G(i)>0.

En resumen

si ¬K(i)=F entonces G(i)=0

si ¬K(i)=V entonces G(i)>0

G∈TREC1, luego ¬K es rec. dec.

Ejercicio 7.41: Sea TOT el predicado de un argumento que es verdad para x sii el

programa de número x acaba para toda entrada. Estudiar si TOT es o no es rec. dec.

VII.5 El teorema de Rice

En este apartado vamos a considerar funciones de N en N.

Vamos a definir predicados en relación con propiedades de las funciones calculadas por

programas.

El predicado de un argumento Q es verdad para el valor i, Q(i)=V sii la función

calculada por el programa i , cumple cierta propiedad P.

Ejemplo 7.42: Q(i)=V sii fi(3)=18

Q(i)=V sii fi(45)↑

VAC, TOT, FIN, INF etc. son ejemplos de predicados de este tipo.

Claramente, si Q(i)=V y otro programa j calcula la misma función que el programa i,

entonces también Q(j)=V.

Page 108: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 108 29/09/2004

Recuérdese que, dada una función recursiva, hay infinitos programas que la calculan, de

manera que si una función cumple la propiedad P, entonces hay infinitos valores i tales

que Q(i)=V.

Diremos que una propiedad P es no trivial si hay funciones que la cumplen y funciones

que no; es decir, el predicado Q asociado ni es siempre verdad ni es siempre falso.

Teorema 7.43: (Rice) Si una propiedad de las funciones recursivas es no trivial,

entonces el predicado Q asociado a P es no decidible (y el problema correspondiente es

insoluble).

Demostración:

Veamos que Q decidible implica K decidible.

Como P es una propiedad no trivial, supongamos que la función que siempre diverge,

calculada por el programa de número n, no cumple la propiedad P (caso contrario

consideraríamos ¬P).

Sea el programa i que calcula la función f que cumple la propiedad P.

En resumen; Q(n)=F y Q(i)=V.

Supongamos que Q es decidible, entonces existe una función recursiva total F de N en

N, tal que F(n)=0 y F(i)>0.

Vamos a construir, a partir de F, una función G que decide K; esto es:

Si el programa de nº x, con la entrada x no acaba, entonces G(x)=0

Si el programa de nº x, con la entrada x acaba, entonces G(x)>0.

Para ello, dado un x concreto, escribimos el programa:

begin

Page 109: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 109 29/09/2004

X2:=x;

X2:= U(X2, X2);

X1:= f(X1);

end.

Este programa tiene un número en función de x: h(g0, x) (esta función es recursiva total,

es más, es PRIM, ver ejercicio que sigue a la demostración).

Veamos que G(x) = F(h (x))

Si el programa de nº x con entrada x acaba, entonces el programa de nº h( x) calcula la

función f, que cumple la propiedad P, luego, por la decidibilidad de Q tenemos que

F(h(x))>0, es decir G(x)>0.

Si el programa de nº x con entrada x no acaba, entonces el programa de nº h(x) calcula

la función que siempre diverge, la cual no cumple la propiedad P, luego, por la

decidibilidad de Q tenemos que F(h( x))=0, es decir G(x)=0.

En resumen, hemos construido una función G recursiva total, que vale 0 ó distinto de 0

según que x pertenezca o no a K.

Luego K es decidible.

c.q.d.

Interpretación intuitiva:

Caundo se diseña un programa para resolver un problema complejo, es util y habitual

descomponer el problema en partes mas pequeñas, y mas fáciles de resolver. La tarea de

escribir programas para resolver estos subproblemas se asigna a distintas personas. A

estas personas se les dan unas especificaciones relativas a lo que su programa se supone

que debe hacer. Entonces, no enfrentamos al problema de determinar cuándo estos

programas son correctos; esto es, cuando todos los pares (valor de entrada, valor de

salida) satisfacen un predicado dado P, en otras palabras, cuándo un programa se

comporta de acuerdo con unas especificaciones dadas. Ya que esto es una propiedad de

Page 110: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 110 29/09/2004

funciones, el teorema de Rice nos dice que el problema de determinar cuándo un

programa cumple unas restricciones P es recursivamente insoluble.

En un ejercicio anterior hemos visto que el problema de determinar cuando dos

programas son equivalentes es recursivamente insoluble. Esto es consecuencia

inmediata del hecho de que el problema de determinar cuando un programa satisface

una restricciones particulares es recursivamente insoluble.

Ejercicio 7.44: Demostrar que la función h de la demostración anterior es recursiva

total.

Ejercicio 7.45: Demostrar que para cada función recursiva total de un argumento existe

un valor m tal que el programa m calcula la misma función que el programa f(m).

Solución:

Sea f∈TREC1. Para cada i sea el siguiente programa:

begin X2:=i; X3:=i; X2:=U(X2, X3); X1:=U(X2, X1) end Para cada i este programa tiene número h(i), h∈TREC1, y por tanto foh∈TREC1.

Sea n el número de un programa que calcula la función foh.

Sea m=h(n). Entonces m es un punto fijo.

En efecto:

La función de nº m coincide con la función de nº h(n), que la calcula el programa de nº

h(n) que según el código anterior hace lo siguiente:

1 - Asignar a X2 el valor n

2 - Asignar a X3 el valor n

3 - Asignar a X2 el resultado de U(n,n)

4 - Asignar a X1 el resultado de U(U(n,n), X1)

Como n es un índice de foh, la línea 3 calcula foh(n)=(f(h(n))=f(m).

Entonces la línea 4 calcula X1:=U(f(m), X1) es decir, calcula la función de nº f(m).

Page 111: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 111 29/09/2004

Ejercicio 7.46: Demostrar que existe un m tal que el programa de nº m calcula la

función constante m.

Solución:

Sea el programa “begin X1:=i end”. Para cada i este programa tiene número h(i)

y calcula la función constante i.

h∈TREC1, luego por el ejercicio anterior existe un m tal que el programa m calcula la

misma función que el programa h(m). Luego ese punto fijo cumple que es un programa

de nº m y calcula la función constante m.

Ejercicio 7.47: Encontrar explícitamente un tal m para nuestro lenguaje WHILE.

Page 112: CAPITULO I: INTRODUCCION HISTORICA AL …fjv/UMA/LCC/web/Teaching/TALF/... · enumerable y recursivamente decidible que se estudiaran en el capitulo VII). FATR, RMB 3 29/09/2004 ...

FATR, RMB 112 29/09/2004