Complementos de Engenharia de Software 2005/06 Introdução à Teoria da Computação: Decidibilidade João Pascoal Faria (jpf@fe.up.pt, www.fe.up.pt/~jpf) (Com base em notas de Gabriel David e Cristina Ribeiro)
Problemas de computação e de decisão Problema de computação: calcular saída (resposta) em função de entrada Exemplo (resto da divisão inteira): achar o resto da divisão inteira de dois números Entrada: dois números inteiros Saída (resposta): o resto da divisão inteira do 1º pelo 2º Pode-se formular como problema de tradução de linguagens Problema de decisão: problema de computação com resposta “sim” ou “não” Exemplo (divisibilidade): determinar se um número inteiro é divisível por outro Resposta: sim (o 1º é divisível pelo 2º) ou não (o 1º não é divisível pelo 2º) Pode-se formular como problema de aceitação de linguagem Problemas de decisão podem-se reduzir a problemas de computação e vice-versa Problema de decisão problema de computação Para determinar se n é divisível por m, calcula-se o resto da divisão inteiro do n pelo m. Se este resto for 0, a resposta é “sim”, caso contrário a resposta é “não”. Problema de computação problema de decisão Para achar o resto da divisão inteira de n por m, verifica-se se n+m-r é divisível por m, para r=0, 1, …, m-1. O valor de r em que a resposta é “sim” é o resto procurado.
Computabilidade e decidibilidade Problema solúvel: existe um algoritmo (isto é, uma máquina de Turing) que dá a resposta em tempo finito Sem entrar em ciclo infinito! Se for um problema de computação, diz-se computável O resto da divisão inteira é computável Se for um problema de decisão, diz-se decidível A divisibilidade é decidível Existem problemas insolúveis, como veremos a seguir! Caso paradigmático – problema da terminação
Problema da Terminação Problema da terminação genérico: Existe algum algoritmo A capaz de decidir em tempo finito, para qualquer programa P e entrada E, se o programa P termina (não entra em ciclo infinito) quando executado com entrada E? Não chega executar o programa P com entrada E e ver o que acontece, pois, se o programa P não terminar ao fim de um certo tempo (por maior que seja esse tempo), não sabemos se vai algumas vez terminar ou não Problema da terminação para máquinas de Turing: Dada uma máquina de Turing arbitrária T e uma cadeia de entrada arbitrária w sobre o alfabeto {a, b} (ou, equivalentemente, sobre o alfabeto {0, 1}), existe algum algoritmo capaz de decidir se T termina (não entra em ciclo infinito) quando executado com entrada w? Problema indecidível! Prova por contradição (redução ao absurdo)!
Prova por contradição (1) Suponhamos que existe o algoritmo/programa A Sim (se P for executado com entrada E, termina) programa P A entrada E Não (se P for executado com entrada E, não termina) (A termina em tempo finito)
Prova por contradição (2) Se A existe, podemos definir o algoritmo/programa B da seguinte forma: B Sim (se P for executado com entrada E, termina) programa P programa P A ciclo infinito entrada E Não (se P for executado com entrada E, não termina) Não (se P for executado tendo como entrada o seu próprio código, não termina) (A termina em tempo finito) Comportamento de B tendo como entrada o código do programa P: - Se o programa P termina quando executado tendo como entrada o próprio código do programa P, então B não termina. - Caso contrário, B termina e imprime “não”.
Prova por contradição (3) Correndo agora B tendo como entrada o próprio B: B Sim (se P for executado com entrada E, termina) B programa P A ciclo infinito entrada E Não (se P for executado com entrada E, não termina) Não (A termina em tempo finito) Comportamento de B tendo como entrada o código do programa B: - Se o programa B termina quando executado tendo como entrada o próprio código do programa B, então B não termina (quando executado tendo como entrada o código do programa B). - Caso contrário, B termina e imprime “não”. Contradição!
Prova por contradição (4) Portanto, não pode existir o programa/algoritmo B! Se A existe, então B existe. Como B não existe, então A não existe! Logo o problema da terminação não é decidível!