Title: Computabilidade e Linguagens Formais
1Computabilidade e Linguagens Formais
Gabriel David / Cristina Ribeiro
2Hello, world
- main()
-
- printf(?hello, world\n?)
-
- Qual a saída deste programa?
3Hello, world de novo
int exp(int i, n) / calcula in / int ans,
j ans 1 for (j1 jltn j) ans
i return(ans)
- main()
-
- int n, total, x, y, z
- scanf(?d?, n)
- total 3
- while(1)
- for (x1 xlttotal-2 x)
- for (y1 ylttotal-x-1 y)
- z total-x-y
- if (exp(x,n) exp(y,n) exp(z,n))
- printf(?hello, world\n?)
-
- total
-
-
- Qual a saída deste programa?
- Para entrada 2? E 3?
- xn yn zn
- Último teorema de Fermat
- Levou 300 anos a provar que é impossível para n?3
4Devem existir problemas indecidíveis
- Problema é decidir se uma cadeia pertence a uma
linguagem - O número de linguagens diferentes sobre um
alfabeto com mais do que um símbolo não é
numerável - Não é possível estabelecer uma correspondência
biunívoca com ? - Os programas são numeráveis
- Cadeias finitas sobre alfabetos finitos
- Ordenar por comprimento e por ordem lexicográfica
- Podem ser contados, embora em número infinito
- Há infinitamente menos programas do que problemas
- Linguagem ao acaso dá provavelmente um problema
indecidível - A maioria dos problemas parecem decidíveis porque
são escolhidos
5Teste do Hello, world
- Hipótese
- Existe um programa H que recebe como entrada um
programa P e uma entrada I e imprime yes se P com
entrada I imprimir hello, world e no no caso
contrário e faz sempre uma coisa ou outra - Um problema que tenha um algoritmo como H é
decidível - Senão é indecidível
- Vamos provar que H não existe
- Seria estranho que um programa resolvesse o
último teorema de Fermat
H
P
yes
I
no
6Prova por contradição
- Simplificação na classe de programas P
- Só programas em C com saída em caracteres e que
só usam printf() - Modificar H
- As modificações não põem em causa a existência de
H - Modificar printf() de forma a que quando devesse
imprimir no, passe a imprimir hello, world - Obtém-se H1
H1
P
yes
I
hello, world
7Prova por contradição
- Interesse em programas que processam programas
- Restringir H1
- Só tem entrada P
- Pergunta o que faz P quando recebe P como entrada
- H2 é modificação de H1
- H2 começa por ler P para um array com malloc()
- H2 simula H1 substituindo leituras de P e de I
por leituras do array - O que faz H2 quando é dado como entrada a ele
próprio?
H2
yes
P
hello, world
H2
yes
H2
hello, world
8H2 não pode existir
- H2, dado P
- Imprime yes se P imprimir hello, world com
entrada P - Imprime hello, world se P, com entrada P, não
imprimir hello, world - Dando H2 a H2
- Se imprimir yes diz que H2 com entrada H2 imprime
hello, world - Mas acaba-se de assumir que H2 com entrada H2
imprime yes - Se imprimir hello, world (tem que ser uma ou
outra das possibilidades) então a saída da caixa
tem que ser yes - Contradição também
- Portanto H2 não pode existir nem H1 nem H
- O problema do hello, world é indecidível
9Redução de problemas
- Outros problemas
- Para testar a indecidibilidade pode-se construir
um programa paradoxal, semelhante a H2 - Alternativa reduzir o problema indecidível ao
novo problema se conseguisse decidir o novo,
também decidia o antigo como o antigo é
indecidível, o novo também é - Questão saber se se consegue reduzir o antigo ao
novo - Nota reduzir o novo ao antigo não resolve porque
daria Decidível(antigo) ? Decidível(novo), mas o
antecedente é falso - Decide
- yes ou no conforme a
- sua entrada instância do
- problema P2 está ou não
- na linguagem do problema
Decide
yes
P1
P2
Constrói
no
10Fase de construção
- A construção tem que reduzir cada instância de P1
(cadeia w) a uma instância de P2 (cadeia x) com a
mesma resposta - Qualquer cadeia no alfabeto de P1 que não
pertence à linguagem de P1 tem que ser convertida
para uma cadeia que não está na linguagem de P2 - Assim, se w está em P1, x está em P2 e Decide diz
yes se w não está em P1, x não está em P2 e
Decide diz no fala verdade sobre w
11Exemplo de redução
- Problema
- Programa Q, com entrada y, chama a função foo?
- Se Q não tiver a função foo é fácil
- P1 é o problema hello, world e P2 é o problema
chama-foo - Dado um programa Q com entrada y construir um
programa R com entrada z que chame foo se e só se
Q com entrada y imprimir hello, world - Construção
- Se Q tiver foo, renomeá-la e a todas as suas
chamadas - Adicionar uma função foo vazia e que não é
chamada - Memorizar no array A os primeiros 12 caracteres
da saída - Sempre que o programa escrever para a saída,
verifica em A se está lá hello, world e, nesse
caso, chama foo - O programa modificado é R a entrada z é igual a
y - Se fosse possível decidir R também seria possível
decidir Q
12Motivação
- Problemas indecidíveis
- Não existe algoritmo
- Problemas intratáveis
- Os algoritmos conhecidos são demasiado
dispendiosos - Simplificação heurísticas
- Necessidade de um modelo simples de computador
para estudar a computabilidade - Máquinas de Turing
- Modelo de computador, mais do que de linguagem
13Contexto
- David Hilbert (início do séc. XX)
- Há alguma maneira de determinar se qualquer
fórmula da lógica de predicados de primeira
ordem, aplicada aos inteiros, é verdadeira? - Kurt Gödel (1931)
- Teorema da incompletude construiu uma fórmula
que não pode ser provada nem refutada - Técnica semelhante ao programa contraditório H2
- Alan Turing (1936)
- Máquina de Turing modelo de qualquer computação
possível - Veio a estar envolvido, durante a 2ª Guerra, no
esforço de construção de máquinas de que
emergiram os computadores - Hipótese de Church (tese de Church-Turing, não
demonstrável) - Todos os modelos gerais de computação são
equivalentes às funções parciais recursivas e às
máquinas de Turing (mesmo os computadores actuais)
14Máquina de Turing
Controlo
B
B
X1
X2
Xi
B
B
Xn
- Controlo finito
- Número finito de estados
- Fita de comprimento infinito dividida em células
- Cada célula pode conter um símbolo (alfabeto
finito) - Entrada
- Cadeia finita constituída por símbolos do
alfabeto de entrada - Colocada na fita no início resto da fita
preenchido com brancos (B) - Símbolos da fita
- Alfabeto de entrada branco possivelmente
outros símbolos
15Máquina de Turing
- Cabeça da fita
- Sempre posicionada numa célula
- No início, está na célula mais à esquerda da
entrada - Movimento ou passo da máquina
- função do estado do controlo e do símbolo a ser
varrido pela cabeça - 1. Mudança de estado
- Pode ser o mesmo
- 2. Escrita de um símbolo na célula onde está a
cabeça - Pode ser o mesmo
- 3. Deslocação da cabeça de uma célula à esquerda
ou à direita - Não restringe sequência de passos com a cabeça
parada seguida de um com movimento pode ser
resumida neste
16Formalização
- Semelhante a autómatos de pilha
- Máquina de Turing (TM) M (Q, ?, ?, ?, q0, B, F)
- Q conjunto finito de estados do controlo
- ? conjunto finito de símbolos de entrada
- ? conjunto finito de símbolos da fita
- ? função de transição ?(q, X) (p,Y,D)
- q é um estado, X um símbolo da fita
- p é o novo estado, em Q
- Y é o símbolo em ? que substitui X
- D é L ou R, esquerda ou direita, direcção em que
a cabeça se move depois da substituição - q0 estado inicial
- B branco, símbolo que preenche a fita, excepto
as células com a entrada - F conjunto de estados de aceitação ou finais
17Computação
- Descrição instantânea
- X1X2Xi-1qXiXi1Xn
- Células desde a primeira à última não brancas (nº
finito) - Mais um prefixo ou sufixo finito com brancas até
à cabeça - O estado (q) e a célula (i) onde a cabeça está
- Passo da máquina de Turing M (MM 0 ou mais
passos) - Supondo ?(q,Xi) (p,Y,L)
- X1X2Xi-1qXiXi1Xn M X1X2Xi-2pXi-1YXi1Xn
- Estado q passa a p célula Xi passa a Y cabeça
anda para a esquerda - Se i1 qX1X2Xn pBYX2Xn
- Se in e YB X1X2Xn-1qXn X1X2Xn-2pXn-1
- Simétrico para ?(q,Xi) (p,Y,R)
18Exemplo 0n1n
- TM para aceitar a linguagem 0n1n n?1
- Ideia
- Fita no início contém 0s e 1s
- Mudar o primeiro 0 para X deslocar para a
direita até ao primeiro 1 e mudá-lo para Y
deslocar para a esquerda até ao primeiro X
deslocar um para a direita recomeçar - Se num estado aparecer algum símbolo não
previsto, a TM morre - Se a entrada não for 01
- Se na iteração em que marca o último 0 também
marca o último 1 então aceita
19Exemplo 0n1n
Estado 0 1 X Y B
q0 (q1,X,R) (q3,Y,R)
q1 (q1,0,R) (q2,Y,L) (q1,Y,R)
q2 (q2,0,L) (q0,X,R) (q2,Y,L)
q3 (q3,Y,R) (q4,B,R)
q4
- M (q0,q1,q2,q3,q4), 0,1, 0,1,X,Y,B, ?, q0,
B, q4) - q0 muda 0 para X
- q1 desloca-se para a direita até ao primeiro 1
que muda para Y - q2 desloca-se para a esquerda até encontrar um X
e volta a q0 - Se tiver um 0 reinicia o ciclo se tiver um Y vai
para a direita se encontrar um branco vai para
q4 e aceita senão morre sem aceitar
20Computações no exemplo
- Entrada 0011
- Descrição instantânea inicial q00011
- q00011 Xq1011 X0q111 Xq20Y1 q2X0Y1
- Xq00Y1 XXq1Y1 XXYq11 XXq2YY Xq2XYY
- XXq0YY XXYq3Y XXYYq3B XXYYBq4B
- aceita
- Entrada 0010
- q00010 Xq1010 X0q110 Xq20Y0 q2X0Y0
- Xq00Y0 XXq1Y0 XXYq10 XXY0q1B
- morre
21Diagramas de transição
- Semelhante a autómato de pilha
- Nós são estados da TM
- Arco do estado q para o estado p com etiquetas
X/YD - ?(q,X) (p,Y,D), X e Y são símbolos da fita e D
é L ou R - Start é estado inicial circunferência dupla,
estados finais B, branco
Y/Y ? 0/0 ?
Y/Y ? 0/0 ?
Start
0/X ?
1/Y ?
q0
q1
q2
X/X ?
Y/Y ?
B/B ?
q3
q4
Y/Y ?
22Exemplo
- Diagrama de transição para uma TM que aceite a
linguagem das cadeias com número igual de 0 e 1.
0/X ?
Y/Y ?
1/1 ? Y/Y ?
Y/Y ? 0/0 ?
Start
1/X ?
q0
q1
q2
1/Y ?
B/B ?
0/Y ?
X/X ?
q3
q4
0/0 ? 1/1 ? Y/Y ?
- q00110 Xq2110 q3XY10 Xq0Y10 XYq010
XYXq10 XYq3XY - XYXq0Y XYXYq0B XYXYBq4B
- q0110 Xq110 X1q10 Xq31Y q3X1Y Xq01Y
XXq1Y XXYq1B
23Linguagem de uma TM
- Cadeia de entrada colocada na fita
- Cabeça no símbolo mais à esquerda
- Se a máquina entrar num estado de aceitação, a
cadeia é aceite - Linguagem da TM M (Q, ?, ?, ?, q0, B, F)
- Conjunto das cadeias w em ? tais que q0w ?p?
e p ? F - Linguagens recursivamente enumeráveis
Linguagens
Linguagens recursivamente enumeráveis
TM
Linguagens sem contexto (CFL)
PDA, CFG
Linguagens regulares (RL)
DFA (NFA, ?-NFA), RE
24Paragem
- Uma TM pára se entrar num estado q a ler um
símbolo X e ?(q,X) não estiver definida - Permite encarar a máquina de Turing como
executando uma computação, com princípio e fim - exemplo calcular a diferença de dois inteiros
q00m10n 0m-nqf - TM que param sempre, aceitem ou não a entrada,
constituem modelos de algoritmos (linguagens
recursivas) - Pode-se assumir que uma TM pára sempre que aceita
- Infelizmente não é sempre possível exigir que uma
TM pare quando não aceita - Indecidibilidade (linguagens recursivamente
enumeráveis) - Possibilidade de uma TM se referir a si própria
(poder para ser indecidível)
25Técnicas de programação de TM
- Uma TM tem o mesmo poder computacional que os
computadores actuais - Memória no estado
- Estado controlo memória de dados
- Ver o estado como um tuplo
- Pistas múltiplas
- Fita composta por várias pistas um símbolo em
cada pista - Alfabeto da fita constituída por tuplos
- Poder das TM permanece inalterado
26Subrotinas
- Uma TM é um conjunto de estados que executa um
processo - Tem uma entrada e estados finais
- Encarada como subrotina de uma TM principal
- Chamada vai para estado principal
- Não existe noção de endereço de retorno
- Se uma subrotina for chamada de vários estados
diferentes, faz-se cópias (macro) para retornar
ao estado que chamou
27Extensões
- TM com várias fitas
- Cada qual tem a sua cabeça
- Entrada só na primeira fita
- Movimento esquerda, direita e estacionário
- Equivalente a uma fita
- Complexidade temporal quadrática
- TM não deterministas
- Função de transição dá conjunto de tuplos (q,Y,D)
- Equivalente a determinista
- Codificar na fita uma fila com as descrições
instantâneas a processar - Simular o não determinista percorrendo-as em
largura
28Restrições
- TM com fitas semi-infinitas
- Máquinas com várias pilhas
- Máquinas com contadores
- Comparação com computadores