Você está na página 1de 39

Teoria da Computação

Decidibilidade
versão 1.2

Bruno Masquio
Máquina de
Turing Universal
Decidibilidade
● Uma Máquina de Turing Universal (MTU)
é uma máquina de Turing que consegue
simular uma mT arbitrária operando sobre
uma entrada arbitrária

● Note que os computadores são, em


essência, MTUs -- são máquinas que
simulam outras máquinas, a saber, os
programas que executam
Decidibilidade
● Para criar uma MTU, é necessário resolver
os seguintes problemas:
○ Qual é um alfabeto da MTU suficiente
para codificar uma mT arbitrária com uma
entrada arbitrária? (codificação)
○ Como realizar a simulação em si?
(simulação)
Decidibilidade
Codificação
● Dada uma mT M = (K, Γ, Σ, δ, i, F), podemos
codificar M com uma cadeia c(M) sobre o
alfabeto universal ΣU da seguinte forma:
Decidibilidade
Codificação

● Renomeie K para {q0, q1, q2, …}


Codifique c(qk) = qIII...III (com k I's)
Codifique c(K) = c(q0)c(q1)c(q2)...

Ex: K = {0, 1, 2, 3, 4}, c(K) = qqIqIIqIIIqIIII


Decidibilidade
Codificação

● Renomeie Γ para {s0, s1, s2, …}


Codifique c(sk) = sIII...III (com k I's)
Codifique c(Γ) = c(s0)c(s1)c(s2)...

Ex: Γ = {a, b, X, Y, ◊}, c(Γ) = ssIsIIsIIIsIIII


Decidibilidade
Codificação

● Seja Σ = {s0, …, sk }
Codifique c(Σ) = c(s0)c(s1)...c(sk)

Ex: Σ = {a, b}, c(Σ) = ssI


Decidibilidade
Codificação

● Codifique
c(qisjqkslR) = c(qi)c(sj)c(qk)c(sl)R
c(qisjqkslL) = c(qi)c(sj)c(qk)c(sl)L

Sendo δ = {t1, t2, …}, codifique c(δ) = c(t1)c(t2)...


Decidibilidade

Ex: δ = {0a1XR, 0Y3YR, 0◊4XR, 1a1aR,


1b2YL, 1Y1YR, 2a2aL, 2X0XR, 2Y2YL,
3Y3YR, 3◊4XR}

c(δ) =
qsqIsIIRqsIIIqIIIsIIIRqsIIIIqIIIIsIIRqIsqIsRqIsIqI
IsIIILqIsIIIqIsIIIRqIIsqIIsLqIIsIIqsIIRqIIsIIIqIIsIII
LqIIIsIIIqIIIsIIIRqIIIsIIIIqIIIIsIIR
Decidibilidade
Codificação

● Sendo F = {qi, qj, ….}, codifique


c(F) = c(qi)c(qj)...

Ex: F = {4}, c(F) = qIIII


Decidibilidade
Codificação

● Sendo mT M = (K, Γ, Σ, δ, i, F), codifique


c(M) = c(K)#c(Γ)#c(Σ)#c(δ)#c(i)#c(F)
● Sendo x uma cadeia x1x2...xk sobre Σ, entrada
de mT, codifique c(x) = c(x1)c(x2)...c(xk)
● Uma mT M com entrada x, pode ser codificada
como c((M, x)) = c(M)#c(x)
Decidibilidade
Ex: Seja M = (K, Σ, Γ, δ, i, F) onde:
K = {0, 1, 2, 3, 4}, Γ = {a, b, X, Y, ◊}
Σ = {a, b}, i = 0, c(i) = q, F = {4}

c((M, aabb)) =
qqIqIIqIIIqIIII#ssI#ssIsIIsIIIsIIII#qsqIsIIRqsIIIqII
IsIIIRqsIIIIqIIIIsIIRqIsqIsRqIsIqIIsIIILqIsIIIqIsIII
RqIIsqIIsLqIIsIIqsIIRqIIsIIIqIIsIIILqIIIsIIIqIIIsIII
RqIIIsIIIIqIIIIsIIR#q#qIIII#sssIsI
Decidibilidade
Codificação

Portanto, c((M, x)) é uma cadeia sobre o


alfabeto ΣU = {q, s, I, #, L, R} --
um alfabeto universal!
Decidibilidade
Simulação

● Uma MTU MU= (KU, ΓU, ΣU, δU, iU, FU) deve ser
projetada para, sob entrada xU = c((M, x)), fazer
a simulação da mT M sob entrada x de forma
que:

MU aceita xu ⇔ M aceita x

uma máquina de Turing universal!


Decidibilidade

Teorema (Alan Turing):


O conjunto de todas as mT's é
enumerável.

∴ com isso, fixada de uma enumeração f: ℕ → { M : M é uma


mT }, é possível simplificar a descrição de uma mT M para
apenas o natural i tal que f(i) = M!
Problema da Parada
("Halting Problem")
Decidibilidade
● Considere o seguinte problema:

Dada uma mT M e uma cadeia x sobre


o alfabeto da linguagem de M,
M pára com entrada x?
Decidibilidade
● Pela Tese de Church-Turing, este problema
é equivalente ao problema:

Dado um programa A escrito em


qualquer linguagem e x uma entrada
de A,
A pára com entrada x?
Decidibilidade
● Uma linguagem é decidível se ela é
recursiva e indecidível, caso contrário.

● Isto é, uma linguagem L é decidível se


houver um algoritmo que decide, para
qualquer cadeia x, se x ∈ L ou não
Decidibilidade

Teorema (Alan Turing):


O problema da Parada é indecidível.

∴ nunca um compilador poderá colocar um código automático


no executável de um algoritmo que verifique, para 100% das
entradas possíveis, se aquele programa pára e reportar um erro
no caso contrário. Isto seria desejável para evitar que um
programa que possa fazer loop infinito seja criado!
Decidibilidade
Dem.: Suponha que fosse decidível. Considere então
o problema de responder se uma MTU MU pára com
entrada c(M)#c(x). Fixando uma enumeração f: ℕ → ΣU*,
podemos então trocar a codificação c(M)#c(x) pelos
respectivos "id's", de modo que (i, j) represente f(i)#f(j),
onde f(i) = c(M) e f(j) = c(x).
Decidibilidade
Dem.: (continuação)
Seja A(i, j): Lógico o algoritmo que responde se a mT Mi
pára com entrada xj. Seja então B um algoritmo que
recebe uma cadeia xi ∈ ΣU* através do respectivo id i:

função B(i): Lógico


se A(i, i) então Não tente entender este
algoritmo. Apenas note
enquanto (V) faça que ele existe (e sua
k ← 0 // loop infinito existência produzirá a
contradição procurada!)
senão
retornar (F)
Decidibilidade
Dem.: (continuação)
Seja A(i, j): Lógico o algoritmo que responde se a mT Mi
pára com entrada xj. Seja então B um algoritmo que
recebe uma cadeia xi ∈ ΣU* através do respectivo id i:

função B(i): Lógico Como B é um


se A(i, i) então algoritmo, existe uma
enquanto (V) faça mT equivalente,
digamos, Mk
k ← 0 // loop infinito
senão
retornar (F)
Decidibilidade
Dem.: (continuação)
Seja A(i, j): Lógico o algoritmo que responde se a mT Mi
pára com entrada xj. Seja então B um algoritmo que
recebe uma cadeia xi ∈ ΣU* através do respectivo id i:

função B(i): Lógico Como B é um


se A(i, i) então algoritmo, existe uma
enquanto (V) faça mT equivalente,
digamos, Mk
k ← 0 // loop infinito
senão
A execução B(k)
retornar (F) pára?
Decidibilidade
Dem.: (continuação)
Analisemos:
Quando A(i, j) pára? Quando A(i, j) não pára?

função B(i): Lógico Sempre (por hipótese) Nunca (por hipótese)

se A(i, i) então
enquanto (V) faça
k←0
senão
retornar (F)
Decidibilidade
Dem.: (continuação)
Analisemos:
Quando A(i, j) pára? Quando A(i, j) não pára?

função B(i): Lógico Sempre (por hipótese) Nunca (por hipótese)

se A(i, i) então Quando B(i) pára? Quando B(i) não pára?


enquanto (V) faça quando Mi com entrada xi quando Mi com entrada xi pára
k←0 não pára

senão
retornar (F)
Decidibilidade
Dem.: (continuação)
Analisemos:
Quando A(i, j) pára? Quando A(i, j) não pára?

função B(i): Lógico Sempre (por hipótese) Nunca (por hipótese)

se A(i, i) então Quando B(i) pára? Quando B(i) não pára?


enquanto (V) faça quando Mi com entrada xi quando Mi com entrada xi pára
k←0 não pára

senão Quando B(k) pára? Quando B(k) não pára?


retornar (F)
quando Mk com entrada xk quando Mk com entrada xk pára
não pára
Decidibilidade
Dem.: (continuação)
Analisemos:
Quando A(i, j) pára? Quando A(i, j) não pára?

função B(i): Lógico Sempre (por hipótese) Nunca (por hipótese)

se A(i, i) então Quando B(i) pára? Quando B(i) não pára?


enquanto (V) faça quando Mi com entrada xi quando Mi com entrada xi pára
k←0 não pára

senão Quando B(k) pára? Quando B(k) não pára?


retornar (F)
quando Mk com entrada xk quando Mk com entrada xk pára
não pára

Quando Mk com entrada Quando Mk com entrada xk


xk pára? não pára?

quando Mk com entrada xk quando Mk com entrada xk pára


não pára
Decidibilidade
Dem.: (continuação)
Chegamos a uma contradição, pois.

● "Mk com entrada xk pára" quando "Mk com entrada xk


não pára" (contradição), e
● "Mk com entrada xk não pára" quando "Mk com entrada
xk pára" (contradição).

Logo, não é possível que B(k) pare nem que B(k) não
pare. Mas alguma coisa tem que acontecer com B(k)!
Chegamos a um absurdo lógico. Portanto, a premissa de
que A(i, j) seja decidível é falsa.
Decidibilidade
● O Problema da Parada é importante para
mostrar que outros problemas são também
indecidíveis, via técnica de redução de
problemas
Decidibilidade
● Exemplo: O problema da Divisão por Zero,
aquele de determinar se dado algoritmo com
dada entrada efetua ao longo de sua
execução uma divisão por zero, é
indecidível.
Decidibilidade
● Dem. (esboço): Suponha que exista um algoritmo Div0(i, j):
Lógico que responda se a mT Mi com entrada xj executa
uma divisão por zero ou não, ∀ i, j ∈ ℕ (suponha que a mT
detecte que uma divisão por 0 está sendo feita e seja
preparada para parar e reportar um erro de aritmética)

● Seja Mk uma mT qualquer com entrada qualquer xR

● Em todos os pontos da função de transição onde Mk não


tenha mais transição a ser feita, troque o estado corrente
para um novo estado cujo objetivo é executar uma divisão
por 0 (exemplo, calcule "1 / 0"). Seja Mk2 a mT assim
modificada.
Decidibilidade
● Dem. (esboço): (continuação)

● Logo, Div0(k2, j) = V ⇔ Mk com entrada xj pára

● Portanto, na existência de fato de Div0, poderíamos


indiretamente saber se qualquer Mk com qualquer
entrada xj pára ou não; em outras palavras, estaríamos
resolvendo o Problema da Parada, um absurdo.

● Portanto, Div0(i, j) é indecidível.


Decidibilidade
● Outros problemas indecidíveis
○ Dada GLC G e um alfabeto ∑, é verdade que G gera ∑*?

○ Dadas duas GLCs G1 e G2, é verdade que L(G1) = L(G2)?

○ Dadas duas GLCs G1 e G2 e uma cadeia w, é verdade que w ∈ L(G1) ⋂


L(G2)?

○ Dada uma gramática GLC G, é verdade que G é ambígua? G é ambígua se


existe uma cadeia w que pode ser derivada por mais de uma sequência de
derivações de G.
Hierarquia das
Linguagens
Decidibilidade
Linguagens LDIAG_REJ

Recursivamente Enumeráveis LAC


Recursivas LL_DIAG_REJ

Sensíveis ao Contexto { ai bi ci: i ∈ ℕ }


Livres de Contexto { a i bi : i ∈ ℕ }
Regulares { ai : i ∈ ℕ }

LL_DIAG_REJ = { xi : i ∈ ℕ | Mi não aceita xi usando no máximo |xi| posições da fita }


LAC = { (Mi, xj) : i, j ∈ ℕ | Mi aceita xj }
LDIAG_REJ = { xi : i ∈ ℕ | Mi não aceita xi }
Exercícios
Exercícios
1) Determinar a codificação das máquinas de turing a seguir.
a) Σ = {0,1}, Γ = {0,1,X,B}, tal que B é o símbolo branco, i = q0, F = {q4} e δ é dado a seguir.

b) Σ = {a,b,c}, Γ = {a,b,c,X,Y,Z,B}, tal que B é o símbolo branco, i = q0, F = {qπ} e δ é dado a seguir.

Você também pode gostar