Computabilidad & Complejidad Computacional (En rodaje)

Slides:



Advertisements
Presentaciones similares
Tema: Decibilidad Integrantes: Ileana Rdguez Soto
Advertisements

Introducción a la máquina
La maquina de Turing La máquina de Turing es una caja negra (tan simple como una máquina de escribir y tan compleja como un ser humano) capaz no sólo de.
ALGORÍTMICA Dpto. Ingeniería de Sistemas y Automática
CLASIFICACION DE LAS MAQUINAS DE TURING
Representaciones de conjuntos y funciones Roberto Moriyón.
Complejidad Roberto Moriyón.
Lenguajes regulares Teoría del Autómata.
MÁQUINAS DE TURING Teoría del Autómata.
Gramáticas Formales Cadenas y Lenguajes.
Problemas de grafos y Tratabilidad Computacional
Análisis de los algoritmos Unidad 7. Análisis La resolución práctica de un problema – algoritmo o método de resolución – y por otra un programa o codificación.
Introducción al cálculo lambda Programación lógica funcional.
1 MATEMATICAS I ITESM-Preparatoria Esmeralda Prof. Q.F.B. Mary Luz Noguera Números.
Teoría de la computación DECIBILIDAD Equipo 4 Karla Flores Samuel rojas Filiberto Jiménez.
Autómatas finitos (AF) Los AF constan de 5 elementos fundamentales AF=( , E, F, s,  ).  Un alfabeto (  )  Un conjunto de estados (E)  Un conjunto.
Máquinas de Turing. Aumentando el poder Hasta aquí: Autómatas finitos (  lenguajes regulares), el poder de cómputo de los sistemas con memoria finita.
¿Qué es un Diagrama de Flujo? UN DIAGRAMA DE FLUJO, TAMBIÉN LLAMADO FLUJOGRAMA DE PROCESOS O DIAGRAMA DE PROCESOS, REPRESENTA LA SECUENCIA O LOS PASOS.
TUTORIA 1 Lógica para la Computación TUTORIA 1 Facultad de Ciencias Naturales y Matemáticas.
1 Autómatas de pila (Pushdown automata). 2 Autómata de conteo Autómata finito determinista con un contador de enteros o “bolsa” en la que se colocan o.
Nancy Margarita Gutiérrez Chavira
Ingreso , proceso y salida de datos
U-6. Cap. III Introducción a la solución por series.
LA DEMOSTRACIÓN EN MATEMÁTICAS
PRINCIPIOS LOGICOS MATERIA: LOGICA MATRICULA:
TEOREMA FUNDAMENTAL DEL CALCULO
INDUCCIÓN MATEMÁTICA.
El conjunto de los números naturales
Fundamentos de la Computación
Programación Orientada a Objetos
Diagramas de Flujo Algoritmos.
5. Análisis y diseño de sistemas secuenciales (I)
5. Fundamentos de algoritmos
Computación Valeria Herskovic –
PSEUDOCÓDIGO Prof. Rafael Mourglia.
1 1 1 El Sistema B nar o
CREAR DIAGRAMA DE FLUJO
MATEMÁTICA DISCRETA Y LÓGICA 1
ALGORITMOS. IFE 115: INFORMÁTICA BÁSICA Lic. Marcio Rodas
Software Es intangible, existe como información, ideas, conceptos, símbolos, pero no ocupa un espacio físico, se podría decir que no tiene sustancia. Se.
LÓGICA DE PROGRAMACIÓN
Estimación de parámetros: Estimación puntual y por intervalos
EXPRESIONES Una expresión es una forma especial de asignación.
ALGORITMOS es un conjunto preescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permite realizar una actividad mediante pasos.
Aplicación: Circuito RLC
3.1 AREAS.
Funciones Prof. M. Alonso
Equipo 7 -Ayala sanjuan Luis Antonio -Villa González Jonathan Aldair
AUTOMATAS FINITOS DETERMINISTICOS
CONCEPTOS PRELIMINARES (Cont)
IFE 115: INFORMÁTICA BÁSICA
Retroalimentación ejercicios de tarea. Ejercicios para resolver 1.¿Cuántos bytes hay exactamente en un sistema que contiene a.32 Kbytes b.64 Mbytes c.6.4.
Métodos de derivación numérica: El problema de la derivación numérica consiste en la evaluación de la derivada de la función en un punto, cuando únicamente.
CURSO PROGRAMACIÓN BÁSICA SEMANA 3 ¿Qué es un programa?
Máquinas de Turing.
FUNDAMENTOS DE PROGRAMACIÓN. INTRODUCCIÓN  Conceptos: Informática, Ordenador, Programa, Dato, Bit, Byte, Hardware, Software, Lenguaje de Programación,
Matrices Conceptos básicos. Matrices Buscando formas para describir situaciones en matemáticas y economía, llegamos al estudio de arreglos rectangulares.
Informática Aplicada al Medio Ambiente - Curso 99/00 1 Tema 6. Introducción a la programación 1 Conceptos básicos 2 Los algoritmos – Concepto de algoritmo.
Eficiencia de un Algoritmo  El análisis de algoritmos estudia desde el punto de vista teórico los recursos computacionales que necesita un programa para.
ISIV - Desarrollo de Sistemas I1 Diagramas PERT Cálculos y Gráficos.
Lógica y argumentación Transformación de proposiciones.
CICLOS EN JAVA FOR, WHILE, DO WHILE Un ciclo en Java o bucle en Java (como prefieras llamarlo) permite repetir una o varias instrucciones cuantas veces.
Informática Aplicada al Medio Ambiente - Curso 99/00 1 Tema 6. Introducción a la programación 1 Conceptos básicos 2 Los algoritmos – Concepto de algoritmo.
Recursividad 1 Análisis de algoritmos. Matrushka La Matrushka es una artesanía tradicional rusa. Es una muñeca de madera que contiene otra muñeca más.
Complejidad algorítmica
AUTÓMATAS ROHERMY OCHOA V AUTÓMATA FINITO Es un modelo computacional que realiza cómputos en forma automática sobre una entrada para producir.
Informática Aplicada al Medio Ambiente - Curso 99/00 1 Tema 6. Introducción a la programación 1 Conceptos básicos 2 Los algoritmos – Concepto de algoritmo.
Teoría de Conjuntos Conjuntos. CONCEPTO DE CONJUNTO Es considerado un término primitivo, por lo tanto se acepta como un término no definido. Es una colección.
1 Ingeniería en Sistemas Matemática Discreta. 2 EJEMPLOS DE CONJUNTOS:  N: conjunto de los números naturales.N: conjunto de los números naturales. 
Guías Modulares de Estudio Cálculo diferencial – Parte B.
Transcripción de la presentación:

Computabilidad & Complejidad Computacional (En rodaje)

GeneralidadesGeneralidades ½ de un curso de 6 créditos, en cámara lenta A futuro, obligatorio Esta primera vez: semestral y en construcción; el programa puede variar. Requisitos: Lógica, grafos, probabilidades TALF se supone que no Evaluación: Tareas (individuales) Certamen (a partir de una lista conocida) Material disponible: Bibliografía en pdf Ppts y audio de clases

GeneralidadesGeneralidades Bibliografía: Hopcroft et al, Introduction to Automata Theory, Languages and Computation (3ed, 2007) Sipser, Introduction to the Theory of Computation (2005) Papadimitriou, Computational Complexity (1994) Arora & Barak, Computational Complexity: A Modern Approach (2009) Moore & Mertens, The Nature of Computation (2011) +, informalmente: Aaronson, Quantum Computing Since Democritus (2013)

Tema y programa ¿De qué trata el curso? Como “computer scientists”, hay algunas preguntas que uno esperaría que seamos capaces de responder. Por ejemplo: ¿Qué es un computador? ¿Qué problemas puede resolver un computador? ¿Qué no puede hacer, ni siquiera “en teoría”? ¿Qué problemas podemos resolver en la práctica? ¿Podemos clasificar la dificultad de los problemas? ¿Podemos detectar cuándo es preferible pasar a métodos probabilistas, o aproximados, o a heurísticas? ¿Para qué problemas es útil tener un cluster?

Tema y programa Supongamos dos conjuntos de secuencias de ADN, {a 1,...,a n } y {b 1,...,b n }. En bioinformática aparecen preguntas como: ¿Cuál es la secuencia de ADN más corta que admite a a 1,...,a n y también a b 1,...,b n como subsecuencias? ¿Cuál es la secuencia de ADN más corta, formada por elementos traslapados de estos conjuntos, que parte con a i y termina con b k ? ¿Existe un conjunto de índice i 1,..., i n, tal que a i 1 + a i a i n = b i 1 + b i b i n ? ¿Es posible parear cada a i con un b j distinto, de tal forma que a i y b j coincidan en un 99%? ¿De cuántas maneras se puede?

Tema y programa De estos problemas: Hay uno para el cual es imposible diseñar un algoritmo. Los otros tres sí admiten solución. En un caso, la solución es eficiente. En los otros dos, la solución es ineficiente y probablemente siga siéndolo para siempre.  Necesitamos ser capaces de distinguir, clasificar, demostrar!

Tema y programa Otros problemas: ¿Es posible hacer un programa que escriba su propio código? ¿Es posible determinar acaso un programa escribe su propio código (¡¡virus!!)? ¿Es posible automatizar la matemática? Es decir, ¿es posible hacer un programa que distinga entre teoremas ciertos y teoremas falsos? FÁCIL IMPOSIBLE

Tema y programa PROGRAMA DEL CURSO (en principio) Máquinas de Turing. Lenguajes recursivos y recursivos enumerables; funciones computables. Máquina de Turing universal. Tesis de Church-Turing. Problemas indecidibles, teorema de Rice y funciones no computables. Complejidad algorítmica. Clases de complejidad computacional. Reducciones eficientes y completitud. P y NP. C-Value y C-Sat; teorema de Cook-Levin. Otros problemas NP- completos. CoNP, EXP, NEXP. Diagonalización y teoremas de jerarquía. Oráculos. Complejidad espacial. PSPACE y NL. Complementos: definición de otras clases importantes (BPP, NC, BQP); dificultad de aproximación y teorema PCP.

Los problemas de cómputo tiene diversas formas. Por ejemplo: Dado un programa, determinar si sigue la sintaxis del C. Dado un programa, determinar acaso se detiene. Dadas dos matrices, calcular su producto. Dado un entero, encontrar sus factores primos. Dada una fórmula booleana, contar cuántas combinaciones de V/F que la hacen verdadera. Dados dos nodos de un cierto grafo, encontrar el camino más corto entre ellos. Los problemas de cómputo tiene diversas formas. Por ejemplo: Dado un programa, determinar si sigue la sintaxis del C. Dado un programa, determinar acaso se detiene. Dadas dos matrices, calcular su producto. Dado un entero, encontrar sus factores primos. Dada una fórmula booleana, contar cuántas combinaciones de V/F que la hacen verdadera. Dados dos nodos de un cierto grafo, encontrar el camino más corto entre ellos. Cómputo y lenguajes

