0% acharam este documento útil (0 voto)
7 visualizações10 páginas

Máquinas de Turing: Exercícios e Soluções

O documento apresenta uma série de exercícios sobre Máquinas de Turing, incluindo a definição de uma máquina específica e suas transições para processar sequências de zeros. Ele também descreve várias linguagens que podem ser decididas por Máquinas de Turing, detalhando algoritmos para cada uma delas. Além disso, são apresentadas subrotinas para operações básicas em Máquinas de Turing, como teste de início, reset e limpeza da fita.

Enviado por

aregradaatena
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
7 visualizações10 páginas

Máquinas de Turing: Exercícios e Soluções

O documento apresenta uma série de exercícios sobre Máquinas de Turing, incluindo a definição de uma máquina específica e suas transições para processar sequências de zeros. Ele também descreve várias linguagens que podem ser decididas por Máquinas de Turing, detalhando algoritmos para cada uma delas. Além disso, são apresentadas subrotinas para operações básicas em Máquinas de Turing, como teste de início, reset e limpeza da fita.

Enviado por

aregradaatena
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

tc

Mateus Alves
October 2025

1 Introduction
Exercı́cio 1 – Sequência de Configurações de uma
Máquina de Turing
Seja a máquina

M = ({q1 , q2 , q3 , q4 , q5 , qa , qr }, {0}, {0, x, ⊔}, δ, q1 , qa , qr )

definida pela função de transição:


δ 0 x ⊔
q1 (q2 , ⊔, D) (qr , x, D) (qr , ⊔, D)
q2 (q3 , x, D) (q2 , x, D) (qa , ⊔, D)
q3 (q4 , 0, D) (q3 , x, D) (q5 , ⊔, E)
q4 (q3 , x, D) (q4 , x, D) (qr , ⊔, D)
q5 (q5 , 0, E) (q5 , x, E) (q2 , ⊔, D)

(a) Entrada: 0

q1 0 ⇒ ⊔q2 ⊔ ⇒ ⊔ ⊔ qa ⊔

Aceita.

(b) Entrada: 00

q1 00 ⇒ ⊔q2 0 ⇒ ⊔xq3 ⊔ ⇒ ⊔q5 x


⇒ q5 ⊔ x ⇒ ⊔q2 x ⇒ ⊔xq2 ⊔
⇒ ⊔x ⊔ qa ⊔

1
Aceita.

(c) Entrada: 000

q1 000 ⇒ ⊔q2 00 ⇒ ⊔xq3 0 ⇒ ⊔x0q4 ⊔


⇒ ⊔x0 ⊔ qr ⊔

Rejeita.

(d) Entrada: 0000

q1 0000 ⇒ ⊔q2 000 ⇒ ⊔xq3 00 ⇒ ⊔x0q4 0


⇒ ⊔x0xq3 ⊔ ⇒ ⊔x0q5 x ⇒ ⊔xq5 0x
⇒ ⊔q5 x0x ⇒ q5 ⊔ x0x ⇒ ⊔q2 x0x
⇒ ⊔xq2 0x ⇒ ⊔xxq3 x ⇒ ⊔xxxq3 ⊔
⇒ ⊔xxq5 x ⇒ ⊔xq5 xx ⇒ ⊔q5 xxx
⇒ q5 ⊔ xxx ⇒ ⊔q2 xxx ⇒ ⊔xq2 xx
⇒ ⊔xxq2 x ⇒ ⊔xxxq2 ⊔ ⇒ ⊔xxx ⊔ qa ⊔

Aceita.

Conclusão

Entrada Resultado
0 Aceita
00 Aceita
000 Rejeita
0000 Aceita

Observação: a máquina marca cada sı́mbolo 0 como x, varre até o fim da
cadeia, volta e repete o processo. Ela aceita quando o número de blocos de zeros
é par e rejeita quando é ı́mpar (exceto o caso de uma única célula).

