Está en la página 1de 33

Tema 9: Límites de lo

computable
¿Hay problemas indecidibles?
El problema de parada
El problema de parada es indecidible:
Demostraciones por diagonalización
Significado de indecidible
Siginificado de decidible
Otro problema indecidible
¿Cómo encontramos más problemas indecidibles?
Teorema de Rice
Consecuencias del Teorema de Rice
Teoremas de incompletiud de Gödel
1
Problemas semidecidibles
Tema 9: ¿Hay problemas indecidibles?

Hemos visto problemas intratables

INPUT OUTPUT

Vamos a ver problemas imposibles

INPUT OUTPUT

2
Tema 9: ¿Hay problemas indecidibles?
Hay que recordar que la noción de problema para nosotros es decidir un
lenguaje sobre alfabeto ∑.

w ∈ ∑* SI/NO

Alan Turing demostró en 1936 la existencia de la Máquina de Turing


Universal 𝔄: Podemos escribir una máquina de Turing, que cuando
recibe como entrada M#x, interpreta M como una máquina de Turing y
simula la ejecución de M sobre x. 𝔄 calcula la función:

U(M,x) = el valor que devuelve la máquina M cuando se ejecuta sobre x.

3
Tema 9: The Halting Problem
El problema de parada

Entrada: Una máquina M y una entrada x para la máquina.


Salida: Decidir si la ejecución de la máquina M sobre entrada x
termina.

Útil en verificación, pruebas, depuración de programas

QUIZ ¿Cuál es la salida del problema de parada para estas instancias?


for x in l: while x < 0: while x < 0:
print(x) x = x - 1 x = x + 1

entrada l= [1, 2, 3] entrada x = -2 entrada x = -100

☐ ☐ ☐
4
Tema 9: El problema de parada

Algoritmo halt
SI

M, x

NO

¿Existe el algoritmo halt?

El problema de parada es indecidible


(La prueba se hace por contradicción)

5
Tema 9: Demostraciones por diagonalización
Teorema: El problema de parada es indecidible
Demostración: Se hace por diagonalización, un tipo de prueba
por reducción al absurdo.

1- Supón que el problema de parada es decidible. SI


M, x
2- Entonces el Algoritmo halt existe

3- Escribimos el programa halt_inverso(program): NO


if halt(program, program):
go to infinite loop
else:
return True

4- Ejecuta halt_inverso(halt_inverso)

6
Tema 9: Demostraciones por diagonalización
QUIZ ¿Qué ocurre si halt_inverso(halt_inverso) para?
halt(halt_inverso, halt_inverso) = SI ☐
halt(halt_inverso, halt_inverso) = NO
1- Supón que el problema de parada es decidible.

SI

2- Entonces el Algoritmo halt existe M, x

3- Escribimos el programa halt_inverso(program): NO


if halt(program, program):
go to infinite loop
else:
return True

4- Ejecuta halt_inverso(halt_inverso)

7
Tema 9: Demostraciones por diagonalización
QUIZ ¿Qué ocurre si halt_inverso(halt_inverso) NO para?
halt(halt_inverso, halt_inverso) = SI ☐
halt(halt_inverso, halt_inverso) = NO
1- Supón que el problema de parada es decidible.

SI

2- Entonces el Algoritmo halt existe M, x

3- Escribimos el programa halt_inverso(program): NO


if halt(program, program):
go to infinite loop
else:
return True

4- Ejecuta halt_inverso(halt_inverso)

8
Tema 9: Demostraciones por diagonalización

1- Supón que el problema de parada es decidible.


SI

2- Entonces el Algoritmo halt existe M, x

3- Escribimos el programa halt_inverso(program): NO


if halt(program, program):
go to infinite loop
else:
return True

4- Ejecuta halt_inverso(halt_inverso)

9
Tema 9: Demostraciones por diagonalización
Otra manera de ver la contradicción en la demostración:
Programa halt(programa,programa) Significado halt_inverso(programa)

P1 SI P1 para con ↑
input P1
P2 NO P2 no para SI
con input P2
... ... ... ...

halt_inverso SI Para sobre ↑


halt_inverso.
No para
NO SI
sobre
halt_inverso.

10
Tema 9: Demostraciones por diagonalización

Otra manera de ver la contradicción en la demostración:

https://www.youtube.com/watch?v=92WHN-pAFCs&t=12s

https://www.youtube.com/watch?v=wGLQiHXHWNk

11
Tema 9: Significado de indecidible
QUIZ
¿Qué significa que un problema sea indecidible?

☐ El coste de un algoritmo que lo resolviera tendría que


ser superior a exponencial.