Sin embargo, hay un esquema general: inputoutput Computador Información digital  Secuencia de símbolos CPU con estados internos (finitos!) Memoria  también es información digital!

Cómputo y lenguajes Es natural ver el cómputo como una función que recibe un string, y contesta con otro string. Problemas de funciones: dado un string x, calcular f(x) (incluye el caso de optimización y conteo) Problemas de decisión: dado un string x, contestar SÍ/NO Los problemas de decisión son más simples de estudiar, y en la práctica capturan mucho de la dificultad del cómputo. Nos centraremos en ellos.

Nociones básicas de palabras y lenguajes ALFABETO: un conjunto finito, no vacío, de símbolos. PALABRA (=“string”) : una secuencia finita de símbolos. Ejemplos:  ={0,1},  ={a,b,c,...,z},  =ASCII,  =Unicode Con alfabeto  ={0,1}, podemos escribir palabras como , 01, , etc. En particular si la secuencia tiene 0 símbolos obtenemos la palabra nula, típicamente representada por .

Nociones básicas de palabras y lenguajes  k denota el conjunto de todas las palabras de largo k con alfabeto . Por ejemplo, con  ={0,1}, tendríamos  0 = {  }  1 = { 0, 1 }  2 = { 00, 01, 10, 11 }... Definimos  * como el conjunto de todas las palabras con alfabeto . Es decir,

Nociones básicas de palabras y lenguajes A veces queremos excluir el caso de k=0; para eso se define también LENGUAJE: es cualquier conjunto de palabras L  *. Se define la concatenación de dos lenguajes como el lenguaje formado por todas las concatenaciones posibles entre sus palabras:

Nociones básicas de palabras y lenguajes Esto permite escribir y análogamente definir L k para cualquier k. Además (y L + si excluimos el k=0).

Lenguajes y problemas Nótese que a todo lenguaje L se le asocia de manera natural un problema de decisión: Dada una palabra w, ¿w  L? Es el llamado problema de membresía para L. Recíprocamente, cada vez que estudiamos un problema de decisión, y decidimos una forma de codificar sus instancias en strings, el problema se convierte en el problema de membresía de un cierto lenguaje: el de las instancias con respuesta “SÍ”. ¿es n primo?  L={n:n es primo}

Lenguajes y problemas Por lo tanto, hablaremos indistintamente de “clases de lenguajes” (sobre todo al comienzo) o de “clases de problemas” (más adelante). También veremos algunos casos en que el output no es SÍ/NO; en ese caso la noción de lenguaje deja de ser relevante.

Modelos de cómputo Para poder estudiar preguntas sobre la computabilidad de un problema, o sobre la complejidad de su solución, es necesario precisar el modelo de cómputo, la “máquina” de la que disponemos. inputoutput Máquina Debemos definirlo formalmente, para poder luego demostrar resultados sobre él. En (casi) todo este curso, el modelo son las máquinas de Turing, aunque no siempre será explícito.

Modelos de cómputo Un modelo más simple: autómatas finitos. Suponemos que la máquina puede estar en una cantidad finita de distintos estados, y que va cambiando de estado en la medida que recibe símbolos desde su input. La respuesta la leemos viendo el estado en que queda la máquina al terminar de leer el input: algunos estados se interpretan como “SÍ”, otros como “NO”. q0q0 q1q1 q2q ,11

Modelos de cómputo Un poco más complejo: autómatas de pila. Similar a un autómata finito, pero agregamos una pila, no acotada, donde es posible leer y guardar información. Los cambios de estado ahora consideran el símbolo que se ve en el tope de la pila, y pueden sacarlo y/o agregar otro. Se agrega la posibilidad de no determinismo: más de un cambio de estado es posible en un momento dado. Se contesta “sí” cuando existe una secuencia de decisiones que permite contestar “sí”.

Modelos de cómputo Los lenguajes que pueden decidirse con un autómata finito se llaman regulares; los que pueden decidirse con un autómata de pila se llaman de libre contexto. Ambas clases son muy útiles; los lenguajes regulares describen patrones simples en textos, mientras que los de libre contexto son capaces de describir lenguajes de programación, lenguajes humanos, XML, etc... En ambos casos existe algoritmos eficientes para resolver el problema de membresía.

Máquina de Turing Las máquinas de Turing son también similares a los autómatas finitos, pero les agregamos una cinta. input posición inicial del cabezal w0w0 w1w1 w2w2 wnwn...   casillas en blanco Sobre la cinta va un cabezal, que lee y escribe. El input viene escrito en la cinta.

Transiciones entre estados 1) leo 2) escribo 3) me muevo (Left, Right) 4) cambio el estado de la máquina

Ejemplos de transiciones Tiempo k Tiempo k+1 Se suele anotar el estado de la máquina “en el cabezal”.

Determinismo; función parcial Salvo que digamos lo contrario, las máquinas de Turing serán deterministas. Si en un momento dado ninguna transición es aplicable, la máquina se detiene. En particular, los estados de aceptación no tienen transiciones de salida. Por lo tanto, son siempre estados finales : la máquina acepta y se detiene.

Aceptación, rechazo o divergencia Cuando la MT se ejecuta partiendo con un input w escrito en la cinta, puede... aceptar w: si se detiene en un estado de aceptación no aceptar w: eso puede ser porque rechaza w: si se detiene en un estado de no aceptación nunca se detiene. Decimos que una MT siempre se detiene si ningún input la hace caer en ese último caso.

T=4 Ejemplo: aceptación Consideremos la máquina de arriba, y hagámosla correr sobre el input aaa. Stop y acepta T=0 T=1 T=2 T=3

Ahora, con input aca. Stop y rechaza T=0 T=1 Ejemplo: rechazo

Ahora, con input aba. Ejemplo: divergencia T=0 T=1T=2T=4...etc! No acepta, pero tampoco rechaza.

FormalmenteFormalmente Una máquina de Turing queda definida por M = ( Q, , , , q 0, F,  ) donde Q : conjunto finito de estados q 0  Q : estado inicial F  Q : estados de aceptación  : alfabeto del lenguaje a reconocer  : alfabeto de la cinta [incluye a  ]   \  : carácter “blanco” [a veces usan “B”, o “  ”]  :Q  Q  {L,R}  {  }: función de transición [  (q,a)=   “Stop!” ]

Descripción instantánea área de trabajo El área de trabajo en un instante dado es la parte (finita) de la cinta que la máquina ha visitado hasta ese momento. caq 2 ba "Descripción instantánea" o "configuración" : uqv  El contenido del área de trabajo es uv, la MT está en estado q, y el cabezal está al comienzo de v. Por lo tanto, una MT puede verse como un operador que transforma (localmente) un string en otro string.

Descripción instantánea En el ejemplo que teníamos, q 0 aaa  aq 0 aa  aaq 0 a  aaaq 0  aaq 1 a De modo que q 0 aaa  aaq 1 a, y como q 1  F, aceptamos aaa. T=4 T=0 T=1 T=2 T=3

Lenguajes reconocidos, lenguajes decididos El lenguaje reconocido por una máquina M es L(M) = { w  * : q 0 w  uqv, q  F } Si además M es una MT que siempre se detiene, decimos que M decide su lenguaje.

Lenguajes reconocidos, lenguajes decididos Con esto, las MT definen no una, sino dos clases de lenguajes: Un lenguaje L es “recursivo enumerable”, o “reconocible”, si existe una máquina de Turing que lo reconoce. Un lenguaje L es “recursivo”, o “decidible” si existe una máquina de Turing que lo decide. Nótese que, por definición, todo lenguaje decidible es reconocible.

Lenguajes Lenguajes reconocibles Lenguajes decidibles Lenguajes de libre contexto Lenguajes regulares Jerarquía de lenguajes

Volvamos al ejemplo Consideremos la máquina del ejemplo, con  ={a,b,c}. ¿Qué lenguaje reconoce? a * +b(a+b+c) * No lo decide ; existen palabras (por ejemplo, “ab”) que provocan un loop. Sin embargo, es fácil hacer una MT que sí lo decida.

Otro ejemplo Veamos un MT para el lenguaje {a n b n } a  x,R x  x,R y  y,R a  a,R q0q0 b  y,L y  y,L a  a,L y  y,R ,R q1q1 q3q3 q4q4 q2q2

T= 0 a  x,R x  x,R y  y,R a  a,R q0q0 b  y,L y  y,L a  a,L y  y,R ,R q1q1 q3q3 q4q4 q2q2

T= 1 a  x,R x  x,R y  y,R a  a,R q0q0 b  y,L y  y,L a  a,L y  y,R ,R q1q1 q3q3 q4q4 q2q2

T= 2 a  x,R x  x,R y  y,R a  a,R q0q0 b  y,L y  y,L a  a,L y  y,R ,R q1q1 q3q3 q4q4 q2q2

T= 3 a  x,R x  x,R y  y,R a  a,R q0q0 b  y,L y  y,L a  a,L y  y,R ,R q1q1 q3q3 q4q4 q2q2

T= 4 a  x,R x  x,R y  y,R a  a,R q0q0 b  y,L y  y,L a  a,L y  y,R ,R q1q1 q3q3 q4q4 q2q2

T= 5 a  x,R x  x,R y  y,R a  a,R q0q0 b  y,L y  y,L a  a,L y  y,R ,R q1q1 q3q3 q4q4 q2q2

T= 6 a  x,R x  x,R y  y,R a  a,R q0q0 b  y,L y  y,L a  a,L y  y,R ,R q1q1 q3q3 q4q4 q2q2

T= 7 a  x,R x  x,R y  y,R a  a,R q0q0 b  y,L y  y,L a  a,L y  y,R ,R q1q1 q3q3 q4q4 q2q2

T= 8 a  x,R x  x,R y  y,R a  a,R q0q0 b  y,L y  y,L a  a,L y  y,R ,R q1q1 q3q3 q4q4 q2q2

T= 9 a  x,R x  x,R y  y,R a  a,R q0q0 b  y,L y  y,L a  a,L y  y,R ,R q1q1 q3q3 q4q4 q2q2

T= 10 a  x,R x  x,R y  y,R a  a,R q0q0 b  y,L y  y,L a  a,L y  y,R ,R q1q1 q3q3 q4q4 q2q2

T= 11 a  x,R x  x,R y  y,R a  a,R q0q0 b  y,L y  y,L a  a,L y  y,R ,R q1q1 q3q3 q4q4 q2q2

T= 12 a  x,R x  x,R y  y,R a  a,R q0q0 b  y,L y  y,L a  a,L y  y,R ,R q1q1 q3q3 q4q4 q2q2

Para y acepta T= 13 a  x,R x  x,R y  y,R a  a,R q0q0 b  y,L y  y,L a  a,L y  y,R ,R q1q1 q3q3 q4q4 q2q2

El segundo ejemplo Podemos resumir el funcionamiento de esa máquina de Turing mediante pseudocódigo: While veo a a  x Avanzar (R) saltando {a,y}, hasta ver b b  y Avanzar (L) saltando {a,y}, hasta ver x Avanzar (R) Avanzar (R) saltando {y} hasta ver  Aceptar

