Teoria da Computação Segundo Semestre, 2014 Aula 10: Decidibilidade DAINF-UTFPR Prof. Ricardo Dutra da Silva Definição 10.1. Um problema de decisão P é um conjunto de questões para as quais as respostas são sim ou não. Exemplo 10.1 O problema PSQ que determina se um dado número natural é um quadrado perfeito consiste nas seguintes questões: • 0 é um quadrado perfeito? • 1 é um quadrado perfeito? • 2 é um quadrado perfeito? • 3 é um quadrado perfeito? .. . Definição 10.2. Uma solução para um problema de decisão P é um algoritmo que determina a resposta correta para cada umas das perguntas de P . Um algoritmo deve ser: • completo: produz uma resposta para todas as questões do problema; • mecanicista: consiste em um conjunto de instruções bem definidas; • determinista: para entradas idênticas retorna a mesma resposta; Uma MT é mecanicista e determinística. Caso a máquina pare com qualquer entrada, ela também é completa. Uma MT é o modelo formal para estudar problemas de decisão. Definição 10.3. Um algoritmo é uma MT que para com qualquer entrada. Definição 10.4. Um problema é decidível se ele possui uma representação para a qual o conjunto de strings aceitas forma uma linguagem recursiva. A solução para um problema de decisão requer que para qualquer instância do problema seja retornada uma resposta. Relaxando essa restrição, podemos definir uma solução parcial como um procedimento que retorna sim para toda instância verdadeira mas no caso de uma instância falsa pode retornar não ou falhar em produzir uma resposta. 1 2 Aula 10: Decidibilidade Assim como uma solução para uma problema de decisão pode ser formulada como uma questão de pertinência em uma linguagem recursiva, uma solução parcial pode ser formulada como pertinência em uma linguagem recursivamente enumerável. Definição 10.5 (Tese de Church-Turing). Existe um procedimento efetivo para resolver um problema de decisão se, e somente se, existe uma MT que para com qualquer entrada e resolve o problema. Definição 10.6 (Tese Estendida de Church-Turing). Um problema de decisão P é parcialmente solucionável se, e somente se, existe uma MT que aceita as instâncias de P para as quais a resposta é sim. Definição 10.7. Um problema de decisão é decidível se há uma MT que determina a resposta para cada pergunta. Se não existe tal máquina, o problema é indecidível. Veremos a seguir que existem problemas indecidíveis provando que o Problema da Parada é indecidível. Suponha que queiramos definir um algoritmo A que tenha como entrada um algoritmo B e uma entrada para B. O Algoritmo A executa o algoritmo B com a entrada dada e é capaz de determinar se B para com tal entrada. Provaremos que o algoritmo A não existe, ou seja, não existe uma MT que realize tal computação e que pare para toda entrada. Definição 10.8 (Problema da Parada). Dadas uma MT qualquer M com alfabeto Σ e uma string w ∈ Σ∗ , a computação de M irá parar com a entrada w? O problema da parada exige um algoritmo que responda a questão para qualquer combinação de MT M e string de entrada w. Ou seja, dado um par (M, w) queremos uma máquina H que decida o problema. A entrada para a MT H é, portanto, uma MT M e uma string w. Como em qualquer computador, uma MT é capaz de codificar qualquer entrada como uma string sobre o alfabeto Σ = {0, 1}. Vamos limitar nossas máquinas para usar os alfabetos Σ = {0, 1} e Γ = {0, 1, B}. Exemplo 10.2 Seja qualquer MT M com estados {q0 , q1 , . . . , qn } e função de transição da forma δ(qi , a) = (qj , b, d), onde qi , qj ∈ Q, a, b ∈ Γ e d = {L, R}. Uma codificação possível para os símbolos da máquina é dada abaixo: Aula 10: Decidibilidade 3 símbolo codificação 0 1 B q0 q1 .. . 1 11 111 1 11 qn L R 1n+1 1 11 Considere que a codificação de um símbolo z é retornada pela função enc(z). A função de transição é codificada pela string δ(qi , a) = (qj , b, d) enc(qi )0enc(a)0enc(qj )enc(b)0enc(d) com os zeros separando as componentes. Como uma MT é completamente definida por sua função de transição, podemos codificála pela codificação das transições e separar cada uma das transições por dois 0’s. Considere o caso da MT M = (q0 , q1 , q2 , 0, 1, 0, 1, B, q0 , δ, B, q1 ) com função de transição δ(q0 , 1) = (q2 , 0, R) δ(q2 , 0) = (q0 , 1, R) δ(q2 , 1) = (q1 , 0, R) δ(q2 , B) = (q2 , 1, L). Os códigos para cada transição acima são, respectivamente: enc(q0 )0enc(1)0enc(q2 )0enc(0)0enc(R) = 1011011101011 enc(q2 )0enc(0)0enc(q0 )0enc(1)0enc(R) = 1110101011011 enc(q2 )0enc(1)0enc(q1 )0enc(0)0enc(R) = 11101101101011 enc(q2 )0enc(B)0enc(q2 )0enc(1)0enc(L) = 1110111011101101. O código da MT M é 10110111010110011101010110110011101101101011001110111011101101. 4 Aula 10: Decidibilidade Consideraremos que a função enc(M ) retorna a MT M codificada com 0’s e 1’s, como demonstrado no exemplo anterior. Teorema 10.1. O problema da parada é indecidível. Demonstração. Segundo o Teorema 10.1, não existe uma MT que decida o problema da parada. Vamos no entanto supor, por contradição, que tal máquina exista. Vamos dar o nome H para a MT. Como estamos supondo que exista a máquina H, então, dada uma entrada da forma enc(M )w, a máquina H é capaz de parar e aceitar a string enc(M )w se M para com a string w. Caso contrário, se M não para com a string w, H para e rejeita a entrada enc(M )w. A máquina H é representada pelo desenho abaixo. M para com a entrada w enc(M )w aceita e para H M não para com a entrada w rejeita e para Vamos construir uma nova máquina H 0 baseada na máquina H. A MT H 0 tem os mesmos estados da máquina H. No entanto, em todo estado de aceitação incluímos uma transição que faz com que H 0 entre em um loop infinito. A máquina H 0 entrará em loop sempre que M aceitar a string w, quando H aceita e para com string enc(M )w. A máquina H 0 irá parar quando H rejeita e para com string enc(M )w, ou seja, quando M não parar com a string w. M para com a entrada w enc(M )w H loop 0 para M não para com a entrada w A string de entrada w para uma máquina M pode inclusive ser a própria codificação da máquina. Vamos analisar o que nossa máquina que decide o problema da parada diz quando uma máquina M executa com sua própria codificação. A máquina H 0 receberá como entrada enc(M )enc(M ). Para isso, basta adicionar uma MT C que recebe enc(M ) e faz uma cópia, produzindo enc(M )enc(M ). Temos uma máquina resultante D cujo comportamento é descrito na figura abaixo. D M para com a entrada enc(M ) enc(M ) C enc(M )enc(M ) loop H0 para M não para com a entrada enc(M ) Aula 10: Decidibilidade 5 A entrada para a máquina D pode ser qualquer máquina, inclusive a própria máquina D. A computação realizada pela máquina D recebendo ela mesma é mostrada na figura abaixo. D D para com a entrada enc(D) enc(D) C enc(D)enc(D) loop H0 para D não para com a entrada enc(D) Vamos analisar as possíveis computações realizadas pela máquina D e a resposta da máquina H que decide o problema da parada: • Considere que a máquina D parou com a entrada enc(D). Isso significa que a máquina H rejeitou a entrada, ou seja, ela computou que a máquina D não para com entrada enc(D). Mas se D parou então temos uma contradição. • Considere agora o caso em que D não parou com a entrada enc(D). Isso significa que a máquina H aceitou a entrada, ela computou que D para com entrada enc(D). Novamente, contradição. Portanto, nossa suposição de que exite a máquina H é absurda e, como consequência, o problema da parada não é decidível. Segundo o Teorema 10.1, não existe uma algoritmo para o problema da parada. Concluímos, portanto, que a linguagem LH = {enc(M )w | enc(M ) é a codificação de uma máquina M e M para com a entrada w ∈ {0, 1}∗ } não é recursiva. Para o problema da parada definimos uma máquina que recebe uma máquina M e uma string w para a máquina M . A máquina que definimos simula M com entrada w. Definição 10.9. Uma Máquina de Turing Universal U é uma máquina que toma como entrada uma outra MT M e uma string arbitrária e simula o comportamento de M com entrada w. Podemos pensar na Máquina de Turing Universal U como um computador que executa um programa M que por sua vez recebe w como dados de entrada. Teorema 10.2. A linguagem LH é recursivamente enumerável. Demonstração. Basta codificar M , enc(M ), e usar enc(M )w como entrada para uma Máquina de Turing Universal que para se M para. Sabemos agora que existem linguagens que são recursivamente enumeráveis mas que não são recursivas. Será que existem linguagens que não são recursivamente enumeráveis? 6 Aula 10: Decidibilidade Para responder esta questão usaremos o princípio da diagonalização que nos ajuda a comparar o tamanho de conjuntos infinitos. Podemos dizer que dois conjuntos têm o mesmo tamanho se pudermos formar pares entre os elementos de cada um dos conjuntos. Exemplo 10.3 Seja o conjunto dos naturais N e o conjunto E dos números naturais pares. Podemos achar que E é menor que N já que é um subconjunto deste. No entanto, pela definição de acima, para tamanho de conjuntos, se pudermos formar para entre os dois conjuntos, eles têm o mesmo tamanho. Assim, basta mapear N em E com a função f (n) = 2n. O que nos leva a n f (n) 1 2 3 .. . 2 4 6 .. . Definição 10.10. Um conjunto é contável se ele é finito ou se ele tem o mesmo tamanho de N. Exemplo 10.4 O conjunto E dos números naturais pares, mostrado no Exemplo 10.3, é contável. Definição 10.11. Se não existe uma correspondência de uma conjunto com o conjunto N, então ele é incontável. Teorema 10.3. O conjunto dos números reais R é incontável. Demonstração. Temos que mostrar que não existe correspondência entre o conjunto dos reais e dos naturais. No entanto, suponha que exista uma função f : N → R para a correspondência e que, por exemplo, f (1) = 3.14159 . . ., f (2) = 55.55555 . . ., f (3) = 0.12345 . . ., f (4) = 0.500000 . . ., . . .. Vamos tentar construir um número x ∈ R tal que ele é diferente de qualquer número correspondido com os naturais pela função f . Usaremos um número entre 0 e 1 cuja parte significativa é decimal. Para garantir que x 6= f (1), façamos o primeiro digito decimal diferente do primeiro digito decimal de f (1), por exemplo, x = 0.4. Agora queremos também x 6= f (2), façamos o segundo digito diferente do segundo decimal de f (2), x = 0.46. Continuando o processo construímos x tal que, para qualquer n ∈ N, x difere de f (n) no n-ésimo digito. Logo, x não possui correspondência em N e, como consequência, R não é contável. Aula 10: Decidibilidade 7 Temos agora todas as ferramentas para verificar se existe alguma linguagem que não é recursivamente enumerável, ou seja, uma linguagem que não possui uma Máquina de Turing. Faremos isso comparando o tamanho do conjunto de todas as possíveis Máquinas de Turing com o conjunto de todas as possíveis linguagens. A ideia é mostrar que o conjunto de linguagens é maior do que o conjunto de Máquinas de Turing. Primeiramente, vamos contar o número de Máquinas de Turing. Corolário 10.1. O conjunto Σ∗ de todas as strings é contável. Demonstração. Vamos formar uma lista das strings de Σ∗ ordenadas por tamanho (strings de tamanho 0, 1, 2, . . .): λ, 0, 1, 00, 01, 10, 11 . . .. Se concatenarmos um dígito 1 na frente dessas strings obtemos 1λ, 10, 11, 100, 101, 110, 111 . . . e, portanto, um mapeamento direto das strings com os naturais: n f (n) 1 2 3 4 5 6 7 .. . 1 10 11 100 101 110 111 .. . O conjunto Σ∗ de todas as strings tem o mesmo tamanho de N, sendo contável. Corolário 10.2. O conjunto de Máquinas de Turing é contável. Demonstração. Toda Máquina de Turing M tem uma codificação enc(M ), que é uma string. Podemos omitir todas as strings que não são codificações de máquinas de Turing e listá-las, como na prova anterior. Assim, conseguimos uma correspondência com os naturais. Agora, vamos contar o número de linguagens. Corolário 10.3. O conjunto de todas as possíveis linguagens é incontável. Demonstração. Seja L o conjunto de todas as linguagens e Σ∗ = {s1 , s2 , s3 , . . .} o conjunto de todas as strings sobre um alfabeto Σ. Temos que Σ∗ = {s1 , s2 , s3 , s4 , s5 , s6 , . . .} = {λ, 0, 1, 01, 10, 11, . . .} 8 Aula 10: Decidibilidade e que uma linguagem L é formada por um subconjunto de strings de Σ∗ . Vamos formar uma sequência binária χL , chamada sequência característica, na qual o i-ésimo bit é 1 se si ∈ L e 0 caso contrário. Como exemplo, dado o conjunto Σ∗ = { λ , 0 , 1 , 01 , 10 , 11 , ... } o subconjunto L Σ∗ L = { λ , 0 , 1 , 01 , 10 , 11 , . . . } = { , 0 , , 01 , , , ... } é uma linguagem com sequência característica χL Σ∗ A χL = { = { = λ 0 , 0 , 1 , 01 , 10 , 11 , . . . } , 0 , , 01 , , , ... } 1 0 1 0 0 ... Como podemos ter linguagens incluindo ou excluindo qualquer elemento de Σ∗ , cada linguagem L ∈ L tem uma sequência característica. O conjunto de todas as linguagens pode ser visto com o conjunto de todas as sequências características, ou seja, o conjunto de todas as sequências binárias infinitas, Cbs = { 0000000 . . . , 1111111 . . . , 0101010 . . . , 1010101 . . . , 1101011 . . . , 0011011 . . . , 1000100 . . . , .. . } Vamos supor que Cbs é contável, ou seja, existe uma função bijetora f : N → Cbs . Podemos pensar numa enumeração arbitrária como Aula 10: Decidibilidade 9 n f (n) 1 2 3 4 5 6 7 .. . 0000000 . . . 1111111 . . . 0101010 . . . 1010101 . . . 1101011 . . . 0011011 . . . 1000100 . . . .. . Construímos uma sequência s pegando o n-ésimo bit de f (n) e fazemos o complemento deste bit o n-ésimo bit de s. Mas s é uma sequência binária infinita que difere de todo f (n). Logo, ela não está mapeada e não existe a função f . Cbs é incontável. Corolário 10.4. Algumas linguagens não são recursivamente enumeráveis. Demonstração. Como temos mais linguagens do que Máquinas de Turing, concluímos que algumas linguagens não são recursivamente enumeráveis.