Tema 5: Procedimientos para obtener funciones computables Dpto. Ciencias de la Computación e Inteligencia Artificial Universidad de Sevilla Lógica y Computabilidad Curso 2010–11 LC, 2010–11 Procedimientos para obtener funciones computables 5.1 Procedimientos de definición y funciones básicas I Estudiaremos procedimientos para definir funciones que nos permitan obtener nuevas funciones computables, a partir de otras funciones computables ya conocidas. I Es deseable que estos procedimientos de definición permitan obtener todas las funciones GOTO–computables a partir de algunas funciones básicas cuya computabilidad sea indiscutible. I Esto nos proporcionará, más adelante, una caracterización de las funciones GOTO-computables independiente de todo modelo de computación particular. Consideramos tres procedimientos básicos: I I I I LC, 2010–11 Composición. Recursión primitiva. µ–Recursión (o Minimización). Procedimientos para obtener funciones computables 5.2 Composición I Dadas g : Nn − −→ N, h1 , .., hn : Nm − −→ N, decimos que f es la composición de g y h1 , . . . , hn , si Para todo ~x ∈ Nm , I I f (~x ) = g (h1 (~x ), . . . , hn (~x )) Usamos como notación f = C(g ; h1 , . . . , hn ). Lema. GCOMP es cerrado bajo composición: I En efecto, el siguiente programa calcula f = C(g ; h1 , ..., hn ): Z1 ←− h1 (X1 , ..., Xm ) .. . Zn ←− hn (X1 , ..., Xm ) Y ←− g (Z1 , ..., Zn ) I LC, 2010–11 Lema. El conjunto de funciones totales es cerrado bajo composición. Procedimientos para obtener funciones computables 5.3 Recursión Primitiva(I) I Dadas g : Nm − −→ N, h : Nm+2 − −→ N, decimos que f : Nm+1 − −→ N se define por recursión primitiva a partir de g y h (y escribimos f = R(g , h)), si f (~x , 0) = g (~x ) m Para todo ~x ∈ N , y ∈ N f (~x , y + 1) = h(~x , y , f (~x , y )) I Esta definición se extiende al caso m = 0: f (0) = k f (x + 1) = h(x, f (x)) donde k ∈ N. En este caso escribimos: f = R(k, h), y diremos que f se obtiene por recursión primitiva a partir de la constante k y de h. LC, 2010–11 Procedimientos para obtener funciones computables 5.4 Recursión Primitiva(II) I Lema. GCOMP es cerrado bajo recursión primitiva: I En efecto, sean g : Nm − −→ N, h : Nm+2 − −→ N G-computables. El siguiente programa calcula f = R(g ; h): [A] I LC, 2010–11 Y ←− g (X1 , ..., Xm ) IF Xm+1 = 0 GOTO E Y ←− h(X1 , ..., Xm , Z , Y ) Z ←− Z + 1 Xm+1 ←− Xm+1 − 1 GOTO A Lema. El conjunto de funciones totales es cerrado por recursión primitiva. Procedimientos para obtener funciones computables 5.5 µ–Recursión (I) I Sea f : Nn+1 − −→ N, (n ≥ 1). La función definida por µ–recursión a partir de f es la función fµ : Nn − −→ N dada por min{y : f (~x , y ) = 0 ∧ ∀z < y (f (~x , z) ↓)} si existe fµ (~x ) = ↑ e.o.c. I Nota. Usualmente escribiremos: µy (f (~x , y ) = 0). Lema. GCOMP es cerrada bajo µ–Recursión. En efecto, sea f : Nn+1 − −→ N, (n ≥ 1), GOTO–computable. El siguiente programa calcula fµ : I I [A] Z ←− f (X1 , ..., Xn , Y ) IF Z = 0 GOTO E Y ←− Y + 1 GOTO A LC, 2010–11 Procedimientos para obtener funciones computables 5.6 µ–Recursión (II) Para los predicados suele darse una definición ligeramente distinta: I Si θ es un predicado n + 1-ario, definimos: min{y : θ(~x , y )} si existe el mı́nimo θµ (~x ) ≡ µy (θ(~x , y )) = ↑ e.c.o.c. I I I LC, 2010–11 Lema. θ ∈ GCOMP =⇒ µy (θ(~x , y )) ∈ GCOMP Observación: La µ–Recursión no proporciona siempre funciones totales. Ejemplo. Sea θ el siguiente predicado de aridad 2: 1 si x = 0 θ(x, y ) = 0 e.o.c. 0 si x = 0 Entonces, θµ (x) = µy (θ(x, y )) = ↑ si x 6= 0 Como θ es computable, la función θµ es computable. Procedimientos para obtener funciones computables 5.7 Funciones básicas Llamaremos funciones básicas a las siguientes funciones: I Siguiente: S : N −→ N; S(x) = x + 1 I Idénticamente nula: O : N −→ N; O(x) = 0 I Proyecciones: Para Qn Qn cada i, n ∈ N (1 ≤ i ≤ n), : N −→ N; i i (x1 , . . . , xn ) = xi Lema. Las funciones básicas son G-computables: X ←− X + 1 I Siguiente, S : Y ←− X I Nula, O : Programa vacı́o, p∅ Q(n) I Proyecciones, : Y ←− Xj j LC, 2010–11 Procedimientos para obtener funciones computables 5.8 Ejemplos-I- (Composición y Recursión) Las siguientes funciones son GOTO-computables y totales: I Identidad IN : N −→ N I Constantes: Cak : Nk −→ N, Cak (~ x ) = a (a, k ∈ N, k > 0) I Predecesor: pr : N −→ N 0 si x = 0 pr (x) = x − 1 si x > 0 • I Diferencia reducida: − : N2 −→ N • 0 si x ≤ y x −y = x − y e.c.o.c. I Signo: sg : N −→ N sg (x) = LC, 2010–11 0 si x = 0 1 e.c.o.c. Procedimientos para obtener funciones computables 5.9 Ejemplos-II- (Composición y Recursión) I − Signo inverso: sg : N −→ N • − sg (x) = 1 − sg (x) I Suma: + : N2 −→ N +(x, y ) = x + y I Producto: · : N2 −→ N ·(x, y ) = x·y I LC, 2010–11 Mı́nimo: min : N2 −→ N y Máximo: max : N2 −→ N. x si x ≤ y min(x, y ) = y e.c.o.c. x si x ≥ y max(x, y ) = y e.c.o.c. Procedimientos para obtener funciones computables 5.10 Ejemplos-III- (Composición y Recursión) I Distancia: || : N2 −→ N |x − y | = x −y y −x si x ≥ y e.c.o.c. I Exponencial: exp : N2 −→ N 1 si x = 0 ∧ y = 0 exp(x, y ) = x y e.c.o.c. I Factorial: fact : N −→ N 1 Y fact(x) = j si x = 0 e.c.o.c. 1≤j≤x LC, 2010–11 Procedimientos para obtener funciones computables 5.11 Ejemplos-IV- (µ–Recursión) I I Minimización de la suma: Sum(x, y ) = x + y 0 si x = 0 Sumµ (x) = µy (Sum(x, y ) = 0) = ↑ e.o.c. ( · x − y si y ≤ x Minimización de la función g (x, y ) = ↑ si y > x gµ (x) = Id(x) I La función función raı́z cuadrada parcial, Sqrt, definida ası́: y si existe y ∈ N tal que y 2 = x Sqrt(x) = ↑ e.o.c es GOTO-computable. En efecto, Sqrt(x) = µy (|x − y 2 | = 0) LC, 2010–11 Procedimientos para obtener funciones computables 5.12 Predicados y conjuntos GOTO–computables. I I Un predicado sobre N es GOTO–computable si la función que lo define es GOTO–computable. Un conjunto A ⊆ Nk es GOTO–computable si su función caracterı́stica, CA , es GOTO–computable. Ejemplos: I Los conjuntos ∅ y Nk , para cada k ∈ N son GOTO–computables. I Los predicados: θ1 (x, y ) ≡ x = y ; θ2 (x, y ) ≡ x ≤ y ; θ3 (x, y ) ≡ x < y son GOTO–computables. I Si f : Nk −→ N es GOTO–computable , entonces los predicados (k + 1)-arios siguientes son GOTO–computables: θ(~x , y ) ≡ f (~x ) = y ; I LC, 2010–11 θ0 (~x , y ) ≡ f (~x ) ≤ y ; θ00 (~x , y ) ≡ f (~x ) < y . El grafo G (f ) = {(~x , y ) ∈ Nk+1 : f (~x ) = y } de una función f : Nk −→ N, GOTO–computable, es GOTO–computable. Procedimientos para obtener funciones computables 5.13 Operaciones con conjuntos y predicados I Proposición. Sean θ, θ0 predicados sobre N, k–arios y GOTO–computables, entonces los predicados: ¬θ, θ ∧ θ0 , θ ∨ θ0 , θ ⇒ θ0 y θ ⇔ θ0 son predicados GOTO-computables. I I I I I I Corolario. Si A, B ⊆ Nk son conjuntos GOTO-computables, entonces: Nk − A; A ∩ B; A ∪ B son GOTO-computables. I I I LC, 2010–11 ¬θ(~x ) = sg (θ(~x )) (θ ∧ θ0 )(~x ) = θ(~x )·θ0 (~x ) (θ ∨ θ0 )(~x ) = sg (θ(~x ) + θ0 (~x )) θ ⇒ θ0 ≡ ¬θ ∨ θ0 θ ⇔ θ0 ≡ θ ⇒ θ0 ∧ θ0 ⇒ θ CNk −A = ¬CA ; CA∩B = CA ∧ CB ; CA∪B = CA ∨ CB Procedimientos para obtener funciones computables 5.14 Definiciones por casos Proposición. Sean k ≥ 2 y f1 , . . . , fk : Nm −→ N funciones GOTO-computables y totales. Sea {A1 , . . . , Ak } una partición de Nm en conjuntos GOTO-computables, es decir, S Nm = ki=1 Ai , ∀i(Ai 6= ∅), y ∀i, j = 1, . . . , k, i 6= j ⇒ Ai ∩Aj = ∅ Entonces, la función g : Nm −→ N f1 (~x ) .. g (~x ) = . fk (~x ) definida por si ~x ∈ A1 .. .. . . si ~x ∈ Ak es GOTO-computable y total. I Pues g = f1 ·CA1 + . . . + fk ·CAk es GOTO-computable. I Nota: La proposición anterior puede expresarse con predicados GOTO-computables, θ1 , . . . , θk , que sean exhaustivos y excluyentes. LC, 2010–11 Procedimientos para obtener funciones computables 5.15 Minimización acotada -I- Definición. Sea θ(~x , y ) un predicado (n + 1)–ario. Definimos la función total θµ∗ : Nn+1 → N, ası́: θµ∗ (~x , y ) I = min{z ≤ y : θ(~x , z)} y +1 si existe tal mı́nimo e.c.o.c. Usualmente escribiremos: µz ≤ y θ(~x , z) y diremos que θµ∗ se obtiene de θ por minimización acotada. Proposición. Si θ ∈ GCOMP (n+1) entonces θµ∗ ∈ GCOMP (n+1) . I LC, 2010–11 Es fácil diseñar un programa que calcule θµ∗ (~x , y ) (Ejercicio). Procedimientos para obtener funciones computables 5.16 Minimización acotada -III Definición. Sea f (~x , y ) una función (n + 1)–aria y total. Definimos la función de aridad n + 1, fµ∗ , ası́: fµ∗ (~x , y ) = µz ≤ y (f (~x , z) = 0) I Diremos que fµ∗ se obtiene de f por minimización acotada. I Proposición. Si f ∈ GCOMP (n+1) y total entonces fµ∗ ∈ GCOMP (n+1) . Ejemplos. I I I La función cociente. 0 qt(x, y ) = µt ≤ x (x < (t + 1) · y ) La función resto. ( rm(x, y ) = LC, 2010–11 si y = 0 e.o.c. • x − (y · qt(x, y )) si y = 6 0 0 si y = 0 Procedimientos para obtener funciones computables 5.17 Cuantificación acotada I Proposición. Sea θ ∈ G -COMP (n+1) un predicado n + 1-ario. Los siguientes predicados son GOTO-computables: θ1 (~x , y ) ≡ ∃z ≤ y θ(~x , z); I En efecto: θ2 (~x , y ) ≡ ∀z ≤ y θ(~x , z) • I θ1 (~x , y ) = sg (y + 1− µt ≤ y (θ(~x , t))) I θ2 (~x , y ) = sg (y + 1− µt ≤ y (¬θ(~x , t))) • I Ejemplos. Los siguientes predicados son GOTO-computables: I Predicado de divisibilidad, x|y : θ(x, y ) ≡ ∃z ≤ y (y = z · x) I Predicado de primalidad: primo(x) ≡ (x > 1) ∧ ∀t ≤ x((t|x) → (t = 1 ∨ t = x)) LC, 2010–11 Procedimientos para obtener funciones computables 5.18 La sucesión de los números primos I Es la función p : N → N definida por: I I I LC, 2010–11 p(0) = 0, y para todo n ≥ 1, p(n) = pn es el n–ésimo primo. p es GOTO–computable ya que se define por recursión ası́: p(0) = 0 p(x + 1) = µy (primo(y ) ∧ y > p(x)) Procedimientos para obtener funciones computables 5.19 Codificación de sucesiones Definición (Sucesiones finitas). Una codificación de Nm a partir de N, es una función total f : Nm −→ N que verifica: 1. f es GOTO–computable e inyectiva. 2. Para cada i, 1 ≤ i ≤ m, la función total, gi : N −→ N: ai si x ∈ rang (f ) ∧ x = f (a1 , ..., am ) gi (x) = 0 e.c.o.c. es GOTO–computable. Definición (Sucesiones de longitud arbitraria). Sea N0 = {ε} ∪ N ∪ N2 ∪ ... ∪ Nk ∪ ... (donde ε es la sucesión vacı́a -de longitud 0-). Una función f : N0 −→ N, codifica N0 a partir de N, si: I f es total. I ∀j ≥ 1, f Nj es una codificación de Nj , a partir de N. LC, 2010–11 Procedimientos para obtener funciones computables 5.20 La función par I Es la función total h· , ·i : N2 −→ N definida por • hx, y i = 2x · (2y + 1) − 1 I I I La función par es GOTO-computable y biyectiva. Para todo x, y ∈ N se verifica: x ≤ hx, y i, y ≤ hx, y i. Existen l, r : N −→ N tales que si z = hx, y i , l(z) = x; I I r (z) = y z = hl(z), r (z)i l y r son funciones decodificadoras de h ·, ·i. Las funciones l, r son GOTO-computables y totales. Usando la función par podemos codificar N3 a partir de N: (x, y , z) −→ hx, hy , zii Y, en general, Nk a partir de N. LC, 2010–11 Procedimientos para obtener funciones computables 5.21 Números de Gödel Sea {pn : n ≥ 1} la sucesión de números primos y [ · · · ] : N0 −→ N la función definida ası́: [ε] =1 [a1 , ..., an ] = p1a1 ...pnan Diremos que [a1 , ..., an ] es el número de Gödel de la sucesión finita a1 , ..., an . Propiedades: I La función [ · · · ] codifica N0 a partir de N. I Para todo i, 1 ≤ i ≤ n se verifica: ai ≤ [a1 , ..., an ]. I La función [ · · · ] no es inyectiva. I rang( [ · · · ])= N − {0}. I Cada número natural codifica infinitas sucesiones. LC, 2010–11 Procedimientos para obtener funciones computables 5.22 Las funciones componente y longitud I Lema. Si x ∈ N − {0, 1} existen unos únicos a1 , ..., an ∈ N, an 6= 0, tales que x = [a1 , ..., an ]. I I Escribiremos (x)i = ai si i ∈ {1, ..., n} y diremos que ai es la componente i–ésima de x. Si i ∈ / {1, ..., n} entonces escribiremos: (x)i = 0. I Definición. Denominaremos función componente a la función: ( · ) : N2 −→ N , definida ası́: 0 si x = 0 (x)i = t+1 µt ≤ x (¬(pi |x)) e.c.o. I La función componente es GOTO–computable y total. Definición. Definimos la función longitud, long : N −→ N, ası́: I long (x) = µi ≤ x ((x)i 6= 0 ∧ ∀j ≤ x (j > i → (x)j = 0)) I LC, 2010–11 La función longitud es GOTO–computable y total. Procedimientos para obtener funciones computables 5.23