Teoria da Computabilidade
Computabilidade e decidibilidade
Os problemas relevantes que estudamos são problemas de decisão e reconhecimento de linguagens, ou cálculo de funções. É então relevante definir formalmente o que significa reconhecer/decidir uma linguagem e calcular uma função.
Para um alfabeto , uma linguagem e uma função , dizemos que:
- Uma linguagem diz-se reconhecível se existe uma máquina de Turing com alfabeto de entrada/saída tal que . Denotamos por o conjunto de todas as linguagens reconhecíveis sobre o alfabeto .
- Uma linguagem diz-se decidível se existe uma máquina de Turing com alfabeto de entrada/saída tal que e . Denotamos por o conjunto de todas as linguagens decidíveis sobre o alfabeto .
- Uma função diz-se computável se existe uma máquina de Turing com alfabeto de entrada/saída tal que . Denotamos por o conjunto de todas as funções computáveis sobre o alfabeto .
O seguinte resultado diz-nos que podemos concentrar-nos apenas em reconhecer/decidir linguagens:
Proposição
Seja um alfabeto. Sejam uma função e , com . Então:
- é computável se e só se é reconhecível;
- se é total, é computável se e só se é decidível.
Prova
Prova de 1
Suponha-se que é computável e considere-se a máquina de Turing que computa . Criamos uma máquina de Turing com duas fitas que:
- copia para a segunda fita;
- computa (usando ) sobre ;
- compara o output de com , aceitando se estes forem iguais. Evidentemente que esta máquina reconhece .
Agora suponha-se que é reconhecível e seja a máquina de Turing que a reconhece. Considere-se a máquina de Turing com 3 fitas tal que:
- na primeira fita está o input ;
- escolhe não-deterministicamente uma palavra - uma palavra que vamos verificar se é o resultado de - e coloca-a na fita 3;
- coloca na segunda fita ;
- executa sobre a segunda fita: se aceitar a palavra na fita 2, termina, caso contrário volta ao passo 2.
Esta máquina calcula : quando termina (pois aceitou a palavra na segunda fita), a palavra (o output esperado) está na última fita (onde o output deve estar).
Observe-se que, para cada , existe no máximo uma palavra do tipo que é reconhecida por . Logo, a árvore de computações desta máquina para o input tem no máximo uma computação de aceitação.
A prova de 2 é semelhante.
Propriedades
Nesta secção vão ser enunciadas várias propriedades sobre a decibilidade de linguagens. É bastante relevante entender a justificação por detrás destas propriedades. Muitas vezes estas justificações usam raciocínios muito semelhantes aos que podem ser usar para justificar a decibilidade de outras linguagens. Nomeadamente, vai ser usada muitas vezes (nesta e na próxima secção) a ideia de definir uma máquina que decida uma linguagem a partir de máquinas que decidem linguagens já conhecidas. Esta ideia é muito importante e útil.
Seja um alfabeto e linguagens decidíveis. Então,
- ,
- ,
- ,
- ,
são linguagens decidíveis.
Prova
(1) Basta considerar que a máquina de Turing que ao receber qualquer input vai para o estado de rejeição reconhece ;
(2) Basta considerar que a máquina de Turing que ao receber qualquer input vai para o estado de aceitação reconhece ;
(3) Se for a máquina de Turing que decide , basta trocar os estados de aceitação e rejeição para decidir .
(4) Sejam e máquinas de Turing que reconhecem e , respetivamente. Considere-se a máquina de Turing com duas fitas. A máquina começa por copiar o input para a segunda fita. Então, executa na fita 1:
- se aceitar o input, termina no estado de aceitação; caso contrário, executa na fita 2:
- se aceitar o input, termina no estado de aceitação; caso contrário, termina no estado de rejeição.
(5) Basta observar que . Como e são decidíveis, e também o são. Então, segundo 4., também é decidível e, mais uma vez, .
(6) Basta observar que . Como é decidível, é decidível e segundo 4. é decidível.
Seja um alfabeto e linguagens reconhecíveis. Então,
- ,
- ,
- ,
- ,
são linguagens reconhecíveis.
Prova
(1) é decidível e todas as linguagens decidíveis são reconhecíveis;
(2) é decidível e todas as linguagens decidíveis são reconhecíveis;
(3) Sejam e máquinas de Turing que reconhecem e , respetivamente. Definimos a máquina de Turing que escolhe não deterministicamente entre executar e . Se a computação de uma destas máquinas terminar em aceitação, termina também em aceitação. reconhece pelo que esta linguagem é reconhecível.
(4) Sejam e máquinas de Turing que reconhecem e , respetivamente. Considere-se a máquina de Turing com duas fitas que, ao receber como input, copia para a fita 2 e, de seguida, executa alternadamente um passo da execução de na fita 1 e um passo da execução de na fita 2. Se uma das execuções terminar, então prossegue a execução da outra máquina no caso de ter terminado aceitando, e rejeita em caso contrário. Se a execução da outra máquina terminar, então aceita no caso de ter terminado aceitando, e rejeita em caso contrário. A máquina reconhece pelo que esta linguagem é reconhecível.
Se for reconhecível e for decidível, então é reconhecível.
Prova
Se é decidível, é também decidível e, consequentemente, reconhecível. Como vimos acima, se e são reconhecíveis, então é reconhecível.
NOTA
Note-se como já não é verdade que se é reconhecível então também o é: basta que haja uma palavra em cuja computação não termine na máquina que reconhece para que isto não seja verdade.
Seja uma linguagem sobre o alfabeto . Então, é decidível se e só se e forem reconhecíveis.
Prova
Se for decidível, então e são decidíveis e portanto reconhecíveis.
Sejam agora e linguagens reconhecidas por máquinas de Turing e , respetivamente.
Seja a máquina de Turing com duas fitas que copia o input da primeira fita para a segunda e executa, alternadamente, na primeira fita e na segunda.
Como e são reconhecíveis, uma destas computações acaba eventualmente.
Se for a computação na primeira fita, aceitamos, caso contrário, rejeitamos.
De qualquer forma a computação termina e é decidível.
Redução Computável
Nas provas acima e no capítulo anterior, por vezes pegamos em máquinas de Turing que já conhecíamos para criar máquinas de Turing que resolviam problemas que ainda não tínhamos resolvido. A ideia de redução computável consiste exatamente nisso:
Sejam e linguagens sobre os alfabetos e , respetivamente. Dizemos que há uma redução computável de para , ou simplesmente que se reduz a , o que denotamos por se existe uma função total computável tal que, para cada ,
Proposição
Sejam e linguagens sobre e , respetivamente. Se e é decidível (resp. reconhecível) então é decidível (resp. reconhecível).
Prova
Como , existe uma função total computável tal que .
Seja a máquina de Turing que calcula esta função.
Como é decidível, é também decidida por uma máquina de Turing .
Considere-se a seguinte máquina de Turing :
- dado um input , começa por computar tal como ;
- computa sobre : se terminar , termina em aceitação, terminando em rejeição caso contrário. Esta máquina decide .
A prova para reconhecimento é análoga.
Nota
Para usarmos a ideia de redução computável basta então encontrar uma função que reduza uma linguagem a outra . Para esta função é essencial provar que:
- ela é total - está definida para todo o input;
- ela é computável - existe uma máquina de Turing que a computa;
- satisfaz a propriedade
Claro está, se alguma destas propriedades não se verificar, a redução computável não está bem definida.
A proposição acima não é no entanto suficiente para verificar se uma linguagem não é computável.
Dado um alfabeto distinguimos as seguintes linguagens:
- - o problema da aceitação;
- - o problema da rejeição;
- - o problema da computação bem sucedida;
- - o problema do abortamento;
- - o problema da terminação.
De forma mais intuitiva, podemos pensar que a linguagem consiste nos pares constituídos por uma máquina de Turing e uma palavra tais que , isto é, é aceite por .
De forma a podermos representar estes pares por uma palavra, usamos a representação canónica de máquinas, separando esta representação da palavra input por um .
De forma semelhante, contém pares tais que , os pares tais que , e por aí em diante.
Proposição
Para um alfabeto , as linguagens , , , e são reconhecíveis mas não são decidíveis.
Prova
As demonstrações para as 5 linguagens são semelhantes, pelo que vamos centrar-nos apenas em .
Para mostrar que esta linguagem é reconhecível basta calcular para um input o valor de e depois simular sobre como na máquina universal, aceitando assim que a computação de sobre termine (aceitando, rejeitando ou abortando).
Assuma-se agora então que é decidível.
Nesse caso existe uma máquina de Turing que a decide.
Construímos a seguinte máquina .
Para cada input , começa por simular sobre . Se aceitar, entra num ciclo infinito. Caso contrário, aceita.
Verificamos que é aceite por se e só se a computação de dado o input não termina.
Como isto se verifica para qualquer máquina de Turing temos que, em particular, se , é aceite por se e só se a computação de dado o input não termina.
Ou seja, dado o input termina se e só se dado o input não termina.
Como isto é uma contradição, conclui-se que a linguagem não é decidível.
Neste vídeo podemos encontrar esta demonstração apresentada de uma forma mais leve.
Nota
O resultado enunciado acima permite-nos provar a indecidibilidade de uma linguagem mostrando que uma das linguagens enunciadas reduz a (se fosse decidível então qualquer linguagem que reduza a ela deve também ser decidível). No entanto é importante perceber o raciocínio por trás da prova, já que raciocínios semelhantes a este podem também ser aplicados frequentemente.
Corolário
Para um alfabeto , as linguagens , , , e não são reconhecíveis.
Teorema de Rice
O seguinte teorema é uma ferramenta bastante genérica para demonstrar a indecidibilidade de linguagens constituídas por máquinas de Turing cujas linguagens satisfaçam alguma propriedade não-trivial.
Teorema de Rice
Sejam um alfabeto e tal que se e , então .
Se então é indecidível.
Exemplo
Vamos provar que a linguagem é indecidível.
Segundo o Teorema de Rice basta mostrar que (1) , (2) , e (3) .
- A máquina de Turing sobre que aceita todas as palavras está em . Então .
- A máquina de Turing sobre que não aceita nenhuma palavra não está em . Então .
- Seja . Se , então o seu alfabeto é e aceita infinitas palavras, pelo que .
Podemos então concluir, segundo o Teorema de Rice, que é indecidível.