1. Definición, notación, ejemplos 2. Lenguajes de MT; funciones computables 3. Variaciones c/r a MT estándar 4. Conjuntos enumerables; codificación de inputs 5. Máquina de Turing Universal. Indecidibilidad, incomputabilidad, reducciones. Teorema de Rice. 6. Tesis de Church-Turing y los límites de la computación Máquinas de Turing

MT estándar cabezal que escribe y lee transiciones entre los estados internos de la MT son determinísticas 1 cinta, infinita en ambas direcciones (movimiento es a la izquierda o la derecha)

Variaciones c/r a las MT estándar Las MT son un paradigma bastante robusto: es posible definir modelos de cómputo aparentemente más poderosos, y resulta (una y otra vez) que las clases de lenguajes reconocibles y decidibles siguen siendo las mismas. Veremos algunas variantes; con ellas en mano, es más fácil construir MT más ambiciosas.

Ejemplo de extensión: MT con “Stay” MT+stay: como una MT estándar, pero las opciones de movimiento son L, R y "S" (quedarse donde está). Por ejemplo, una transición podría ser y al aplicarla...

Ejemplo de extensión: MT con “Stay” Teorema: las MT+stay tienen el mismo poder de cómputo que las MT estándar. Demostración: hay que mostrar que 1.Las MT+stay tienen al menos el poder de cómputo de las MT estándar. 2. Las MT estándar tienen al menos el poder de cómputo de las MT+stay.

Ejemplo de extensión: MT con “Stay” 2. Las MT estándar tienen al menos el poder de cómputo de las MT+stay. Para eso, veremos cómo convertir una MT+stay en una MT estándar, sin alterar su funcionamiento. 1.Las MT+stay tienen al menos el poder de cómputo de las MT estándar.  Es directo, pues la MT estándar es un caso particular de MT+stay.

Ejemplo de extensión: MT con “Stay” Para cada transición que use el “S” (stay), agregamos un estado auxiliar, y reemplazamos la transición por 1+|  | transiciones: Una flecha de esas por cada x   QED

MT multipista ("multitrack") pista 1 pista 2 lo que leelo que escribe Se simula con una MT estándar: si son k pistas, la MT estándar usará  ’ =  k. En el ejemplo, k=2 y el cabezal lee “(b,a)”. ¿Qué es? ¿Cómo se hace?

MT con marcas Las transiciones podrán consultar la presencia de marcas, y decidir marcar o desmarcar una celda. ¿Cómo hacemos esto con una MT estándar?  Ponemos una segunda pista para las marcas. ¿Qué? ¿Cómo?

MT con memoria "interna" finita Una MT podría “variables internas” finitas del tipo Parte “normal” de la regla Los valores se pueden consultar y modificar en las transiciones (si no se modifican, quedan como estaban). m 1  D 1 = {0, 1} m 2  D 2 = {,, } ¿Qué?

MT con memoria "interna" finita Para simular con una MT estándar, la idea es reemplazar Q por Q' = Q  D 1  D 2 Con eso, las consultas y cambios de variables se reducen a ver en qué estado estoy y a cuál paso. estado interno estado de control variables internas =+...etc q q,0, q,1, ¿Cómo?

MT con varias cintas ("multitape") Cinta 1Cinta 2 Unidad de control ¿Qué?

MT con varias cintas T = 1 T = 2 Cinta 1Cinta 2 ¿Qué?

MT con varias cintas Podemos simularla usando una MT multipista, con marcas (“cabezales virtuales”), y con variables internas: Cinta 1 Cinta 2... Para simular cada iteración: Recorro y memorizo lo que los cabezales ven. Recorro de nuevo, aplicando los cambios. ¿Cómo?

MT no-deterministas En una MT no determinista, existe más de una transición posible a partir de una configuración dada. T = 1 T = 2 Opción 1Opción 2 ¿Qué?

MT no-deterministas Lenguaje aceptado por una MT no-determinista: el conjunto de inputs para las cuales existe alguna cadena de decisiones que lleva a estado de aceptación. El no-determinismo tampoco cambia la clase de lenguajes que una MT puede aceptar. ¿Qué? Bosquejemos una forma de simular una MT no- determinista M mediante una MT determinista M’.

MT no-deterministas En la cinta ponemos varias áreas de trabajo, cada una con un “cabezal virtual” área 1 $  $  área 2 $ En cada vuelta M' recorre todas las áreas, y hace en cada una lo que M habría hecho. Cada vez que toque "adivinar" un paso, M’ clonará esa área de trabajo, y habrá un área por cada opción. ¿Cómo?

MT no-deterministas Si en algún momento en algún área de trabajo M llega a estado de aceptación, M' acepta área 2 $  $  área 1b $ área 1a $ área 1 $  $  área 2 $ ¿Cómo?

Variaciones c/r a las MT estándar Respecto a las MT estándar, uno puede definir: Extensiones: generalizan las MT. Limitaciones: reducen las capacidades de la MT. Los ejemplos previos son todas extensiones. Ninguna extensión aumenta de verdad el poder de cómputo: los lenguajes reconocibles, las funciones computables, siguen siendo las mismas. Las limitaciones, en cambio, podrían reducir el poder de cómputo.

Una posible limitación: cinta semi-infinita... disponemos de:... Cualquier MT con cinta bi-infinita se puede convertir en una con cinta semi-infinita (no veremos la demostración). Algunos textos usan este tipo de MT como "estándar". “#” marca el fin de la cinta Un ejemplo de limitación que no reduce el poder de cómputo es la cinta semi-infinita. En lugar de

Funciones computables y conjuntos enumerables: otras formas de usar MT. Máquinas de Turing

Funciones Turing-computables Las MT también son flexibles en otro sentido: pueden usarse de distintas formas. Si miramos el contenido del área de trabajo al detenerse, vemos que una máquina M induce una función, f M :  *  * Config. inicialSe detiene, con config. final:

Funciones Turing-computables Una función f es computable si  M tq f=f M. Una función computable es total si es inducida por una MT que se detiene siempre. En particular, la función indicatriz de un lenguaje L (definida como f L (w)=1 si w  L y f L (w)=0 si w  L) será computable ssi L es reconocible, y total ssi L es decidible.

Ejemplo: 2x, con x codificado en unario Describamos su funcionamiento en pseudocódigo informal: Reemplazar cada 1 por un $. REPETIR Encontrar el $ de más a la derecha, cambiarlo a 1. Ir al extremo derecho, insertar un 1. HASTA que no queden $ Sistema unario: n se escribe como (n unos).

Otro ejemplo: log x, en binario Esta MT calcula la función log n, redondeado hacia abajo, con input y output en binario. Ejercicio: ¡convencerse!

Funciones “recursivas” Una función f:N k  N se dice recursiva primitiva si puede obtenerse combinando las siguientes funciones... Función constante: para todo n y k, f(x 1,...,x k )=n es una función Función sucesor: S(x) se define f(x)=x+1 Función de proyección: P k i (x 1,...,x k ) se define como f(x 1,...,x k )=x i.

Funciones “recursivas”...usando los siguientes operadores: Composición Recursividad primitiva: a partir de un par de funciones g(x 1,...,x k ), h(y,z,x 1,...,x k ), se puede obtener la función  (g,h) definida como f(y,x 1,...,x k ) tal que f(0,x 1,...,x k ) = g(x 1,...,x k ) f(y+1,x 1,...,x k ) = h(y,f(y, x 1,...,x k ),x 1,...,x k )

Funciones “recursivas” La mayoría de las funciones “razonables” son recursivas primitivas: producto, factorial, exponencial, etc. Es lo que se puede calcular en un lenguaje de programación que tenga operadores aritméticos, IF/THEN, y ciclos FOR de la forma “FOR i from 1 to n”, donde el n no se modifica dentro del loop. No hay otros tipos de loop. El cómputo siempre termina, de modo que las funciones recursivas primitivas son todas computables y totales.

Funciones “recursivas” La clase de las “funciones recursivas” incluye a las anteriores, pero admite un operador más: Minimización: a partir de una función f(y,x 1,...,x k ) se puede obtener la  (f) definida como  (f)(x 1,...,x k ) = z ssi f(z,x 1,...,x k )=0 y f(i,x 1,...,x k )>0 para i=0,...,z-1 Teorema: una función es recursiva ssi es computable. (demostración: no veremos) (Informalmente: si f tiene k+1 argumentos, podemos fijar k de ellos y pedir el primer valor del otro que hace f=0. Pero: si no existe, la función se indefine!)

Funciones “recursivas” De modo que funciones recursivas primitivas  funciones computables totales  funciones computables (a.k.a. recursivas) Sabemos que esa inclusión es propia ¿Serán iguales estas clases? NO. Ejemplo más conocido de función total que no es recursiva primitiva: la función de Ackermann.

Función de Ackermann (En rigor, esta es la función de Ackermann- Péter, la versión más conocida.) A(m,n) = n+1 A(m-1,1) A(m-1,A(m,n-1)) si m=0 si m>0, n=0 si m>0, n>0 Crece desquiciadamente rápido Un número de > 19 mil dígitos

A(4,2)=A(4,2)=

Función de Ackermann A(m,n) = n+1 A(m-1,1) A(m-1,A(m,n-1)) si m=0 si m>0, n=0 si m>0, n>0 La función de un argumento, A(n,n), crece más rápido que cualquier función recursiva primitiva. Nótese que sólo aplica +1 y así que el tiempo que tarda evaluar A(m,n) es de orden A(m,n). Por lo mismo, su crecimiento deriva de la profundidad de la recursividad. Se ha usado como benchmark para evaluar qué tan bien los compiladores manejan la recursión.

Enumeración: otra forma de usar MT Máquinas de Turing: las podemos usar para... Reconocer lenguajes ¿w  L? Calcular funciones ¿f(w)? Ahora agreguemos: enumerar lenguajes ¿L?

Enumeración: otra forma de usar MT Decimos que una MT enumera un lenguaje L si no recibe ningún input genera todas las palabras de L Podemos suponer que hay una cinta de trabajo, y otra (la “impresora”) en la que la MT escribe las palabras de L w2w2  w3w3 #w1w1 #  #   área de trabajo  +

EnumeraciónEnumeración Que la MT enumere L significa que:  w  L,  un tiempo t w en que w es impresa. Si w es impresa, w  L. Un lenguaje L se dice “enumerable” si existe una MT que lo enumera w2w2  w3w3 #w1w1 #  #   área de trabajo  +

