Charla Figueira

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 32

Introducción a la Teorı́a de Funciones Recursivas

Santiago Figueira

Universidad de Buenos Aires


Facultad de Ciencias Exactas y Naturales
Departamento de Computación

Charla de PLP
29 de noviembre de 2005
Advertencia: Hay refritos de Charla de Borrachos.
Historia de la Computabilidad
David Hilbert, 1900: Acá les dejo 23 problemas.
¿Es la matemática completa? Es decir, ¿puede
ser demostrada o refutada cualquier sentencia
matemática? y ¿es la matemática consistente?
Además, ¿son las matemáticas decidibles?
Historia de la Computabilidad
David Hilbert, 1900: Acá les dejo 23 problemas.
¿Es la matemática completa? Es decir, ¿puede
ser demostrada o refutada cualquier sentencia
matemática? y ¿es la matemática consistente?
Además, ¿son las matemáticas decidibles?

Kurt Gödel, 1931: Cualquier sistema formal


suficientemente potente es inconsistente o
incompleto. Además, si un sistema de axiomas es
consistente, esta consistencia no puede
demostrarse dentro del sistema formal.
Historia de la Computabilidad
David Hilbert, 1900: Acá les dejo 23 problemas.
¿Es la matemática completa? Es decir, ¿puede
ser demostrada o refutada cualquier sentencia
matemática? y ¿es la matemática consistente?
Además, ¿son las matemáticas decidibles?

Kurt Gödel, 1931: Cualquier sistema formal


suficientemente potente es inconsistente o
incompleto. Además, si un sistema de axiomas es
consistente, esta consistencia no puede
demostrarse dentro del sistema formal.

David Hilbert: Chapeau!


Alan Turing, 1936: Hola, yo soy Alan.
Construı́ un modelo formal de cómputo, la
Máquina de Turing, y demostré que hay
problemas que esta máquina no puede resolver.
Alan Turing, 1936: Hola, yo soy Alan.
Construı́ un modelo formal de cómputo, la
Máquina de Turing, y demostré que hay
problemas que esta máquina no puede resolver.

Alonzo Church, 1936: Yo hice lo mismo pero por


un camino totalmente distinto. Me basé en una
notación formal, que denominé cálculo lambda.
Alan Turing, 1936: Hola, yo soy Alan.
Construı́ un modelo formal de cómputo, la
Máquina de Turing, y demostré que hay
problemas que esta máquina no puede resolver.

Alonzo Church, 1936: Yo hice lo mismo pero por


un camino totalmente distinto. Me basé en una
notación formal, que denominé cálculo lambda.

Stephen Kleene: Formulé la noción de función


computable de otra manera. Estudié los grados
de computabilidad de los conjuntos, la jerarquı́a
aritmética, etc.

Emil Post: Trabajé en conjuntos recursivamente


enumerables, reducibilidades y grados de
computabilidad, etc.
Primer intento para método efectivo:
funciones primitivas recursivas
La clase de funciones primitivas recursivas es la clase más chica de
funciones
I que contiene a las funciones iniciales:

O(x) = 0
S(x) = x + 1
Tin (x1 , . . . , xn ) = xi (para 1 ≤ i ≤ n)
I cerrada por composición: si g1 , g2 y h estaban en la clase
entonces también está f :
f (x) = h(g1 (x), g2 (x))
I cerrada por recursión primitiva: si g y h estaban en la clase
entonces también está f :
f (x, 0) = g (x)
f (x, S(y )) = h(x, y , f (x, y ))
La función de Ackermann
Las funciones primitivas recursivas coinciden con los programas
for (i.e. programas imperativos que no tienen while, sólo for).
La función de Ackermann
Las funciones primitivas recursivas coinciden con los programas
for (i.e. programas imperativos que no tienen while, sólo for).
¿Con los programas for se puede simular cualquier programa
while?
La función de Ackermann
Las funciones primitivas recursivas coinciden con los programas
for (i.e. programas imperativos que no tienen while, sólo for).
¿Con los programas for se puede simular cualquier programa
while?

n + 1
 si m = 0
A(m, n) = A(m − 1, 1) si m > 0 y n = 0

A(m − 1, A(m, n − 1)) si m > 0 y n > 0

La función de Ackermann
Las funciones primitivas recursivas coinciden con los programas
for (i.e. programas imperativos que no tienen while, sólo for).
¿Con los programas for se puede simular cualquier programa
while?

n + 1
 si m = 0
A(m, n) = A(m − 1, 1) si m > 0 y n = 0

A(m − 1, A(m, n − 1)) si m > 0 y n > 0

Para valores chicos de m, como 1, 2, o 3, A crece relativamente