☐ Ningún algoritmo puede resolver el problema.

☐ Dado un programa P concreto, no existe un algoritmo


que responda cuándo para P y cuándo no.

12
Tema 9: Significado de indecidible
Puede parecer que la indecibilidad del problema de parada depende
de instancias muy complicadas. Pero esto no es real.

def collatz(x):
Pre: x >= 1
while x != 1:
if x % 2 == 0:
x = x / 2
else:
x = x * 3 + 1

No se sabe si este programa para, cuando x es un positivo. La


Conjetura de Collatz dice que éste es el caso, pero nadie ha sido
capaz de demostrarlo https://es.wikipedia.org/wiki/Conjetura_de_Collatz.
13
Tema 9: Significado de decidible
QUIZ
Sea P un problema decisional: para cualquier instancia devuelve
SI ó NO.
NO Llamamos complementario(P) al siguiente problema:

SI cuando P(x) = NO
complementario(P)(x) =
NO cuando P(x) = SI

☐ P es decidible <==> complementario(P) es decidible

☐ Si P es decidible, entonces P y complementario(P)


siempre paran (sobre cualquier instancia)
14
Tema 9: Otro problema indecidible

halt_particular(M) <==> halt(M,M)

Teorema: halt_particular es indecidible.


Demostración:
1- Supón que es decidible
2. Existe el algoritmo halt_particular.
3. Escribe el programa halt_particular_inverso(program):
if halt_particular(program):
go to infinite loop
else:
return True
4. Ejecuta
halt_particular_inverso(halt_particular_inverso)
15
Tema 9: ¿Cómo encontramos más problemas
indecidibles?
Con la misma técnica que hemos usado con los problemas
intratables: Reducción entre problemas.

halt(M, x) halt_general(M)
Decide si M para Decide si existe una instancia x de
sobre x. forma que M para sobre x.

Teorema: Si halt_general es decidible, halt es decidible.


Demostración: Para decidir halt(M, x), reescribe el programa
M de forma que siempre se ejecute sobre x (independientemente de
la entrada que llegue). Sea M’ el nuevo programa (que tiene x en su
propio código). Devuelve lo que devuelva halt_general(M’).

16
Tema 9: ¿Cómo encontramos más problemas
indecidibles?
Dicho de otra forma,

halt(M, x) halt_general(M)
Decide si M para Decide si existe una instancia x de
sobre x. forma que M para sobre x.

Teorema: halt ≤ halt_general.


Demostración: f(M,x),devuelve el código del programa M’ que
es M ejecutándose siempre sobre x (independientemente de la
entrada que llegue). La función f es computable y
halt(M,x) <==> halt_general(M’)

17
Tema 9: ¿Cómo encontramos más problemas
indecidibles?

halt_general(M) equivalencia(M,M’)
Decide si existe una instancia x de Decide si ambos programas
forma que M para sobre x. se comportan igual sobre
todas las instancias.

Teorema: Si equivalencia es decidible, halt_general también.


Demostración: Para decidir halt_general(M), escribe un
programa nunca que cicla siempre, para cualquier instancia. Llama
a equivalencia(M,nunca). Si la respuesta es YES entonces
devuelve NO. Si la respuesta es NO entonces devuelve YES.

18
Tema 9: ¿Cómo encontramos más problemas
indecidibles?
Dicho de otra forma,
halt_general(M) equivalencia(M,M’)
Decide si existe una instancia x de Decide si ambos programas
forma que M para sobre x. se comportan igual sobre
todas las instancias.
Teorema: complementario(halt_General)≤ equivalencia
Demostración: f(M),devuelve el par (M,nunca). Donde nunca
es el código de un programa que cicla siempre, para cualquier
entrada. La función f es computable y
complementario(halt_general)(M) <==> equivalencia(M,nunca)

Corolario: como halt_general no es decidible, su complemen_


tario tampoco lo es, y por tanto, equivalencia no es decidible.
19
Tema 9: ¿Cómo encontramos más problemas
indecidibles?

Equivalencia(M,M’) Especificacion(M,{Pre, Post})


Decide si ambos programas Decide si M cumple la especificación
se comportan igual sobre {Pre, Post}.
todas las instancias.

Teorema: Si Especificación es decidible, Equivalencia es


decidible. Es decir, Equivalencia ≤ Especificación.

Sin demostración.

20
Tema 9: Teorema de Rice

Henry Gordon Rice (1920 – 2003) demostró en 1953 que si un


programa P puede decidir sobre su comportamiento, entonces
halt_particular es decidible.

21
Tema 9: Teorema de Rice

Para enunciar el Teorema de Rice, primero debemos definir lo


que es una propiedad funcional.

Definición: Una propiedad funcional es aquella que

(a) describe el comportamiento de un programa en función


de su entrada. Describe lo que hace el programa;

(b) debe ser cumplida por al menos un programa y debe


ser no cumplida por al menos otro programa.

22
Tema 9: Teorema de Rice
QUIZ
¿Cuáles son propiedades funcionales?

☐ “Es un programa de ordenador”

☐ “Siempre devuelve 1”

☐ “Resuelve Vertex-Cover”

☐ “Es un virus”

☐ “Tiene un coste O(n)”


23
Tema 9: Teorema de Rice
QUIZ

Si dos programas con código distinto dan la misma salida


para las mismas entradas, entonces tienen las mismas
propiedades funcionales.

CIERTO FALSO

☐ ☐

24
Tema 9: Teorema de Rice
QUIZ
Sea el programa def nunca(x):
i = 0
while True:
i = i + 1

☐ Si nunca verifica una propiedad funcional A , entonces


todos los programas que ciclan sobre cualquier
entrada cumplen A.

☐ Si nunca NO verifica una propiedad funcional A ,


entonces todos los programas que ciclan sobre
cualquier entrada tampoco cumplen A.
25
Tema 9: Teorema de Rice

TEOREMA DE RICE: Cualquier propiedad funcional de un


programa es indecidible.

Demostración: Por reducción al absurdo. Fija una propiedad


funcional cualquiera A.

(1) Supón que existe un programa DPFA que decide la


propiedad funcional A. Esto es, dado un programa M, decide si
M cumple A ó NO.

(2) Veamos que halt_particular ≤ DFPA

(3) Entonces podríamos decidir halt_particular


26
Tema 9: Teorema de Rice
Demostración de (2): Reducción

halt_particular(M) DPFA(M)
Decide si M para sobre M Decide si M cumple A.

Teorema: halt_particular ≤ DPFA.

Demostración: Supongamos que el programa nunca no verifica la


propiedad A. En caso contrario la estrategia es diferente. Sabemos
que debe existir un programa P que verifique la propiedad A. Dado
un programa M, f(M) escribe el siguiente programa:

27
Tema 9: Teorema de Rice

Ejecuta M sobre M;
M -----> Borra la memoria usada;
f Ejecuta el programa P sobre la entrada;

f es computable.
halt_particular(M) <==> DFPA(f(M))

halt_particular(M) ===>
el programa M sobre M para ===>
el programa f(M) se comporta exactamente como el programa P,
que cumple la propiedad A ===>
f(M) cumple la propiedad A ===>
DFPA(f(M)) 28
Tema 9: Teorema de Rice

Ejecuta M sobre M;
M -----> Borra la memoria usada;
f Ejecuta el programa P sobre la entrada;

halt_particular(M) <==> DFPA(f(M))

┓halt_particular(M) ===>
el programa M sobre M no para ===>
el programa f(M) se comporta exactamente como el programa
nunca, que no cumple la propiedad A ===>
f(M) no cumple la propiedad A ===>
┓DFPA(f(M)) 29
Tema 9: Teorema de Rice

QUIZ

¿Cómo probarías la reducción anterior si suponemos


que el programa nunca verifica la propiedad A?

30
Tema 9: Consecuencias del
Teorema de Rice
QUIZ
¿Cuáles son propiedades funcionales de un programa?

☐“Suma dos números” ☐“Devuelve un entero”


☐“Siempre devuelve 1” ☐“Convierte a un
fichero mp4”

☐“Resuelve Vertex-Cover” ☐“Termina en 3 pasos”


☐“No hace nada” ☐“Se modifica a si
mismo”

☐“Lee de un fichero” ☐“Es un virus”31


Tema 9: Consecuencias del
Teorema de Rice

Las demostraciones de indecibilidad y la aplicación del


teorema de Rice son malinterpretados a menudo.

Sabemos que no existe un único algoritmo que decida sobre


una propiedad funcional para TODOS los programas. Puede
que la dificultad sea debido a muy pocas instancias.

Siempre puedes intentarlo con la esperanza de que responda


la mayoría de las veces y cicle en raras ocasiones.

Si tienes que probar una propiedad funcional para un


programa concreto la tarea puede ser muy fácil.
32
Tema 9: Consecuencias del
Teorema de Rice

QUIZ
¿Qué afirmaciones son ciertas cuando hablamos de
detección automática de malware?

☐ Problema NP-completo

☐ Problema indecidible

☐ La detección no puede ser “perfecta”.

33

También podría gustarte