Ejemplo: enumerar {a,b} * MT de dos cintas y con “stay”: [cuando no se menciona la 2ª cinta, es “stay”] ( ,  )  (a,#),S,R q1q1 q3q3 q0q0 q2q2 a  a,L b  b,L ,R (a,  )  (a,a),R,R (b,  )  (b,b),R,R ( ,  )  ( ,#),L,R b  a,L a  b,L  a,S Pone “a” en el área de trabajo, # en el output Retrocede al comienzo del área de trabajo Copia el área de trabajo al output Actualiza el área de trabajo

EnumeraciónEnumeración  # a # b # aa # ab # ba # bb # aaa # aab #... Sólo palabras de {a,b} * aparecen. Todas las palabras de {a,b} * aparecen tarde o temprano. A este tipo de orden (en longitud creciente, y en orden alfabético dentro de la misma longitud) se le llama orden canónico.

EnumeraciónEnumeración Teorema: L es reconocible   MT que lo enumera. L es decidible   MT que lo enumera en orden canónico.

EnumeraciónEnumeración  MT que decide L   MT que enumera L en orden canónico (  ) Tengo M EC que enumera L en orden canónico. Construyo M D que recibe un input w, y ejecuta M EC hasta ver las de largo |w|. Si está, acepta; si no, rechaza. (  ) Tengo M D que decide L. Construyo M EC que enumera  * en orden canónico, y para cada palabra le pregunta a M D acaso está en L. Si está, imprime.

EnumeraciónEnumeración  MT que acepta L   MT que enumera L (  ) Tengo M E que enumera L. Construyo M A que recibe un input w, y echa a correr M E. Si en algún momento ve aparecer w, acepta. (  ) Tengo M A que acepta, quiero M E que enumere. Tentación: FOR w   * IF M A acepta w THEN Imprimir w Problema: M A puede no detenerse.

EnumeraciónEnumeración Solución: Construimos M E de la siguiente forma: Para k=0,1,2,... Listar las primeras k palabras de  * (en orden canónico): w 1,...,w k Para cada una de ellas, Ejecutar M A con input w i durante k pasos. Si M A aceptó w i, imprimir w i. QED  MT que acepta L   MT que enumera L

Nociones equivalentes QED MT que siempre para ¿w  L? lenguajes reconocibles lenguajes decidibles ¿f(w)? funciones recursivas [parciales] funciones recursivas totales ¿L? lenguajes enumerables lenguajes enumerables en orden MT

CodificaciónCodificación En los tres “usos” es necesario codificar la información que entregamos como input (o recibimos como output). Es importante es precisar qué codificación se usa. Pronto, para complejidad computacional, se volverá especialmente relevante (p.ej., ¡no se usa unario!). No es grave que algunos inputs no sean codificaciones válidas, siempre y cuando el conjunto de inputs válidos sea un lenguaje decidible (de modo que la MT pueda chequearlos y proceder).

CodificaciónCodificación Ejemplo: codificar un grafo dirigido. Una opción: codificar la cantidad de nodos, y luego dar la matriz de adyacencia. 111# AB C

CodificaciónCodificación Ejemplo: codificar un grafo dirigido. Otra opción: codificar la cantidad de nodos, y luego los arcos. 111#1#11#11#11#1#111#111#11 AB C Cantidad de nodos (en unario) (A,B)(B,B)(A,C)(C,B)

CodificaciónCodificación 111#1#11#11#11#1#111#111#11 AB C Podemos definir L G  {1,#} * como el conjunto de secuencias que codifican grafos dirigidos. Ejercicios: Construir una MT que decida L G Construir una MT que enumere L G en orden canónico. Construir una MT que calcule f:L G  {0,1} definida como f(G) = 1si G tiene algún circuito 0si G no tiene circuitos

CodificaciónCodificación Algo más complicado: codificar máquinas de Turing. Codifiquemos en unario los símbolos de  y los estados de Q (el contexto evitará ambigüedad). También los movimientos del cabezal: 1 para L, 11 para R. símbolos codificación estados

CodificaciónCodificación Podemos codificar una transición: y codificar varias transiciones:

CodificaciónCodificación Podemos codificar la máquina entera dando: [cantidad de estados] ### [cantidad de símbolos en  ] ### [lista de estados que son de aceptación] ### [lista de transiciones] Ejemplo: Q={q 0,q 1 },  ={a, b,  }  (q 0,a)=(q 0,a,R)  (q 0,b)=(q 0,b,L)  (q 0,  )=(q 1, ,L) 1#1#1#1#11 1#11#1#11#1 1#111#11#111#1 11###111###11###1#1#1#1#11##1#11#1#11#1##1#111#11#111#1

CodificaciónCodificación Tendremos un lenguaje L MT sobre el alfabeto {#,1}, formado por todas las posibles MT. L MT es un lenguaje decidible: no es difícil hacer una MT que reciba w  {#,1} * y revise si es una descripción válida de una MT [Ejercicio!] Por lo tanto, el conjunto formado por todas las MT se puede enumerar (y en orden canónico, si queremos). ¿Para qué sirve codificar máquinas de Turing?

1. Definición, notación, ejemplos 2. Lenguajes de MT; funciones computables 3. Variaciones c/r a MT estándar 4. Conjuntos enumerables; codificación de inputs 5. Máquina de Turing Universal. Indecidibilidad, incomputabilidad, reducciones. Teorema de Rice. 6. Tesis de Church-Turing y los límites de la computación Máquinas de Turing

Máquina de Turing Universal Alan Turing, luego de definir las MT y mostrar ejemplos que implementan diversas funciones, construyó una MT muy especial: una "máquina de Turing universal" (MTU). Una MTU recibe como input:  M , la descripción de una máquina de Turing M Una palabra w.

Máquina de Turing Universal La MTU simula la máquina M, con input w. Es decir, hace exactamente lo que hubiese hecho M al partir con input w. U input w MT M con input w

Máquina de Turing Universal No es difícil construir una MTU usando tres cintas: Máquina de Turing Universal Descripción de M Cinta de M Estado actual de M Cinta 2 Cinta 3 Cinta 1 p 

Otras universalidades El conjunto formado por todas las funciones recursivas f:N  N es enumerable; sea (  i ) i  N una enumeración de ellas. Entonces una función u:N  N  N es universal si u(i,n) =  i (n) donde la igualdad significa que el valor está definido en ambos lados y es el mismo, o está indefinido en ambos lados. También podríamos definir un “enumerador universal”: una MT que reciba como input una descripción, y enumere L M en su impresora.

UniversalidadUniversalidad La noción de MT universal es poderosa. Al leer las MT de una cinta, desaparece la distinción entre datos y máquina: la misma MT puede ser vista como ambas cosas. (Hoy a eso le llamamos ”software”.) Por desgracia, una consecuencia es que aparece la posibilidad de auto-referencia, con riesgo de paradojas.

Lenguajes indecidibles, lenguajes no reconocibles. Preludio. Un poco de historia. A fines del s.XIX Georg Cantor crea la teoría [intuitiva] de conjuntos. En particular, define la noción de cardinal: |A|  |B| ssi existe f:A  B inyectiva |A|=|B| ssi existe f:A  B biyectiva Se definen los cardinales como las clases de equivalencia de la relación |A|=|B|. Para conjuntos finitos, coinciden con los n° naturales.

Lenguajes indecidibles, lenguajes no reconocibles. Preludio. Si un conjunto es infinito, su cardinal ya no está en N. Teorema: Para todo A infinito, |N|  |A|. Por lo tanto, |N| es el menor cardinal infinito. Se le llama  0. Se tiene  0 =|N|=|Z|=|2Z|=|Q|=|N  N|=... Llegado a este punto, Cantor se pregunta: ¿será el infinito uno solo? No.

Lenguajes indecidibles, lenguajes no reconocibles. Preludio. |N|  |P(N)| donde P(N) son las partes de N, ie, P(N)={A:A  N} Para la demostración inventa el método diagonal. Supongamos que  f:P(N)  N  inyectiva. Entonces podemos asignarle a cada A  N un n° natural. Es decir, podemos listar P(N): A 1, A 2, A 3,... Cantor hace una tabla:

Lenguajes indecidibles, lenguajes no reconocibles. Preludio. A1A1 A2A2 A3A3 A4A4 Para cada A i y cada j  N, indica acaso j  A i. Luego define el conjunto C como la negación de la diagonal: j  C ssi j  A j C = { 2, 5,.... } A5A C  N; sin embargo, por construcción C  A i  i  ¡contradicción!

Lenguajes indecidibles, lenguajes no reconocibles. Preludio. Al cardinal de P(N) se le llama  1, el “cardinal del continuo”, y coincide con |R|. Se puede demostrar que siempre |A|  |P(A)|. A los conjuntos con cardinal menor o igual que |N| se les llama contables. Todo conjunto finito es contable.

Lenguajes indecidibles, lenguajes no reconocibles. Preludio. Antes de dejar a Cantor: Hoy le llamamos “intuitiva” o “naïve” a su teoría de conjuntos (aunque la parte de los cardinales subsiste). Bertrand Russell notó que permitía definir cosas como “el conjunto de todos los conjuntos que no se incluyen a si mismos”, una noción autocontradictoria. Nótese que es una instancia del propio método diagonal.

Lenguajes indecidibles, lenguajes no reconocibles. Preludio. Hacemos una tabla con los posibles conjuntos, indicando si C i  C j. El conjunto de Russell se obtiene como el complemento de la diagonal. C1C1 C2C2 C3C3 C4C4 R = { C 2, C 5,.... } C5C C 1 C 2 C 3 C 4 C 5

Lenguajes indecidibles, lenguajes no reconocibles. Preludio. Consecuencia histórica: Russell arruina no sólo la teoría naïve de conjuntos, sino también el intento de Frege de axiomatizar la aritmética. Es parte de la “crisis de los fundamentos”: se intenta refundar la matemática sobre bases axiomáticas sólidas. Volveremos a eso.

Lenguajes indecidibles, lenguajes no reconocibles. Preludio. Consecuencia para nos: hay lenguajes no reconocibles. Todo conjunto enumerable es contable.   * es contable (i.e., |  * |=  0 ).  Todo lenguaje es contable.  {M: M es una máquina de Turing} es contable. ¿Cuántos lenguajes reconocibles existen? 00 ¿Cuántos lenguajes existen?  1 = |P(  * )|  Existen lenguajes no reconocibles.

Un indecidible, un no reconocible Usemos el método diagonal de Cantor para construir: un lenguaje que no es reconocible un lenguaje reconocible pero indecidible Primero, un paréntesis técnico:

(Paréntesis técnico: 2 teoremas) Teorema: L es decidible ssi L C es decidible. Demostración: Usamos la misma MT, pero cambiamos su respuesta: si aceptaba, rechaza, si rechazaba, acepta. Teorema: Si L y L C son reconocibles, entonces L es decidible. Demostración: Dado un input w, ejecutamos simultáneamente las MT de L y de L C (un paso a la vez para cada una). Tarde o temprano una de las dos se tiene que detener, y sabremos si w  L. Corolario: Si L es reconocible pero L C no lo es, entonces L no es decidible.

Un indecidible, un no reconocible Consideremos el alfabeto  = {a}, y todas las MT que reconocen lenguajes sobre . Son enumerables: llamémoslas M 0, M 1, M 2,... Cada una reconoce un lenguaje: L(M 0 ), L(M 1 ),... Nótese que todos los lenguajes reconocibles con alfabeto  estarán en esa lista. Hacemos la tabla.

Un indecidible, un no reconocible Definamos el lenguaje L 0 como { a k : a k  L(M k ) }: w1w1 w2w2 w3w3 w4w4 w0w L 0 = { , aa,aaa,...} L diag -

Un indecidible, un no reconocible L 0 es reconocible: Podemos construir una MT que lo reconoce, de la siguiente forma: Dado un input w=a k, identificamos el valor de k. Encontramos M k, usando la máquina que enumera las MT. Echamos a correr M k, dándole el input w. Si se detiene, comunicamos su respuesta. aaaaaaaaaa  L0L0 -

Un indecidible, un no reconocible Por otro lado, por construcción, L 0 C no coincide con L(M k ) para ningún k.  L 0 C no es reconocible aaaaaaaaaa  L0L0 - aaaaaaaaaa  L0CL0C L 0 reconocible, L 0 C no. Por el corolario previo, L 0 es indecidible.

¿Dónde quedan? Lenguajes Lenguajes reconocibles Lenguajes decidibles Lenguajes de libre contexto Lenguajes regulares L0L0 L 0 es reconocible pero no decidible. L0CL0C L 0 C no es reconocible.

El alto: un lenguaje indecidible más natural ALTO: Input: una MT M, y una palabra w Problema: ¿M(w) se detiene? L alto = { (  M ,w): M se detiene, si su input es w } equivalente al problema de decisión: Teorema: el problema del alto es indecidible. Demostración: El lenguaje indecidible más conocido es

Problema del alto Supongamos que “D alto ” decide el problema del alto. Entonces podríamos construir la siguiente MT, “Imp”: ¿Se detiene Imp(  Imp  )? Sí  No, No  Sí. ¿M se detiene al partir con ? NO SÍ Loop Stop ¡Contradicción!

Problema del alto Veámoslo de otra forma. Supongamos que el alfabeto es {0,1}, y w 1, w 2,... es una enumeración de {0,1} *. Podemos suponer que cada w i codifica una MT M(w i ) (para los w i mal formados, asignamos una MT trivial). Nótese que todas las MT con alfabeto {0,1} estarán en la lista M(w 1 ), M(w 2 ),... Hacemos una tabla indicando acaso M(w i ) se detiene con input w j :

Problema del alto w 1 w 2 w 3 w 4 w M(w 1 ) M(w 2 ) M(w 3 ) M(w 4 )...Así que nuevamente es el método diagonal. Lo que hace IMP es comportarse al revés que la diagonal, para cada input, y por lo tanto no está en la lista.

Otros problemas indecidibles MEMBRESÍA: Input: una MT M, y una palabra w Problema: ¿M acepta w? L mem = { (  M ,w):  M  describe una MT que acepta w } equivale al problema Teorema: el problema de membresía es indecidible. Demostración:

Problema de membresía Supongamos que el problema de membresía fuera decidible, y que lo decide una hipotética MT que llamaremos “D mem ”. Sería posible construir la siguiente MT, “Imp 2 ”: Recibe (  M ,w) Genera  M’ , idéntica a M salvo que todas las transiciones indefinidas han sido ruteadas a un estado de aceptación. Ejecutamos D mem (  M ,w) y damos la respuesta. Imp 2 resolvería el problema del alto. ¡Contradicción!

 Lenguajes no reconocibles Así que tanto L mem como L alto son indecidibles. Sin embargo, son reconocibles: en ambos casos basta con echar a correr M sobre w y esperar.  Por lo tanto, L mem C y L alto C no son reconocibles.

ReducciónReducción Dados L 1  1 * y L 2  2 *, decimos que L 1 se reduce por mapeo a L 2 (anotado L 1  M L 2 ) si existe  :  1 *  2 * computable total tal que  w  1 * w  L 1   (w)  L 2 Teorema: Si L 1  M L 2, y L 2 es decidible, entonces L 1 lo es. Corolario: Si L 1  M L 2, y L 1 es indecidible, entonces L 2 lo es. Lo que hicimos antes fue mostrar que L alto  T L mem. Es fácil demostrar que también L mem  T L alto. En ese caso diremos que son equivalentes por mapeo, y escribimos L alto  M L mem.

ReducciónReducción Ejercicio: La relación  M es refleja y transitiva.  M es una relación de equivalencia. L 1  M L 2  L 1 C  M L 2 C Teorema: Sea L reconocible. Entonces L  M L alto. Demostración: Como L mem  M L alto, basta con mostrar que L  M L mem, y con la transitividad concluimos. Sea M tal que L=L(M).  w se tiene w  L   (w) = (  M ,w)  L mem

ReducciónReducción Teorema: Sea L 1 y L 2 dos lenguajes decidibles no triviales (es decir, no son  ni  * ). Entonces L 1  M L 2. Demostración: Fijamos u  L 2, v  L 2. Definimos  (w) = Moraleja: Esta noción de reducción es trivial entre lenguajes decidibles. Por eso en complejidad computacional añadiremos restricciones. usi w  L 1 vsi w  L 1

Otros problemas indecidibles típicos ACCESO A UN ESTADO: Input:  M , w, y un estado q de M. Problema: ¿Partiendo con input w, pasa alguna vez M por el estado q? ALTO CON CINTA VACÍA: Input:  M . Problema: Si M se ejecuta con input vacío (cinta inicialmente en blanco), ¿se detiene alguna vez? VACUIDAD: Input:  M . Problema: ¿L(M)=  ?

Teorema de Rice Que la propiedad sea “no trivial” significa que existe al menos una MT cuyo lenguaje la cumple y existe al menos una MT cuyo lenguaje no la cumple. Teorema (Rice): cualquier propiedad no trivial de los lenguajes de las MT es indecidible. Ejemplo de propiedad trivial: “L es reconocido por una MT con cantidad par de estados”. Siempre es cierto, pues podemos agregar estados de relleno.

Teorema de Rice: demostración Demostración: Sea T={M: L(M) cumple la propiedad). Sea M  una MT con lenguaje . Sin perder generalidad, podemos suponer M   T (de lo contrario, trabajamos con T C ). Sea M 1 una MT que sí está en T. Mostraremos que si T fuese decidible, entonces el problema del alto lo sería.

Teorema de Rice: demostración Nos dan M,w. Construimos M', una máquina que, dado un input x, hace lo siguiente: Ejecuta M con input w Ejecuta M 1 con input x Si M 1 aceptó x, aceptar. Si M 1 rechazó x, rechazar. Si M(w) se detiene, L(M’)=L(M 1 ), así que M’  T Si M(w) no se detiene, L(M’)=  =L(M  ), así que M’  T  Si pudiéramos decidir T, sabríamos acaso M(w) para.

Teorema de Rice: como se usa Ejemplos: Será indecidible determinar acaso el lenguaje de una MT es finito, acaso es regular, acaso contiene dos palabras del mismo largo, etc etc. Ojo: Tienen que ser propiedades del lenguaje. Sobre propiedades de las máquinas o su comportamiento, Rice no se pronuncia. Teorema (Rice): cualquier propiedad no trivial de los lenguajes de las MT es indecidible.

Teorema de Rice: corolario “Mi función, ¿reconoce los RUTs válidos?” Hay funciones que reconocen RUTs válidos, otras que no... “Mi función, ¿calcula el determinante de la matriz que recibe?” Permitiría reconocer el lenguaje (A, d) donde A es una matriz y d=det(A). Corolario: la verificación de software es indecidible. Teorema (Rice): cualquier propiedad no trivial de los lenguajes de las MT es indecidible.

Teorema de Recursión: preludio ¿Puede una máquina de Turing reproducirse? Como el I/O son strings, lo que estamos preguntando es acaso existe una MT que escriba su propia descripción. A priori no es claro: para que un programa del tipo print x pueda escribir su propio código tendríamos que tener x=“print x” y caemos en un problema de muñecas rusas infinitas. Sin embargo, se puede.

Teorema de Recursión: preludio Afirmación: para todo string w, es posible construir una MT M w que, dado cualquier input, tenga output w. Demostración: trivial. M w es la máquina que Borra lo que haya en la cinta Escribe w Para M 1101 sería, p.ej., q1q1  1, R q2q2 0 , R q0q0 q3q3  1, R q4q4  0, R  1, R

Teorema de Recursión: preludio Afirmación: existe una MT G que, dado w, genera  M w  a la izquierda a la w. Sea S una máquina formada combinando M  G  y G MGMG G Partiendo con cinta vacía, S:                                - M  G  escribe  G     G              G           - G genera a su izquierda M  G      MG G           MG G        O sea, imprime  S 

Teorema de Recursión Esta situación es caso particular (y apoyo para la demostración) del Teorema de Recursión: Sea  :  *  *  * una función recursiva. Entonces existe una máquina de Turing M  tal que para cualquier input w, M  (w) =  (  M  ,w) (Aquí la igualdad significa que una de dos: o ambos lados no paran, o ambos paran y dejan el mismo output). Idea de la demostración:

Teorema de Recursión: idea de la demo  :  *  *  * recursiva   M  tal que M  (w) =  (  M  ,w) Sea T la MT que calcula . M  es una combinación de M  G  T , G y T. M  G  T  GT Partiendo con w, en M  :       # w           - M  G  T  escribe  G  y  T      G   T  # w         - G escribe M  G  T      M  G  T   G   T  # w            M   # w        - T calcula  (  M  ,w)        (  M  ,w)       

Teorema de Recursión  :N  N  N recursiva y {f n } una enumeración de las funciones recursivas   n tal que f n (m) =  (n,m)  :  *  *  * recursiva   M  tal que M  (w) =  (  M  ,w) Teniendo el teorema, la existencia de MT autorreproductoras es un corolario: Basta tomar  (u,v)=u En rigor es el “2° Teorema de Recursión de Kleene”, y se aplica a cualquier sistema de cómputo con poder equivalente a las máquinas de Turing. Por ejemplo,

Teorema de Recursión  :  *  *  * recursiva   M  tal que M  (w) =  (  M  ,w) Corolario: en todo lenguaje de programación Turing- completo, existen quines. Quine: un programa que escribe su propio código. La demostración del teorema es constructiva, así que muestra cómo obtener el quine. Por desgracia requiere que el quine ejecute el programa descrito por un string arbitrario  En principio un quine en Python requerirá implementar en un intérprete de Python en Python.

QuinesQuines Un deporte extremo entre programadores: encontrar quines pequeños, o con propiedades extra. Ejemplo en Python:  javascript, hace rotar un globo terráqueo En general siguen el esquema del siguiente “quine” lingüístico: Escriba dos veces la siguiente frase, la segunda vez entre comillas: “Escriba dos veces la siguiente frase, la segunda vez entre comillas:” s = ‘s = %r\nprint(s%s)’ print(s%s)

QuinesQuines Quines en docenas de lenguajes, desde Algol a Brainfuck, en Más info e instrucciones para quines en Variaciones: Uroboros, “multiquines”.

Teorema de Recursión: consecuencias Consecuencias del teorema de recursión: Existencia de quines Existencia de funciones definidas recursivamente (No nos meteremos ahí) Posibilidad de autorreferencia en MT ¿Autorreferencia? Al definir una MT M(w) podemos asumir que conoce  M . En efecto: podemos definir  (x,w) que interpreta x como la descripción de una máquina, y el teorema de recursión garantiza que  M(w) para la cual x es  M .

Teorema de Recursión: consecuencias Sea QUINE(w) el problema de determinar, dado w, acaso w es la descripción de una MT que escribe su propia descripción. Teorema: QUINE es indecidible. Corolario: es imposible detectar virus. Demostración: reduzcamos ALTO a QUINE.

Teorema de Recursión: consecuencias Sean  M ,w para los que queremos resolver ALTO. Sea S con input u una MT que hace lo siguiente: Borra el input u Simula M sobre w Si M(w) para, entonces escribe  S  y para. Si pudiéramos decidir QUINE(S), podríamos determinar acaso M(w) para. (Nótese que es el teorema de recursión el que nos permite definir S con referencia a  S  ).

Teorema de Recursión: consecuencias La autorreferencia es poderosa. Por ejemplo, demostremos (de nuevo) que no existe D mem que decida MEMBRESÍA(  M ,w). Si existiera, podríamos definir la siguiente MT Imp 3 (w): If D mem (  Imp 3 ,w) rechaza else acepta Imp 3 es una máquina imposible, así que D mem no existe.

Teorema de Recursión: consecuencias Dada una codificación de MT (como la que vimos), diremos que una MT es minimal si no existe otra con descripción más corta y que reconozca el mismo lenguaje. Definamos Min TM = {  M  : M es minimal} Teorema: Min TM no es reconocible. Demostración: Supongamos Min TM reconocible. Entonces existe E que lo enumera, imprimiendo MT minimales M 1, M 2,...

Teorema de Recursión: consecuencias Imp 5 (w): Obtener  Imp 5  Ejecutar E hasta que aparezca una descripción más larga que la de Imp 5 : |  M i  | > |  Imp 5  | Ejecutar M i (w) L(Imp 5 )=L(M i ), pero Imp 5 tiene descripción más corta  M i no era minimal  Contradicción! Corolario: No existe el compilador óptimo (c/r al tamaño del ejecutable).

Teorema de Recursión: consecuencias Otro ejemplo (un poco informal). Supongamos que Test(  M  ) genera un conjunto de instancias que permiten testear el buen funcionamiento de M, según algún lenguaje de especificación. Consideremos este programa para calcular f(x)=x+1 Inc(x) if x  Test(  Inc  ) output x+1 else output 0 Inc pasa el test, pero está malo.  La verificación automática de software es imposible (si le pedimos que sea perfecta).

Un poco de historia Hoy, “computabilidad” es el estudio de los límites de lo que puede hacer un computador. Históricamente, fue al revés.  Al intentar precisar qué es lo que las matemáticas pueden calcular, apareció la idea del procedimiento de cómputo universal, mecanizable (es decir, el computador). ¿Por qué estaban los matemáticos tratando de entender eso?

Un poco de historia Por milenios la matemática siguió el esquema de los Elementos de Euclides: Axiomas razonamiento Teoremas Pero: Los axiomas eran lo que el autor encontrara “obvio”. El razonamiento era verbal, aristotélico. ~1850, Boole inventa la lógica matemática ~1890, Frege la perfecciona: “lógica de primer orden” ~1900, “Crisis de los fundamentos”. Muchas cosas ya no resultan “obvias”. Al tratar de axiomatizar algo tan básico como los conjuntos, aparecen paradojas.

Un poco de historia Programa de Hilbert: para cada teoría, tener Axiomas lógica Teoremas con axiomas que sean: consistentes: que no se pueda demostrar un teorema y a la vez su negación completos: que todo teorema verdadero se pueda demostrar decidibles: que haya un algoritmo para decidir acaso un teorema es verdadero. Problema: ¿qué significan todas esas palabras?

Un poco de historia Los axiomas son strings. También los teoremas Y la lógica da reglas para obtener algunos strings a partir de otros. ¿Será posible definir “verdadero” como una propiedad de un string? ¿Será lo mismo que “demostrable”? El alfabeto para los strings será  ~  x  R 1,...R k } Aquí la x se usa para las variables, que se llamarán “x”, “xx”, “xxx”, etc., para evitar la necesidad de un alfabeto infinito. Sin embargo las escribiremos x 1, x 2, etc. Los R i son relaciones, no necesariamente binarias. De modo que habrá cosas como R 1 (x 1,x 3 ), R 2 (x 3 ), R 3 (x 1,x 2,x 5 ).

Fórmulas de primer orden  ~  x  R 1,...R k } Una “fórmula bien formada” se define de la forma intuitiva que alguna vez aprendieron. R 1 (x 1 )  R 2 (x 1,x 2,x 3 )  x 1 ( R 1 (x 1 )  R 2 (x 1,x 2,x 3 ) )  x 1  x 2  x 3 ( R 1 (x 1 )  R 2 (x 1,x 2,x 3 ) ) Los cuantificadores “ligan” variables en todo el ámbito en que se apliquen. Las variables no ligadas son “libres”. Una fórmula sin variables libres es una “proposición”. Ejemplo: la tercera.

Proposiciones y modelos Hasta aquí todo es sintaxis. Para darle contenido, hay que agregar un modelo. Un modelo M=(U,R 1,...R k ) consiste en: Un universo U (donde “viven” las variables) Interpretaciones concretas para los R i, como funciones que toman tuplas de elementos de U, y entregan “V” o “F”. Al menos la relación “=“ tiene que estar. Dado un modelo, una proposición puede ser verdadera o falsa. Por ejemplo, si R 1 (x 1,x 2 ) es “x 1 es menor estricto que x 2 ”,  x 1  x 2 R 1 (x 2,x 1 ) NZ será falsa si M=(N,R 1 ), y verdadera si M=(Z,R 1 ).

Proposiciones y modelos Dado un modelo M, definimos Teo(M)  * como el conjunto de todas las proposiciones que son verdaderas en M. Si C es un conjunto de modelos, definimos Teo(C) como las proposiciones que son verdaderas en todos ellos. Por otro lado, dada una proposición , definimos Mod(  ) como el conjunto de todos los modelos en los cuales  es verdadera. Teo(Mod(  )) serán entonces las proposiciones que son verdaderas en todo modelo en el cual  sea verdadera. Si  Teo(Mod(  )), decimos que  es una consecuencia válida de , y lo anotaremos

Proposiciones y modelos Pero hay otra forma de obtener consecuencias: si afirmamos que  es verdadera y aplicamos algún método de deducción, podemos deducir que cierta  es verdadera. El método de deducción que conocen: cálculo de predicados. Se usan las identidades de la lógica, el modus ponens, etc., así como algunas proposiciones que son siempre válidas (por ejemplo, “  x (x=x)” ). Si  puede deducirse a partir de , anotaremos Observación: el lenguaje {  :  } es reconocible. En efecto: podemos ir listando todas las consecuencias lógicas, y si en algún momento aparece , aceptamos.

CompletitudCompletitud Teorema de completitud de Gödel (1929): Esa fue una buena noticia: si  representa un conjunto de axiomas (pegados con “y”), entonces la lógica que conocemos permite demostrar cualquier consecuencia inevitable de ellos.

Buenas y malas noticias ¿Qué hay de la lista de Hilbert? ¿Consistencia, completitud, decidibilidad? Por ejemplo, ¿será Teo(M) un lenguaje decidible? N Hay casos en que sí: por ejemplo, para M=(N,+). [Teorema 6.12 en Sipser; es vía autómatas finitos.] Pero en general no: NN 1er Teorema de Incompletitud de Gödel: Para cualquier conjunto de axiomas  ={  1,...,  k } consistente cuyo modelo sea (N,+,  ), existe una proposición  Teo(N,+,  ) que no se deduce de .

IncompletitudIncompletitud Idea de demostración: NDada una máquina de Turing M y un input w, es posible construir una fórmula  M,w (x) en el lenguaje de (N,+,  ) tal que  x  M,w (x) ssi M(w) se detiene M(w) para o no para; por lo tanto,  x  M,w (x) es V ó F. Si  fuera completo, podríamos listar {  :  } hasta encontrar una demostración de  x  M,w (x) o de su negación. Pero con eso estaríamos resolviendo ALTO(M,w). ¡Contradicción!

IncompletitudIncompletitud ¿Cómo se construye  M,w (x)? La idea es que  M,w (x) “diga” que x (decodificado de alguna forma) representa una historia de cómputo M(w) que para. Podemos representar la MT como un número (por ejemplo, la codificación que vimos podría dar un n° binario, en lugar de un string de 1 y #). Podemos representar configuraciones (del tipo “0110q 2 101”) como números. Es posible escribir una fórmula db(x,i) que sea V ssi el i- ésimo dígito binario de x es 1.

IncompletitudIncompletitud Es posible escribir una fórmula f(m,x,y) que valga V ssi la configuración y se obtiene a partir de x con la MT m. Es posible combinar los números que representan varias configuraciones en uno solo. Por ejemplo, h=2 x 3 y 5 z. Es posible escribir una fórmula f(m,h) que valga V ssi h representa una historia de cómputos válidos de la MT m. Es posible escribir una fórmula f(m,h) que valga V ssi la última configuración descrita en h hace que m se detenga. &cétera. Es largo y técnico, pero posible (y ese es el punto).

IncompletitudIncompletitud Gödel es pre-Turing. ¿Cómo lo hizo él entonces? Codificó variables y símbolos lógicos usando números. Codificó propiedades de las fórmulas (como el hecho de que una se deduzca a partir de otra) como propiedades de los números que las representan. Construyó (vía método diagonal) una fórmula S que dice “S no se puede demostrar a partir de  “.  Si S se puede demostrar, entonces  es inconsistente.  Si S no se puede demostrar, entonces N S  Teo(N,+,  )  S  {  :  }

IncompletitudIncompletitud Se puede construir algo como S usando el teo. de recursión. Sea M una MT que hace lo siguiente: Construir la proposición  M = ~(  x  M,  (x) ) Listar {  :  } hasta hallar una demostración de  M Si la halló, aceptar Si M encuentra una demostración de  M, entonces se detiene, con lo que  M sería falsa, y  sería inconsistente. Si  es consistente, entonces eso no ocurrirá, y M correrá eternamente. Pero entonces N  M  Teo(N,+,  )   M  {  :  }

IncompletitudIncompletitud De cierta forma lo que Gödel demuestra es que si  fuera completo para la aritmética, sería decidible. Y como ALTO se puede codificar en aritmética, eso es imposible. Ojo: indecidibilidad no implica, por si sola, incompletitud: Axiomas de grupo : completos, pero indecidibles. Geometría euclidiana : completa y decidible. La clave suele estar en la posibilidad de autorreferencia: RC(R,+,  ) y (C,+,  ) son decidibles. R(R,+, ,exp) se conjetura decidible. CR(C,+, ,exp) y (R,+, ,seno) son indecidibles. Z e 2  ix y sen(  x) valen 1 ssi x  Z : eso trae de vuelta la combinatoria y la autorreferencia.

ComputabilidadComputabilidad Gödel no demostró indecidibilidad, porque faltaba precisar qué significaba que algo fuera “decidible” (i.e., “computable”). La pelota queda rebotando: su construcción es casi código. Implícitamente incluye subrutinas, punteros, y varias otras cosas que aparecen en los lenguajes de programación. Tras Gödel, varios intentan capturar la noción general de “computable”.

ComputabilidadComputabilidad Alonzo Church: Define el -cálculo (véase: LISP). Demuestra que existen problemas indecidibles. Afirma la “tesis de Church”: que todo cálculo efectivamente realizable se puede escribir en -cálculo. Gödel no le cree. Alan Turing: Define las máquinas de Turing. Define la MT universal. Demuestra que existen problemas indecidibles. Demuestra que las MT equivalen al -cálculo. Gödel se convence.

ComputabilidadComputabilidad Todo eso ocurría en Además ~1934 Gödel define las funciones recursivas Emil Post crea un modelo de cómputo muy similar al de Turing, y resulta ser equivalente. En las décadas siguientes se crean muchos modelos más; todos resultan iguales (o inferiores) a las MT. “Tesis Church-Turing”, sin retadores hasta hoy: todo procedimiento efectivo de cálculo se puede implementar en una MT (o en -cálculo, etc etc.) Ver Cap. 7, “The Grand Unified Theory of Computation”, del libro de Moore. Especialmente 7.6, “Computation Everywhere”.

Demostraciones y código Nótese que: Gödel para su teorema trata de capturar la noción más general de demostración... pero eso decanta en una noción general de cómputo. No es casual. Existe una relación estrecha entre “algoritmo” y “demostración”. Hay versiones concretas de eso (Google: correspondencia de Curry-Howard). Se explota en softwares de verificación automática de demostraciones (Google: Coq). No profundizaremos por ahí.

OráculosOráculos Turing post 1936: se doctora en EEUU, con Church. ¿Qué investiga ahí? Investiga la indecidibilidad relativa. Por ejemplo: si pudiésemos resolver el problema del alto, ¿qué problemas podríamos resolver? ¿Cuáles no?  Tal como pronto (en complejidad computacional) veremos que hay problemas más decidibles que otros, resulta que también hay problemas más indecidibles que otros. Para estudiar eso, Turing introdujo la noción de oráculo.

OráculosOráculos Una MT con oráculo (aka MTO) es una máquina de Turing a la que le damos la posibilidad de “adivinar” la membresía en un lenguaje dado (digamos, “A”). La MTO tiene una cinta especial, inicialmente en blanco, y tres estados especiales q ?, q sí, q no. Llamemos w E al área de trabajo de la cinta especial en un momento dado. Es una forma de decir que la MT puede “preguntarle cosas” a un oráculo que sabe decidir A, en tiempo instantáneo. Por lo general se indica como superíndice: M A.  (q ?,) = q sí si w E  A q no si w E  A ¡w E  A!

OráculosOráculos Si B es un conjunto de lenguajes, entonces MTO B serán las MT que pueden definirse con algún oráculo en B. REC B = { L: existe una MTO con oráculo B que decide L} RE B = { L: existe una MTO con oráculo B que reconoce L} Decimos que L es decidible, o reconocible, con respecto a B. Además: coRE B = { L: existe una MTO con oráculo B que reconoce L C } REC  y RE  corresponden a los lenguajes decidibles (“recursivos”) y reconocibles (“recursivos enumerables”) que ya conocemos.

OráculosOráculos Reducción por mapeo: dados L 1  1 * y L 2  2 *, L 1  M L 2 si  :  1 *  2 * :  w  1 *, w  L 1  (w)  L 2. Si L 2 es decidible, entonces L 1 lo es. Diremos que L 1 se Turing-reduce a L 2, anotado L 1  T L 2, si L 1 es decidible con respecto a L 2. Obs.: L  T L C es cierto para cualquier L. Teo.: Si L 1  M L 2, entonces L 1  T L 2. La recíproca en general no es cierta: L C alto  T L alto Si L C alto  M L alto, L C alto sería reconocible y sabemos que no lo es. Dijimos: + Si L 2 es reconocible, entonces L 1 lo es.

OráculosOráculos Además: La relación  T es transitiva y refleja. Si L 1  T L 2 y L 2 es decidible, entonces L 1 es decidible. L 1 y L 2 son Turing-equivalentes, L 1  T L 2, si L 1  T L 2 y L 2  T L 1 El grado de Turing de un lenguaje L es su clase de equivalencia en la relación  T. Los lenguajes decidibles forman una clase de equivalencia, y por lo tanto son un grado de Turing. L alto  T L mem, así que tienen el mismo grado de Turing.

Grados de Turing Nótese que: Para todo L reconocible, L  T L alto.  Decimos que L alto es “  T -completo” para los lenguajes reconocibles, y su grado de Turing es maximal entre ellos. ¿Existirán lenguajes con grado intermedio?  Sí. No lo demostraremos, pero existen problemas reconocibles, indecidibles, que no son equivalentes al Alto.  De hecho, hay infinitos grados intermedios.

Grados de Turing ¿Existirán grados de Turing mayores al de L alto ? Sí. Demostración: Se repite la construcción que hicimos con el método diagonal para obtener ejemplos de un lenguaje reconocible pero indecidible (que era el de la diagonal) y uno no reconocible (su complemento). La única salvedad es que en lugar de decir “enumeramos todas las MT...” decimos “enumeramos todas las MTO con oráculo L alto...”  Se obtiene un lenguaje en RE ALTO \REC ALTO + otro que no pertenece a RE ALTO.

Grados de Turing O, similarmente, podemos definir el problema del alto de segundo orden (ALTO 2 ): ALTO 2 : Dada una MTO M con oraculo L alto y un input w, determinar acaso M(w) para. La construcción de máquina imposible sigue funcionando, sólo que ahora las M con las que trabaja son MTO. ¿M se detiene al partir con ? NO SÍ Loop Stop Y tal como L alto es completo para los lenguajes reconocidos por MT, L alto 2 es completo para los reconocidos por MTO alto.

RelativizaciónRelativización En otras palabras, esas demostraciones son insensibles a la presencia de oráculos. Se dice que se “relativizan”. Hay muchas cosas que se relativizan. Por ejemplo, el teorema de recursión (se le puede agregar un oráculo B a todas las MT que menciona, y sigue válido). Otro ejemplo: L  REC B ssi L C  REC B. Otro: si L  RE B y L C  RE B, entonces L  REC B. Volveremos a esto en complejidad computacional.

Jerarquía aritmética Ya dijimos que existen lenguajes indecidibles, incluso con un oráculo para el alto. Pero la cosa no termina ahí. Se definen  0 = {L:L es decidible}  1 = {L:L es reconocible} y para k  1  k = RE  k-1 = {L:L es reconocible con respecto a  k-1 } Además se definen  k = coRE  k-1 = {L:L C   k } y  k = REC  k-1 = {L:L es decidible con respecto a  k-1 } (para k  1; a dedo se define  0 =  0 ).

Jerarquía aritmética  0 = decidibles  1 = RE  0 = reconocibles  1 = coRE  0 = co-reconocibles  k = reconocibles con oráculo en  k-1 (o, equiv., en  k-1 )  k = co-reconocibles con oráculo en  k-1 (o, equiv., en  k-1 ) Nótese que: Para todo k,  k   k, y  k   k Para todo k,  k =  k  k Para todo k,  k   k+1, y  k   k+1 Y en particular  k   k+1

Jerarquía aritmética  1 = reconocibles 22  1 =decidibles =  0 =  0 =  0 22 22  1 = co-reconocibles 33 33 33 L alto 2  2 \  1 ; su complemento  2 \  1. Se pueden definir ALTO 3, ALTO 4,...  Todas las inclusiones aquí son propias. ALTOALTO C ALTO 2 ¿Habrá problemas “naturales” que vivan por allá arriba?

Caracterización alternativa de RE y coRE Antes de eso, un rodeo: volvamos a las clases “bajas” de lo reconocible (RE) y lo co- reconocible (coRE). Nótese que esa parte, vista como función de M,w y t, es decidible. Esto resulta ser general. RE REC coRE ALTOALTO C Los problemas en RE\REC que vimos compartían cierta forma: L alto : { (M,w): M(w) para } = { (M,w):  t M(w) para en tiempo t} L mem : { (M,w): M(w) acepta} = { (M,w):  t M(w) acepta en tiempo t}

Caracterización alternativa de RE y coRE Un predicado computable es una función computable del tipo R(x,y):  *  *  {V,F}. R(w,t) (  ): Si L es de la forma { x:  y R(x,y) }, construimos M L que recorra todos los posibles y, aceptando cuando encuentre uno que haga R verdadero. REC coRE RE Teorema: L  RE ssi L= { x:  y R(x,y) } para algún pred.comp. R Dem.: (  ): Sea M la MT que reconoce L. Entonces w  L ssi M(w) acepta  L = { w:  t: M(w) acepta en tiempo t}

Jerarquía aritmética L  RE ssi L = { x:  y R(x,y) } para algún R. Al y se le llama certificado : Es algo que puedo darle a un incrédulo para convencerlo de que x efectivamente está en L. El incrédulo podrá chequear que efectivamente R(x,y) Los lenguajes reconocibles entonces son aquellos en los que es posible, para cualquier palabra del lenguaje, dar un certificado de su pertenencia. REC coRE RE

Jerarquía aritmética Los lenguajes co-reconocibles (coRE) son aquellos en que se puede dar un certificado para los casos en que x no está en el lenguaje. En particular, si L  coRE\RE, significa que no es posible dar un certificado finito para mostrar que x  L. ¿De qué forma son los lenguajes de coRE? L  coRE cuando L C  RE O sea, cuando L C = { x:  y R(x,y) } para algún R  L = { x:  y ~R(x,y) } (y el ~ da lo mismo: si R es un predicado, ~R también) REC coRE RE L  RE ssi L = { x:  y R(x,y) } para algún R.

Jerarquía aritmética En términos de la jerarquía,  1 = lenguajes de la forma { x:  y R(x,y) }  1 = lenguajes de la forma { x:  y R(x,y) } ¿Qué pasa si agregamos cuantificadores? Apilar cuantificadores del mismo tipo no tiene efecto: decir que “  x  y...” es lo mismo que decir “  z: z=x#y...”. Ídem con varios “  ”. Pero alternar cuantificadores de tipos distintos si afecta.

Jerarquía aritmética Sea L de la forma { x:  y  z R(x,y,z) } Y viceversa. Se tiene  1 = lenguajes de la forma { x:  y R(x,y) }  1 = lenguajes de la forma { x:  y R(x,y) }  2 = lenguajes de la forma { x:  y  z R(x,y,z) }  2 = lenguajes de la forma { x:  y  z R(x,y,z) }  3 = lenguajes de la forma { x:  y  z  w R(x,y,z,w) }  3 = lenguajes de la forma { x:  y  z  w R(x,y,z,w) }...etc   L   2

Jerarquía aritmética Ejemplo: El problema de Totalidad consiste en determinar acaso una MT M se detiene para todos sus inputs. L TOT ={  M  :  w  t M(w) para en tiempo t}  Totalidad está en  2. De hecho, es completo para  2 : Sea A  2. Entonces  R tal que x  A   y  z R(x,y,z) Lo resolvemos invocando al oráculo de Tot para esta MT: M x (y): z=0 while ~R(x,y,z) z = z+1 aceptar

Jerarquía aritmética Finitud: dada M, ¿es L(M) finito? Se puede escribir como L FIN = {  M  :  n  w |w|  n  M(w) no acepta } L FIN = {  M  :  n  w |w|  n   t ~( M(w) acepta en t pasos} L FIN = {  M  :  n  w |w|  n   t R(n,w,t)} L FIN = {  M  :  n  w |w|  n   t R(n,w,t)} L FIN = {  M  :  n  w,t |w|  n  R(n,w,t)} R(n,w,t) = {  M  :  n  w,t R’(n,w,t)} R’(n,w,t)  Finitud está en  2. (De hecho es  2 -completo). Co-finitud: dada M, determinar si L(M) C es finito. Ejercicio: Co-finitud está en  3.

Jerarquía aritmética 11 22  1 =decidibles =  0 =  0 =  0 22 22 11 33 33 33 ALTOALTO C TOTFIN CO-FIN L(M 1 )=L(M 2 ) L(M)= 

Jerarquía aritmética Cuando decimos que un lenguaje está en la jerarquía aritmética (“arithmetical hierarchy”), estamos diciendo que pertenece a ¿Por qué se llama jerarquía “aritmética“ ? Una fórmula de primer orden en aritmética se escribe con  ~  x  y,z,..., además de los números, + y  Siempre es posible trasladar los cuantificadores al principio de la fórmula (se habla de forma “PRENEX”). Así que la jerarquía clasifica todos los conjuntos que la aritmética puede definir con fórmulas de primer orden.

Jerarquía aritmética En particular, Teorema “de indefinibilidad de la verdad” de Tarski: N Teo(N,+,  )  AH ¿Estarán todos los lenguajes en AH? No, pues sigue siendo una colección enumerable... |AH|=  0 Es decir: la aritmética no puede definir el conjunto de las sentencias verdaderas de la aritmética.  Se generaliza para cualquier lenguaje formal suficientemente poderoso. Y desde ahí, es filosofía.

Teoría algorítmica de la información Haremos una pasada rápida por [lo básico de] la teoría algorítmica de la información. En teoría de probabilidades, no tiene sentido decir que una secuencia de resultados es “más aleatoria” que otra: sólo se puede hablar de la aleatoriedad del proceso que la genera. Como resultado de una moneda, las siguientes secuencias son igualmente probables: CCCCCCCCCC, CSCSCSSSCS, CSCCSCSSCC.

Teoría algorítmica de la información O estas: Pero nuestra intuición nos dice que la primera es menos aleatoria. ¿Por qué?  Porque sigue un patrón claro. En otras palabras, porque podemos dar una descripción corta de la secuencia. De la tercera también: el i-ésimo dígito es 1 cuando la expansión binaria de i tiene una cantidad impar de unos.

Teoría algorítmica de la información Idea: la cantidad de información contenida en un string se puede medir como la manera más corta de describirlo. Es una noción muy amplia; permite comparar cosas tan dispares como strings, dibujos, objetos físicos, modelos, lo que sea. Se relaciona, por ejemplo, con el principio de minimum description length: la mejor hipótesis para un conjunto de datos es la que más los comprime (formaliza la “navaja de Occam”). Depende, para bien o mal, del lenguaje en que se haga la descripción.

Teoría algorítmica de la información Para hacer una teoría, se opta por descripciones binarias de strings binarios. ¿Y cómo hacemos que un string describa a otro?  Con máquinas de Turing! Consideremos una codificación binaria de máquinas de Turing, como la que vimos. Sea x  {0,1} *. Su descripción más corta, d(x), será el string  M,w  más corto tal que M(w) se detiene con output x. Su complejidad de Kolmogorov será K(x)=|d(x)|

Teoría algorítmica de la información Teorema:  c tal que  x  {0,1} *, K(x)  |x| + c O sea, la información en x no es mucha más que |x|. Demostración: Sea M 1 la máquina que se detiene de inmediato. M 1 (x)=x, así que  M 1,x  es una descripción de x.  K(x)   M 1,x  = |  M 1  | + |x|

Teoría algorítmica de la información Teorema:  c tal que  x  {0,1} *, K(xx)  |x| + c O sea, la información en xx no es mucha más que la que hay en x. Demostración: Sea M 2 una máquina que Recibe  M,w  Escribe M(w) dos veces. Entonces  M 2,d(x)  es una descripción de xx.  K(xx)  |  M 2,d(x)  |  |  M 2  | + |d(x)| = |  M 2  | + K(x)

Teoría algorítmica de la información Teorema:  c tal que  x,y  {0,1} *, K(xy)  2K(x) + K(y) + c O sea, la información en xy está más o menos acotada por la de x e y sumadas. Idea de demostración: Sean d(x)=  M x,w x , d(y)=  M y,w y . Sea M 3 la MT que recibe w y lo separa en  M x,w x  y  M y,w y  ; luego imprime M x (w x ) seguido de M y (w y ). Idealmente uno quisiera K(xy)  |  M 3,d(x)d(y)  |  |  M 3  | + |d(x)| + |d(y)| y concluiríamos “K(xy)  K(x) + K(y) + c”.

Teoría algorítmica de la información Teorema:  c tal que  x,y  {0,1} *, K(xy)  2K(x) + K(y) + c ¿Por qué falla? Se puede mejorar, bajando ese K(x) extra a log(K(x)) pero no se puede eliminar. Teorema:  c tal que  x,y  {0,1} *, K(xy)  K(x) + K(y) + log(K(x)) + c  Porque M 3 necesita separar d(x) // d(y)  Para eso duplicamos los bits de  M x,w x  (será algo de la forma “ ”), y luego usamos un “01” para indicar que lo que sigue es  M y,w y .

Sin demostración (aquí) Teorema:  x,y  {0,1} *, K(x,y) = K(x) + K(y|x) + O(log K(x,y)) Donde K(y|x) es el tamaño de la máquina mínima que genera y, si es que además conoce x. Corolario: K(x)-K(x|y)  K(y)-K(y|x) (donde  indica “=, salvo por posible término logarítmico”) Podemos ver K(x)-K(x|y) como “lo que y sabe sobre x”.  Es el “Teorema de simetría de la información”, demostrado por Levin & Kolmogorov en [En teoría clásica de la información existe un resultado análogo, pero con entropía e información mutual.]

Teoría algorítmica de la información ¿Por qué hacerlo con máquinas de Turing? ¿Por qué no definir K(x) como el largo del menor programa en Python que escribe x? Se puede. Dado un lenguaje de programación P, definamos d P (x) como el menor programa en P que escribe x, y K P (x)=|d P (x)|. Teorema: Para todo lenguaje P,  c tal que  x  {0,1} * K(x)  K P (x) + c Idea de dem.: Sea M una MT que interpreta su input como un programa en P, y lo ejecuta. Entonces  M,d P (x)  será una descripción de x.

Teoría algorítmica de la información Nótese que si P es Turing-completo, el argumento funciona para ambos lados, así que también habrá c’ tal que K P (x)  K(x) + c’. Por lo tanto, K(x) y K P (x) difieren a lo más en una constante aditiva, que depende de P (pero no de x). ¿Interesa el valor exacto de K(x)? Por lo general no; lo que se estudia son propiedades asintóticas. Más nos vale, porque...

Teoría algorítmica de la información Teorema: K(x) no es computable. Demo.: Usamos el teorema de recursión. Supongamos que existe una MT que calcula K(x). Definimos una MT S que hace lo siguiente: For i=1,2,... For x: |x|=i If K(x) > |  S  | print x; stop S escribirá un número cuya K es mayor que |  S  |: contradicción! Corolario: no existe el “zip” perfecto.

Teoría algorítmica de la información Teorema: K(x) no es computable. S encarna la “Paradoja de Berry”: ¿cuál es “el menor entero positivo que no se puede definir en menos de quince palabras”? La incomputabilidad de K(x) tiene que ver con la dificultad de encontrar descripciones compactas de algo que vemos como complejo o aleatorio

Strings incomprimibles Decimos que x es incomprimible si K(x)  |x|. Teorema: Para todo n, existe x incomprimible, |x|=n O sea: hay strings incomprimibles de cualquier longitud. Demo.: Existen 2 n strings de largo n. Existen a lo más n-1 = 2 n -1 descripciones de largo < n. Al menos un string queda sin descripción mínima < n.

Strings incomprimibles Teorema: Para todo n y todo c  n, la probabilidad de que x de largo n escogido al azar tenga K(x)  n-c es al menos 1-1/2 c. O sea: la mayoría de los strings son incomprimibles. Demo.: # de strings de largo n: 2 n. # de descripciones de largo n-c  2 n-c -1 Ergo, si escojo x al azar la probabilidad de K(x)<n-c es a lo más

Incomprimible = Aleatorio Una idea a priori extraña, pero en retrospectiva evidente: los strings con más contenido de información son los que nos parecen más aleatorios. En probabilidades (o información à la Shannon) la entropía mide “desorden”, pero a la vez “contenido de información”. Aquí es definición: se define “x es aleatorio” [en el sentido de Kolmogorov] como sinónimo de “x es incomprimible”. x

Incomprimible = Aleatorio Una palabra infinita w 1 w 2... se dice “aleatoria” [en el sentido de Kolmogorov] si  c  n, se tiene K(w 1 w 2...w n ) > n-c. Se puede demostrar que una palabra infinita aleatoria pasa todos los tests de aleatoriedad estadística. Una gracia: como K(x) depende del modelo de cómputo a lo más en una constante aditiva, la definición de arriba no depende del modelo de cómputo. La mala noticia: dado incluso un string finito x... Teorema: La propiedad “x es aleatorio” es indecidible. De hecho es peor todavía.

Verdades Aleatorias Teorema de Incompletitud de Chaitin: Para cualquier axiomatización consistente de la aritmética, existe un N tal que la afirmación “K(x) es aleatorio” es indemostrable para todo x con |x|>N. O sea: A lo más se puede demostrar que una cantidad finita de strings es aleatoria. Los strings largos, si es que son aleatorios, no se pueden demostrar aleatorios. Sin embargo sabemos que para la graaaan mayoría de ellos, la afirmación es cierta! Sin embargo todo esto se usa. Como herramienta teórica, y también usando winzip (por ejemplo) como proxy de K(x).