Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # # # # # # # # # # # # # #
- # Linguagens de Programação #
- # Prof. Fernando Pereira #
- # notasdogarcia.blog.com #
- # # # # # # # # # # # # # #
- Existe um problema matemático que é:
- Dada uma linguagem formalmente definida e uma sentença
- é possível provar que essa sentença pertence à linguagem?
- Esse problema foi provado por turing que é um problema indecidível.
- Esse problema também foi provado por Alonzo Church que resolveu o mesmo problema um ano antes de turing utilizando
- um formalismo chamado "Cálculo Lambida".
- Vamos falar a respeito desse formalismo nessa aula.
- É importante entender que o Cálculo Lambida é tão poderoso quanto uma máquina de turing, sendo portanto uma linguagem de programação válida,
- e cuja idéia foi usada como base para linguagens reais de programação.
- NOTA Aleatória: "Açucar Sintático" é como se chama expressões de programação que comprimem vários comandos em um só, para facilitar o uso da linguagem.
- Exemplos disso são: for, while, switch etc.
- CONCEITO:
- Calc Lambida pode ser definido pela gramatica:
- <E>::= x
- | <fun>
- | <app>
- <fun> ::= <lambida>x.<E>
- <app> ::= <E1> <E2>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Explicando de forma mais clara:
- Uma expressão x, é uma variável, e pode significar um nome de função, ou qualquer coisa que voce achar conveniente.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Uma função é da forma:
- (<lambida>x <E>)
- Mas vou resumir o lambida para <l>, ou seja:
- (<l>x <E>)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Agora o que significa o <l>x?
- <l>x é uma declaração de um parâmetro.
- Ao ler um <l>x voce deve procurar o primeiro valor após o fecha parentesis da função.
- Assim para toda vez que voce usar a letra x dentro da função será o mesmo que usar esse parâmetro.
- ex:
- (<l>x x ) 5 = 5
- (<l>x x ) y = y
- (<l>x x z) y = y z
- (<l>x z) y = z (nesse caso a função independia de x)
- Agora suponha que voce queira 2 parâmetros então faça:
- (<l>x <l>y y x) 4 5 = 5 4, interessante?k
- Por fim, lembra que eu disse que o parametro é a primeira coisa depois do fecha parentesis?
- Veja um tipo de parâmetro muito usado nessa linguagem:
- (<l>x x) (<l>y y) 8 = (<l>y y) 8 = 8
- Ou seja o parametro x ganhou o valor de: (<l>y y) no primeiro passo.
- E no segundo o parametro y da segunda função ganhou o valor 8.
- Nesse linguagem repare que a associatividade é a esquerda.
- Assim se temos:
- (<l>x x)y
- y é chamado de parametro real.
- x é chamado de parametro formal.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Veja um exemplos de programa:
- ((<l>x <l>y x y) (<l>z z))w =
- (<l>y (<l>z z) y ) w =
- (<l>z z) w = w
- Mantendo sempre a associatividade à esquerda.
- Outro exercicio igual ao anterior, mas com um posicionamento diferente dos parenteses:
- (<l>x <l>y x y) ((<l>z z)w) =
- (<l>x <l>y x y) w =
- (<l>y w y)
- Assim a resposta foi uma função.
- Agora suponha que voce tenha a expressão:
- (<l>y <l>x (mol(y x)))x
- Veja que mol é também uma variável assim como qualquer outra, e assim como qualquer outra ela pode ser qualquer coisa.
- No caso suponha que ela seja uma função, e cujos parametros serão y e x.
- Agora veja que resolvendo o <l>y chegamos em um problema.
- = (<l>x (mol(x x)))
- Antes <l>x definia o valor de uma única variável (àquela de nome originalmente x)
- Após a execução da função <l>y o significado da função <l>x mudou, antes ela fazia mol(y x) sendo y um valor pre definido, e x um parametro da função <l>x.
- Agora ela faz mol(x x) sendo ambos parametros dela.
- Isso é algo que confunde e ocorre de forma não intencional. E quando ocorrer deve ser burlado para manter a coerencia do programa.
- Assim podemos mudar o nome de <l>x para <l>w por exemplo, e simplificar nossa vida.
- (<l>y <l>w (mol(y w)))x
- Esse programa daria como resposta a função:
- (<l>w (mol(x, w)))
- Que preservou o significado de <l>w do inicio ao fim da execução.
- O nome dado a esse efeito que acabamos de aprender a evitar
- é amarração de variável.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Agora veja o caso:
- (<l>x x(<l>x x))y
- Nesse caso temos duas declaraçòes de x.
- Assim temos de separa-las pois cada uma fica em um escopo diferente.
- Uma analogia razoável é imaginar a declaração de uma variável local em C, cujo nome é o mesmo de uma variável global.
- Para retirar a ambiguidade vamos fazer da função mais interna uma função diferente da mais externa assim:
- (<l>x.x(<l>w w))y
- Assim não havera redeclaração, e o código fica claro.
- // Em calculo lambida pode-se escrever qualquer algoritimo que seja computável. E é portanto tão poderoso quando uma máquina de turing.
- // Pre-requisitos minimos para um turing completo:
- // - Desvios Condicionais
- // - Números
- // - Capacidade de soma
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Agora se calculo lambida é uma linguagem turing completa,
- Ela deve ser capaz de expressar números também correto?
- E realizar operações matemáticas.
- Porém até onde vimos parece que todo objeto, ou variável, ou expressão é construido necessáriamente por outras funções.
- Se é assim, então como fazer para denotar um número? Bem usando funções também, veja:
- Números em Calc. Lambida:
- ZERO = ( <l>s <l>z z )
- UM = ( <l>s <l>z s z )
- DOIS = ( <l>s <l>z s (s z) )
- Ou seja, o número ZERO aplica uma função s sobre a variável z 0 vezes.
- o número UM aplica uma função s sobre a variável z 1 vez..
- e assim por diante.
- // Essa definição foi arbitrária do professor e provavelmente pode-se fazer de outras formas.
- // Porém imagino que se o professor descreveu essa notação essa deve ser a notação mais comumente usada.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Agora ainda faltam algumas coisas para podermos chamar esse conjunto de variáveis de "conjunto de números reais"
- O conjunto dos números reais é definido de forma que se X pertence ao conjunto X+1 também pertence,
- E portanto para esse conjunto existir deve haver uma função Sucessora de forma que SUC(x) = x+1,
- assim temos:
- Função sucessora:
- SUCC = (<l>n <l>y <l>x y(n y x))
- Agora posso usar:
- SUCC(ZERO) = (<l>n <l>y <l>x y(n y x))ZERO = (<l>n <l>y <l>x y(n y x))(<l>s <l>z z)
- Se voce realizar as operações isso necessariamente vai dar UM, o que é interessante não?
- Se voce usar como parametro o UM teremos DOIS como resposta e assim por diante.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Assim o significado de (n y x) sendo n um número, é aplicar a função y sobre a função x n vezes.
- Ou seja um número é o número de vezes que se aplica a função a frente sobre seu parametro.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Função de soma de dois números:
- ADD = (<l>n1 <l>n2 n1 S n2)
- Assim uma soma de 2 + 3 fica:
- ADD 2 3 = (<l>n1 <l>n2 n1 SUCC n2) 2 3
- substituindo:
- 2 SUCC 3
- Assim vou buscar o sucessor de 3 duas vezes, chegando ao valor CINCO.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Como fazer uma função de Multiplicação?
- MUL = (<l>n1 <l>n2 <l>s n1 (n2 s))
- Aplicando isso para 2 * 3:
- ( <l>n1 <l>n2 <l>s n1 (n2 s) ) 2 3
- Nessa função então eu aplico o número 3 sobre seu parametro duas vezes, ou seja,
- se o parametro for x, eu aplico x sobre seu parametro 2*3 = 6 vezes, gerando o número 6 segundo a definição do professor.
- mucho loco não?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Como fazer uma funçào booleana AND?
- Vamos definir então que verdadeiro é T e falso é F tal que:
- T = <l>x <l>y x // ou seja retorna o primeiro elemento
- F = <l>x <l>y y // ou seja retorna o segundo elemento
- Uma funçào AND ficaria:
- AND = (<l>x <l>y x y F)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Como fazer um OR, ou um NOT?
- OR = (<l>x <l>y x T y)
- NOT = (<l>x x F T)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Como fazer um IF?
- IF = (<l>c <l>e1 <l>e2 c e1 e2)
- // Se c for verdadeiro retorna e1 se for falso e2
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Função para detectar se é zero.
- Z = <l>x x F NOT F
- Ele mostrou que para 0 essa funçào retorna T e para outros valores F.
- Bizarro!
- // Bem a aula acabou por aqui.
- // Bem interessante esse cálculo lambida, mas visívelmente é tão complexo para uso prático quanto a máquina de turing,
- // e portanto tem utilidade apenas teorica.
- // Mas como se sabe ela assim como a máquina de turing é a base que gerou diversas linguagens, incluindo SML e outras.
Advertisement
Add Comment
Please, Sign In to add comment