Indecidibilidade Prof.: Edson Holanda [email protected] Teoria da computação Programa Hello, World main( ) { printf( "Hello, World \n"); getch( ); } ????? “O programa P com a entrada E, imprime a string ‘Hello, world’?” Programa Hello 2 main() { int n, total, x, y, z; scanf("%d", &n); total = 3; while(1) {for (x = 1; x <= total - 2; x++) for ( y = 1; y <= total -1; y++) { z = total - x - y; if (exp(x,n) + exp(y,n) == exp (z,n)) { printf("Hello, World");} } total++; } } Programa Hello 2 int exp(int i, int n) { int res, j; res = 1; for ( j = 1 ; j <= n ; j++ ) { res = res * i; } return(res); } Último teorema de Fermat “Não existem soluções inteiras para a equação xn + y n = z n , se n > 2”. Testador hipotético P E Testador de Hello, world Sim H Não Testador hipotético P Sim H1 E Hello, World Testador hipotético Sim P H2 Hello, World O que acontece quando…. ? Sim H2 H2 Hello, World Vamos chamar esse problema de ‘Hello, world’ Princípio da Redução Problema Hello, world Redução de Hello, world Problema Chamar F1 Reduzindo um problema a outro Sim Instância de P1 Construir Instância de P2 Decidir Não Um exemplo de redução Vamos mostrar que o problema: “ O programa P, dada a entrada E,chamará a função f1?” é indecidível. Obs.: Vamos supor que o programa possui uma função chamada f1 Prova: Usaremos uma demonstração por absurdo; Como só conhecemos um problema indecidível, Hello, world fará o papel de P1 no diagrama mostrado anteriormente. Prova: (cont.) Precisamos projetar um algoritmo que converta o problema Hello, world no problema de chamar F1. Prova: (cont.) Ou seja, dado o programa P e sua entrada E, devemos contruir uma programa R e uma entrada Z tais que R, com a entrada Z, chame F1 SSE P com a entrada E imprimir Hello, world. Prova: (cont.) A construção 1. Se P tem uma função F1, renomeie essa função e todas as chamadas a ela. ( vamos chamar esse novo programa de P1) Prova: (cont.) A construção 2. Adicione a P1 uma função F1. Essa função não faz nada e não é chamada. ( vamos chamar esse novo programa de P2) Prova: (cont.) A construção 3. Modifique P2 para memorizar os 12 primeiros caracteres que ele imprime (armazenando em um vetor global V. ( vamos chamar esse novo programa de P3) Prova: (cont.) A construção 4. Modifique P3 de forma que, sempre que executar qualquer instrução de saída, ele verifique em seguida no vetor V se escreveu 12 caracteres ou mais e, se for o caso, se Hello, world são esses 12 primeiros caracteres. Nesse caso, chame a nova função F1. O programa resultade é R e a entrada Z é igual a E. Prova: (cont.) conclusão Dessa forma transformamos um problema Hello, world em um caso do problema chamar F1. Logo, se o problema chamar F1 fosse decidível, então o problema Hello, world também seria. O que é um absurdo poís sabemos que Hello, world é indecidível. Portanto, o problema chamar F1 também é indecidível. Importante: Sobre a prova através de redução: Observe a importância do raciocínio recursivo na implementação do programa H2. Importante: A tese de Church estabelece uma correspondência entre as noções de Algoritmo e Máquina de Turing. Ou seja, podemos pensar num algoritmo como uma máquina de turing que sempre pára, para qualquer entrada, aceitando ou rejeitando. Importante: Lembre que L é uma linguagem recursivamente enumerável (RE) SSE L = L1(M) para alguma Máquina de Turing M. Ling. Recursivas Decidíveis MT sempre pára. Uma modificação na MT Seja M = (Q ,, , q0, ß, F) uma Máquina de Turing. Assumiremos que a fita é infinita, tanto do lado direito quanto do lado esquerdo. A palavra de entrada w será formado por todos os símbolos diferentes do branco, desde o mais a esquerda até o mais o direita. Outro problema indecidível Vamos provar que é indecidível a linguagem que consiste em pares (M,w) tais que: 1. M é uma máquina de turing (codificada em binário), com alfabeto de entrada { 0, 1 } 2. w é um string de 0´s e 1´s. 3. M aceita a entrada w. Enumeração dos strings binários Ordene todos os strings de acordo com o comprimento e os de mesmo comprimento por ordem lexicográfica. Ex: , 0, 1, 00, 01, ... Dessa maneira podemos falar do primeiro string (w1), do segundo string (w2), etc. Codificação para máquinas de Turing Seja M = (Q ,, , q0, ß, F), precisamos atribuir números naturais aos estados, aos símbolos e aos sentidos (E e D). 1. Sejam q1,q2,...,qr para algum r. Vamos admitir que q1 sempre será o estado inicial e que q2 será o único estado de aceitação (final). Codificação para máquinas de Turing 2. Sejam X1, X2, ..., Xs para algum s. Vamos admitir que X1 sempre será 0, X2 será 1 e que X3 será ß. Os demais símbolos são atribuídos de maneira aleatória aos próximos naturais. 3. Atribuiremos D1 ao sentido E e D2 ao sentido D. Codificação para máquinas de Turing Agora podemos codificar o função de transição (qi, Xj) = (qk, Xl, Dm), para alguns naturais i, j, k, l e m. Codificaremos essa regra pelo string i j k l m 0 10 10 10 10 Obs.: Como todos os valores i, j, k, l e m são, pelo menos, iguais a 1, não temos dois, ou mais, 1´s consecutivos. Codificação para máquinas de Turing Um código para a MT M inteira consiste em todos os códigos para as transições, em alguma ordem, separados por pares de 1´s: C111C211...Cn-111Cn Codificação para máquinas de Turing Exercício: Codifica a MT M abaixo, M = ({q1,q2,q3},{0,1}, , q1, ß, {q2}) na qual consiste nas regras: (q1, 1) = (q3, 0, E), (q3, 0) = (q1, 1, E), (q3, 1) = (q2, 0, D), Codificação para máquinas de Turing Lembrem que precisamos codificar pares que consistem em uma MT e uma string, (M, w). Para esse par usamos a codificação anterior para M, seguida de 111 e por w. Obs.: Em um código para uma MT não contém três 1´s consecutivos. Enumeração de MT´s Agora podemos ordenar todas as MT´s de acordo com o comprimento e as de mesmo comprimento por ordem lexicográfica. Assim, podemos falar da Mi(i-ésima máquina de Turing). Obs.: Se o string não for uma representação bem formada de alguma MT, então ela representa um MT sem movimentos. L(M)={ } A linguagem da diagonalização A linguagem Ld, a linguagem da diagonalização, é o conjunto de strings wi tais que wi não está em L(Mi). Vetor caracteristico: Formado por todas as strings que são aceitas pela MT Mi. O complementa da diagonal não é o vetor característico de nenhuma MT. Teorema: Ld não é RE Ou seja, não existe nenhuma MT que aceite Ld. Prova: Vamos supor que Ld é L(M) para alguma TM M. Como Ld é uma linguagem sobre o alfabeto {0,1}, M está na lista de MT que construímos, ou seja, existe um código para M, digamos que seja i ( M = Mi). Teorema: Ld não é RE Wi está em Ld ? Se wi está em Ld, então Mi aceita wi. Entretanto, por definição de Ld, wi não está em Ld, porque contém somente os valores wj tais que Mj não aceita Mj. Teorema: Ld não é RE Wi está em Ld ? Se wi não está em Ld, então Mi não aceita wi. Portanto, por definição de Ld, wi está em Ld. O que é uma contradição (absurdo) !!