lento con respecto a n (a lo sumo exponencialmente).
Para m ≥ 4, crece más rápido:
I A(4, 2) ' 2 × 1019728
I A(4, 3) > cantidad de partı́culas del universo (¿?)
La función de Ackermann
Las funciones primitivas recursivas coinciden con los programas
for (i.e. programas imperativos que no tienen while, sólo for).
¿Con los programas for se puede simular cualquier programa
while?

n + 1
 si m = 0
A(m, n) = A(m − 1, 1) si m > 0 y n = 0

A(m − 1, A(m, n − 1)) si m > 0 y n > 0

Para valores chicos de m, como 1, 2, o 3, A crece relativamente


lento con respecto a n (a lo sumo exponencialmente).
Para m ≥ 4, crece más rápido:
I A(4, 2) ' 2 × 1019728
I A(4, 3) > cantidad de partı́culas del universo (¿?)

h(n) = A(n, n) crece más que la función exponencial, el factorial...


¡h crece más que cualquier función primitiva recursiva!
Segundo intento para método efectivo:
funciones recursivas parciales

La clase de funciones recursivas parciales es la clase más chica de


funciones
I que contiene a las funciones iniciales O(x), S(x), Tin
I cerrada por composición
I cerrada por recursión primitiva
I cerrada por minimización no acotada: si g estaba en la clase,
entonces también está f :

f (x) = µy [g (x, y ) = 0 ∧ ∀z ≤ y g (x, z) ↓]


= el mı́nimo y tal que g (x, y ) = 0 y
g (x, z) no se indefine para ningún z < y
(si no existe tal y , µ se indefine)
Tercer intento para método efectivo:
máquinas de Turing
Entonces... ¿qué es un método efectivo?

Resultado básico de Teorı́a de la Computabilidad:


Son equivalentes:
I f es programable en algún lenguaje de programación (Java, C,
Haskell, Prolog, etc.), en cualquiera de los paradigmas que
vieron
I f es recursiva parcial (segundo intento)
I f es computable por una máquina de Turing (tercer intento)
I f es definible en λ-cálculo (esto no lo vimos)
En general, se dice que f es recursiva parcial o computable parcial.

Tesis de Church:
Cualquier función de f : N → N calculable efectivamente (i.e. de
manera mecánica) es recursiva parcial.
¿Qué estudia la Teorı́a de funciones recursivas?

La Teorı́a de funciones recursivas (o Computablilidad) no estudia


los distintos lenguajes de programación que se pueden usar para
computar las funciones computables (de eso se encarga PLP).

Más bien, estudia qué es lo que se puede computar y qué no.


Estudia y compara es el poder computacional de los conjuntos de
números naturales.
Quiero contarles:
I Cómo se puede relativizar el cómputo y qué son los oráculos
I ¿Hay conjuntos esencialmente más complejos que otros?
I Jerarquı́a aritmética
I Problema de Post
Cómputos con oráculo –más alto que alto orden

Son programas con una pequeña “ayudita”: un conjunto de