2
Exercı́cio 2 – Máquinas de Turing que decidem
linguagens
Notação: sı́mbolos de marcação X, Y, Z são usados para indicar letras já pro-
cessadas. A fita contém apenas {a, b, c, ⊔}; os estados de aceitação e rejeição
são qacc e qrej .

(a) L1 = {ai bj ck | 0 ≤ i ≤ j ≤ k}
Ideia: verificar que a cadeia tem forma a∗ b∗ c∗ e que cada a possui um b corre-
spondente e cada b possui um c correspondente.
Algoritmo:
1. Verifique a forma a∗ b∗ c∗ ; se violada, rejeite.

2. Para cada a não marcado: marque a → X, procure o primeiro b não


marcado; se não existir, rejeite; marque b → Y ; volte ao inı́cio.
3. Após não restarem a não marcados, emparelhe cada b não marcado com
um c não marcado (marcando b → Y, c → Z).
4. Aceite se todos os b foram emparelhados com algum c.

Estados principais: qcheck , qab , qf indB , qbc , qf indC , qacc , qrej .


(b) L2 = {ai bj ck | i + j = k, i, j, k > 0}


Ideia: cada a e cada b consome exatamente um c. No fim não deve restar
sı́mbolo não marcado.
Algoritmo:
1. Verifique a forma a∗ b∗ c∗ e a presença de ao menos um a, b, c.

2. Para cada a não marcado, marque a → X e um c não marcado c → Z; se


faltar c, rejeite.
3. Repita o mesmo para cada b não marcado.
4. Se todos os a, b têm c correspondente e nenhum sı́mbolo sobra, aceite.

3
(c) L3 = {ai bj ck | i ̸= j ̸= k, i, j, k > 0}
Ideia: os três contadores devem ser distintos entre si. A máquina executa três
sub-rotinas de comparação: (i=j?), (j=k?) e (i=k?). Se qualquer comparação
der igualdade, rejeite; caso contrário, aceite.
Cada sub-rotina emparelha sı́mbolos dos dois blocos (marcando-os) e testa
se terminam simultaneamente.

(d) L4 = {w ∈ {a, b}∗ | wnãoédaf ormaan bn }


Ideia: é o complemento de an bn . Basta construir a MT que decide an bn e
inverter aceitação/rejeição.
Submáquina Meq para an bn : marque o primeiro a → X, procure o
primeiro b → Y ; se não encontrar, rejeite; repita até acabar; aceite se não
sobrar a ou b. A máquina de L4 troca qacc ↔ qrej .

(e) L5 = {w ∈ {a, b}∗ | #a(w) = #b(w)}


Ideia: em qualquer ordem, o número de a’s é igual ao de b’s.
Algoritmo:
1. Se existir a não marcado, marque a → X e procure um b não marcado
b → Y ; se não existir, rejeite.
2. Repita simetricamente para b não marcado.
3. Quando não restarem sı́mbolos não marcados, aceite.

(f ) L6 = {w ∈ {a, b}∗ | #a(w) = 2 · #b(w)}


Ideia: cada b corresponde a dois a’s.
Algoritmo:
1. Enquanto existir b não marcado: marque b → Y ; procure dois a’s não
marcados e marque a → X; se não achar dois, rejeite.
2. No fim, se não restar a não marcado, aceite; caso contrário, rejeite.

(g) L7 = {w ∈ {a, b}∗ | #a(w) < 2 · #b(w)}


Ideia: adaptar a rotina anterior. Durante o emparelhamento de cada b com
dois a’s, se faltar a em algum momento, aceite imediatamente (pois #a < 2#b).
Se todos os b obtiverem dois a’s, rejeite.

4
(h) L8 = {w ∈ {a, b}∗ | wépalı́ndromoe#a(w) = #b(w)}
Ideia: interseção de duas linguagens decidı́veis:
1. Verifique se w é palı́ndromo: compare primeiro e último sı́mbolo, marcando-
os; repita até o centro.
2. Se for palı́ndromo, execute a rotina de L5 para checar igualdade de con-
tagens.
3. Aceite apenas se ambos os testes forem verdadeiros.

(i) L9 = {w#t | w, t ∈ {a, b}∗ , wésubcadeiadet}


Ideia: verificar se t contém w como substring.
1. Separe as partes w e t.
2. Para cada posição possı́vel em t, compare w sı́mbolo a sı́mbolo com o
trecho correspondente de t.
3. Se algum casamento completo ocorrer, aceite; se o fim de t for atingido
sem sucesso, rejeite.
Estados tı́picos: qinit , qcmp , qrestore , qshif t , qacc , qrej .

(j) L10 = {ww | w ∈ {a, b}∗ }


Ideia: verificar se a palavra é composta por duas metades idênticas.
Algoritmo:
1. Calcule o comprimento total m; para cada n ≤ m/2, teste se m = 2n.
2. Marque os n primeiros sı́mbolos (X) e os n últimos (Y ). Compare-os um
a um, movendo a cabeça entre as extremidades.
3. Se todas as comparações coincidirem e não restarem sı́mbolos extras,
aceite; caso contrário, rejeite.
Observação: a MT pode testar todos os possı́veis pontos de corte, ou copiar
a primeira metade para uma área auxiliar e comparar.

Conclusão: Cada uma das linguagens L1 , . . . , L10 é decidı́vel. As con-
struções acima descrevem como obter os diagramas completos de estados de
suas respectivas Máquinas de Turing. [a4paper,11pt]article [utf8]inputenc ams-
math,amssymb tikz automata,positioning,[Link]
Exercı́cio 3 – Subrotinas de Máquina de Turing
Notação: escrevemos transições como δ(q, a) = (q ′ , b, D) (D = direita, E =
esquerda). O branco é ⊔.

5
Subrotinas (a) a (h)
(a) TESTE-INICIO
Descrição: aceita se a cabeça já está na posição mais à esquerda da fita (i.e.,
o sı́mbolo atual está imediatamente após infinitos brancos à esquerda). Rejeita
caso contrário.
Ideia: mover-se uma posição para a esquerda; se encontrará ⊔ então a
cabeça não estava no inı́cio (volte e rejeite). Se ao mover para a esquerda já
estava em ⊔ (isto é, o sı́mbolo atual era o primeiro não-branco), então voltamos
e aceitamos.
Máquina (esquemática):
• q0 : estado inicial (a cabeça está sobre o sı́mbolo atual).
• qL : move uma célula à esquerda para checar.
• qacc , qrej : aceitação/rejeição.

Transições principais:

δ(q0 , a) = (qL , a, E) paratodoa ∈ Γ.


δ(qL , ⊔) = (qacc , ⊔, D) (achoubrancoàesquerda : estavanoinı́cio).
δ(qL , b) = (qrej , b, D) paratodob ̸= ⊔ (hásı́mboloàesquerda).

(b) RESET
Descrição: desloca a cabeça até a posição mais à esquerda da fita (primeiro
sı́mbolo não-blank) e termina em estado de aceitação com a cabeça sobre esse
primeiro sı́mbolo.
Ideia: mover-se repetidamente para a esquerda até encontrar ⊔, então mover
uma posição à direita (para o primeiro sı́mbolo) e aceitar.
Transições principais:

δ(q0 , a) = (qL , a, E) ∀a.


δ(qL , ⊔) = (qr , ⊔, D)
δ(qr , a) = (qacc , a, N ) (N = nãomover/estadof inal).

(Usa-se qr para posicionar sobre o primeiro sı́mbolo não-branco e então aceita.)

6
(c) LIMPAR
Descrição: limpa (coloca brancos) todas as células desde a posição atual até a
posição mais à esquerda (inclusive ou exclusiva conforme enunciado — aqui as-
sumimos exclusive da posição atual: limpa as células à esquerda até o primeiro
não-blank à esquerda). Pelo enunciado de exemplo, a posição atual e os sı́mbolos
à esquerda até o inı́cio ficam em branco, e a cabeça termina no inı́cio, em qa .
Ideia: iterativamente escrever ⊔ na célula atual, mover-se à esquerda e
repetir até encontrar a célula que já é branca (ou até o começo), então aceitar.
Transições principais:
δ(q0 , a) = (qc , ⊔, E) ∀a ̸= ⊔.
δ(qc , b) = (qc , ⊔, E) ∀b ̸= ⊔.
δ(qc , ⊔) = (qacc , ⊔, D).

(d) LIMPAR-R
Descrição: limpa da posição atual até o primeiro branco à direita (i.e., substitui
por ⊔ cada célula desde a atual até encontrar o primeiro ⊔ à direita), e termina
em qa com a cabeça sobre o primeiro branco (ou sobre a célula seguinte, conforme
exemplo).
Ideia: escreva ⊔ na célula atual, mova à direita; se encontrar sı́mbolo não-
branco repita; se encontrar ⊔, pare e aceite.
Transições principais:
δ(q0 , a) = (qr , ⊔, D) ∀a ̸= ⊔.
δ(qr , b) = (qr , ⊔, D) ∀b ̸= ⊔.
δ(qr , ⊔) = (qacc , ⊔, N ).

(e) SHIFT-L
Descrição: desloca a subcadeia iniciada na posição atual uma posição para a
esquerda. Ex.: se a fita a partir da cabeça é s0 s1 s2 · · · ⊔ · · ·, após SHIFT-L
fica s0 s1 s2 · · · (onde “ ” representa a célula anterior preenchida por aquilo que
havia antes, normalmente ⊔).
Ideia (rotina clássica):
1. Salve o sı́mbolo atual (marcando-o com um marca especial ou movendo-o
para uma área de trabalho).
2. Mova para a célula imediatamente à esquerda, escreva o sı́mbolo salvo
lá, e então vá para a célula da direita (original) e continue copiando
sı́mbolos um a um: ler si , apagar (ou marcar), escrever em posição ante-
rior, avançar.

7
3. Ao encontrar o primeiro ⊔ (final da subcadeia), escreva ⊔ na última
posição remanescente e aceite.
Descrição em estados (esquemática): Estados: q0 (inı́cio), q save (guardar
sı́mbolo e mover esquerda), q copy (copiar em loop), q f inish.
Transições essenciais (esquemático):
δ(q0 , a) = (q save, X, E) (marqueaporXeváesquerda),
δ(q save, b) = (q copy, b, D) (escreveb= sı́mbolosalvo),
δ(q copy, c) = (q copy, X, D) (marcaremovercopiando),
δ(q copy, ⊔) = (q f inish, ⊔, E).

(A implementação completa usa marcas para lembrar sı́mbolo salvo; é longa


mas direta.)

(f ) SHIFT-R
Descrição: desloca a subcadeia iniciada na posição atual uma posição para a
direita.
Ideia: procedimento análogo ao SHIFT-L, porém trabalhando da direita
para a esquerda para evitar sobrescrever dados — primeiro encontre o fim da
subcadeia, copie sı́mbolos para a direita um a um voltando para a esquerda, etc.
Estrutura de estados (esquemática): q0 → q f indEnd → q copyLef tT oRight →
q f inish.
Observação: a rotina tipicamente:
• localiza o fim da subcadeia (primeiro ⊔);
• move-se uma célula à esquerda e começa a copiar sı́mbolos para a direita
(escrevendo em células em branco);
• marca sı́mbolos copiados para evitar duplicação e volta para continuar;
• ao terminar, limpa marcas e aceita.

(g) COPIA
Descrição: copia a subcadeia iniciada na posição atual para a primeira área
em branco à direita (por exemplo, coloca um separador # e escreve a cópia).
Ideia: usar algoritmo de copiar que:
1. Percorre o bloco original da esquerda para a direita, marcando cada sı́mbolo
lido (por exemplo 0 → X, 1 → Y ).
2. Para cada sı́mbolo marcado, move-se até o final (primeiro ⊔) e escreve o
sı́mbolo correspondente, depois retorna ao próximo sı́mbolo não marcado
do bloco original.

8
3. Após terminar, restaura marcas no bloco original ao sı́mbolo original.
Estados esquemáticos: q0 (inı́cio), q mark (marcar e lembrar sı́mbolo),
q write (ir ao fim e escrever), q return (voltar ao próximo).
Transições principais (exemplo para alfabeto {0, 1}):

δ(q0 , 0) = (q mark, X, D), δ(q 0, 1) = (q mark, Y, D).


δ(q mark, a) = (q mark, a, D) (iratéof im).
δ(q mark, ⊔) = (q write, a, E) (escrevesı́mbolosalvoevolta).

(Implementação completa precisa de estados separados para lembrar se o sı́mbolo


era 0 ou 1.)

(h) COPIA-D (cópia delimitada)


Descrição: copia a subcadeia indicada por delimitadores (por exemplo entre
“<” e “¿”) para a área em branco à direita, preservando delimitadores e adicio-
nando a cópia após eles.
Ideia: varrer do delimitador de inı́cio, marcar sı́mbolos até o delimitador de
fim; para cada sı́mbolo marcado, ir ao fim e escrever sua cópia; depois restaurar
marcas; por fim escrever “#”+cópia (ou apenas a cópia, conforme enunciado).
Estados esquemáticos: muito semelhante à subrotina COPIA, mas começa
ao encontrar “<” e termina ao encontrar “¿ ”.

Diagramas compactos (alguns exemplos com tikz)

(a) TESTE-INICIO (diagrama)

[¿=Stealth,shorten ¿=1pt,auto,node distance=2.2cm] [state,initial] (q0) q0 ;


[state] (qL) [right=of q0] qL ; [state,accepting] (qa) [right=of qL] qacc ; [state]
(qr) [below=of qL] qrej ; [-¿] (q0) edge node (a) → (qL , a, E) (qL) (qL)
edge[bend left] node ⊔ → (qacc , ⊔, D) (qa) (qL) edge[bend right] node
(b ̸= ⊔) → (qrej , b, D) (qr);

(b) RESET (diagrama)

[¿=Stealth,shorten ¿=1pt,auto,node distance=2.2cm] [state,initial] (q0) q0 ;


[state] (qL) [right=of q0] qL ; [state] (qr) [right=of qL] qr ; [state,accepting] (qa)
[right=of qr] qacc ; [-¿] (q0) edge node (a) → (qL , a, E) (qL) (qL) edge node
⊔ → (qr , ⊔, D) (qr) (qr) edge node (a) → (qacc , a, N ) (qa);

9
(d) LIMPAR-R (diagrama)

[¿=Stealth,shorten ¿=1pt,auto,node distance=2.2cm] [state,initial] (q0) q0 ;


[state] (qr) [right=of q0] qr ; [state,accepting] (qa) [right=of qr] qacc ; [-¿] (q0)
edge node (a ̸= ⊔) → (qr , ⊔, D) (qr) (qr) edge[bend left] node
(b ̸= ⊔) → (qr , ⊔, D) (qr) (qr) edge node ⊔ → (qacc , ⊔, N ) (qa);

Os outros subdiagramas (SHIFT-L, SHIFT-R, COPIA, COPIA-D) são maiores


mas seguem a mesma ideia:

• marcar sı́mbolo, mover até área de escrita, escrever, e voltar;


• usar estados para lembrar qual sı́mbolo foi marcado (uma cadeia de estados
por sı́mbolo do alfabeto).

Observações finais
• Apresentei cada subrotina com a ideia e as transições essenciais; cada uma
pode ser expandida para o diagrama de estados completo (detalhando um
estado por situação de guardar sı́mbolo X, retornar, restaurar marca, etc.).

• Se quiser, eu posso:
1. gerar o diagrama completo em TikZ para uma subrotina es-
pecı́fica (por exemplo COPIA ou SHIFT-L), com todos os estados
e todas as transições explı́citas; ou
2. fornecer a tabela completa de δ (linha-por-linha) para uma das
subrotinas.

10

Você também pode gostar