Atlasingeniería

Teoría de la computaciónComputabilidadTema 4

Problemas indecidibles y reducciones

Después del problema de la parada, casi nada se demuestra desde cero: se reduce. Mostrar que resolver un problema nuevo resolvería la parada alcanza para probar que tampoco se puede.

Para este tema conviene tener claro:El problema de la parada

El problema de la parada es el primero, y casi el único que se demuestra con un argumento diagonal. Todos los demás resultados de imposibilidad se prueban de otra forma, mucho más barata: mostrando que si ese problema se pudiera resolver, la parada también.

La mecánica de la reducción

La estructura del argumento es siempre la misma. Se supone que existe un decisor para el problema nuevo XX, y se construye con él un decisor para la parada. Como la parada no es decidible, XX tampoco.

La dirección es la misma que en las reducciones de NP-completitud y se confunde igual de seguido: se reduce el problema conocido-imposible al nuevo, nunca al revés. Reducir XX a la parada no dice nada; sólo indica que XX no es peor.

Sabemos que la parada no es decidible. Queremos probar lo mismo de X: decidir si un programa alguna vez imprime «hola».

1 / 6
Las dos flechas se pueden dibujar y sólo una prueba algo. La que sirve sale de la parada: si tuviéramos un decisor para X, podríamos armar uno para la parada, y ése no existe. Dibujarla al revés es el error más común, y el dibujo lo hace evidente.

Antes de seguir, predecí

Un verificador de tipos rechaza un programa que en realidad nunca fallaría. ¿Está roto?

Un ejemplo concreto, paso a paso

Un ejemplo concreto: decidir si un programa alguna vez imprime “hola”. Supongamos que existe imprime_hola(P).

Dado un programa PP y una entrada xx, construyo un programa nuevo que ejecuta PP sobre xx y, si eso termina, imprime “hola”. Ese programa imprime “hola” exactamente cuando PP termina con xx. Preguntándole a imprime_hola habría resuelto la parada. Contradicción: decidir si un programa imprime cierta cosa es indecidible.

El teorema de Rice ahorra todas esas demostraciones

El teorema de Rice ahorra todas esas demostraciones de un saque: cualquier propiedad no trivial del lenguaje que reconoce un programa —es decir, de lo que computa, no de cómo está escrito— es indecidible.

“No trivial” significa que algunos programas la cumplen y otros no. Así que decidir si un programa calcula la función constante cero, si termina para toda entrada, o si es equivalente a otro, son todos indecidibles sin necesidad de argumento propio. La contracara: propiedades sintácticas —cuántas líneas tiene, si usa cierta palabra clave— son perfectamente decidibles.

La indecidibilidad lejos de los programas

La indecidibilidad aparece lejos de los programas. El problema de correspondencia de Post, un rompecabezas de fichas con cadenas arriba y abajo, es indecidible, y se usa como base para reducir problemas sobre gramáticas: decidir si dos gramáticas libres de contexto generan el mismo lenguaje, por ejemplo.

El décimo problema de Hilbert —decidir si una ecuación polinómica con coeficientes enteros tiene solución entera— también resultó indecidible, después de setenta años. Y los teoremas de incompletitud de Gödel son el mismo fenómeno en lógica: ningún sistema formal consistente y suficientemente expresivo demuestra todas las verdades sobre los números.

No todo lo indecidible es igual

No todo lo indecidible es igual. Hay una escala: los lenguajes reconocibles —donde se puede confirmar un sí pero no descartar— son un escalón; su complemento, otro; y hay problemas que no son ni reconocibles ni co-reconocibles, como decidir si un programa termina para toda entrada.

Esa jerarquía se formaliza con oráculos: una máquina con acceso gratuito a un decisor de la parada resuelve más cosas, pero tiene su propio problema de la parada indecidible. La imposibilidad no se acaba agregando poder; se reproduce un nivel más arriba.

Cuando una herramienta promete demasiado

Esto no es sólo teoría de la carrera. Cada vez que una herramienta promete decidir algo sobre programas arbitrarios —detectar todo el código muerto, garantizar ausencia de bugs, identificar todo el malware— vale la pena preguntarse en qué lado de Rice cae la propiedad.

La respuesta casi siempre es que la herramienta aproxima, y saber eso cambia cómo se la evalúa: no por si acierta siempre, sino por su tasa de falsos positivos y falsos negativos, que es lo único que puede ofrecer.

El teorema de Rice, y lo que deja afuera

Propiedad¿Decidible?Por qué
¿El programa tiene más de 100 líneas?es del texto, no del comportamiento
¿Usa la variable x?también es sintáctica
¿Alguna vez imprime «hola»?noes del comportamiento
¿Es equivalente a este otro programa?nodel comportamiento
¿Termina para toda entrada?nodel comportamiento
El teorema de Rice dice que toda propiedad no trivial del comportamiento de un programa es indecidible. La frontera es exactamente ésa: lo que se puede leer del texto sí, lo que hay que ejecutar para saber no.

Cierre

Después de la parada, la indecidibilidad se propaga por reducción: si resolver XX resolvería la parada, XX tampoco se puede. El teorema de Rice extiende eso a toda propiedad no trivial de lo que un programa computa, y deja afuera sólo lo sintáctico.

Autoevaluación

¿Lo entendiste?

¿Cómo se demuestra que un problema nuevo es indecidible?
Para probar que «decidir si un programa imprime hola» es indecidible, ¿qué se construye?
¿Qué dice el teorema de Rice?
Un problema es «reconocible pero no decidible». ¿Qué significa?