números naturales gratis que funciona como oráculo.
Un programa con oráculo tiene una instrucción nueva:
(
1 n está en el oráculo
estásEnOráculo?(n) =
0 sino

Ahora las funciones pueden ser computables relativas a B ⊆ N:

f : N → N es computable relativa a B (o B-computable) cuando


existe un programa que, con la ayuda del oráculo B, calcula f .

En general, para avisar que f usa al oráculo B, se escribe f B .


Conjuntos computables y recursivamente enumerables
Recién vimos qué era una función B-computable.

Un conjunto A ⊆ N es B-computable cuando hay una función


B-computable (total) f tal que
(
1 n∈A
f B (n) =
0 n∈
/A

Decimos que A ≤T B cuando A es B-computable.


≤T se llama reducibilidad de Turing.

Un conjunto A ⊆ N es B-recursivamente enumerable (B-r.e.)


cuando hay una función B-computable parcial f tal que

A = {f B (n) : n ∈ N}

Cuando el oráculo no aporta (por ejemplo B = ∅ o B = N),


decimos que A es computable o r.e. a secas.
El salto (jump operation)
Las funciones recursivas parciales con oráculo son enumerables:

ϕ0 , ϕ 1 , ϕ 2 , . . .

Para un conjunto B ⊆ N, definimos el salto de B como

B 0 = {i : ϕB
i (i) ↓}.

Por ejemplo, ∅0 = {i : ϕ∅i (i) ↓} es el famoso Halting problem.


∅0 es r.e. pero no es computable. Esto quiere decir que

∅ <T ∅0 (i.e. ∅ ≤T ∅0 pero ∅0 6≤T ∅).

Y el halting problem se puede relativizar:

∅ <T ∅0 <T ∅0 <T ∅00 . . . ,

es decir, representa siempre un salto en la dificultad.


La jerarquı́a aritmética

I A es r.e. sii

x ∈ A ⇔ ∃z P(x, z)
La jerarquı́a aritmética

I A es r.e. sii

x ∈ A ⇔ ∃z P(x, z)

I A es co-r.e. sii

x ∈ A ⇔ ∀z P(x, z)
La jerarquı́a aritmética

I A es r.e. sii

x ∈ A ⇔ ∃z P(x, z)

I A es co-r.e. sii

x ∈ A ⇔ ∀z P(x, z)
La jerarquı́a aritmética

I A es r.e. sii

x ∈ A ⇔ ∃z P(x, z)

I A es co-r.e. sii

x ∈ A ⇔ ∀z P(x, z)

I A es ∅0 -r.e. sii

x ∈ A ⇔ ∃y ∀z P(x, y , z)
La jerarquı́a aritmética

I A es r.e. sii

x ∈ A ⇔ ∃z P(x, z)

I A es co-r.e. sii

x ∈ A ⇔ ∀z P(x, z)

I A es ∅0 -r.e. sii

x ∈ A ⇔ ∃y ∀z P(x, y , z)

I A es ∅0 -co-r.e. sii

x ∈ A ⇔ ∀y ∃z P(x, y , z)
La jerarquı́a aritmética

I A es r.e. sii

x ∈ A ⇔ ∃z P(x, z)

I A es co-r.e. sii

x ∈ A ⇔ ∀z P(x, z)

I A es ∅0 -r.e. sii

x ∈ A ⇔ ∃y ∀z P(x, y , z)

I A es ∅0 -co-r.e. sii

x ∈ A ⇔ ∀y ∃z P(x, y , z)
La jerarquı́a aritmética

I A es r.e. sii

x ∈ A ⇔ ∃z P(x, z)

I A es co-r.e. sii

x ∈ A ⇔ ∀z P(x, z)

I A es ∅0 -r.e. sii

x ∈ A ⇔ ∃y ∀z P(x, y , z)

I A es ∅0 -co-r.e. sii

x ∈ A ⇔ ∀y ∃z P(x, y , z)
La jerarquı́a aritmética

I A es r.e. sii

x ∈ A ⇔ ∃z P(x, z)

I A es co-r.e. sii

x ∈ A ⇔ ∀z P(x, z)

I A es ∅0 -r.e. sii

x ∈ A ⇔ ∃y ∀z P(x, y , z)

I A es ∅0 -co-r.e. sii

x ∈ A ⇔ ∀y ∃z P(x, y , z)
El problema de Post

Recordemos que A ≤T B sii A es B-computable (es decir, puedo


computar A con la ayuda del oráculo B)
Vimos que
∅ <T ∅0 .
Pero ¿hay algo r.e. en el medio entre ∅ y ∅0 ?
O sea, ¿habrá esencialmente dos clases de conjuntos r.e.
I los conjuntos computables = {A : A ≡T ∅}
I los conjuntos Turing completos = {A : A ≡T ∅0 }
y ocurre que cualquier A r.e. es o bien computable o bien Turing
completo?
(A ≡T B quiere decir A ≤T B y B ≤T A)
El problema de Post

Recordemos que A ≤T B sii A es B-computable (es decir, puedo


computar A con la ayuda del oráculo B)
Vimos que
∅ <T ∅0 .
Pero ¿hay algo r.e. en el medio entre ∅ y ∅0 ?
O sea, ¿habrá esencialmente dos clases de conjuntos r.e.
I los conjuntos computables = {A : A ≡T ∅}
I los conjuntos Turing completos = {A : A ≡T ∅0 }
y ocurre que cualquier A r.e. es o bien computable o bien Turing
completo?
(A ≡T B quiere decir A ≤T B y B ≤T A)

Respuesta: ¡No! Existen conjuntos r.e. A tal que ∅ <T A <T ∅0 .


Pero se lo construye ad hoc. No son ejemplos naturales y la
construcción es difı́cil.
Otras reducibilidades
≤T no es la única reducibilidad que existe:
I A ≤1 B sii existe una función 1 a 1 computable f tal que

x ∈ A ⇔ f (x) ∈ B.

Se llama one to one reducibility.


I A ≤m B sii existe una función computable f tal que

x ∈ A ⇔ f (x) ∈ B.

Se llama one to many reducibility.


I A ≤tt B sii existe una función f que con oráculo B computa
A, pero podemos acotar recursivamente las llamadas que f
hace al oráculo B. Es decir, f (x) necesita conocer los primeros
g (x) elementos de B a lo sumo, donde g es recursiva. Se
llama truth table reducibility.
A ≤1 B ⇒ A ≤m B ⇒ A ≤tt B ⇒ A ≤T B

También podría gustarte

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy