Profª. Jussara Maria Marins
Capítulo 1
INSTITUTO PRESBITERIANO MACKENZIE Professora Jussara Maria Marins
Teoria da Computação Capítulo 1 Fundamentos 1.
Fundamentos ............................ .......................................... ............................ ............................ ............................ ............................ ............................ ........................... ........................... ................. ... 2 1.1. Lógica Lógica e Linguagem...... Linguagem........... ......... ......... .......... ......... ......... ......... ......... .......... ......... ......... ......... ......... ......... ......... .......... ......... ......... ......... ......... .......... ......... ........ ........ ......... ........ ... 2 1.2. Conjuntos....................... Conjuntos..................................... ............................ ............................ ............................ ............................ ............................ ............................ ............................ ................... ..... 5 1.3. Relações e Funções...................... Funções................................... ........................... ............................ ............................ ........................... ........................... ........................... ..................... ........ 7 1.4. Tipos Especiais Especiais de Relações Relações Binárias.. Binárias...... ........ ........ ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... .... 10 1.5. Operações Operações sobre Funções Funções ........ ............. ......... ......... .......... ......... ......... .......... ......... ......... .......... ......... ......... .......... ......... ......... .......... ......... ......... .......... ......... ........ ......... ........ ... 12 1.6. Cardinalid Cardinalidade ade de Conjuntos.. Conjuntos...... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ........ ......... .......... ..... 13 1.7. Fechos............................. Fechos........................................... ............................ ............................ ............................ ............................ ............................ ........................... ........................... ................. ... 15 1.8. Técnicas Técnicas Fundament Fundamentais ais de Provas Provas..... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ......... ...... 15
Os objetivos gerais deste capítulo são: • Mostrar que a ciência da computação é uma ciência interdisciplinar, que é muito nova (50 anos), mas possui fundamentos sólidos muito antigos (2500 anos) baseados na lógica e matemática. Estabelecer o conceito destas duas últimas ciências também também não é simples. simples. • Fornecer subsídios para o aluno verificar que o lugar comum nem sempre é lógico, ou que o que é mais simples, nem sempre é o mais formal , que uma noção básica 1nem sempre é intuitiva e certos conceitos que estão internalizados precisam ser bem definidos para que novos conceitos sejam bem compreendidos. Os objetivos específicos deste capítulo são:
• • •
Revisar noções básicas, os axiomas da Lógica, bem como as propriedades das operações lógicas. Usar a Teoria de Conjuntos de modo mais simbólico e consequentemente desenvolvendo o formalismo necessário necessário à teoria da computação. Provar teoremas distinguindo as suas técnicas fundamentais.
1
Por exemplo : definir o que é uma palavra ou o que é um número Cp1Fundamentos 17/08/03
1
Profª. Jussara Maria Marins
Capítulo 1
1. Fundamentos
1.1. Lógica e Linguagem 1. O que é computação? Para caracterizar um determinado objeto podemos descrevê-lo usando outros objetos que o constituem, usando aproximações expondo o que faz faz parte do novo objeto e o que não faz parte do objeto. Isto é, pelo método aristotélico do contraste do que é e do que não é o novo objeto. Faremos isto com computação.
•
Computação não é uma ciência da natureza. Não estudamos computação do mesmo modo que Física, Química ou Biologia, pela observação dos fenômenos correspondentes, correspondentes, experimentação em situações controladas, comparação entre entre resultados, formulação de modelos modelos e teorias e novos experimentos experimentos controlados controlados para analisar e validar os resultados resultados obtidos. • Computação não é só uma ciência teórica. Embora usemos muito a matemática, não basta definirmos entes computacionais, provar a correção de fórmulas que modelam algoritmos, etc, pois precisamos na prática do modelo e/ou instrumento computador para fazer computação. Lembremos a Matemática e a Lógica não são ciências empíricas. Mas computação também possui disciplinas teóricas, isto é, que não dependem do modelo usado para computar. • Computação não é só uma arte. As vezes, o que se opõe às ciências teóricas ou empíricas pode ser comparado com Arte. Computação não é arte, contudo, é preciso criatividade, arte e engenhosidade para criar e aperfeiçoar os diversos algoritmos, usando técnicas técnicas já conhecidas conhecidas ou criando outras. • Computação não é só tecnologia. Inúmeros avanços da física, da eletrônica, da ótica, etc contribuem de forma decisiva na computação e até mesmo determinam novos campos de estudo, mas isto faz parte da Engenharia em si, que depois á aplicada aos modelos físicos computacionais. • É a ciência do que é computável2. É o conjunto conhecimentos matemáticos, lógicos, estatísticos, lingüísticos, tecnológicos, eletrônicos etc, organizados do modo que possamos resolver os problemas diversos desde a elaboração ou utilização de uma teoria até ao desenvolvimento e implantação da solução por meio de algoritmos que possam ser traduzidos em programas num computador. Como ciência autônoma é ainda muito nova em termos do conhecimento humano. Tudo o que veremos nesta e em outras disciplinas como: Matemática Discreta, Linguagens Formais, Autômatos e Grafos fazem fazem parte do arcabouço da Teoria da Ciência da Computação. Computação. Exercícios: 1. Procure uma conceituação conceituação melhor do que dado acima acima para computação, relacione suas disciplinas disciplinas descrevendo objetivamente seu escopo. Faça um contraste com Matemática ou Física. 2. Procure também um bom conceito de algoritmo. 3. Idem para as características de "bom" algoritmo. 4. O que é "boa qualidade" de um algoritmo? 5. Quais as relações entre um algoritmo e um programa? 2. Porque fundamentos matemáticos para computação?
•
A matemática fornece fundamentos para formalização dos algoritmos numa linguagem simbólica e objetiva. Um algoritmo é facilmente descrito como uma função que recebe dados de Entrada, os transforma e produz uma saída. Entrada → Algoritmo → Saída f: E→S 2
Parece que "choveu no molhado". Cp1Fundamentos
17/08/03
2
Profª. Jussara Maria Marins
Capítulo 1
1. Fundamentos
1.1. Lógica e Linguagem 1. O que é computação? Para caracterizar um determinado objeto podemos descrevê-lo usando outros objetos que o constituem, usando aproximações expondo o que faz faz parte do novo objeto e o que não faz parte do objeto. Isto é, pelo método aristotélico do contraste do que é e do que não é o novo objeto. Faremos isto com computação.
•
Computação não é uma ciência da natureza. Não estudamos computação do mesmo modo que Física, Química ou Biologia, pela observação dos fenômenos correspondentes, correspondentes, experimentação em situações controladas, comparação entre entre resultados, formulação de modelos modelos e teorias e novos experimentos experimentos controlados controlados para analisar e validar os resultados resultados obtidos. • Computação não é só uma ciência teórica. Embora usemos muito a matemática, não basta definirmos entes computacionais, provar a correção de fórmulas que modelam algoritmos, etc, pois precisamos na prática do modelo e/ou instrumento computador para fazer computação. Lembremos a Matemática e a Lógica não são ciências empíricas. Mas computação também possui disciplinas teóricas, isto é, que não dependem do modelo usado para computar. • Computação não é só uma arte. As vezes, o que se opõe às ciências teóricas ou empíricas pode ser comparado com Arte. Computação não é arte, contudo, é preciso criatividade, arte e engenhosidade para criar e aperfeiçoar os diversos algoritmos, usando técnicas técnicas já conhecidas conhecidas ou criando outras. • Computação não é só tecnologia. Inúmeros avanços da física, da eletrônica, da ótica, etc contribuem de forma decisiva na computação e até mesmo determinam novos campos de estudo, mas isto faz parte da Engenharia em si, que depois á aplicada aos modelos físicos computacionais. • É a ciência do que é computável2. É o conjunto conhecimentos matemáticos, lógicos, estatísticos, lingüísticos, tecnológicos, eletrônicos etc, organizados do modo que possamos resolver os problemas diversos desde a elaboração ou utilização de uma teoria até ao desenvolvimento e implantação da solução por meio de algoritmos que possam ser traduzidos em programas num computador. Como ciência autônoma é ainda muito nova em termos do conhecimento humano. Tudo o que veremos nesta e em outras disciplinas como: Matemática Discreta, Linguagens Formais, Autômatos e Grafos fazem fazem parte do arcabouço da Teoria da Ciência da Computação. Computação. Exercícios: 1. Procure uma conceituação conceituação melhor do que dado acima acima para computação, relacione suas disciplinas disciplinas descrevendo objetivamente seu escopo. Faça um contraste com Matemática ou Física. 2. Procure também um bom conceito de algoritmo. 3. Idem para as características de "bom" algoritmo. 4. O que é "boa qualidade" de um algoritmo? 5. Quais as relações entre um algoritmo e um programa? 2. Porque fundamentos matemáticos para computação?
•
A matemática fornece fundamentos para formalização dos algoritmos numa linguagem simbólica e objetiva. Um algoritmo é facilmente descrito como uma função que recebe dados de Entrada, os transforma e produz uma saída. Entrada → Algoritmo → Saída f: E→S 2
Parece que "choveu no molhado". Cp1Fundamentos
17/08/03
2
Profª. Jussara Maria Marins
Capítulo 1
x→y = f(x)
•
Matemática é uma ciência abstrata e usa: - noções básicas - axiomas - definições - símbolos próprios ou diríamos uma linguagem própria e global 3 - teoremas Além disso, a matemática usa a Lógica como uma ferramenta de trabalho, uma vez que todos seus axiomas também são válidos para a Matemática. Vale lembrar que a matemática é fundamental para outras disciplinas, como Física, Química e outras por motivos mais ou menos semelhantes. A Matemática é uma linguagem suficientemente4 geral e abstrata que pode ser adaptada a diversos contextos. Creio que somente a música é uma linguagem mais ampla do que a Matemática. Alias a inter-relação entra as duas é histórica. A questão seguinte, embora muito relacionada com a matemática, não faz parte desta. As disciplinas da matemáticas são Cálculo Diferencial e Integral, Álgebra, Álgebra Linear, Geometria, Topologia, Análise, Teoria dos números, etc. De fato, a Lógica faz parte da Filosofia, porque sistematiza o modo de analisarmos os pensamentos que se colocam em proposições. Há pensamentos, é claro, que não são passíveis de serem colocados em proposições, e daí entramos no terreno dos sentimentos, das artes, etc. Aí, também alguns vêem uma certa lógica. É preciso, não confundir bom senso, senso comum, normalidade( no sentido estatístico) com lógica. 3. Mas, o que é a Lógica, afinal? A Lógica trata das inferências válidas, ou seja, das inferências cujas conclusões têm que ser verdadeiras, caso as premissas o sejam. É o estudo da veracidade das proposições compostas. A chamada Lógica Simbólica inclui a mesma lógica descrita em termos de inferências e usando simbolismos matemáticos estuda o cálculo dos predicados clássicos de primeira ordem e suas extensões. Uma proposição é uma afirmação cujo valor verdade (Verdadeiro ou Falso) pode ser determinado sem ambigüidade. Uma proposição pode ser simples ou composta. composta. Uma pergunta: Fabrício é Corintiano? não é uma proposição, assim como também uma exclamação: Deus me livre! não é uma proposição. Para que uma sentença como "Sandra é uma aluna do Mackenzie" seja uma proposição necessitamos saber de qual Sandra se trata e qual o período. Já a sentença "O quadro Banhistas de Renoir é bonito" e emite um juízo de gosto e que não tem o caráter de proposição. Finalmente a sentença: "O número 25 é o quadrado do número 5" é uma proposição cujo valor é Verdadeiro; enquanto que a sentença: "O número 9 é múltiplo de 2" é uma proposição falsa. O valor verdade da composição ou de operações sobre as proposições é estudado na Lógica. As noções básicas de lógica são dadas pelo predicado de igualdade, os valores lógicos Verdade ou falso e as sentenças que exprimem afirmações ou proposições, assim como os quantificadores universal ∀:para todos ou todo; existencial existencial :∃: existe pelo menos um, alguns, algum ou existe um. Um axioma ou postulado (ou ainda um dogma) é uma proposição aceita como verdade, incondicionalmente, ou sem a necessidade de uma prova. Também pode ser chamado de Princípio. Na realidade, não haveria como prová-la mas há total aceitação de sua veracidade. - Princípios (axiomas) da Lógica Clássica 5: Princípio da Contradição: Contradição: A seguinte expressão é sempre uma contradição ( sempre falsa) (p ∧ ¬p)
Princípio do Terceiro Excluído: Excluído: uma proposição só admite o valor V ou o valor F, excluindo-se um terceiro valor. A afirmação seguinte é uma tautologia( sempre verdade).
p ∨ ¬p
3
Muitos falam em caráter universal da matemática, matemática, o que é muito muito compreensível. Mas Mas usamos o seu significado global, sem nenhuma conotação com a dita "globalização" ou geleia geral da mídia atual. 4 Em termos de epsilons e deltas. 5 Há outros tipos de Lógicas: a Paraconsistente; Paraconsistente; Paracompleta; Intucionista; Polivalente; Fuzzy, e outras. Cp1Fundamentos 17/08/03
3
Profª. Jussara Maria Marins
-
Capítulo 1
Princípio da Dupla Negação: A negação da negação de uma proposição implica em sua afirmação:
¬¬p ↔ p Cálculo proposicional: Estudo da veracidade das proposições compostas com Tabelas Verdade. • p,q são proposições simples • operações com proposições: p∧q, p∨q, p→q, p↔q • O cálculo das Proposições é completo. Isto quer dizer que, existe um mecanismo de determinar se uma proposição composta qualquer é sempre verdadeira :Tautologia, ou se é sempre falsa: Contradição ou ainda é uma Contigência: nem sempre verdade, nem sempre falsa, dependendo dos valores iniciais das proposições constituintes. Para isso basta fazer a tabela-verdade, o que pode ser feito finita e mecanicamente. Cálculo dos Predicados: Estudo da veracidade das proposições com predicados a) Predicados: proposições com variáveis; "x é par" que quer dizer: "os pares..." ou "o número que é par" • Notação: P(x): x é par. • P1(x): x é primo • P2(x): x é verde Se x∈{2,56,68,98,4} então P1(x) é Verdadeiro. Se x∈{2,56,17} então P2(x) é falso. b) Proposições Quantificadas • 1) (∀n∈ N)(∃x∈ N)[x+n = x = n+x] • Isto significa: Todo número natural admite um neutro aditivo. Para todos naturais x , existe um número natural n tal que , x somado a n resulta no próprio x. Mais claramente, para x=3, existe o n=0 tal que 3+n=3+0=3; para x=7 , existe n=0, tal que 7+n=7+0=7 , isto é, tanto para o 3 como para o 7, ou ainda para qualquer outro natural, o neutro é um só, o número zero. • 2) (∃x∈Z) (∀x'∈ Z) [x+x' = x'+x = n] O significado agora, é diferente, existe um oposto (aditivo) para cada número inteiro. Para x=5, existe o oposto aditivo que é o -5, e 5 + (-5)=0; para x=-8, existe um outro oposto aditivo que é o x'= 8, tal que x+x'= (-8) +8=0. Podemos fazer operações entre predicados, proposições quantificadas e proposições simples, e então temos o Cálculo de Predicados, que pode ser de primeira ou segunda ordem. Estudamos os de primeira ordem que constituem os exemplos vistos e todos aquelas proposições onde as variáveis aparecem sempre ligadas a um domínio, ou seja, não possuem variáveis livres. Exercícios: 1. Quais as foram as definições, axiomas, propriedades que já foram vistas em lógica. 2. Qual o significado e valor lógico das seguintes sentenças? a) (∃ f sobre N)[ f(0)=1 e ( ∀x∈ N)[x > 0 →f(x)=f(x)+1] ]. b) (∃ f sobre N)[ f(0)=1 e ( ∀x∈ N)[x>0 →f(x)=x f(x-1)] ]. c) (∃ F sobre Σ*) [F(β)=β e (∀ w ∈Σ*) [x ≠ β → F( tail(x) )*head(x)] ] se w∈Σ* tail(w) indica o fim da palavra e head(x) indica o início da palavra. O Cálculo de Predicados de Primeira Ordem não é completo. Tal problema foi abordado por Hilbert em 1900. Só foi resolvido negativamente por Gödel em 1931. Voltaremos a este assunto. 4. E o que é Linguagem? Sabemos que não podemos passar diretamente um modo de realizar uma tarefa a um computador sem passarmos antes por uma linguagem que possa ser traduzida em instruções e comandos realizáveis na máquinas computador. O mesmo acontece com música? Os conceitos de linguagem que usaremos são mais restritos do que as linguagens naturais, isto é, a utilizadas por nós. Existem estudos sobre as linguagens naturais para que possamos modela-las em termos computacionais mas isto é outro assunto. Cp1Fundamentos
17/08/03
4
Profª. Jussara Maria Marins
Capítulo 1
Leia os seguintes conceitos básicos no livro texto 1:Teoria da Computação do Paulo e do Tiarajú, nas páginas 5,6 e 7. • Linguagem • Alfabeto • Palavra • Comprimento de uma palavra • Subpalavra: prefixo e sufixo • Linguagem Formal • Concatenação de palavras • Concatenação sucessivas de palavras
1.2. Conjuntos Vale citar o que Paul Halmos fala sobre Teoria do Conjuntos em seu Livro "Naïve Set Theory .. leia-a, absorva-a e esqueça-a. "6 Noções básicas ou Primitivas Elementos e conjuntos são noções primitivas Notação: I) Letras e Chaves • Usualmente letras latinas maiúsculas para conjuntos; letras cursivas para conjuntos de conjuntos e letras minúsculas para elementos. • Isto não é obrigatório! Exemplos: Seja A o conjunto das letras vogais minúsculas. • A={a,e,i,o,u} • Seja B o conjunto dos divisores de 24 • B={1,2,3,4,6,12,24} Seja C conjunto dos subconjuntos de A
•
II) Diagramas de Venn B
A A. b. g. A={ A, b,g}
•
1. 67
3
C
D
9 45 2
B={1,3,9,45,67}
3 5 6 8
C={2,3,5,6,8}
9 12
D={ 5,6,8,9,12}
Relação Básica ou Primitiva Pertinência: e ∈A={a,e,i,o,u}, , pois e é um elemento de X; • X={a,e} X ∈ C ; um conjunto pode ser elemento de outro conjunto. • i ∉ Y={a,u} pois i não é um elemento de Y.
Axiomas: 1. Axioma da Extensão: Dois conjuntos são iguais se e somente se têm os mesmos elementos. 2. Axioma da Especificação: A todo conjunto A e a toda condição S(x) corresponde um conjunto B cujos elementos são exatamente aqueles x de A para os quais S(x) vale. Exemplos: a) S(x) é a sentença: x é casado. U={Marcos, Paulo, João, Ricardo, Artur, André} 6
Não vale fazer só a primeira e última parte. Cp1Fundamentos
17/08/03
5
Profª. Jussara Maria Marins
Capítulo 1
C={x ∈ U | x é casado} C={Paulo, João, Artur} b) P(x) é a sentença: x é par. D={ x ∈ N| P(x)} D={2,4,6,8,10,12,...} 3. Axioma da Escolha: será visto depois Diferença entre Definição e Conceito Definição: Dizer O QUE É um objeto ou ente , de modo formal, ou por fórmulas, de forma objetiva, completa, sucinta e sem ambigüidades. Isto significa que na descrição da definição devemos usar noções primitivas, outras definições anteriores, outros resultados já estabelecidos , sem criar circularidades. Conceito: Dizer o que é um ente 7, explicação ou descrição de uma coisa, síntese, pensamento, etc. A definição é semelhante e também se contrapõe ao conceito, onde se diz O que é, mas de forma coloquial, intuitiva ou mesmo pessoal. Relações de Inclusão: X ⊆ A; X ⊂ B, A ⊇ X, B ⊃ A Definição 1: Inclusão: estar contido Sejam A e B conjuntos A,B ∈ U, conjunto Universo ou referência. A ⊆ B ⇔ ( ∀ x ∈ U) [ x ∈ A ⇒ x ∈B] Definição 2: ⊇ Contém Seja A e B dois conjuntos B⊇A ⇔ A⊆ B
Θ
Θ
Para os seguintes teoremas temos que U indica o conjunto Universo ou referencial Teorema 1: ( ∀ A ∈ U ) [∅ ⊆ A]
Teorema 2: ( ∀ A ∈ U) [A ⊆ A]
Definição 3: Igualdade de conjunto ( ∀ A, B ∈ U) [A=B ⇔ A ⊆ B e B ⊆ A] Observe bem esta definição! Há alguma coisa de errada com ela? Ou ainda, tem algo demais? Ela pode ser omitida? Operações entre conjuntos: Na expressão x|x queremos dizer ∀x∈U|x... ( ∀ A, B, C ∈ U) Definição 4: União 7
Ente é um conceito da filosofia que designa uma coisa, ser ou substância. Para nós é melhor falarmos de objeto. Cp1Fundamentos 17/08/03
6
Profª. Jussara Maria Marins A Υ B = {x | x
Capítulo 1
∈ A ∨ x ∈ B}
Definição 5: Intersecção A Ι B = {x | x ∈ A ∧ x ∈ B} Definição 6: Diferença A-B = {x | x ∈ A e x ∉ B}
Θ Θ
Teorema 3: 3: Dados A,B,C ∈ U, temos as seguintes propriedades: propriedades: Idempotência: A Υ A = A AΙ A = A Comutativa: A Υ B = B Υ A AΙ B = BΙ A Associativa : (A Υ B) Υ C = A Υ (B Υ C) (A Ι B) Ι C = A Ι (B Ι C) Distributiva: A Υ (B Ι C) = (A Υ B) Ι (A Υ C) A Ι (B Υ C) = (A Ι B) Υ (A Ι C) Absorção: A Ι ( A Υ B) = A A Υ (A Ι B) = A Leis de De Morgan: A - (B Υ C) = (A - B) Ι (A - C) A - (B Ι C) = (A - B) Υ (A - C)
1.3. Relações e Funções Noção básica: par ordenado (a,b) = {a,{a,b}} (a,b)≠(a,b) ou seja, no primeiro par, o 1º componente é o a 2º componente é o b. Axioma da Escolha: Para todo conjunto não vazio E, existe uma função ϕ: ℘(E)* →E , tal que ϕ(X) ∈ X, para todo X ∈℘(E)*. Em outras palavras, o axioma nos garante que podemos sempre fixar , ou escolhermos um elemento em cada parte não vazia de X. Em algumas situações é necessário garantirmos tal existência. Sendo assim podemos trabalhar com a operação seguinte que é a do Produto Cartesiano. Definição 7 - Produto Cartesiano (∀A,B∈U) [A x B = {(a,b) | a∈A ∧ b∈B} Assim pelo axioma da escolha o produto cartesiano de dois conjuntos não vazios é não vazio também.
Θ
Definição 8 - Relação Binária: Relação Binária: entre 2 conjuntos A e B é qualquer subconjunto do produto cartesiano de A e B. Exemplos: Cp1Fundamentos
Θ
17/08/03
7
Profª. Jussara Maria Marins
Capítulo 1
a) A={a, m, k} e B={ 4,7} A x B ={(a,4),(a,7),(m,4),(m,7), ={(a,4),(a,7),(m,4),(m,7),(k,4),(k,7)} (k,4),(k,7)} b) A={3,7} e B= ∅ então A x B = ∅. c) Se A=∅ ou B=∅ então A x B = ∅ Podemos ter o produto cartesiano entre entre mais de 2 conjuntos, formando formando um conjunto de ternas: AxBxC={(a,b,c)| AxBxC={(a,b,c)| a∈ A, b ∈ B, c ∈ C} Como há mais de 2 conjuntos, precisamos estabelecer se queremos ternas ou o produto cartesiano feito dois a dois conjuntos e aí podemos associá-los diferentemente. Assim: (AxB)xC ≠ Ax(BxC) pois se C={x,y} C={x,y} então: então: (AxB)xC= ={(a,4),(a,7),(m,4),(m,7), ={(a,4),(a,7),(m,4),(m,7),(k,4),(k,7)}xC= (k,4),(k,7)}xC={((a,4),x),( {((a,4),x),((a,7),x),((m (a,7),x),((m,4),x),((m,7),x ,4),x),((m,7),x),((k,4),x),(( ),((k,4),x),((k,7),x),((a,4),y k,7),x),((a,4),y), ), ((a,7),y),((m,4),y),((m, ((a,7),y),((m,4),y),((m,7),y),((k,4),y), 7),y),((k,4),y),((k,7),y)} ((k,7),y)} que é diferente de Ax(BxC) pois faremos primeiro primeiro os pares de BxC e depois os pares com A . Assim podemos falar em: duplas : aRb (a,b)∈ AxB ternas : aRbRc (a,b,c)∈AxBxC Podemos generalizar a definição de relação binária binária para uma relação n-ária, e daí temos n-upla : a1Ra2R... Ra n (a1,a2,...an)∈A1xA2x...xA n Definição 9 - Função Função de A em B é uma relação binária R ∈ AxB tal que (∀a∈A)(∃!b∈B)| (a,b) ∈R).
Θ
Isto significa que cada elemento de A está em correspondência com um só elemento de B. Exemplos: C: conjunto das cidades do Brasil E: conjunto dos estados do Brasil Sejam R1 ⊆ C x E e R2 ⊆ C x E a)
R1: {(x,y)| x∈C, y∈E ∧ x é uma cidade do estado y}
b)
R2: {(x,y) | x∈E, y∈C ∧ y é uma cidade do estado x}
R1 é uma função e R2 não é. Notação f: A→B x α y=f(x) A é o domínio e B é o Contra Domínio - (Range) y é a imagem de x A'⊂ A e f[A']= {f(a) | a∈A'}={b| b=f(a) ∧ a∈A'} Um ponto a salientar é que muitas vezes precisamos de uma generalização do conceito de função. Esta Parcial, ou seja, uma relação onde um elemento do domínio pode não generalização é a chamada Função Parcial, estar relacionado com alguém do contra-domínio, mas mantém a característica de estar relacionado a um só elemento do contra-domínio. Ainda dizemos que função parcial é uma função que não esgota o domínio. A função que esgota o domínio, ou seja está definida para todo domínio é chamada de Função Total. Total. Só quando for necessário usaremos a função parcial. O comuml é usarmos a função total ou apenas função. Cp1Fundamentos
17/08/03
8
Profª. Jussara Maria Marins
Capítulo 1
Exemplos de funções : a) A= B= R conjunto dos reais. f: A→B x α y=f(x)=x 2 b) f: A →B x α y=f(x)=x 3 + c) f: R →R x α y=f(x)=sqrt(x ) onde R + é o conjunto dos reais positivos. d) Faça o gráfico dessas funções e um diagram com alguns de seus elementos. Propriedades de funções Definição 10 -Tipos de funções Dado f: A→B a) f é injetora ⇔ (∀a, a'∈A) [a ≠ a' → f(a)≠f(a')) b) f é sobrejetora ⇔ (∀ b∈B) (∃a∈A) [b=f(a)] c) f é bijetora ⇔ f é injetora e sobrejetora
Θ
Exemplos: Seja f: N → N a) f(n)=n+1 f é injetora mas não é sobrejetora b) f(n) = n/2 se n é par e (n-1)/2 se n é ímpar. Esta função f é sobrejetora mas não é injetora. c) f : R → R ( R ( conjunto dos reais) f(x) = 2x+3 Neste caso f é sobrejetora e injetora. Logo é bijetora. Exercícios: 1. Verifique quais das seguintes relações são funções: a) f: R →R x α y=f(x)=3+x 3 b) f: R →R x α y=f(x)=sqrt( |x | )+5 c) f: R →R x α y=f(x)=ln x + x 2 d) f: R →R x α y=f(x)=( x 2 -3 x -6) / (x+3) e) f: R →R x α y=f(x)=( x 2 -5 x -6) / (x+3) 2. Modifique o domínio para que as relações sejam funções, caso já não o sejam 3. Quais delas são injetoras, sobrejetoras e bijetoras 4. Programe estas funções e a do exemplo b anterior em C. Como modificar o domínio da função em C? Mude as declarações das variáveis para int, byte; float e double. Quais os limites? Definição 11 11:: Relação Inversa. Uma relação binária R ⊆ A x B tem uma inversa R -1 ⊆ B x A que é definida por (b,a) ∈ R -1 se e somente se (a,b) ∈ R.
Θ
Teorema 4 : Uma função f é inversível se e somente somente se f é bijetora. Cp1Fundamentos
17/08/03
9
Profª. Jussara Maria Marins
Capítulo 1
Definição 12: Isomorfismo Um isomorfismo entre dois conjuntos A e B é dado por qualquer função bijetora.
Θ
1.4. Tipos Especiais de Relações Binárias Depois das definicoes temos sempre a parte da classificação dos diferentes tipos definidos. Veremos os tipos e as representações gráficas a seguir.
•
Representação gráfica • Diagramas • Grafos
1) Exemplo: A = { 1,2,3,4} R ⊆ AxA Grafo de R xRy ⇔ x≤y 2) Diagrama de R
1
1
2
2
3
3
4
4
1 2 3 Grafo: G = (V,A) V: conjunto de vértices ou nós A: conjunto de arestas ou ligações entre nós
4
Exemplo 1: V= {1,2,3,4}
A= {(1,1), (1,2), (1,3), (1,4), (2,2), (2,3), (2,4), (3,3), (3,4), (4,4)}
Fazer a figura do grafo V com as arestas dadas em A . Exemplo 2: V= {a,b,c,d}
A= {(a,b), (b,a), (a,d), (d,c), (c,c), (c,a)}
Fazer a figura do grafo V com as arestas dadas em A . Propriedades das Relações Ou seja, os tipos especiais de relações que temos. Seja A um conjunto e R ⊆AxA Definição 13: Relação Reflexiva R é reflexiva ⇔ (∀a∈A) [aRa] ou (a,a)∈R → a∈A Definição 14: Relação Simétrica Cp1Fundamentos
Θ 17/08/03
10
Profª. Jussara Maria Marins R é simétrica ⇔ (∀a,b∈A) [(a,b)∈R → (b,a) ∈R]
Capítulo 1
Θ
Definição 15: Relação Transitiva R é transitiva ⇔ (∀a,b,c∈A) [(a,b)∈R ∧ (b,c)∈R → (a,c)∈R]
Θ
Definição 16 : Relação Anti-Simétrica R é anti-simétrica ⇔ (∀a,b∈A)[(a,b) ∈R ∧ a≠ b → (b,a)∉R] ou (∀a,b∈A) [(a,b)∈R ∧ (b,a)∈R →a=b Exemplos: a) xRy ⇔ x é amigo de y R não é reflexiva não é transitiva é simétrica
Θ
b) xRy ⇔ x é anterior a y R não é reflexiva não é simétrica é transitiva Definição 17: Relação de Equivalência Uma relação R que é reflexiva, simétrica e transitiva é dita uma Relação de Equivalência. Notação: [a] = {b| (a,b) ∈R}
Θ
Exemplo : Q’: conjunto das diferentes representações das frações próprias. R = Q’ x Q’ [1/2] = {1/2, 2/4, 3/6, 4/8, ...} [2/3] = { 2/3, 4/6, 6/9, 8/12, ...} R é reflexiva - simétrica transitiva Definição 18: Relação de Ordem Parcial Uma relação R que é reflexiva, anti-simétrica e transitiva é dita uma Relação de Ordem Parcial Exemplo: a) R ⊆ NxN xRy⇔x≤y b) R ⊆ P(A) xRy⇔x≤y
Θ
Definição 19: Relação de Ordem Total Uma relação R que é de Ordem Parcial em A e: (∀a,b∈A) [(a,b)∈R ou (b,a)∈R ] é dita Relação de Ordem Total
Θ
Definição 20: Partição de A Dado um conjunto A e um conjunto U de subconjuntos de A é dito uma Partição de A se valem as seguintes condições: (i) (∀X,Y∈U) [X∩Y = 0] (ii) (∀a∈A) (∃X∈U) [a∈X] (iii) φ∈U
Θ
Cp1Fundamentos
17/08/03
11
Profª. Jussara Maria Marins
Capítulo 1
Teorema 5: Seja R uma relação de equivalência num conjunto A, então as classes de equivalência de R constituem uma partição de A.
Definição 21: Cadeia ou caminho Uma cadeia numa relação binária R é uma seqüência (a 1, a2,...,a n) para algum n i =1, ...,n-1
≥ 1 tal que (ai, a i-1) ∈ R para
Θ
Definição 22: Ciclo O caminho é chamado de circuito se se todos elementos são distintos e ainda ( n a, a1) ∈R. Obsevação: Um ciclo é trivial se n=1
Θ
Teorema 6: Uma relação é de ordem parcial se e somente se R é reflexiva, transitiva e não tem ciclos triviais.
Definição 23: Elemento minimal Se R é uma relação de ordem parcial, então um elemento minimal de R é um elemento a tal que (b,a) ∈ R se e somente se b=a.
Θ
Exemplos: a) (Z,≤) é ordem parcial não tem elemento minimal. b) (N, ≤) é ordem parcial. O zero (0) é elemento minimal. c) X={{a},{b,c,d},{a,d}{b,d},{c,d},{c},{a,b,c}} e X ∈℘({a,b,c,d} e a relação de inclusão os elementos {a} e {c} são minimais de X. Há outros?
1.5. Operações sobre Funções Definição 24: Função Composta Seja f uma função de um conjunto E num conjunto F e seja g uma função de F num conjunto G; chama-se composta de g e f à função h, de E em G, definida por h(x) = g(f(x)), para todo x em E. Indicaremos esta função h por g º f (leia-se: g composta com f ou g círculo f); portanto, g º f (x) = g(f(x)) para todo x em E. Representa-se também a composta g º f pelo diagrama f
E
Θ
F
g•f
g G
A composta de g e f só está definida quando o contra - domínio de f é igual ao domínio de g. Em particular se f e g são funções de E em E, então, as compostas g º f e f º g estão definidas e são aplicações de E em E. Exemplo - Consideremos as funções f e g, de R em R , definidas por f(x)=2x e g(x)=x 2 para todo x em R . Neste caso estão definidas as compostas g º f e f º g e temos (g º f)(x)=g(f(x))=g(2x)=(2x)2 =4x2 Cp1Fundamentos
17/08/03
12
Profª. Jussara Maria Marins
Capítulo 1
(f º g)(x)=f(g(x))=f(x2 )=2x2 logo, f º g ≠ g º f. Teorema 7 - Quaisquer que sejam as aplicações f g h E→ F, F → G e G → H Tem-se (propriedade associativa) (h º g) º f = h º (g º f).
Teorema 8 - Se as aplicações f: E → F e g: F → G são sobrejetoras, então a composta g º f também é sobrejetora.
Teorema 9 - Se as aplicações f: E → F e g: F → G são injetoras, então a composta g º f também é injetora.
1.6. Cardinalidade de Conjuntos Seja A um conjunto finito então seu tamanho é dado pelo número de seus elementos. Notação: |A| ou # (A) Exemplo: A={a,b,c,d,e} |A| = 5, |∅| = 0, |{a,{b}}| = 2 Teorema 10 : Se A e B são finitos e se A ⊆ B então |A| ≤ |B| A ⊂ B então |A| < |B|
O teorema acima é válido para conjuntos infinitos? Veja o que você acha, nestes casos: A = M(17) = {0,17,34,51,68,..., } B = {0,1,4,9,16,25,36,... } C= {0,2,4,6,8,10,12,... } = M(2) D = {0,6,12,18,24,30,... } = M(6) M(2) ⊆ M(6) |C| < |D| ? Definição 25: Conjuntos Equipotentes Dizemos que 2 conjuntos A e B são equipotentes (equinumerous) se existe uma bijeção f: A → B
Θ
Exemplo 1) A= {8,2,{∅,b}} B= {x,y,z} ∅(8) = x ∅(2) = y ∅({∅,b})) = z Cp1Fundamentos
17/08/03
13
Profª. Jussara Maria Marins
Capítulo 1
2) A= M(17) = {0,17,34,51,...} B = {0,1,4,9,16,25,36,...} f: A → B f(n) = ? f(17.n) = n2, ∀ n ∈ N Definição 26: Conjunto Enumerável Um conjunto é dito contavelmente infinito (“contably infinite” ) se ele é equipotente ao conjunto N. Um conjunto é dito contável ou enumerável se ele é finito ou contavelmente infinito.
Θ
Exemplos: 1) Z ≈ N Z = {..., -4,-3,-2,-1,0,1,2,3,4,...} N = {0,1,2,3,4,....} Z = {0,+1,-1,+2,-2,+3,-3,...} n se n=0 f(n) = n/2 se n é impar -n/2 se n é par 2) Q = {a/b| a∈Z, b∈Z, b≠0} N≈Q? -
A união de um número finito de conjuntos contavelmente infinitos é contavelmente infinita. Se Ai são contavelmente infinitos, então n U Ai é contavelmente infinita i=1 - Se A é contavelmente infinito A = {a0, a1,a2, a3, a4, ...} A,B e C contavelmente infinito A = {a0, a1,a2, a3, a4, ...} B = {b0, b1,b2, b3, b4, ...} C = {c0, c1,c2, c3, c4, ...} Esquema de caminhamento: (ou percorrimento) a0,
a1,
a2,
a3,
a4, ...
b0,
b1,
b2,
b3,
b4, ...
c0,
c1,
c2,
c3,
c4, ...
Logo, A∪B∪C: é contavelmente infinito. -
N x N é contavelmente infinito ?
notação U Ai: união infinita de A i i N x N = {0} x N ∪ {1} x N ∪ {2} ∪ N FIGURA: fazer no quadro. Cp1Fundamentos
17/08/03
14
Profª. Jussara Maria Marins
Capítulo 1
1º Passo: visitar um elemento do 1º conjunto (0,0) 2º Passo: visitar o próximo elemento do 1º conjunto (0,1) e também o primeiro elemento do 2º conjunto (1,0) 3º Passo: visitar o próximo elemento não visitado do 1º e 2º conjuntos (0,2) e (1,1) e também o 1º elemento do 3º conjunto (2,0) 4º Passo: Em geral, no n ésimo passo, visitamos o n ésimo elemento do primeiro conjunto, (n-1) th do segundo, o (n2) do terceiro, ... e o 1º elemento do n th conjunto. A relação é (i,j) ∈ N x N se e só se i+j = n-1
1.7. Fechos Observe a seguinte seqüência: (N, +) é fechado para adição ∀ x, y ∈ N , x + y ∈ N (N, -) não é fechado para subtração (Z, +) é fechado para adição e (Z, -) é fechado para subtração Vemos que quando um conjunto não é fechado para uma operação ele pode ser ampliado.
Definição 26: Fecho de um Conjunto Seja D um conjunto e n ≥ 0 e seja R ⊆ Dn+1 uma relação (n+1) ária em D. Um subconjunto B de D é dito fechado sobre R se b n+1∈B sempre que b1, ..., b n∈B e (b1,..., b n+1)∈R
Θ
Exemplo: D= 2A A = {a,b} (S,T,U) ∈ R ⊆ D2 ⇔ S∩T = U a) B ⊆ D é fechado sob R ⇔ ∀ X,Y∈B B = {{x ∈N a ≤ x ≤ b} a,b∈N} B={[1,1],[1,2],[1,3],...[1,n],...[2,3],[2,4],...[2,n],...}
Exercícios: 1. Verifique se o conjunto dos ancestrais de uma pessoa é fechado sob a relação : {(a,b)| a e b são pessoas e b é pai de a} 2. Usando a definição mostre que (N,+) é fechado e que (N,-) não é fechado.
1.8. Técnicas Fundamentais de Provas Perceber as relações que criamos na matemática é um exercício de observação, comparação e análise. Quando uma nova relação é construída precisamos prová-la. Provar um teorema é um exercício de criatividade mas também possui técnicas. Vejamos as técnicas. Prova Direta É a mais comum e não constitui novidade em si. Basicamente um teorema é uma proposição da forma p → q onde p é a hipótese e q é a tese.
Cp1Fundamentos
17/08/03
15
Profª. Jussara Maria Marins
Capítulo 1
Na prova direta, assume-se que p é verdadeira e a partir dos axiomas , definições e outros teoremas e por deduções lógicas chega-se diretamente à veracidade de q. Prova por Contradição: Na prova por contradição, nega-se o condicional , o u seja afirma-se que : p → q ⇔ ( p ∧ ¬q) → F ( F: contradição, proposição sempre falsa ) O que é válido pelo princípio do terceiro excluído. Veja a tabela verdade: ¬¬
p V V F F
q V F V F
F F F F F
p→q V F V V
¬q
F V F V
p^¬q F V F F
p^¬q→F F V F F
¬( p→q)
F V F F
Prova Contra - positiva: p → q ⇔ (¬ q → ¬ p) Ou seja, pode ser mais fácil provar a segunda parte. A afirmação anterior é provada apenas propriedades lógicas. Fazer a tabela verdade.
Princípio da indução Matemática Seja A um conjunto de números naturais tal que : (1) 0 ∈ A, e (2) ∀n ∈ N, se {0,1,2,...,n} ⊆ A, então n+1 ∈ A Então N = A Técnica da Prova por Indução Matemática “Para todo número natural n, a propriedade P é verdadeira” A = { n P(n) é verdadeira} Passos : (a) Base de Indução : 0 ∈A ∴ P(0) é V. (b) Hipótese de Indução : P(n) é V (c) Passo de Indução : P(n+1) é V. Logo, pelo Princípio da Indução P(n) é V. Exemplo :
Cp1Fundamentos
17/08/03
16
Profª. Jussara Maria Marins n
∑i =
+n
n2
i =0
Capítulo 1
2
(a)BI : Se n = 0
02 + 0 P (n) = i= ? 2 i =0 0
∑
P(0) = 0 (b)HI : P(m) = 1 + 2 +... + m = m 2 + n / 2 , m ≤ n. (c)PI : P(n+1) é V. HI
P (n + 1) = 1 + 2 + ... + n + (n + 1) =
=
n2
+ n + 2(n + 1) 2
=
n2
(n + 1) 2 + (n + 1) = 2
n2
+n 2
+ 2n + 1 + n + 1 2
+ (n + 1)
=
c.q.d
Exemplo Para qualquer conj. Finito A, 2A = 2|A| B.I: A=φ |A| =0 P(a) =2A = {φ} |P(A)| = 1, 2 0=1 ∴ p(0) é V HI: Seja n> 0 |2 A| = 2 |A| dado que |A| < n PI: Seja A tal que |A| = n+1 Como n> 0, tal contém pelo menos um elemento B= A – {a}, |B| = n |2B| = 2 |B| = 2n P(A) →2 partes 2A= 2B ∪{C ∪ {a}| C ∈2B} 8 |2A| = 2n + 2n = 2 n+1 = 2 |A| 8
São disjuntos. Cp1Fundamentos
17/08/03
17
Profª. Jussara Maria Marins
Capítulo 1
Princípio ‘ Pigeonhole’ Versão coloquial: Se n pombos voam para k casinhas (pigeonholes: buracos do pombal) e k < n, então alguma casinha contém pelo menos 2 pombos. 9
Versão matemática: Teorema 11: Se A e B são conjuntos finitos e |A| > |B|, então ñ existe uma função injetora de A em B. Prova : BI : |B| = 1 |B| = {b} e |A| > 1, a1,a2 ∈ A f:A→B f(a1) = f(a2) = b ⇒ f não é injetora HI : Suponha que f não é injetora . Dado que f : A → B, |A| > |B| e |B| ≤ n, n ≥ 1 PI : Suponha que f : A → B e |A| > |B| = n + 1 Escolhendo b e B. - Se |f -1(b)| ≥ 2 então f não é injetora - Se |f -1(b)| ≤ 1 considerar a função g g : A ⇒ f -1(b) ⇒ B – {b} g(a) = f(a) para cada a A - f -1(b) Então |A - f -1(b)| ≥|A| - 1, |B – {b}| = n < |A| - 1 Logo, pela HI g ñ é injetora Então g(a1) = g(a2), a1,a2 ∈A - f -1(b) e Daí f(a1) = f(a 2) ⇒ f não é injetora.
Teorema 12: Seja R uma relação binária num conj. Finito A . Se existem cadeias arbitrariamente grandes em R então existe um ciclo em R. Prova : Seja (a1,a2,...,a n) uma cadeia, para algum n > |A|. Seja f : {1,2,...,n} → A 9
Por que pombos? Cp1Fundamentos
17/08/03
18
Profª. Jussara Maria Marins
Capítulo 1
F(i) = ai ∀ i Logo pelo Princípio do ‘ pigeonhole' f não é injetora. F(i) = f(j) para algum i e j 10 e f(m) = f(m+k) para algum m, 1
Princípio da Diagonalização Seja R uma relação binária num conj. A, e seja D o conj. Diagonal para R dado por {a | a ∈ A e (a,a) ∉ R} Para cada a ∈ A, seja R a= {b | b ∈ A e (a,b) ∈R Então D é diferente de cada R a Exemplo: A= {a,b,c,d,e,f} R={(a,b),(a,d),(b,b),(b,c),(c,c),(d,b),(d,c),(d,e),(d,f),(e,c),(e,f),(f,a),(f,c),(f,d),(f,e)} a a b c d e f
b X X X
X
c
d X
X X X X
X
e
f
X X X
X X
D = {a,d,f} R a = {b,d} R b = {b,c} R c = {c} R d = {b,c,e,f} R e = {e,f} R f = {a,c,d,e} Teorema 13: O conj. 2 N é incontável, não é enumerável. Prova: Demonstração por absurdo. Suponhamos que 2 N é enumerável. Logo existe uma função bijetora de N em 2 N Seja f dada por: f: N →2 N f(i) = Si, ∀ i ∈ N
Cp1Fundamentos
17/08/03
19
Profª. Jussara Maria Marins
Capítulo 1
Então 2 N admite uma enumeração.10 2 N= {S0, S1, S2,...} Seja D um conjunto tal que: D={n ∈ N | n ∉ Sn}, D ⊂ N Quem é realmente o conjunto D? D ⊂ N ⇒ ∃ k ∈ N tq. D=Sk Tome um elemento k natural . Qual a relação de k com S k? Suponhamos que k pertence a S k a) k ∈ Sk . Como D = {n | n ∉ Sn} ⇒ k ∉ D e D= S k , logo k ∉Sk Suponhamos que k não pertence a Sk. b) k ∉ Sk . c) Então k ∈D mas D = S k logo k ∈ Sk Logo sempre chegamos a uma seqüência de proposições que implica num absurdo. Logo a proposição inicial é falsa. Logo, 2 N não é enumerável
10
Observe que os conjuntos S i são os conjuntos D a da diagonalização, onde a relação S é dada por S= {(i,j) | j ∈ S(i)}
Si = {i | (i,j) ∈R} = Si ⇒ D ≠ Si D ∉ f [N] Cp1Fundamentos 17/08/03
20
Profª. Jussara Maria Marins
Capítulo 2 Programas, Máquinas e Computações
1. Fundamentos 2. Programas, Máquinas e Computações Este capítulo esta totalmente baseado no capítulo 2 do livro texto Teoria da Computação do Tiarajú e Paulo, ambos professores do Instituto de Informática da UFRGS. O Professor Paulo é doutor em Matemática (na área de Teoria da Computação) pela Universidade de Lisboa. O Professor Tiarajú é doutor em Ciência da Computação pela UFGRS. A vantagem desta abordagem é possuir uma linguagem satisfatória sobre a teoria, inerente ao assunto, de modo bem mais coloquial do que outros livros sobre o assunto, sem deixar de lado a formalidade necessária ao assunto. Objetivos: " Neste capítulo é introduzida a formalização das noções de programa, de máquina, de computação e do que é computável em uma máquina e das relações entre formalismos como, equivalência e simulação." 1
Atenção: O curso proposto pelo livro é de 60h, o que não é o nosso caso, por isso faremos algumas simplificações.
1
Aquilo que estiver em itálico e salientado de amarelo é cópia direta do livro. Mas atenção: nem todas as transcrições foram feitas. Logo não basta ler as anotações deste arquivo. Cp2Programa
1
17/08/03
Profª. Jussara Maria Marins
Capítulo 2 Programas, Máquinas e Computações
Roteiro: Ler os seguintes itens: 2.1. Programas Parece que começamos a pintar as paredes de cima para baixo. Metodologia Top Down ou Botton Up? Observe que não se parte de nenhuma noção básica anterior e que não se questiona a natureza das operações.
2.1.1. Programa Monolítico "Um programa pode ser descrito como um conjunto estruturado de instruções que capacitam uma máquina a aplicar sucessivamente certas operações básicas e testes sobre os dados iniciais fornecidos, com o objetivo de transformar estes dados numa forma desejável". a) Estruturação monolítica: É baseada em desvios condicionais e incondicionais , não possuindo mecanismos de explícitos de iteração, subdivisão ou recursão. b) Estruturação Iterativa: Possui mecanismos de controle de iterações de trechos de programas. Não permite desvios incondicionais. c) Estruturação Recursiva: Possui mecanismos de estruturação em sub-rotinas recursivas. Também não permite desvios incondicionais Composições:
a) Composição seqüencial: A execução da operação ou teste subseqüente somente pode ser realizada após o encerramento da execução ou teste anterior. b) Composição não determinística: Uma das operações ou testes compostos é escolhida para ser executada. Ë também chamada de escolha. c) Composição concorrente: As operações ou testes compostos podem ser executados em qualquer ordem, inclusive simultaneamente, ou seja, a ordem da execução é irrelevante. Notação: Identificadores de operações: F,G,H Operação vazia: símbolo: Identificadores de Testes: T1, T2, T3,... Definição 2.1 Rótulo, Instrução rotulada
a) Rótulo ou Etiqueta: É uma cadeia de caracteres finita(palavra) constituída de letras ou dígitos. b) Instrução rotulada i é uma cadeia de caracteres finita(palavra) de uma das formas a seguir (suponha que F e T são identificadores de operação e teste, respectivamente e que r1, r2 e r3 são rótulos): b1) Operação: r1: faça F vá_para r2 ou r1: faça : vá_para r2 b2) Teste: r1: se T1 então vá_para r2 senão vá_para r3 Exemplo1: 1: faça F vá_para 2 2: se T1 então vá_para 1 senão vá_para 3 3: faça G vá_para 4 4: se T2 então vá_para 5 senão vá_para 1 Tentando fazer outra abordagem, isto é, mais construtiva, poderíamos retornar a tentativa de conceituar algoritmo, que nestas alturas do campeonato, deve ser mais fácil. Algoritmos Alguns conceitos usuais: • Um procedimento é uma seqüência finita de instruções que podem ser executadas por um computacional . • Um procedimento efetivo é uma descrição não ambígua de um conjunto finito de instruções
Cp2Programa
2
agente
17/08/03
Profª. Jussara Maria Marins
Capítulo 2 Programas, Máquinas e Computações
Um procedimento efetivo pode executar uma tarefa, computar uma função ou fazer uma seqüência de operações relacionadas. Um procedimento efetivo que especifica uma seqüência de operações que sempre pára é chamado de • algoritmo. Assim como em Geometria temos algumas noções básicas que não são definidas em Computação temos o conceito de algoritmo que consiste numa noção básica. Em 1936 Alan Turing (1912-1954) propôs um formalismo para a representação de procedimentos efetivos. Pela primeira vez foram identificados programas escritos para uma máquina de computação automática. Esta circularidade não nos interessa. Logo voltamos ao ponto de partida ou então deixemos a Máquina de Turing para depois. •
Definição 2.2 Programa Monolítico Um programa Monolítico é uma par ordenado P=(I,r) Onde: I : Conjunto finito de instruções r: Rótulo inicial o qual distingue rotulado em I Observação: Não existem duas instruções rotuladas diferentes com um mesmo rótulo; • Um rótulo referenciado por alguma instrução o qual não é associado a qualquer instrução rotulada é dito • rótulo final. Observação: A todo programa monolítico corresponde um fluxograma
v partida
parada
operação
teste
f
Exemplo2: a) P1=(I1,1) onde I1 é o conjunto das instruções rotuladas 1,2,3 e 4 do exemplo 1 e 5 neste caso é rótulo final. b) P2({r1: faça : vá_para r2},r1) onde r2 é o rótulo final Exemplo3: Exemplo da apostila de Introdução à Computação do Prof. Fábio do ITA, retirado de um livro o qual não lembro e que gosto muito. 1)Entrada de cartões; 2) Calculadora, 3) Escaninho, 4) Máquina de escrever, 5) Operador, e cartões auxiliares se forem necessários. Observe ( melhore) o desenho:
Escaninho: caixa numerada com instruções ou dados de cartões Operador: Pessoa ou unidade de controle Programa: Cp2Programa
3
17/08/03
Profª. Jussara Maria Marins
Capítulo 2 Programas, Máquinas e Computações
E1: Ler um cartão e colocar em E16; E2: Somar 1 a E14; E3: Ler um cartão e colocar em E15; se acabarem os cartões então executar instrução de E6. E4: Somar E16 com E15 e colocar resultado em E16; E5: Executar instrução de E2; E6: Dividir E16 por E14; E7: Imprimir valor de E12; E8: Terminar trabalho. E9 até E16 estão zerados no início. Observação 2.3 Fluxograma2 Faça o fluxograma do exemplo 1 e do exemplo 3.
2.1.2. Programa Iterativo Definição 2.4 Programa Iterativo Já vi este filme! Quaisquer semelhanças com a "vida real" é proposital. Na página 15 do livro os autores falam em Programação Estruturada. A preocupação com a eficiência e correção junto com sua necessária prova (matemática, é claro) de um programa é que originou a procura do que hoje é chamada programação estruturada. O artigo seminal é " An axiomatic basis for computer programming" de C. A . R. Hoare está publicado na Communication ACM 12, pp 576-584 de 1963. Este mesmo autor juntamente com o prof. Wirth definiu axiomaticamente a Linguagem Pascal em 1973. Ainda da década de 60 temos o clássico artigo Why GOTO is warmfull ? dos autores O . J. Dahl; E. W. Dijkstra e C. A . R. Hoare.
2.1.3. Programa Recursivo Definição 2.5 Expressão de Sub-rotinas Definição 2.6 Programa Recursivo Exercícios: 1. Diga com suas palavras o que é um programa? 2. Por que não foi definido um programa genérico, assim como foi definido, por casos, o monolítico, o iterativo ou o recursivo? 3. Faça os exercícios de 2.1 a 2.3 da página 58.
2.2. Máquinas Grupo1: página 20 até 23. Definição 2.7 Máquina Exemplo 2.7 Definição 2.8 Programa para uma Máquina Exemplo 2.8 Exemplo Extra: Traduzir o exemplo 3 para a máquina de 2 registradores: fazer os programas auxiliares: prg_a← amaisb ; prg_a ← adivb ;
2.3. Computações e funções computadas Grupo2 Página 23 até 27.
2.3.1. Computação Definição 2.9 Computação de Programa Monolítico para uma Máquina 2
Uma imagem sempre vale por 1000 palavras?
Cp2Programa
4
17/08/03
Profª. Jussara Maria Marins
Capítulo 2 Programas, Máquinas e Computações
Exemplo 2.9 Exemplo 2.10 Definição 2.10 Computação de Programa Recursivo para uma Máquina Exemplo 2.11 Grupo3 Página 27 até 31. Máquina de um Registrador Exemplo 2.12
2.3.2. Função Computada Definição 2.11 Função computada por um Programa Monolítico para uma Máquina Exemplo 2.13 Exemplo 2.14 Definição 2.12 Função Computada de um Programa Recursivo para uma Máquina Exemplo 2.15 Exemplo 2.16 Exemplo 2.17
2.4. Equivalência de programas e máquinas 2.4.1. Equivalência Forte de Programas Definição 2.13: Relação de equivalência Forte entre programas Exemplo 2.17 Teorema 2.14 Teorema 2.15 Corolário 2.16 Teorema 2.17 Teorema 2.18 Observação 2.19
2.4.2. Equivalência de programas Definição 2.20: Relação de equivalência de programas em uma Máquina
2.4.3. Equivalência de Máquinas Definição 2.21: Simulação Forte de Máquinas Definição 2.22: Simulação de Máquinas Definição 2.23: Relação de equivalência de Máquinas
2.5. Verificação da Equivalência Forte de Programas Não será visto.
2.6. Conclusão 2.7. Exercícios Página 58 a 64.
Cp2Programa
5
17/08/03
Profª. Jussara Maria Marins
Capítulo 2 Programas, Máquinas e Computações Trabalho em Grupo:
I) 1. 2. 3.
Objetivos: Definir cada máquina citada conforme apresentado no livro texto 1. Definir o que é um programa para esta máquina Programar nesta máquina.
II) a) b) c)
Trabalho: Redigir o trabalho de forma objetiva e disponibilizar o arquivo para todos alunos Ilustrar com outros exemplos além do solicitado Seguir a numeração das definições, conforme dado neste capítulo.
III)
Apresentação: A) Para toda classe em até 20 minutos B) Estimular a participação de todos Data: Será definida em aula.
III)
Este trabalho pode ser complementado com outros tópicos relacionados, embora ele tenha um carater particular e teórico.
Outros trabalhos envolverão a programação em Linguagem C ou Pascal.
Cp2Programa
6
17/08/03
Profª. Jussara Maria Marins
Capítulo 3: Máquinas de Turing e Outras
INSTITUTO PRESBITERIANO MACKENZIE Professora Jussara Maria Marins Teoria da Computação Capítulo 3 :Máquina de Turing E Outras 1. Fundamentos 2. Programas, Máquinas e Computações 3. Máquina de Turing e Outras 1.
FUNDAMENTOS..................................................................................................................................... 1
2.
PROGRAMAS, MÁQUINAS E COMPUTAÇÕES.............................................................................. 1
3.
MÁQUINA DE TURING E OUTRAS ................................................................................................... 1 3.1.
MÁQUINAS DE TURING ........................................................................................................................ 2
3.1.1. 3.1.2. 3.1.3. 3.1.4. 3.1.5.
Máquinas de Turing e seus Modelos .......................................................................................... 3 Máquinas de Turing como Reconhecedores............................................................................... 9 Máquinas de Turing como Processadores de Funções ............................................................ 10 Extensões da Máquina de Turing ............................................................................................. 11 Outras Funções Numéricas ...................................................................................................... 15
Os objetivos deste capítulo são: - compreender que algoritmo é um conceito básico - definir Máquina de Turing e verificar que ela é ao mesmo tempo um reconhecedor de linguagens, um programa e um modelo para um computador - programar várias máquinas de Turing - definir uma máquina universal e compreender sua necessidade para a formação da ciência da computação - definir teoricamente e programar outras máquinas computacionais
Cp3Turing
1
17/08/03
Profª. Jussara Maria Marins
Capítulo 3: Máquinas de Turing e Outras
Capítulo 3 :Máquina de Turing E Outras
3.1. Máquinas de Turing Ler a seção 3.4 e 3.4.1 nas páginas 83 e 84 do livro texto1. Retomar os conceitos usuais: de algoritmos: O repeteco é o mesmo mas observemos todas as palavras em itálico. • Um procedimento é uma seqüência finita de instruções que podem ser executadas por um agente computacional . • Um procedimento efetivo é uma descrição não ambígua de um conjunto finito de instruções • Um procedimento efetivo pode executar uma tarefa, computar uma função ou fazer uma seqüência de operações relacionadas. • Um procedimento efetivo que especifica uma seqüência de operações que sempre pára é chamado de algoritmo. Cada uma das palavras selecionadas ou requer uma nova definição e usando apenas as já definidas anteriormente não são suficientes para completar a idéia de seqüência, instruções e efetividade. Assim como em Geometria temos algumas noções básicas que não são definidas, como reta, ponto e plano em Computação temos o conceito de algoritmo que consiste numa noção básica. Em 1936 Alan Turing (1912-1954) propôs um formalismo para a representação de procedimentos efetivos. Pela primeira vez foram identificados programas escritos para uma máquina de computação automática. Ver alguns aspectos históricos “Conceito de Máquina Turing.” Uma máquina de Turing consiste numa máquina abstrata com um controle finito, numa fita com células, num cabeçote que pode ser usado para ler ou escrever na fita, mover-se para direita ou esquerda. Satisfaz a 3 condições: - Deve ser um autômato - Deve ser simples de descrever - Deve ser geral o suficiente para descrever uma computação. A figura a seguir mostra uma representação gráfica desta idéia.
a b
a
a
UC
q1
q1 q2 q3
•
A unidade de controle opera em passos discretos e faz 2 funções, o que depende do estado atual e do símbolo da fita que está sendo pesquisado pelo cabeçote:
(1) Põe a Unidade de Controle num novo estado E; (2) No estado E: (2a) Escreve um símbolo na fita substituindo o que está sendo pesquisado, ou (2b) Move o cabeçote uma célula para a esquerda ou direita.
Cp3Turing
2
17/08/03
Profª. Jussara Maria Marins
Capítulo 3: Máquinas de Turing e Outras
3.1.1. Máquinas de Turing e seus Modelos A seguinte definição da Máquina de Turing é a mais comum e segue o livro do Papadimitriou, ou o que indicaremos por livro 2, enquanto que o livro do Prof. Paulo Menezes será indicado por livro 1. Está na página 181 que é aqui repetida. Definição 3.1: Uma M.T: Máquina de Turing é uma quíntupla (K, Σ, δ, s, H) onde: - K: conjunto finito de estados; - Σ: alfabeto contendo o símbolo branco: ß e o símbolo terminal mas que não contém ← →; - s∈K: o estado inicial; - H⊆K: o conjunto dos estados finais ou de parada - δ: função de transição
δ: (K-H) x Σ → K x (Σ ∪ {← →}) δ(qi,σ) = (q j,σ’) (a) (∀ q∈K-H), se δ(q, .) = (p,b) então b = → (b) (∀ q∈K-H) e a ∈ Σ se δ(q,a) = (p,b) então b ≠ . Se q∈K-H, a ∈ Σ δ(q,a) = (p,b) Se a Máquina de T.M está no estado q e lê o símbolo a do alfabeto então irá para o estado p e (1) se b ∈ Σ então M substituirá a por b (2) se b = → ou b = ←, então M irá mover o cabeçote para a direita ou esquerda respectivamente.
Obs: 1- δ é função ⇒ Máquina de Turing. é determinística 2- A Máquina de Turing pode alterar a entrada e escrever brancos. 3- A Máquina de Turing pode nunca parar, Exemplo 1: M = (K,Σ,δ,s,{h}) K = {q0,q1,h} Σ = {a, ß ,} s = q0 δ = {q0,q1} x {a, } → { q0,q1,h} x { a, ß,,→,←} Domínio: D={(q0,a), (q0, ß), (q0,), (q1,a), (q1, ß), (q1, )} → #(D)= 6 Contra Domínio CD={( q 0,a),(q 1,a), (q0, →),(q1,a),(q 1, →),..} → #(CD)=15 Fita: ßaaaa (qi, ) 1 (q0,a) 2 (q0, ß) 3 (q0,) 4 (q1,a) 5 (q1, ß) 6 (q1, )
Cp3Turing
(qi, ) (q1, ß) (h, ß) (q0, →) (q0,a) (q0, →) (q0, →)
3
17/08/03
Profª. Jussara Maria Marins
Capítulo 3: Máquinas de Turing e Outras
Execução: Conteúdo da Fita, onde o sublinhado indica o cursor e regra aplicada:
ß
2
3
4
5
6
7
8
9
a
a
a
(q0,a) → (q1, ß) Regra 1
1
a
ß
ß
a
a
a
(q1, ß) → (q0, →) Regra 5 ß
ß
a
a
a
(q0,a) → (q1, ß) Regra 1 ß
ß
ß
a
a
ß
a
a
ß
ß
a
ß
ß
a
ß
ß
ß
ß
ß
(q1, ß) → (q0, →) ß
ß
(q0,a) → (q1, ß) ß
ß
(q1, ß) → (q0, →) ß
ß
(q0,a) → (q1, ß) ß
ß
(q1, ß) → (q0, →) ß
ß
ß
(q0, ß) → (h, ß) Regra 2
Esta máquina recebe uma entrada, com um número qualquer de símbolos, pesquisa para direita, e muda-os para branco, ou seja apaga os símbolos não-brancos. Se o conteúdo da fita fosse: ßaaaa, no estado q1,começaríamos da regra 6. Exemplo 2: M= (K, Σ, δ, s, H) K = { q0,h} s = q0
Σ = {a, ß ,} H = {h}
função de transição : δ q, ( q, ) 1 q0 a (q0,←) 2 q0 , ß (h, ß) 3 q0 (q0,→)
Cp3Turing
4
17/08/03
Profª. Jussara Maria Marins
Capítulo 3: Máquinas de Turing e Outras
I) Se o conteúdo da fita é aaßß, temos
a
a
ß
(q0,) → (q0,←) Regra 3
a
a
ß
(q0,a) → (q0,←) Regra 2
a
a
ß
(q0, ) → (q0,→) Regra 3
a
a
ß
(q0,a) → (q0,←) Regra 2 etc...e a máquina de Turing nunca pára. II) Se o conteúdo da fita é ßaaß, temos
ß
a
a
ß
a
ß
a
ß
(q0,a) → (q0,←)
ß
a
(q0,a) → (q0,←)
ß
a
(q0, ß) → ( h, ß) Neste caso, a Máquina Turing pára, pesquisou para esquerda até encontrar o primeiro branco e parou. A definição do Livro Texto 1 é diferente pois acrescenta outros itens que não estavam colocados na notação mais comum e que seriam introduzidos depois. Leia a definição 3.4 do Livro1 nas páginas 84 à 85. Comparemos: - Mudamos de quíntupla para 8-upla. - Definição 3.1 A : M=( Σ , Q, Π , q0, F,V,ß ,☼ ) onde: - Q: conjunto finito de estados; - Σ : alfabeto de entrada - (não contendo o símbolo branco: ß e o símbolo terminal mas que não contém ← → ; ) - q0: o estado inicial, q 0 ∈ Q; - F ⊆ Q: o conjunto dos estados finais ou de parada - Π : função de transição o símbolo branco: ß - ☼ : símbolo inicial da fita
Π(estado corrente, símbolo lido)=(novo estado, símbolo gravado, sentido do movimento que agora é E (esquerda) ou D (direita).
Cp3Turing
5
17/08/03
Profª. Jussara Maria Marins
Capítulo 3: Máquinas de Turing e Outras
Outra mudança é o modo de representar a função Π ou δ, onde δ(qi,σ) = (q j,σ’) mostra ora o novo símbolo ou o movimento. A tabela, consequentemente, é diferente. Notação para Máquinas de Turing A notação de Máquinas de Turing pode ser semelhante à de autômatos usando nodos e arcos ou arestas de um grafo para representar os estados e as transições. As máquinas em si também poderão ser agrupadas através de uma hierarquia a partir de máquinas básicas. A nova notação envolve tanto o símbolo modificado como o movimento da seguinte maneira: (p, a u )=(q, a v , m) Graficamente, podemos representar como autômatos, levemente modificado e então temos temos: ( a u ,, a v ,m)
q
p
Novo estado
Estado corrente Símbolo lido
Sentido do movimento Símbolo gravado
Outra maneira é representar a função de transição por uma tabela que aliás é mais própria para ser utilizada como estrutura de dados para um programa em qualquer linguagem computacional ou mesmo num mecanismo material: algo como uma máquina mecânica tipo uma máquina de tricô, um relógio acoplado à uma maquina de escrever com símbolos só do alfabeto, ou uma máquina analítica de Charles Babage que simule uma máquina de Turing. Dê asas à sua imaginação e faça um desenho de uma tal máquina. A tabela pode ser representada da seguinte maneira: No estado p com o símbolo a u ,,na fita, substitui por a v e faz o movimento m, indo para o estado q . Na primeira linha estão todos símbolos do alfabeto e na primeira coluna estão todos os estados. au (q,,av,m)
☼
p q ...
,
...
,
av
...
ß
Exemplo 3: Seja a Máquina de Turing com a seguinte configuração inicial: (q1, ß a a a a). (qi, ) (1) q0 a (2) q0 ß (3) q0
(q1, ß) (h, ß) (q0,→)
(4) q1a (5) q1 ß (6) q1
(q0,a) (q0, →) (q1, →)
(q1 ß aaaa)
(qi, )
├M (q0, ß a a a a)
Cp3Turing
6
17/08/03
Profª. Jussara Maria Marins ├M (q1, ├M (q0, ├M (q1, ├M (q0, ├M (q1, ├M (q0, ├M (q1, ├M (q0, ├M (h,
Capítulo 3: Máquinas de Turing e Outras
ß ß a a a) ß ß a a a) ß ß ß a a) ß ß ß a a) ß ß ß ß a) ß ß ß ß a) ß ß ß ß ß ) ß ß ß ß ß ß) ß ß ß ß ß ß)
Neste exemplo a computação tem 10 passos. Para fazer a representação de autômato para a máquina anterior, simplificaremos a transição escrevendo apenas o símbolo que for mudado ou a direção como indicado na definição da função δ(qi,σ) = (q j,σ’). O desenho será, por exemplo:
3.(, →) 1 (a , ß) q0
(a,a) 4
.(, →) 6
q1 (ß,→) 5
2. (ß,ß) h
Uma próxima etapa é juntar o movimento e a troca do símbolo na transição. O autômato ficará simplificado, pois diminui-se um estado, como na figura seguinte: (a,ß,→)
q0
(ß,ß,→) h .(, →)
Autômato da Máquina de Turing que apaga Exercício: Faça uma Máquina de Cópia Seja ω∈Σ* que contém símbolos não brancos e que pode ser uma string vazia. A máquina C copia ω com uma célula branca a sua esquerda e o cabeçote é colocado numa célula branca a esquerda de ω. ßωß→ßω ßω ß
Escreva a função de transição delta ou desenhe o autômato.
Cp3Turing
7
17/08/03
Profª. Jussara Maria Marins
Capítulo 3: Máquinas de Turing e Outras
Exemplo 4: Máquina do Duplo Balanceamento Esta máquina verifica se uma palavra que está na fita tem a seguinte propriedade: inicia com a letra a em um número n de vezes que é seguido pelo mesmo número de vezes da letra b. Duplo_Bal = { a n bn | n ≥0} Exemplos: São aceitas: aabb; ab, e ( palavra vazia) ,aaaabbbb, etc Não são aceitas: aab, ba, aaabb, etc Veja a descrição completa, isto é, definição, tabela e grafo na página 89 e 90 Seja Σ0 ⊆ Σ - { ß } um alfabeto chamado de Alfabeto de Entrada de M. Durante o trabalho de M podemos ter símbolos auxiliares que não fazem parte da Entrada, são símbolos auxiliares o seu conjunto é indicado por V. Outro modo de fazer a maquina Duplo_bal é o seguinte autômato: Sejam Σ={a, b, ß, } K={1,2,3,4,5,6}, s=1, H={6} V={A,B}. A Máquina seguinte reconhece L={a i, b i, | i ≥0} Se a máquina chegar no estado 6 a palavra é aceita, caso contrário é rejeitada. (ß,ß,R) 1
(B,B,L)
(B,B,R)
(a,A,R)
(b,B,L)
2
(A,A,R)
3
5
(ß,ß,R)
66
(a,a,L)
(a,a,R)
(B,B,R) 4
(A,A,R)
(a,a,L)
Exercício: Tente fazer outra máquina com menos estados e regras que a primeira. Exemplo 5: Temos agora uma extensão do exemplo do Duplo_Bal, que é o Triplo_bal, ou seja: L = {a n bn cn | n ≥ 0} A notação seguinte é do livro 2. Papadimitriou. Observe que há uma correção. Nesta notação R indica uma máquina composta que sempre vai para direita em qualquer símbolo do alfabeto, R 2 vai duas células para direita; R a significa que vai para a direita em qualquer símbolo diferente de branco: ß ; se temos dR significa que substitui o símbolo da fita que está no cabeçote por d e vai para direita; e assim por diante. Usamos 2 novas máquinas: A máquina 'y' faz o novo estado de aceitação, enquanto que 'n' faz o estado de rejeição Σ = {a, b, c} Σ0 = {a, b, c, d}
d
R Início
aa
b b
dR
b,c y
Cp3Turing
a,a
d
c,
b,b
dR
cc
dL
a,
nn
8
17/08/03
Profª. Jussara Maria Marins
Capítulo 3: Máquinas de Turing e Outras
Em cada estágio M começa da extremidade esquerda do string ω e move-se para a direita na pesquisa de um a Quando encontra o primeiro a substitui por d e vai para a direita procurando um b. aaabbbccc ß
α
ßaaabbbcccß
α
ß d a a b b b c c c ßα
ßdaabbbcccß
Quando um b é encontrado, substitui por d e vai adiante (deixando só “b”) procurando um c. α ßdaabbbcccß α ßdaadbbcccß α ßdaad bbdcccß Quando um c é encontrado é substituído por um d e o estágio acaba e o cabeçote retorna a extremidade esquerda da entrada: dL ß Em cada estágio a máquina substitui um a, um b e um c por d´ s. Depois volta a pesquisar. Se neste caso um string é ≠ a* b* c* ou existe um símbolo em excesso, então M chega ao estado de rejeição n. Se contudo, a extremidade direita da entrada: ω, quando procurando um a, isto significa que toda entrada foi substituída por d´s, e portanto a forma a n bn cn, foi encontrada para n > 0 e M aceita ω. Situações que ocorrem numa Máquina de Turing: O que é importante ressaltar são as 3 possibilidades de parada de uma Máquina de Turing a) o "processamento" chega ao estado final e a máquina pára e a palavra é aceita ou o resultado esperado é obtido; b) a "função programa" é indefinida para o argumento; a máquina pára e a palavra de entrada é rejeitada c) Movimento inválido, a palavra é rejeitada e a máquina pára. 3.1.2. Máquinas de Turing como Reconhecedores Os exemplos anteriores mostraram dois tipos de exemplos: a) a máquina que faz uma tarefa: uma cópia ou apagar a entrada b) aceita uma palavra de uma linguagem com certas características Vamos deixar esta última situação mais clara e classificar alguns tipos de linguagens.
Definição 3.2: Configuração Seja M = (K, Σ, δ, s, H) uma Máquina de Turing com H = {y, n}. Qualquer configuração que para e cujo estado atual é y é chamada de configuração de aceitação, enquanto que se a configuração que para e o estado é n é chamada de configuração de rejeição. Definição 3.3: Linguagem aceita por uma Máquina de Turing Seja M uma máquina de Turing M =(Σ, Q,Π, q0,,F,V,ß,☼) Dizemos que M aceita ω∈(Σ - { ß, })* se (s, ßω) acarreta numa configuração de aceitação, e M rejeita ω se (s, ß ω) acarreta numa configuração de rejeição. Pode ocorrer que exista uma situação, onde a máquina nem aceita, nem rejeita uma certa configuração. Dizemos que uma máquina de Turing M decide a linguagem1 L⊂Σ*0 se ∀ω∈Σ*0, o seguinte é verdade: Se ω∈L então M aceita ω, ou ainda o conjunto de todas as palavras ou strings pertencentes a Σ*, ou seja: ACEITA(M)={w| M ao processar ω∈Σ* pára num estado final, q f ∈F} i)
ii) Se ω∉L então M rejeita ω. REJEITA(M) = {w| M ao processar C pára num estado final, q f ∉F} 1
Ver resumo no anexo sobre linguagens
Cp3Turing
9
17/08/03
Profª. Jussara Maria Marins
iii)
Capítulo 3: Máquinas de Turing e Outras
A linguagem para a qual M fica em loop infinito ó o conjunto de todas as palavras de ω∈Σ* para as quais M fica processando indefinidamente.
Logo: ACEITA(M) ∪ REJEITA(M) ∪ LOOP(M) = Σ* A definição seguinte está no livro texto1 na página 91. Definição 3.4: Linguagem Enumerável Recursivamente Uma linguagem aceita por uma Máquina de Turing é dita linguagem recursivamente enumerável. Ou seja, existe uma Máquina de Turing que semidecide L. ou seja M pode parar ou não. Exemplos: a) DuploL = {an bn| n≥0} b) TriploL ={an bncn| n≥0} c) Concatena= {ww| w é palavra sobre os simbolos de {a,b}} Esta classe de linguagens inclui algumas para as quais é impossível determinar mecanicamente se uma dada palavra não pertence à linguagem. Se L é uma dessas linguagens, então para qualquer máquina M que aceita L, existe pelo menos uma palavra w que não pertence a L que, sendo entrada da máquina M, ela fica em loop infinito. Logo temos que: 1. se w ∈ L, então M pára e aceita a entrada; 2. se w∉L, M pode parar, rejeitando W ou entrar em loop infinito. Definição 3.5: Linguagem Recursiva Uma linguagem L é dita Linguagem recursiva se existe uma Máquina de Turing M tal que: 1. ACEITA(M) = L 2. REJEITA(M) = Σ*- L 3. LOOP(M) = φ Agora para a classe dessas linguagens é possível garantir que existe um reconhecedor, ou em outras palavras uma algoritmo que as reconhece como válidas ou inválidas. Este reconhecedor nada mais é que um Compilador. A condição 3 indica que existe uma máquina de Turing que sempre pára com esta linguagem. Exemplos: a) DuploL = {an bn| n≥0} b) TriploL ={an bncn| n≥0} c) {w| w∈{a,b}* e tem o dobro de símbolos a do que b} Observações/ Teoremas: 1. O complemento de uma linguagem recursiva é uma linguagem recursiva. 2. Uma linguagem L é recursiva se e somente se L e seu complemento são enumeráveis recursivamente. 3. A classe da Linguagens recursivas é uma classe própria da classe da linguagens enumeráveis recursivamente.
3.1.3. Máquinas de Turing como Processadores de Funções Ver seção 3.4.5 no livro texto 1, na página 92 a 93. Definição 3.6: Função Turing Computável Uma função parcial f é dita função Turing Computável ou simplesmente Turing Computável se existe uma máquina de Turing que a computa, ou seja, a máquina pára e produz o resultado esperado ou fica em loop (infinito) se a função é indefinida para a entrada.
Ver o exemplo da Máquina que concatena duas palavras w1 e w2 de um alfabeto dado, e produz uma nova palavra w=w1w2.
Cp3Turing
10
17/08/03
Profª. Jussara Maria Marins
Capítulo 3: Máquinas de Turing e Outras
Exemplo 6: Concatenação Página 94. Exemplo 7 Quadrado Unário Página 95. Sejam Σ={1 ß, } K={1,2,3,...,13}, s=1, H={13} V={A,B,C
Ver livro texto 2:
Os exemplos da seção anterior deixam claro que as máquinas de Turing podem executar cálculos bastante poderosos, embora de maneira lenta e desajeitada. A fim de melhor enteder sua surpreendente potência, devemos considerar o efeito de estender o modelo da máquina de Turing em várias direções. Devemos ver que, em cada caso, os recursos adicionais não se somam às classes de funções computáveis ou linguagens decidíveis: os “novos modelos melhorados” da máquina de Turing podem, em cada instância, ser simulados pelo modelo padrão. Tais resultados aumentam nossa confiança em que a máquina de Turing é, de fato, o dispositivo computacional definitivo, o fim de nossa progressão para autômatos cada vez mais poderosos. Um benefício colateral desse resultado é que devemos nos sentir livres para utilizar o recurso adicional quando projetarmos máquinas de Turing para resolver problemas particulares, com base no conhecimento de que nossa dependência para com tal recurso pode, se necessário, ser eliminada.
FITAS MÚLTIPLAS Pode-se pensar que as máquinas de Turing têm várias fitas (ver figura). Cada fita é conectada ao controle finito por meio de uma cabeça de leitura/gravação (uma em cada fita). A máquina pode, em um passo, ler os símbolos lidos por todas as suas cabeças e, então, dependendo de quais símbolos e qual seu estado atual, regravar alguns dos quadros lidos e mover algumas cabeças para a esquerda ou para a direita, além de mudar de estado. Para qualquer inteiro fixo k ≥ 1, uma máquina de Turing de k fitas é uma máquina de Turing equipada, como acima, com k fitas e cabeças correspondentes. Portanto, uma máquina de Turing “padrão”, estudada até aqui, neste capítulo, é apenas uma máquina de Turing de k fitas, com k = 1.
Cp3Turing
11
17/08/03
Profª. Jussara Maria Marins
Capítulo 3: Máquinas de Turing e Outras
Definição 3.8:Máquina de Turing de várias fitas Suponha que k ≥ 1 seja um inteiro. Uma máquina de Turing de k fitas é um quíntuplo (K, Σ, δ, s, H), onde K, Σ, s e H são as definições da máquina de Turing normal e δ, a função de transição, é a função de (K – H) * Σk para K * (Σ ∪ {←→})k . Isto é, para cada estado q e cada k tuplas de símbolos de fita (a1, ..., ak ), δ(q, (a1, ..., ak )) = (p, ((b1, ..., bk )), onde p é, como antes, o novo estado e b j é, intuitivamente, a ação assumida por M na fita j. Naturalmente, novamente insistimos que se a j = ► para algum j ≤ k, então b j = →. A computação ocorre em todas as k fitas de uma máquina de Turing de k fitas. Correspondentemente, uma configuração de tal máquina deve incluir informações sobre todas as fitas. Definição 3.9:Uma configuração de M de k Fitas Suponha que M = (K, Σ, δ, s, H) seja a máquina de Turing de k fitas. Uma configuração de M é um membro de
k fitas.
K * (►Σ*X(Σ*(Σ - {ß}) ∪ {e}))k . Isto é, a configuração identifica o estado, o conteúdo da fita e a posição da cabeça em cada
Se (q, (w1 a1 u1, ... wk ak uk )) é uma configuração de uma máquina de Turing de k fitas (onde utilizamos a versão k vezes da notação abreviada para configurações) e se δ(p, a1,..., ak ) = (b1,...,bk ), então em um movimento a máquina se moveria para a configuração (p, (w´1a´1 u´1, ...w´k a´k u´k )), onde, para i = 1,..., k, w´ia´iu´i, w iaiui é modificada pela ação bi, precisamente como na Definição .3.8. Dizemos que a configuração (q,( w 1 a1 u1, ... wk ak uk )) produz um resultado em um passo na configuração (p, (w´1a´1 u´1, ...w´k a´k u´k )).
Cp3Turing
12
17/08/03
Profª. Jussara Maria Marins
Capítulo 3: Máquinas de Turing e Outras
Fita 1
Fita 2
Fita k
.
h q1 q3
Figura Evidentemente, máquinas de Turing de k fitas são capazes de computar tarefas bastante complexas. Devemos mostrar a seguir que qualquer máquina de Turing de k fitas pode ser simulada por uma máquina de uma única fita. Com isso queremos dizer que, dada qualquer máquina de Turing de k fitas, podemos projetar uma máquina de Turing padrão que exibe o mesmo procedimento de entrada - saída – decidir ou semidecidir a mesma linguagem, que computa a mesma função. Essas simulações são importantes ingredientes de nossa metodologia no estudo do poder dos dispositivos computacionais nesse e nos próximos capítulos. Em geral, elas se valem de um método para imitar um passo único da máquina simulada com vários passos da máquina simuladora. Nosso primeiro resultado desse tipo e sua prova são indicativos dessa linha de raciocínio. Teorema 3.1: Suponha que M = (K, Σ, δ, s, H) seja uma máquina de Turing de k fitas, para algum k ≥ 1 . Então, há uma máquina de Turing padrão M´= (K´, Σ´, δ´, s´, H´), onde Σ ⊆ Σ´, tal que vale o seguinte: para qualquer string de entrada x ∈ Σ*, M , na entrada x, pára na saída y da primeira fita, se, e somente se, M´, na entrada x, parar no mesmo estado de parada e com a mesma saída y em sua fita. Além
Cp3Turing
13
17/08/03
Profª. Jussara Maria Marins
Capítulo 3: Máquinas de Turing e Outras
disso, se M pára na entrada x, após t passos, então M pára na entrada x após um número de passos, que é O(t* (x + t)). FITA INFINITA DE DUAS VIAS Suponha agora que nossa máquina tenha uma fita que é infinita em ambas as direções. Todos os quadros são inicialmente espaços em branco, exceto aqueles contendo a entrada: a cabeça da fica inicialmente, digamos, à esquerda da entrada. Além disso, nossa convenção com o símbolo ◄ seria desnecessária e sem sentido para tais máquinas.
Não é difícil ver que, como ocorre com fitas múltiplas, fitas infinitas de duas vias não acrescentam poder substancial às máquinas de Turing. Uma fita infinita de duas vias pode ser facilmente simulada por uma máquina de duas fitas: uma fita sempre contém a parte da fita à direita do quadro que contém o primeiro símbolo de entrada e a outra contém a parte da fita à esquerda dessa ao inverso. A máquina de duas fitas, por sua vez, pode ser simulada por uma máquina de Turing padrão. De fato, na simulação precisamos levar apenas um tempo linear, em vez de um tempo quadrático, já que, a cada passo, somente uma das trilhas está ativa. Seria desnecessário dizer mas as máquinas com várias fitas infinitas de duas vias também podem ser simuladas do mesmo modo.
MÚLTIPLAS CABEÇAS O que ocorre se uma máquina de Turing tem uma fita, mas várias cabeças? Todas as cabeças lêem os símbolos varridos e movem ou gravam independentemente. (Alguma convenção deve ser adotada sobre o que acontece quando duas cabeças varrem o mesmo quadro da fita, ao mesmo tempo que tentamos gravar diferentes símbolos. Talvez a cabeça com o número mais baixo ganhe. Além disso, vamos assumir que as cabeças não possam compreender cada presença no mesmo quadro da fita, exceto talvez indiretamente, por meio de gravações malsucedidas.) Não é difícil ver que uma simulação com a que utilizamos para máquinas de k fitas pode ser realizada para máquinas de Turing com várias cabeças em uma fita. A idéia é, novamente, dividir a fita em trilhas, todas as quais, exceto uma, são utilizadas somente para gravar as posições da cabeça. Para simular um passo computacional pelas máquinas de múltiplas posições de cabeça e outra para alterar esses símbolos ou mover as cabeças apropriadamente. O número de passos necessários é novamente quadrático, como no Teorema 4.3.1. O uso de múltiplas cabeças, como o de múltiplas fita, podem às vezes, simplificar drasticamente a construção de uma máquina de Turing. Uma versão de 2 cabeças da máquina de copiar C no exemplo 4.1.8 poderia funcionar em um modo muito mais natural que a versão de uma cabeça (ou mesmo as versões de duas fitas, Exemplo 4.3.1); veja o problema 4.3.3 do livro referência.. FITA BIDIMENSIONAL Outro tipo de generalização da máquina de Turing permitiria que sua “fita” fosse uma grade bidimensional infinita. (uma poderia até permitir um espaço de dimensão mais alta). Tal dispositivo pode ser muito mais útil que as máquinas de Turing padrão para Cp3Turing
14
17/08/03
Profª. Jussara Maria Marins
Capítulo 3: Máquinas de Turing e Outras
resolver problemas como um “quebra cabeça” (veja o problema do ladrilho no próximo capítulo). Partiremos dele como um exercício (Problema 4.3.6) para definir em detalhes a operação de tais máquinas. Mais uma vez, entretanto, não resulta nenhum aumento fundamental no poder computacional. Curiosamente, o número de passos necessários para simular t passos das máquinas de Turing bidimensionais na entrada x pela máquina de Turing normal é novamente polinomial em t e x. As extensões do modelo da máquina de Turing, feitas acima, podem ser combinadas: podese pensar nas máquinas de Turing com várias fitas, todas ou algumas das quais são de algum modo infinitas de duas vias e têm mais de uma cabeça nelas ou, ainda, são multidimensionais. Novamente, é bastante simples e direto ver que as capacidades da máquina de Turing, em última instância, permanecem as mesmas. Resumimos nossa discussão sobre as diversas variantes das máquinas de Turing, discutidas assim por diante, como segue. Teorema 3.2: Qualquer linguagem decidida ou semidecidida e qualquer função computada por máquinas de Turing com várias fitas, cabeças, fitas infinitas de duas vias ou fitas multidimensionais, podem ser decididas, semidecididas ou computadas, respectivamente, pela máquina de Turing padrão. 3.1.5. Outras Funções Numéricas
Vamos agora adotar um ponto de vista completamente diferente sobre a computação, um que não seja baseado em qualquer formalismo explícito computacional ou de processamento da informação como as máquinas de Turing ou as gramáticas, mas, em vez disso, focalizar o que está para ser computado: funções de números. Por exemplo, é claro que o valor da função F(m,n) = m * n2 + 3 * m2*m+17 Pode ser computado para quaisquer valores dados de m e n, porque se trata de uma composição de funções – adição, multiplicação e exponenciação, mais algumas poucas constantes – que podem ser computadas. E como sabemos que exponenciação pode ser computada? Porque ela é recursivamente definida em termos de uma função simples (a saber, a multiplicação) e valores em menores argumentos. Afinal de contas, mn é 1 se n = 0 e, caso contrário, é m*mn-1. A própria multiplicação pode ser definida recursivamente em termos de adição – e assim por diante. No princípio, devemos ser hábeis para iniciar com funções de números naturais para números naturais tão simples que sejam inequivocamente considerados como computáveis (por exemplo, a função de identidade e a função de sucessor succ(n) = n+1) e combiná-los vagarosa e pacientemente por combinadores que são, também, muito elementares e obviamente computáveis – tais como a composição e a definição recursiva – e por fim, obter uma classe de funções de números para números que são completamente gerais e não triviais.
Cp3Turing
15
17/08/03
Profª. Jussara Maria Marins
Capítulo 3: Máquinas de Turing e Outras
Iniciamos por definir certas funções extremamente simples de Nk para N, para vários valores de k ≥ 0 (a função 0-ária é , naturalmente, uma constante, uma vez que não depende de nada). Definição 3.10: Funções Básicas As funções básicas são as seguintes: (a) Para qualquer k ≥ 0, a função zero k-ária é definida como zerok (n1,...,nk ) = 0 para todo n1,....,nk ∈ N. (b) Para qualquer k ≥ j > 0, a j-ésima função de identidade k-ária é simplesmente a função idk´j(n1,...,nk ) = n j para todo n1...nk ∈ N. (c) A função de sucessor é definida como succ(n) = n + 1 para todo n ∈ N. A seguir, apresentaremos duas maneiras simples de combinar funções para obter funções ligeiramente mais complexas. (1) Seja k, l ≥ 0, g: Nk → N uma função k-ária e sejam h1,...,hk funções l-árias. Então, a composição de g com h1,...,hk é a função l-ária definida como f(n1,...,nl) = g(h1( n1,...,nl),...,hk (n1,...,nl)). (2) Suponha que k ≥ 0, que g seja k-ária função e que h seja a função (k + 2) – ária. Então, a função definida recursivamente por g e h é função (k + 1) –ária f definida como f(n1,...,nk´0) = g(n1,...,nk ), f(n1,...,nk´ m + 1) = h(n1,...,nk´, m, f(n1,...,nk´m)) para todos n1,...,nk , m ∈ N As funções recursivas primitivas são todas as funções básicas e todas as funções que podem ser obtidas por elas por qualquer número de aplicações sucessivas de composição e definição recursiva. Exemplo 8 : A função plus2, definida como plus2(n) = n + 2 é recursiva primitiva, pois pode ser obtida a partir da função básica succ por uma composição com si própria. Em particular, suponha que k = l = 1 em (1) da Definição 3.10 e suponha que g = h1 = succ. Similarmente, a função binária plus, definida como plus(m,n) = m + n, é recursivamente primitiva, porque ela pode ser definida do mesmo modo a partir de funções obtidas por combinações, funções de identidade, zero e sucessor. Em particular, na Parte 2 da definição 3.10, iguale k = 1, assuma g como sendo a função id2,1 e suponha que h seja a função ternária h(m,n,p) = succ(id3,3 (m, n, p) – a composição de succ id3,3. A resultante função recursivamente definida é precisamente a função plus: plus(m,0) = m
plus(m, n + 1) = succ (plus(m,n)).
Cp3Turing
16
17/08/03
Profª. Jussara Maria Marins
Capítulo 3: Máquinas de Turing e Outras
A função de multiplicação mult(m,n) = m * n é definida recursivamente como mult(m,0) = m plus(m, n + 1) = plus(m, mult(m,n)), n e a unção exp(m,n) = m é definida como exp(m,0) = succ(zero(m)), exp (m, n + 1) = mult(m, exp(m,n). portanto, todas essas funções são recursivas primitivas. É relativamente claro que podemos calcular o valor de qualquer função recursiva primitiva para dados valores de seus argumentos. Também é igualmente evidente que podemos calcular a validez de asserções sobre números como m * n > m2 + n + 7, para quaisquer dados valores de m e n. É conveniente definir um predicado recursivo primitivo como sendo uma função recursiva primitiva que somente assume os valores 0 e 1. Intuitivamente, um predicado recursivo primitivo, como greater than (m,n) irá capturar uma relação que pode ou não ser aplicável ( ser verdadeiro) entre os valores de m e n. Se a relação que pode ou não do recursivo primitivo será 1, caso contrário 0. Exemplo 9 : A função iszero, que é 1 se n = 0 e 0 se n > 0, é um predicado recursivo primitivo, definido recursivamente, portanto: iszero(0) = 1, iszero(m + 1) = 0 Similarmente, isone(0) = 0 e isone(n + 1) = iszero(n). Exercício: 1. Definir o predicado positive(n), definindo antes sgn(n) 2. Definir a subtração não negativa, indicada por ~. Além disso, greater-than-or-equal(m,n), escrito m ≥ n, pode ser definido como iszero(n ~ m). Sua negação, less-than(m,n) é naturalmente "1 ~ greater-than-or-equal (m,n)", onde ~ é a subtração do exercício. Em geral, a negação de qualquer predicado recursivo primitivo também é um predicado recursivo primitivo. De fato, assim são a disjunção e a conjunção de dois predicados recursivos primitivos: p(m,n) ou q(m,n) é 1 ~ iszero(p,(m,n) + q(m,n) e p(m,n) e q(m,n) é 1 ~ iszero (p(m,n) * q(m,n)). Por exemplo, equal(m,n) pode ser definido como a conjunção de greater-than-or-equal (m,n) e greater-than-or-equal (n,m). Além disso, se f e g são funções recursivas primitivas e p é um predicado recursivo primitivo, todos os três com a mesma variável k, então a função definida por casos f(n1,...,nk) =
Cp3Turing
g (n1,...nk ), h (n1,...,nk ),
17
se p(n1,...,nk ); caso contrário
17/08/03
Profª. Jussara Maria Marins
Capítulo 3: Máquinas de Turing e Outras
também é recursiva primitiva, uma vez que pode ser reescrita como: f( n1,...,nk ) = p(n1,...,nk ) * g(n1,...,nk ) + ( 1~ p(n1,...,nk )) * h(n1,...,nk ) Como devemos ver, a definição por casos é uma abreviação muito útil. Exemplo 10: Podemos agora definir div e rem. mod(0, n) = 0, mod( m + 1 , n) =
0 mod(m,n) + 1
se equal (mod(m,n), pred(n)); caso contrário,
div(m + 1, n) + 1, div(m,n)
se equal (mod(m,n), pred(n)); caso contrário.
e div(0,n) = 0, div(m + 1, n) =
Outra função interessante que revela-se como sendo recursiva primitiva é digit(m,n,p), mésimo digito menos significativo da representação base p de n. (Como uma ilustração do uso de digit, o predicado odd(n), com o óbvio significado, pode ser gravado simplesmente como digit(1,n,2). É fácil verificar que digit(m,n,p) pode ser definido como div(mod(n,p ↑ m), p ↑ (m~ 1)). Exemplo 11: Se f(n,m) é uma função recursivamente primitiva, então a soma sumf (n,m) = f(n,0) + f(n,1) + ... + f(n,m) Também é recursiva primitiva, porque ela pode ser definida como sumf(n,0) = 0 e sumf (n, m + 1) = sumf (n,m) + f(n, m + 1). Também podemos definir desse modo as conjunções e disjunções ilimitadas dos predicados. Por exemplo, se p(n,m) é um predicado, a disjunção p(n,0) ou p(n,1) ou p(n,2) ou...ou p(n,m) é simplesmente sgn(sum p(n,m)) Definição 3.11: Suponha que g seja a função (k + 1)-ária, para algum k ≥ 0. A minimização de g é função k-ária f definida como segue: f(n1,...,nk ) =
o menor m tal que g(n1,...,nk´m) = 1, se um tal m existe; 0, caso contrário
Devemos denotar a minimização de g por µ m[g(n1,...,nk´m) = 1 ].
Cp3Turing
18
17/08/03
Profª. Jussara Maria Marins
Capítulo 3: Máquinas de Turing e Outras
Apesar de minimização de uma função g ser sempre bem definida, não há um método óbvio para computá-la – mesmo que saibamos como se computa g. O método óbvio m: = 0 enquanto g (n1,...,nk´m) ≠ 1 faça m: = m + 1; emitir m não é um algoritmo ,no sentido estrito de Papadimitriou, porque ele pode falhar em terminar. Vamos então chamar uma função g minimizável, se o método acima sempre terminar. Isto é, uma função (k + 1)-ária g é minimizável, se ela tem a seguinte propriedade: para cada n1,nk ∈ N, há um m ∈ N tal que g(n1,...nk´m) = 1. Por fim, chamamos uma função µ-recursiva, se ela pode ser obtida a partir das funções básicas pelas operações de composição, definição recursiva e minimização de funções minimizáveis. Note que agora não podemos repetir o argumento de diagonalização do exemplo 4.7.5 para mostrar que há uma função computável que não é µ-recursiva. A questão é que, dada uma definição propositada de uma função µ- recursiva, não é absolutamente claro se de fato ela define uma função µ-recursiva – isto é, se todas as aplicações de minimização nessa definição de fato atuam sobre funções minimizáveis! Exemplo 12: Definimos um inverso da adição (a função ~) e um inverso da multiplicação (a função div); mas e quanto ao inverso da exponenciação – logaritmo? Utilizando a minimização podemos definir a função logaritmo: log(m,n) é a menor potência à qual devemos elevar m + 2 para obter um inteiro pelo menos tão grande quanto n + 1 (isto é, log(m,n) = [logm+2 (n + 1)]; temos utilizado m + 2 e n + 1 como argumentos para evitar as armadilhas matemáticas na definição de logm n, quando m ⊂ 1 ou n = 0. A função log é definida como segue: log(m,n) = µ p[greater-than-or-equal ((m + 2) ↑ p, n + 1)]. Note que essa é uma definição apropriada de uma função µ-recursiva, uma vez que a função g(m,n,p) = greater-than-or-equal ((m + 2) ↑ p, n + 1) é minimizável: de fato, para qualquer m, n ≥ 0 há p ≥ 0, tal que (m + 2) p ≥ n – porque, elevando um inteiro ≥ 2 a potências cada vez maiores, podemos obter inteiros arbitrariamente grandes. Podemos agora provar o principal resultado desta seção: Teorema 3.4: A função f: Nk → N é µ-recursiva se, e somente se, ela é recursiva (isto é, computável por uma máquina de Turing).
Cp3Turing
19
17/08/03
Profª. Jussara Maria Marins
Capítulo 3: Máquinas de Turing e Outras
Trabalho em Grupo Outros Exemplos e Programas em trabalhos em grupo Trabalho teórico e pratico Uma máquina geral Uma máquina específica Um novo modelo Voltar para livro texto1 com os outros modelos de máquinas e as universais Máquina Norma Máquina de Post Máquinas com Pilha Máquinas com duas Pilhas
Cp3Turing
20
17/08/03
Profª. Jussara Maria Marins
Capítulo 3: Máquinas de Turing e Outras
Anexo: Revisão de Linguagens Formais Já trabalhamos com o conceito de string em um alfabeto que é uma seqüência de símbolos ou elementos, ou ainda "letras" desse alfabeto. Usualmente a seqüência é finita. Podemos identificar uma seqüência com uma nome dado por uma letra que não seja do alfabeto. Assim se Σ={a,bc} então podemos dizer que w= aab é uma seqüência de Σ .A seqüência vazia é indicada por e . O comprimento de um string é o comprimento da seqüência, medido em número do símbolos. É indicado pelas barras simples, assim |w|=3 , caso anterior e |e|=0. O comprimento estabelece uma função de um string w ∈Σ∗ e Σ. Dois strings podem ser combinados para formar um novo, pela operação de concatenação indicada pelo símbolo da composição ou pela simples justa-posiçao dos 2 strings. Assim se w=aab e v= bc então wv=aabbc. Um string v é substring de w, se somente se, há strings x e y tal que w=xvy. Tanto x como x poderiam ser o string vazio e. Logo e é substring de qualquer string. Se w= xv para algum x então v sufixo de w; se w= vy para algum y então v é prefixo de w. A seqüência wi , sendo i um natural é definida por indução por: w0=e ; wi+1 = wi °w; onde ° indica a concatenação, Uma linguagem L é qualquer conjunto de strings de um alfabeto Σ, isto é qualquer subconjunto de Σ é uma linguagem. Se Σ é um alfabeto finito, então Σ∗ é um conjunto infinito e enumerável ou contavelmente enumerável. As linguagens podem ser operadas como conjuntos, com a união, interseção e diferença. Alem há outra operação chamada de Fecho de Kleene ou estrela de Kleene. O fecho de Kleene é indicado, sugestivamente por L* que é o conjunto de todos os strings obtidos pela concatenação de zero ou mais strings de L. Descrever uma linguagem pode ser uma tarefa muitíssimo complicada quando se trata de uma linguagem natural. Na computação estamos interessados em certos tipos de linguagens. Se a linguagem é finita, a simples enumeração de todos seus strings é viável. Caso contrário, precisamos de outros mecanismos. Exemplo 1: Seja L={w ∈{0,1}*| w tem 2 ou 3 ocorrências de1, sendo que a primeira e a segunda não são consecutivas}. Essa linguagem pode ser descrita como {0}*o {1} o {0}* o {0} o {1} o {0}* o{ {1} o {0}*} ∪ φ* Dispensando as chaves temos: L=0*10*010*(10* ∪ φ*) Este é um exemplo de uma linguagem do tipo Regular. Ou seja descrita, exclusivamente por meio de símbolos únicos e do vazio. Isto caracteriza uma expressão regular. Definimos uma expressão regular como: (1) φ e cada elemento de Σ são expressões regulares; (2) Se α e β são expressões regulares, então a concatenação αβ também o é; (3) Se α e β são expressões regulares, então a união α ∪ β também o é; (4) Se α é uma expressão regular, então α∗ também é regular; (5) Nada mais é expressão regular, a menos que deduzida de (1) a (4). Toda expressão regular representa uma Linguagem. Se α é uma expressão regular então L(α) é uma Linguagem representada por α. A função L é definida como: (1) L (φ)=φ . ( Em alguns livros temos 2 símbolos diferentes para a linguagem vazia e o conjunto vazio.) e L (α)=α, ∀α∈Σ (2) Se α e β são expressões regulares, então L(αβ) = L( α) L(β); (3) Se α e β são expressões regulares, então L(α∪β) = L( α)∪L(β); (4) Se α é uma expressão regular, então L(α∗)=L(α)*. ∗
Exemplo: Descrever L(((α∪ b ∗ a)
Cp3Turing
21
17/08/03
Profª. Jussara Maria Marins L(((
α∪ b ∗ a)
Capítulo 3: Máquinas de Turing e Outras
(α∪ b ∗) L(a) por (2) = L( (α∪ b ∗) {α} por (1) = L( (α∪ b )∗ {α} por (4) = (L(α) ∪ L(b))*{a} por(3) =({a} ∪ { b})*{a} por (1) duas vezes ={a,b}*{a} ={w∈{a,b}* w termina com a} L(
Um Autômato Finito Determinístico é uma quíntupla M=(K, Σ,δ,s,F) onde K ó conjunto finito de estados; Σ é um alfabeto; δ é uma função de transição, s é o estado inicial e F é um subconjunto de K, constituído pelos estados finais. O AFD é semelhante à Máquina de Turing mas não possui um modo de armazenar certas informações. O AF, na realidade pode ser determinístico ou não. Pode ser representado graficamente por um grafo dirigido, chamado de diagrama de estados, onde os nós representam os estados e as arestas as transições. A aresta que vai do estado q para q' é rotulada por a, sempre que δ (q, a) = q'. Exemplo: M=( K, Σ,δ,s,F) onde K={q0,q1} , Σ={α,β}, s=q0 e F={q0} e a função delta é dada por: q σ δ(q,σ) q0 a q0 q0 b q1 q1 a q1 q1 b q0 Logo L(M) é o conjunto de todos os strings em {a,b}* que têm um número par de b's. A representação por diagrama de estados é: b
a
a
q0
q1 b
Vejamos que para a entrada aabba no estado inicial temos: ├ (q0,abba) (q0,aabba) ├ (q0,bba) ├ (q1,ba) ├ (q0,a) ├ (q0,e). ├ *M(q0,e) Logo aabba é aceita por L(M) ou (q0,aabba) Vejamos resumidamente outros resultados, sem as devidas provas, que podem ser encontradas no livro texto do Papadimitrou ou em outro livro da bibliografia de Teoria da Computação ou Linguagens Formais. Teorema 1: A classe das linguagens aceitas por autômato finitos é fechada sob (a) união; (b) interseção (c) fecho de Kleene (d) complementação (e) concatenação. Teorema 2: Uma linguagem é regular se, e somente se, ela é aceita por um autômato finito. Teorema 3: Se linguagem tempo θ(|w|).
L
é regular então existe um algoritmo que dado w ∈Σ*, testa se w∈
L
num
Teorema 4: Se M=(K, Σ, δ, s, F) é um autômato finito não determinístico então existe um algoritmo que dado que dado w∈Σ*, testa se w∈ L(M) num tempo θ(|K|2 |w|).
Cp3Turing
22
17/08/03
Profª. Jussara Maria Marins
Capítulo 3: Máquinas de Turing e Outras
Um autômato de Pilha é um autômato com mais um alfabeto Γ , com os símbolos da Pilha, com dispositivo armazenador do tipo Pilha, permitindo a leitura e gravação só no topo da Pilha. Existem linguagens que não são regulares. O número de AF é enumerável ao passo que o conjunto de todas as linguagens não é enumerável, logo há linguagens que não são regulares. As seguintes linguagens não são regulares; i) L={an bn| n≥0} ii) L={an| n é primo} iii) L={ an bam b m+n| m,n ≥1} não é regular. Uma linguagem chamada Livre do Contexto é gerada por expressões do tipo A →aA , independente do contexto onde se aplica a transformação. Teorema 5: A classe das linguagens aceitas por um autômato de pilha é a classe das linguagens livres do contexto. Teorema 6: Existe um algoritmo polinomial que dado uma linguagem livre do contexto, constrói um Autômato de pilha equivalente.
Cp3Turing
23
17/08/03
Profª. Jussara Maria Marins
Capítulo 3: Máquinas de Turing e Outras
Anexo: Revisão de Linguagens Formais Já trabalhamos com o conceito de string em um alfabeto que é uma seqüência de símbolos ou elementos, ou ainda "letras" desse alfabeto. Usualmente a seqüência é finita. Podemos identificar uma seqüência com uma nome dado por uma letra que não seja do alfabeto. Assim se Σ={a,bc} então podemos dizer que w= aab é uma seqüência de Σ .A seqüência vazia é indicada por e . O comprimento de um string é o comprimento da seqüência, medido em número do símbolos. É indicado pelas barras simples, assim |w|=3 , caso anterior e |e|=0. O comprimento estabelece uma função de um string w ∈Σ∗ e Σ. Dois strings podem ser combinados para formar um novo, pela operação de concatenação indicada pelo símbolo da composição ou pela simples justa-posiçao dos 2 strings. Assim se w=aab e v= bc então wv=aabbc. Um string v é substring de w, se somente se, há strings x e y tal que w=xvy. Tanto x como x poderiam ser o string vazio e. Logo e é substring de qualquer string. Se w= xv para algum x então v sufixo de w; se w= vy para algum y então v é prefixo de w. A seqüência wi , sendo i um natural é definida por indução por: w0=e ; wi+1 = wi °w; onde ° indica a concatenação, Uma linguagem L é qualquer conjunto de strings de um alfabeto Σ, isto é qualquer subconjunto de Σ é uma linguagem. Se Σ é um alfabeto finito, então Σ∗ é um conjunto infinito e enumerável ou contavelmente enumerável. As linguagens podem ser operadas como conjuntos, com a união, interseção e diferença. Alem há outra operação chamada de Fecho de Kleene ou estrela de Kleene. O fecho de Kleene é indicado, sugestivamente por L* que é o conjunto de todos os strings obtidos pela concatenação de zero ou mais strings de L. Descrever uma linguagem pode ser uma tarefa muitíssimo complicada quando se trata de uma linguagem natural. Na computação estamos interessados em certos tipos de linguagens. Se a linguagem é finita, a simples enumeração de todos seus strings é viável. Caso contrário, precisamos de outros mecanismos. Exemplo 1: Seja L={w ∈{0,1}*| w tem 2 ou 3 ocorrências de1, sendo que a primeira e a segunda não são consecutivas}. Essa linguagem pode ser descrita como {0}*o {1} o {0}* o {0} o {1} o {0}* o{ {1} o {0}*} ∪ φ* Dispensando as chaves temos: L=0*10*010*(10* ∪ φ*) Este é um exemplo de uma linguagem do tipo Regular. Ou seja descrita, exclusivamente por meio de símbolos únicos e do vazio. Isto caracteriza uma expressão regular. Definimos uma expressão regular como: (6) φ e cada elemento de Σ são expressões regulares; (7) Se α e β são expressões regulares, então a concatenação αβ também o é; (8) Se α e β são expressões regulares, então a união α ∪ β também o é; (9) Se α é uma expressão regular, então α∗ também é regular; (10) Nada mais é expressão regular, a menos que deduzida de (1) a (4). Toda expressão regular representa uma Linguagem. Se α é uma expressão regular então L(α) é uma Linguagem representada por α. A função L é definida como: (5) L (φ)=φ . ( Em alguns livros temos 2 símbolos diferentes para a linguagem vazia e o conjunto vazio.) e L (α)=α, ∀α∈Σ (6) Se α e β são expressões regulares, então L(αβ) = L( α) L(β); (7) Se α e β são expressões regulares, então L(α∪β) = L( α)∪L(β); (8) Se α é uma expressão regular, então L(α∗)=L(α)*. ∗
Exemplo: Descrever L(((α∪ b ∗ a)
Cp3Turing
24
17/08/03
Profª. Jussara Maria Marins L(((
α∪ b ∗ a)
Capítulo 3: Máquinas de Turing e Outras
(α∪ b ∗) L(a) por (2) = L( (α∪ b ∗) {α} por (1) = L( (α∪ b )∗ {α} por (4) = (L(α) ∪ L(b))*{a} por(3) =({a} ∪ { b})*{a} por (1) duas vezes ={a,b}*{a} ={w∈{a,b}* w termina com a} L(
Um Autômato Finito Determinístico é uma quíntupla M=(K, Σ,δ,s,F) onde K ó conjunto finito de estados; Σ é um alfabeto; δ é uma função de transição, s é o estado inicial e F é um subconjunto de K, constituído pelos estados finais. O AFD é semelhante à Máquina de Turing mas não possui um modo de armazenar certas informações. O AF, na realidade pode ser determinístico ou não. Pode ser representado graficamente por um grafo dirigido, chamado de diagrama de estados, onde os nós representam os estados e as arestas as transições. A aresta que vai do estado q para q' é rotulada por a, sempre que δ (q, a) = q'. Exemplo: M=( K, Σ,δ,s,F) onde K={q0,q1} , Σ={α,β}, s=q0 e F={q0} e a função delta é dada por: q σ δ(q,σ) q0 a q0 q0 b q1 q1 a q1 q1 b q0 Logo L(M) é o conjunto de todos os strings em {a,b}* que têm um número par de b's. A representação por diagrama de estados é: b
a
a
q0
q1 b
Vejamos que para a entrada aabba no estado inicial temos: ├ (q0,abba) (q0,aabba) ├ (q0,bba) ├ (q1,ba) ├ (q0,a) ├ (q0,e). ├ *M(q0,e) Logo aabba é aceita por L(M) ou (q0,aabba) Vejamos resumidamente outros resultados, sem as devidas provas, que podem ser encontradas no livro texto do Papadimitrou ou em outro livro da bibliografia de Teoria da Computação ou Linguagens Formais. Teorema 1: A classe das linguagens aceitas por autômato finitos é fechada sob (f) união; (g) interseção (h) fecho de Kleene (i) complementação (j) concatenação. Teorema 2: Uma linguagem é regular se, e somente se, ela é aceita por um autômato finito. Teorema 3: Se linguagem tempo θ(|w|).
L
é regular então existe um algoritmo que dado w ∈Σ*, testa se w∈
L
num
Teorema 4: Se M=(K, Σ, δ, s, F) é um autômato finito não determinístico então existe um algoritmo que dado que dado w∈Σ*, testa se w∈ L(M) num tempo θ(|K|2 |w|).
Cp3Turing
25
17/08/03
Profª. Jussara Maria Marins
Capítulo 3: Máquinas de Turing e Outras
Um autômato de Pilha é um autômato com mais um alfabeto Γ , com os símbolos da Pilha, com dispositivo armazenador do tipo Pilha, permitindo a leitura e gravação só no topo da Pilha. Existem linguagens que não são regulares. O número de AF é enumerável ao passo que o conjunto de todas as linguagens não é enumerável, logo há linguagens que não são regulares. As seguintes linguagens não são regulares; iv) L={an bn| n≥0} v) L={an| n é primo} vi) L={ an bam b m+n| m,n ≥1} não é regular. Uma linguagem chamada Livre do Contexto é gerada por expressões do tipo A →aA , independente do contexto onde se aplica a transformação. Teorema 5: A classe das linguagens aceitas por um autômato de pilha é a classe das linguagens livres do contexto. Teorema 6: Existe um algoritmo polinomial que dado uma linguagem livre do contexto, constrói um Autômato de pilha equivalente.
Cp3Turing
26
17/08/03
TESE DE CHURCH E INDECIBILIDADE O que vimos, o que ainda falta.... e o que será lido agora. 1. Ferramentas matemáticas básicas 2. Máquina de Turing 3. Tese de Church 3.1 Hipótese /Tese de Church 3.2 Gramáticas 3.3 Funções primitivas recursivas 3.4 Máquinas de Turing Universais 4. Indecidibilidade 4.1 Problema da Parada 4.2 Enumerabilidade de máquinas de Turing 4.3 Recursão 4.4 Conjuntos recursivos e recursivamente enumeráveis 4.5 Teorema de Gödel e Gödelização O texto a seguir oferece um resumo dos itens acima que estão salientados e servirão de material de leitura e estudo para fecho (não algébrico, nem computacional) do curso. Os itens salientados serão usados no debate/P3, para o qual fornecerei mais detalhes, ou seja, as regras e perguntas básicas do debate no final. Capítulo 3:A TESE DE CHURCH – TURING O que pode ser computado? Quando um problema tem solução computacional? O que não pode ser computado? Como saber se o algoritmo está correto, para todas entradas especificadas? Quando uma solução computacional é eficiente? Existem vários modelos matemáticos diferentes dos processos computacionais que executam tarefas concretas nessa área. É esperado que o sujeito das 3 perguntas iniciais esteja no contexto dos problemas que são formuláveis numa linguagem matemática ou computacional. Até hoje não sei de ninguém que pense em resolver problemas para decidir se um quadro de Picasso vale mais1 do que um de Monet, ou ainda se casa ou compra uma bicicleta por meio de um computador. Talvez até possa acontecer isso, num futuro de mais ou menos 500 anos ou 100 anos ou nunca. Uma resposta simples para a primeira questão é verificar se temos ou não um algoritmo para resolver o problema. Normalmente tendo um algoritmo podemos criar, mais ou menos facilmente um programa. 1
É claro que existem mecanismos de estabelecer preços...em função de prioridades e expectativas de leilões, etc., mas isto não é o valor, por completo. No valor de algo está subentendido um conceito emocional ou mesmo morale não só o preço.
1
Os problemas oriundos das ciências da natureza como Física, Química e Biologia, em geral são descritos por um modelo de equações matemáticas. Com o ferramental matemático decidimos se vamos resolver o problema analítica ou numericamente. É claro, que no caso da matemática temos um grande conjunto de áreas e nestas se conhece se o determinado problema tem solução ou não. Além disso, os matemáticos também se preocupam muito se a solução é única ou não, ou mesmo se há infinitas soluções do problema. Assim se o problema envolve a solução de uma equação diferencial de primeira ordem linear, sabemos que, sob certas condições há infinitas soluções e se temos uma condição inicial podemos ter uma só solução. Outros problemas são oriundos de áreas da própria matemática. Existem outros que não das ciências da natureza e que também possuem uma formulação matemática, como por exemplo, o problema da torres de Hanói. Com isso vemos que os problemas que são tratados pela computação vão além dos problemas da matemática ou das ciências da natureza. De posse de um algoritmo temos que analisá-lo e decidir se está correto e é eficiente. Não temos um algoritmo para determinar se outro algoritmo está correto ou não; se é eficiente ou não; se ele pára ou não. Podemos decidir isto, analisando o algoritmo passo a passo, pelo nosso intelecto, mas não podemos escrever um algoritmo ou programa que faça isto. O estudo do problema da eficiência de uma algoritmo pode ser superficialmente resumido no seguinte: Os problemas que são solucionados por um algoritmo de tempo polinomial são chamados de Problemas Tratáveis, ou Não tratáveis, no caso de complexidade superpolinomial ou exponencial. Os problemas de complexidade linear são considerados como uma classe especial, dentro da classe dos polinomiais. Vamos chamar esta classe de Classe 1. São exemplos da Classe 1: 1. Intercalação de dois vetores diferentes, sendo que cada um deles já está ordenado. Esta é a parte linear do método MergeSort. 2. Cálculo de médias em um vetor. 3. Cálculo do maior ou do menor elemento de um vetor. 4. Pesquisa Linear de um elemento numa lista já ordenada. 5. Determinação de componentes biconexos, ou fortemente conexos em grafos. Os problemas de ordenação comum são exemplos de algoritmos quadráticos, o tempo de execução é θ (n 2 ) e o problema da multiplicação da cadeia de matrizes é 3 θ (n ). A classe 2 é a classe dos problemas que são resolvidos com tempo polinomial, ou ainda classe P. Há problemas que estão na classe P e a descoberta ou criação de um novo algoritmo o desloca para a classe 1. Um exemplo é o problema da planaridade de grafos. U grafo é planar se ele pode ser construído de forma que nenhuma das arestas se intersecciona. Até 1971 o problema pertencia a classe P e com a publicação do artigo de Hopcroft e Tarjan ele passou a ter um algoritmo linear. O estudo da complexidade de algoritmos é uma das áreas da computação que tem problemas de pesquisa tanto em aspectos usualmente chamados de práticos como em outros chamados de teóricos. Em teoria da computação estudamos mais detalhadamente o modelo da Máquina de Turing. Outros modelos importantes são: 2
• • • • •
Máquina de Post Máquina com Pilhas( pelo menos 2 delas) Autômato com 2 pilhas Máquina de Registradores Linguagem Lambda ou λ-cálculo.
Máquina de Post: Esta máquina usa uma fila para entrada e saída de dados e também para memória de trabalho. É dada por uma terna M=(Σ,D,#) onde Σ é o alfabeto dos símbolos de entrada; D é um programa ou diagrama de fluxos, construído a partir de modelos elementares denominados partida, parada, desvio e atribuição e # é um símbolo auxiliar. Há uma variável X que pode ser qualquer palavra do alfabeto. As componentes elementares de um diagrama de fluxos são: a) Partida: Existe somente uma instrução de início (partida). Partida
b) Parada: Existem duas situações de parada: uma pela aceitação: Aceita e a outra pela rejeição: Rejeita
Aceita
Rejeita
c) Desvio ou Teste: São baseados na variável X : cabeça(x) e Cauda(X). Determina o fluxo do programa de acordo com o símbolo mais à esquerda da palavra armazenada em X( início da fila). Se X é vazia então é um desvio incondicional Para esta instrução subentende-se que há uma leitura de X e que esta é destrutiva, isto é: X ←ler(X) , significa que o símbolo mais à esquerda da palavra é retirado da mesma. Conforme for este símbolo, o desvio é feito. Por exemplo, se Σ={a,b} podemos ter o seguinte esquema de fluxo para o teste X
a
Ler(X)
b
#
d) Atribuição: Concatena um símbolo distinguido do alfabeto, incluindo o símbolo auxiliar à direita da palavra armazenada na variável X( fim da fila)
3
Um exemplo da Máquina de Post, que mostra suas características é dado pela máquina que faz o reconhecimento da Linguagem não regular L={a n bn | n≥0}. Esta é a máquina chamada de Duplo Balanceamento. Foi visto que não pode existir um Autômato Finito determinístico que reconheça L. No capítulo vimos que existe uma Máquina de Turing que reconhece L. Vimos que com a máquina de Turing podemos formalizar três aspectos importantes para que tenhamos modelos matemáticos para processos fundamentais que caracterizam a Computação como uma ciência autônoma. A máquina de Turing executa um algoritmo, computando todas as funções matemáticas básicas, reconhece uma linguagem formal e é um computador. 3.1. HIPÓTESE /TESE DE CHURCH Existem, portanto, vários modelos matemáticos diferentes dos processos computacionais que executam tarefas concretas nessa área – em particular, decidir, semidecidir ou gerar linguagens e computar funções. Por fim, tentando formalizar nossas intuições2 sobre quais funções numéricas podem ser consideradas computáveis, definimos uma classe de funções que se revelaram como sendo especificamente as recursivas. A seguir temos trechos quase completos do Livro de Elementos Teoria da Computação do Padrimitriou que é uma tradução de Edson Furmankiewicz, relativos à tese de Church. Tudo isso sugere que alcançamos um limite superior natural sobre o que um dispositivo computacional pode ser projetado para fazer; essa nossa procura pela noção matemática definitiva e mais geral de um processo computacional de um algoritmo foi concluída com sucesso – e a máquina de Turing é a resposta certa. Entretanto, vimos também no último capítulo que não são todas as máquinas de Turing que merecem ser chamadas “algoritmos3”: argumentamos que máquinas de Turing que semidecidem linguagens e que, portanto, rejeitam por nunca parar, não são dispositivos computacionais úteis, enquanto as máquinas de Turing que decidem linguagens e computam funções (e, deste modo, param em todas as entradas) o são. Nossa noção de um algoritmo deve excluir máquinas de Turing que não podem parar em entradas. Assim, propomos adotar a máquina de Turing que pára em todas as entradas como a noção formal precisa correspondente para a intuitiva idéia de um “algoritmo”. Nada será considerado como um algoritmo se não puder ser reproduzido como uma máquina de Turing, cuja parada é garantida em todas as entradas, e todas serão corretamente chamadas algoritmos. Esse 2
Por intuitivo, entendemos aquilo que se compreende diretamente, sem explicações intermediárias ou formalismos. 3 Esta colocação é uma opinião do autor.
4
princípio é conhecido como a tese de Church-Turing. Pode ser formulada de diversas formas. " A capacidade computação representada pela Máquina e Turing é o limite máximo que pode ser atingido por qualquer dispositivo de computação ".
"Qualquer função computável pode ser computada por uma máquina deTuring". Ela é uma tese4, não é um teorema, porque não é um resultado matemático: ela simplesmente afirma que um certo conceito informal (algoritmo)5 corresponde a um certo objeto matemático (máquina de Turing). Não sendo uma instrução 6matemática, a tese de Church-Turing não pode ser provada. Teoricamente é possível., entretanto, que a tese de ChurchTuring possa ser “desprovada” em alguma data no futuro, se alguém propuser um modelo alternativo de computação que seja publicamente aceitável como plausível e razoável e que, ainda, seja comprovadamente capaz de realizar computações que não podem ser realizadas por qualquer máquina de Turing. Ninguém considera isso provável. Adotar uma noção matemática precisa de um algoritmo abre a intrigante possibilidade de formalmente provarmos que certos problemas computacionais não podem ser resolvidos por algoritmo algum. Já sabemos o suficiente para esperar isso. No Capítulo 1, argumentamos que, se strings são utilizadas para representar linguagens, nem toda linguagem pode ser representada: há somente um número finito de strings sobre um alfabeto, mas há um número infinito de linguagens. Autômatos finitos, autômatos de pilha, gramática livre de contexto, gramática irrestrita e máquinas de Turing são todos exemplos de objetos finitos que podem ser utilizados para especificar linguagens e que podem ser, eles próprios, descritos por strings (na próxima seção desenvolveremos em detalhes um particular modo de representar máquinas de Turing como strings). Correspondentemente, há somente um número finito de linguagens recursivas e linguagens enumeráveis recursivamente sobre qualquer alfabeto. Assim, apesar de trabalharmos duro para estender ao máximo as capacidades das máquinas de computar, em termos absolutos, elas podem ser utilizadas para semidecidir ou decidir somente uma fração infinitesimal de todas as possíveis linguagens. Utilizar argumentos cardinalmente para estabelecer a limitação de nossa abordagem é trivial: descobrir exemplos particulares de tarefas 4
Um teorema é composto de uma hipótese e uma tese e conforme vimos no capítulo todo teorema simples é um condicional p q, onde p é a hipótese e q é a tese. A demonstração consiste em partir de p e por axiomas ou outros teoremas anteriores chegar à q, na prova direta. 5 Na realidade podemos ter uma algoritmo, assim como também um programa que não pára, ou melhor que decididamente desejaríamos que nunca parasse. Por exemplo um Sistema Operacional, a menos que desligássemos a máquina voluntariamente. 6 No original encontramos "mathematical statement" ou seja "afirmação matemática". →
5
computacionais que não podem ser realizadas dentro de um modelo é muito mais interessante e recompensador. Em capítulos anteriores, tivemos sucesso em descobrir certas linguagens que são regulares ou livres de contexto; neste capítulo faremos o mesmo para linguagens recursivas. No capítulo anterior vimos que o tipo de linguagem reconhecida por uma máquina de Turing é chamada de Linguagem Enumerável Recursivamente como na Definição 2.3.1. Há duas diferenças importantes, entretanto. Primeiro, esses novos resultantes7 negativos não são apenas recuos temporários para serem remediados em um capítulo posterior em que um mesmo dispositivo computacional mais poderoso será definido: de acordo com a tese de Church-Turing, tarefas computacionais que não são recursivas são impossíveis e sem esperança indecidíveis. Segundo, nossos métodos para provar que linguagens não são recursivas seriam diferentes dos teoremas de “bombeamento8” utilizados para explorar a fragilidade da gramática livre de contexto e autômatos finitos. Em vez disso, devemos expor técnicas para explorar o considerável poder das máquinas de Turing, a fim de mostrarmos sua limitações. O aspecto do poder das máquinas de Turing que iremos explorar é um tipo de capacidade introspectiva que elas possuem: apontaremos que as máquinas de Turing podem receber codificações delas mesmas como entradas e manipular essas codificações de maneiras interessantes. Então, perguntamos o que acontece quando uma máquina de Turing manipula uma codificação por si própria – uma aplicação engenhosa e mais simples do princípio da diagonalização.9 Como codificar uma máquina de Turing de modo que ela possa ser manipulada por outra(ou pela mesma) máquina de Turing é, portanto, nosso próximo assunto. 3.2. GRAMÁTICAS 3.3. FUNÇÕES PRIMITIVAS RECURSIVAS Não veremos os itens 3.2 e 3.3 3.4. MÁQUINAS DE TURING UNIVERSAIS
A base da computação é o hardware ou o software? Você pode ter uma opinião sobre esse assunto – e sobre se a questão é significativa e produtiva. Mas o fato é que o formalismo para algoritmos que introduzimos e desenvolvemos no último capítulo – a máquina de Turing – é uma peça de hardware “não programável”, especializada em resolver um problema em particular, com instruções que são “construídas de fábrica10”. 7 8 9
Results, devia ser traduzidos por resultados, simplesmente, e não resultante. "Pumping". Ver um exemplo no livro do Robinson Moreira Tenório com a Érika. "hard-wired at the factory"
10
6
Devemos agora pegar o ponto de vista oposto. Devemos discutir que máquinas de Turing também são softwares. Isto é, mostrar que há uma certa máquina de Turing “genérica” que pode ser programada, mais ou menos da mesma maneira como pode sê-lo um computador de propósito geral, para solucionar qualquer problema que possa ser resolvido por máquina de Turing. O “programa” que faz essa máquina genérica comportar-se como uma máquina específica M deve ser uma descrição de M. Em outras palavras, devemos pensar o formalismo das máquinas de Turing como uma linguagem de programação na qual podemos escrever programas. Programas escritos nessa linguagem podem então ser interpretados por uma máquina de Turing universal – o que significa dizer, outro programa na mesma linguagem. A idéia de que um programa gravado em uma linguagem pode interpretar qualquer programa na mesma linguagem não é uma idéia muito nova – ela é base do método clássico para processadores de linguagem de “rotina de partida” (bootstrapping)11. Mas, a fim de continuar com nosso projeto neste livro, devemos tomar este ponto preciso no contexto das máquinas de Turing. Para começar, devemos apresentar um modo geral de especificar as máquinas de Turing, de modo que suas descrições possam ser utilizadas com entradas para outras máquinas de Turing. Ou seja, devemos definir uma linguagem cujas strings sejam todas representações legais das máquinas de Turing. Um problema já se manifesta sozinho: independentemente do tamanho do alfabeto que escolhermos para essa representação, haverá máquinas de Turing que têm mais estados e mais símbolos de fita como strings sobre um alfabeto fixo. Adotamos a seguinte convenção: a string representando um estado da máquina de Turing tem a forma {q}{0,1}*; isto é, a letra q, seguida por uma string binária. Similarmente, um símbolo de fita é sempre representado como uma string em {a}{0,1}*. Supondo que M = (K, Σ, δ, s, H) seja uma máquina de Turing e que i e j sejam os menores inteiros, tal que 2i ≥ K e 2 j ≥ Σ+ 2. Então, cada estado em K será representado como um q seguido por uma string binária de comprimento i; cada símbolo em Σ será, do mesmo modo, representado como a letra a seguida por uma string de j bits. As direções da cabeça ← e → também serão tratadas como “símbolos de fita honorários” (eles eram a razão para o termo “+2” na definição de j). Fixamos as representações dos símbolos especiais ß, ►, ← e → para serem os quatro lexicograficamente menores símbolos, respectivamente: ß será sempre representado como a0 j, j-1 j-2 j-2 ► como a0 , ← como a0 10 e → a0 11. O estado inicial será sempre representado como o primeiro estado lexicográfico, q0i. Note que requeremos o uso de zeros iniciais nas strings que se seguem aos símbolos a e q, para tornar o comprimento total compatível com o nível exigido. 11
Nota do autor: Os implementadores de uma linguagem muitas vezes escrevem tradutores para uma linguagem de programação na mesma linguagem de programação. Mas como o tradutor traduz a si proprio? Um modo de fazer isso é o seguinte: escrever o tradutor em um segmento simples da mesma linguagem, deixando de fora os recursos mais sofisticados ( e difíceis de traduzir) da linguagem. Então escreva um tradutor para este fragmento - uma tarefa muito simplificada- em uma versão ainda mais reduzida da linguagem. Continue desse modo até que a sua linguagem seja tão simples e explicita que pareça linguagem assembly e assim possa ser traduzida diretamente.
7
Devemos denotar a representação de toda máquina de Turing M como “M” . “M” consiste da tabela de transição δ. Isto é, ela é uma seqüência de strings na forma (q, a, p, b), com q e p representações de estados e a e b de símbolos, separados por vírgulas e incluídos entre parênteses. Adotamos a convenção de que os quádruplos são relacionados em uma ordem lexicográfica crescente, começando com δ(s, ß). O conjunto de estados de parada H será determinado indiretamente pela falta de seus estados como primeiros componentes em qualquer quádruplo de “M”. Se M decide uma linguagem e, portanto, H = {y,n}, adotaremos a convenção de que y é, lexicograficamente, o menor dos dois estados de parada. Dessa maneira, qualquer máquina de Turing pode ser representada. Devemos utilizar o mesmo método para representar strings no alfabeto da máquina de Turing. Qualquer string w ∈ Σ* terá uma única representação, também denotada “w”, a saber, a justaposição das representações de seus símbolos.
Exemplo 1: Considere a máquina de Turing M = (K, Σ, δ, s, {h}), onde
K = {s, q, h}, Σ = {ß, ►, a) e δ é dado nessa tabela. Estado s s s q q q
Símbolo a ß ►
a ß ►
δ (q, ß) (h, ß) (s,→) (s, a) (s, →) (q, →)
Uma vez que há três estados em K e três símbolos em Σ, temos i = 2 e j = 3. Estes são os menores inteiros, tal que 2i ≥ 3 e 2 j ≥ 3 + 2. Os estados e símbolos são representados como segue: estado/símbolo S Q H ß ►
← → A
representação q00 q01 q11 a000 a001 a010 a011 a100
8
Portanto, a representação da string ► aa ß a é “► aa ß a” = a001a100a100a000a100. A representação “M” da máquina de Turing M é a seguinte string: “M” = (q00, a100, q01, a000), (q00, a000, q11, a000), (q00, a001, q00, a011), (q01, a100, q00, a011), (q01, a000, q00, a011), (q01, a001, q01, 011). Agora estamos prontos para discutir uma máquina de Turing Universal U, que utiliza codificações de outras máquinas como programas para direcionar sua operação. Intuitivamente, U tem dois argumentos: uma descrição de uma máquina M, “M”, e uma descrição de uma string de entrada w , “w”. Queremos que U tenha a seguinte propriedade: U pára na entrada “M” “w”, se, e somente se, M parar na entrada w. Para utilizar a notação funcional para máquinas de Turing, devemos desenvolver no último capítulo, U (“M” “w”) = “M(w)”. De fato, descrevemos não uma máquina de uma única fita U, mas uma máquina de 3 fitas U’ intimamente relacionada (então U será a máquina de Turing de uma única fita que simula U’). Especificamente, U’ utiliza suas três fitas como segue: a primeira contém a codificação do conteúdo da fita atual de M; a segunda contém a codificação do próprio M; e a terceira fita contém a codificação do estado M no atual ponto da computação simulada. A máquina U’ é iniciada com alguma string “M” “w” em sua primeira fita e as outras duas fitas com espaços em branco. (Não importa como U’ se comporta, se sua string de entrada não está nessa forma). Primeiro, U’ move “M” na Segunda fita e desloca “w” para baixo, para o final esquerdo da primeira fita, precedendo-a com “►ß”. Portanto, neste ponto a primeira fita contém “►ßw”. U’ grava na terceira fita a codificação do estado inicial s de M, sempre q0i (U’ pode facilmente determinar i e j, examinando “M”). Agora U’ passa a simular os passos da computação de M. Entre esses passos simulados, U’ manterá as cabeças da Segunda e terceira fitas nos seus finais esquerdos, e a cabeça da primeira fita varre o a da versão codificada do símbolo que M estaria varrendo no tempo correspondente. U’ simula um passo de M como segue: ele varre sua segunda fita até encontrar um quádruplo cujo primeiro componente corresponde ao estado codificado gravado em sua terceira fita e cujo segundo componente corresponde ao símbolo codificado lida na primeira fita. Se encontra esse quádruplo, ele muda o estado para o terceiro componente. Se o quarto componente codifica um símbolo do alfabeto da fita de M, esse símbolo é gravado na primeira fita. Se o quarto componente é a0 j-210, (a codificação de ←), então U’ move sua primeira cabeça para o primeiro símbolo a à esquerda e, se for a codificação de →, para a direita. Se um ß é encontrado, U’ deve convertê-lo para a0 j, o código de um espaço em branco de M.
9
Se em algum passo a combinação de estado símbolo não é encontrada na Segunda fita, isso significa que o estado é um estado de parada. U’ também pára em um estado apropriado. Isso completa nossa descrição da operação de U’. 4. Indecidibilidade Problema da Parada Enumerabilidade de máquinas de Turing Recursão Conjuntos recursivos e recursivamente enumeráveis Teorema de Gödel e Gödelização 4.1. O PROBLEMA DA PARADA Suponha que você tenha gravado um programa em sua linguagem de programação favorita, que realiza o seguinte feito notável: pega como entrada qualquer programa P, gravado na mesma linguagem, e uma entrada X desse programa. Utilizando alguma engenhosa análise, seu programa sempre determina corretamente se o programa P irá parar na entrada X (ele retorna “sim” se isso acontece) ou se ele iria executar eternamente (ele retorna “não”). Você chamou esse programa de halts(P,X). Este é um programa inestimável. Ele descobre todos os tipos de bugs sutis que fazem outros programas executar eternamente em certas entradas. Utilizando esse programa, você pode conduzir com êxito muitas coisas notáveis. Eis um exemplo relativamente sutil: você pode utilizá-lo para escrever outro programa, com o nefasto nome de diagonal(X) (lembre-se da prova por diagonalização que 2N não é contável na Seção 1.5): diagonal (X) a: se halts(X,X), então vá para a, senão páre Note o que diagonal (X) faz: se seu programa halts decide que o programa X iria parar se lhe fosse apresentado ele próprio como entrada, então diagonal(X) faz um loop sem fim; caso contrário, ele pára. E agora vem a questão inexplicável: a função diagonal(diagonal) pára? Ela pára se, e somente se, a chamada halts(diagonal, diagonal) retorna “não”; em outras palavras, ela pára se, e somente se, ela não parar . Isso é uma contradição: devemos concluir que a única hipótese com que iniciamos esse caminho é falsa, que o programa halts(P,X) não existe. Isto é, não pode haver programa ou algoritmo para resolver o problema que halts resolveria: dizer se programas arbitrários iriam parar ou entra em loop. Esse tipo de argumento deve ser familiar apenas pela sua experiência com ciências da computação, mas também pela cultura geral do século XX. A questão é que agora introduzimos toda a parafernália necessária para
10
apresentar uma versão formal, matematicamente rigorosa, desse paradoxo. Temos uma completa notação para algoritmos, um tipo de “linguagem de programação”: a máquina de Turing. De fato, na última seção introduzimos uma nova característica de que precisamos: desenvolvemos uma estrutura que permite a nosso “programas” manipular outros programas e suas entradas – exatamente como o nosso o fictício halts(P,X) faz. Já estamos prontos, portanto, para definir uma linguagem que não é recursiva e provar que ela não o é. Suponha que H = {“M” “w”| a máquina de Turing M pára na string de entrada w} Note primeiro que H é enumerável recursivamente: ela é precisamente a linguagem semidecidida por nossa máquina de Turing universal U na seção anterior. De fato, na entrada “m””w”, U pára precisamente quando a entrada está em H. Além disso, se H é recursiva, então cada linguagem enumerável recursivamente é recursiva. Em outras palavras, H tem a chave para a pergunta que fizemos na Seção 4.212, se todas as linguagens enumeráveis recursivamente são também decidíveis por Turing: a resposta é positiva se, e somente se, H é recursiva. Para tanto, suponha que H é de fato decidida por alguma máquina de Turing M0. Então, dada qualquer máquina de Turing M particular que semidecide uma linguagem L(M), podemos projetar uma máquina de Turing M’ que decide L(M) como segue: primeiro, M’ transforma sua fita de entrada de ► ß w ß para ► “M” “w” ß e, então, simula M 0 nessa entrada. Por hipótese, M0 decidirá corretamente se M aceita w ou não. Antecipando as questões tratadas no Capítulo 7, podemos dizer que há reduções de todas as linguagens enumeráveis recursivamente para H, e , portanto, H é completo para a classe de linguagens enumeráveis recursivamente. Mas podemos mostrar, formalizando o argumento para halts(P,X) acima, que H não é recursiva . Primeiro, se H fosse recursiva, então
H1 = {“M”: a máquina de Turing M pára na string de entrada “M”} Também seria recursiva. (H1, significa a parte halts(X,X) do programa diagonal). Se existisse uma máquina de Turing M0 que pudesse decidir H, então uma máquina de Turing M1 que decidisse H1 necessitaria, tão somente, transformar sua string de entrada ► ß “M” em ► ß “M” “M” ß e, então, passar o controle para M0. Portanto, é suficiente mostrar que H1 não é recursiva. Segundo, se H1, fosse recursiva, então seu complemento também seria recursivo: H1 = {w | ou w não é a codificação de uma máquina de Turing ou w é a codificação de “M” de uma máquina de Turing M que não pára em “M”}.
12
A classe das linguagens recursivamente enumeráveis é fechada sob o complemento
11
Isso é assim, porque a classe de linguagens recursivas é fechada sob complemento (Teorema 4.2.2). Inicialmente, H1 é a linguagem diagonal, análoga ao nosso programa diagonal e o último ato da prova. Mas H1, não pode mesmo ser enumerável recursivamente – supondo que sozinho seja recursivo. Vamos supor que M* estava em uma máquina de Turing que semidecide H1. Está “M*” em H1? Por definição de H1, “M*” ∈ H1 se, e somente se, M* não aceita a string de entrada “M*”. Mas M* é suposto para semidecidir H1, assim, “M*” ∈ H1 se, e somente se, M* aceita “M*”. Temos concluído que M* aceita “M*” se, e somente se, M* não aceita “M*". Isso é absurdo, assim como a suposição de que M0 existe deve ter sido um erro. Vamos resumir o desenvolvimento desta seção. Queríamos descobrir se cada linguagem enumerável recursivamente é recursiva. Observamos que isso seria verdadeiro se e somente se, a particular linguagem enumerável recursivamente H fosse recursiva. De H deveríamos, em dois passos, a linguagem H1, a qual tem de ser recursiva a fim de que H seja recursiva. Mas a suposição de que H1 é recursiva conduz a uma contradição lógica, por diagonalização. Provamos, desse modo, o seguinte e mais importante teorema: Teorema 1: A linguagem H não é recursiva; portanto, a classe de
linguagens recursivas é um estrito subconjunto da classe das linguagens enumeráveis recursivamente. Tínhamos dito anteriormente que esse argumento é uma instância do princípio de diagonalização utilizado na Seção 1.5 para mostrar que 2N não é contável. Para ver por que e para sublinhar mais uma vez a essência da prova, vamos definir uma relação binária R em strings sobre o alfabeto utilizando a codificação de máquinas de Turing: (u, w) ∈ R se e somente se u = “M” para alguma máquina de Turing M que aceita w. (R é uma versão de H.) Agora, supondo que, para cada string u, Ru = {w: (u, w) ∈ R} (os Ru’s correspondem às linguagens enumeráveis recursivamente) e considerando a diagonal de R, isto é, D = {w’: (w, w) ∉ R} (D é H1), pelo princípio da diagonalização, D ≠ Ru para todo u; isto é, H1 é uma linguagem diferente de qualquer linguagem enumerável recursivamente. E por que D ≠ Ru para qualquer u? Porque D difere, exatamente pela sua construção de cada Ru (e, portanto, de cada linguagem enumerável recursivamente no mínimo uma string - a saber, u.
12
O Teorema 1 responde negativamente a primeira das duas questões que apresentamos no final da Seção 4.2 (“cada linguagem enumerável recursivamente também é recursiva?” e “ a classe de linguagens enumeráveis recursivamente é fechada sob complemento?”). Mas a mesma prova fornece a resposta para a outra questão. È fácil ver que H1, como H, é enumerável recursivamente, e mostramos que H1 não é enumerável recursivamente. Portanto, também provamos o seguinte resultado: Teorema 2: A classe de linguagens enumeráveis recursivamente não
é fechada sob complemento. ------------Os textos dados na última aula apresentam algumas outras discussões e também citam outras colocações aqui dadas. Os resultados vistos necessitam uma leitura atenta e todos eles remetem à questões que possuem profundas ligações com a lógica. Mas...vejamos Marilena Chauí: "O que é a Lógica?13Como indica o termo grego que foi dado ao conjunto descritos lógicos de Aristóteles, Órganon, a lógica é o instrumento do pensamento, para pensarmos corretamente. Não se referindo a nenhum ser, a nenhuma coisa, a nenhum objeto, a lógica a lógica não se refere a nenhum conteúdo, mas à forma ou às formas do pensamento. Por isso, diz-se que, com Aristóteles surgem a Lógica Formal." Poucas modificações foram feitas à Lógica depois de Aristóteles. Mas no início do século XX houve uma verdadeira revolução na Lógica e na Matemática. A Lógica clássica, formal ou tradicional 14 é mais do que o estudo e construções de tabelas-verdade. Constitui um sistema composto por 3 princípios: 1. Princípio da Não Contradição: ¬(p∧¬ p) Uma proposição não pode ser verdadeira e (∧:conjunção) falsa ao mesmo tempo, e daí ¬(p∧¬ p) é sempre verdadeira, conforme se pode "ver " em uma tabela-verdade. 2. Princípio do Terceiro Excluído: p∨ ¬ p Neste caso, a disjunção (ou: ∨) entre p e a sua negação é sempre verdadeira e daí está excluído um terceiro valor verdade, só temos 2 valores para a veracidade de uma proposição: p é falsa ou p é verdade. 3. Princípio da Dupla Negação: ¬¬ p p A negação de uma verdade é uma falsidade e a negação duas vezes leva a afirmação simples. Conforme disse Aristóteles não é a Lógica que julga se uma afirmação simples é Verdade ou Falsa. Por exemplo, é na Aritmética que decidimos que a seguinte sentença p:"17 é um número primo." ,é verdade. É na gramática portuguesa que decidimos que a sentença simples q: " A palavra livro é verbo" é falsa. Mas é na ↔
13
Na classificação aristotélica a lógica não é nenhuma ciência .
14
Existem outras lógicas.
13
lógica que decidimos que a conjunção p q :17 é um número primo e a palavra livro é verbo" é falsa. A partir dos princípios da Lógica Clássica e da definição das operações do e:∧; ou:∨; → se...então; e : se e somente se, é construído um sistema formal que constitui a Lógica Clássica Elementar ou o Cálculo de Predicados de Primeira Ordem com igualdade, juntamente com as proposições quantificadas com os quantificadores universal: ∀:Para Todo e ∃ : existe pelo menos um, o existencial. O Cálculo consiste em estabelecer o valor das proposições compostas pelos operadores acima citados. Assim podemos dizer que a Lógica trata das inferências válidas, ou seja, das inferências cujas conclusões têm que ser verdadeiras, caso as premissas o sejam. O Cálculo das Proposições é aquele que lida apenas com os operadores lógicos, a negação sem incluir os quantificadores. A revolução da Lógica foi marcada por Gödel, conforme está resumido nos " Aspectos históricos"do Livro Teoria da Computação do Paulo e Tiaraju. Esta revolução, juntamente com o advento dos computadores, numa junção entre teoria e tecnologia foi fator decisivo para todo desenvolvimento que vimos neste século, desde o avião, primeiro objeto, mais " pesado"do o ar, a voar e sairmos do chão, até às viagens pelo mundo todo na internet, sem sairmos do chão. ↔
Questões Básicas para o debate. Considere as seguintes afirmações: I. “ O grande significado do Teorema de Gödel,... é de caráter epistemológico: não podemos identificar os raciocínios rigorosos, matemáticos, com o raciocínio formal. A natureza, que inclui o homem, tem a contradição como qualidade, a contradição que origina o seu movimento e produz a história. II. Se a matemática fosse redutível à lógica e se se pudesse encontrar o tal método para determinar a verdade ou falsidade de qualquer sentença da lógica formal, então qualquer sentença matemática, ou mais forte ainda, qualquer afirmação de conteúdo sobre a realidade formulada em linguagem matemática, poderia ser provada verdadeira ou falsa.... Ora as formulações de Gödel, destruíram tais pretensões. III. Mas as atenções se deslocaram, então, do conceito de verdade para conceito de demonstrabilidade. O problema que ainda restava solucionar era: haveria um método único, com o qual todas as sentenças matemáticas demonstráveis poderiam ser demonstradas de um conjunto de axiomas lógicos? IV. Nos anos seguintes Kleene, Church e Barkley desenvolveram uma linguagem formal, consistente, à qual deram o nome de cálculo Lambda.(λ−cálculo)... Foi demonstrado (Kleene) que uma extensa classe de funções, inclusive a empregadas por Gödel, na sua famosa prova, era expressável no cálculo lambda. V. A seguir Church argumentou que, se uma função matemática pode ser totalmente computável, então ela pode ser definida no λ−cálculo. Seu trabalho consistiu, então, em mostrar que se existir uma função matemática expressável no λ−cálculo que não é computável, então não existirá um método para decidir se uma sentença matemática é demonstrável ou não. Como, em 1936, o mesmo Church publicou uma fórmula lógica não computável no λ−cálculo, a última esperança hilbertiana – encontrar um método único para demonstrar, a partir de um certo conjunto de axiomas, todas as sentenças matemática pereceu.“ .Ver [1]. 14