Title: C
1CÁLCULO LAMBDA
- Base da programação funcional e um modelo
alternativo de computabilidade. - Inventor Alonzo Church
2Modelos de Computabilidade
- Máquina de Turing (Alain Turing- 1936)
- Lambda cálculo (Alonzo Church - 1936)
- Linguagens While (Michael Arbib-1982)
- Alan Turing provou em 1937 a equivalência entre
uma Máquina de Turing e o Cálculo Lambda em
termos de computabilidade
3A. Church, Washington1903
- Doutor pela Universidade de Princepton. Após seu
doutoramento foi para Harvard trabalhar com
Birkhoff e Huntington. E foi nesta época em que
Birkhoff e ele tiveram discussões que resultaram
na Teoria das Categorias como a conhecemos hoje.
Trabalhou até 1990 quando com oitenta e sete
anos parou de dar aulas mas continuou a orientar
alguns pesquisadores selecionados, Turing tendo
sido um de seus doutorandos.
4Programaçãp Funcional (1/2)
- A maioria das Linguagens de Programação Funcional
são semelhantes e diferem somente em aspectos
sintáticos. O Cálculo lambda pode ser considerado
como a ferramenta mais adequada a escrever
programas usando o paradigma funcional. Neste
paradigma, em que a solução de um problema é
considerada como sendo implementar uma função,
usa nesta implementação um conjunto de primitivas
e regras de construir novas funções a partir
destas primitivas.
5Programação Funcional (2/2)
- Interessantes pela sua simplicidade sintática
- Facilidade de escrever problemas recursivos.
- Maioria das implementações são poucos aceitas
devido à ineficiência em comparação com
linguagens de programação comuns. - Novas implementações de interpretadores e/ou
compiladores e novas linguagens mais modernas tem
surgido.
6Exemplos de Linguagens Funcionais
- - LISP (LISt Processing - década de 60). Muito
simples em muitos aspectos. É a mais utilizada
devendo continuar por muito tempo. - - Miranda (Turner 1985)
- - Haskell (1990)
- - Orwell (Wadler 1985)
- - Outras ML, KRC, LML, SASL.
7Sintaxe do Cálculo Lambda
- O cálculo lambda pode ter sua sintaxe definida
como um sistema formal.
8Termos do Cálculo Lambda
- A linguagem do cálculo lambda usa um alfabeto S
constituído de - - um conjunto de variáveis vo, v1, v2,....vn....
- - abstrator l (lambda)
- - agrupadores (,)
- Ao conjunto de cadeias finitas sobre S denota-se
por S e a cadeia que não contem elementos por e.
Usam-se as variáveis x, y, z, ... para denotar
cadeias de S
9Cadeias de Símbolos definições
- Definição (Equivalência de duas cadeias)
- Duas cadeias x e y são equivalentes e se escreve
(x,y) ? Eq ? x y - Definição (Comprimento de uma cadeia)
- É uma função
- ? S ? Z
- em que o número inteiro exprime o número de
elementos da cadeia.
10Termo Lambda definição
- Um termo lambda, denotado pelas letras M, N, O,
P,.. é um elemento da linguagem L, onde S ? L
definido da seguinte forma - - vi é termo lambda
- - dado M, (lvi M) é termo lambda
- - dados dois termos lambda M, N então (MN) é
termo lambda - - e nada mais é termo lambda.
11Exemplos de Termos lambda
- Verificar quais das expressões abaixo são termos
lambda, justificando sua resposta - vo
- (vov1)
- (vo)
- (lvo(vov1))
- (lv1(vo(lv1(vov1))))
- (lvo(vov1)
12Notacão Lambda Simplificada
- 1-Precedência a esquerda. ((MN)L) ? MNL
- 2-Sucessão de abstratores
- Assim (lx(ly(lz........))) ? lxyz...
- 3-Separador usa-se um ponto para designar o
final de uma lista de argumentos lambda - Assim lx.xly.y ? (lx(x(ly.y)))
- 4-Supõe-se que letras diferentes designam
entidades diferentes. - Assim x ¹ y em lx.y
13Semântica Operacional do Cálculo l
- Até agora foi descrita a sintaxe do cálculo-l.
Sua semântica operacional diz como um programa
Lambda opera, isto é, calcula.
14O Porque da Semântica
- Para chamá-lo de "cálculo'', deve-se porém dizer
como "calcular'' com ele. Basicamente isto é
realizado através de três regras de conversão,
que descrevem como converter uma expressão-l em
outra que lhe seja equivalente. - Mostra também como se introduzem os argumentos a
serem usados como dados do programa.
15Programa Lambda
- Um programa Lambda se escreve como um conjunto de
expressões lambda. Normalmente, usando notação
simplificada encontra-se o símbolo lambda seguido
de lista de variáveis. limitando estas variáveis
vem um ponto ".'' seguido pelo corpo da função.
As variáveis são chamadas de parâmetros formais e
diz-se que o lambda os liga. Exemplo - ?xy.( x y)
16Programa Lambda
- Os dados são escritos logo depois da função
lambda, como uma lista e são consumidos durante a
operação do programa. - Exemplos
- gt (?xy. (y x)) dia bom
- gt (?xy. ( x y)) 3 6
- gt (?xy. (x y z)) 3 1 4 5
17Executar Programa Lambda
- Para executar um programa lambda é suficiente dar
valores às variáveis lambda. Assim tem-se - ?xy.( x y) 3 4
- ?y.( 3 y) 4
- ( 3 4)
- 7
- Nota geralmente operadores são pré-fxados. Isto
na realidade é uma conversão de uma expressão em
uma mais simples. Há 3 tipos de conversão.
18Funções embutidas
- Funções embutidas como não existem no cálculo
lambda na sua forma mais pura. Para fins
práticos, uma extensão que as suporte é útil.
Estas incluem funções aritméticas (como , -, ,
/), constantes (como 0, 1,...), funções lógicas
(como E, OU, NÃO,...), constantes lógicas
(VERDADE, FALSO), manipulação de listas
(PRIMEIRO, CAUDA, CONSTRUA, IGUAL) e
reconhecedoras de listas (ATOM).
19Avaliação de programa lambda
- A avaliação ocorre através da seleção repetida de
uma expressão redutível (redex) e de sua redução.
Expressão redutível é aquela que pode ser
avaliada imediatamente. No exemplo - ( ( 5 6) ( 8 3))
- Que são ( 5 6) e ( 8 3)
- A escolha do primeiro redex para redução
fornece - ( ( 5 6) ( 8 3)) -gt ( 30 ( 8 3))
- Do qual resulta ( 30 24) -gt 54
20Regras de Conversão
- Introdução à ?-conversão Variáveis atadas e
livres - Conversão-Alfa (?)
- Conversão-Beta (ß)
- Conversão-Eta (?)
- Provas de Interconvertibilidade
21Variáveis atadas e livres(1/2)
- Seja a expressão-l (lx. x y) 4
- Para avaliar esta expressão é necessário
- saber o valor "global'' de y.
- não é necessário saber o valor global de x, pois
é o parâmetro formal da função. - x ocorre atado pelo lx, y não é atado por nenhum
e assim ocorre livre na expressão.
22Variáveis atadas e livres (2/2)
- .A ocorrência de uma variável é atada se há uma
expressão-l envolvente que a amarra, senão é
livre. - No exemplo a seguir, x e y ocorrem atados, z
porém, ocorre livre - lx. ((ly. y z) 7) x
- Observe que os termos atado e livre se referem a
ocorrências específicas da variável em uma
expressão. Note ainda que x é atado mas não
sabe-se seu valor para calcular a expressão-l.
23Conversão Alfa
- Usa a a-congruência duas expressões-l M e N são
a-congruentes (ou a-equivalentes), denotado por M
? N se ou - M N ou
- M?N, ou
- N é obtido de M através da reposição de uma
sub-expressão S de M por uma expressão-l T tal
que S ? T, ou existe alguma expressão-l, R tal
que M ? R e R ? N.
24Conversão Alfa exemplos
- Exemplo 1
- Nomes de parâmetros
- formais podem não ser
- únicos
- (lx.( lx. (- x 1)) x 3) 9
- (lx. (- x 1)) 9 3
- (- 9 1) 3
- 11
- Exemplo 2
- (lxy. x ((lx.- x 3) y)) 5 6
- (ly. 5 ((lx.- x 3) y)) 6
- 5 ((lx.- x 3) 6)
- 5 (- 6 3)
- 8
25Conversão Alfa exemplos
- Exemplo 3
- (lx. (ly. - y x)) 4 5
- (ly. - y 4) 5
- - 5 4
- 1
- Exemplo 4
- Crie um exemplo semelhante aos 3 anteriores.
26Conversão beta
- Conversão beta consiste na substituição de uma
variável ligada pelo valor que foi justaposto a
definição da função. - Exemplo (lx. x 1) 4
- 4 1
- 5
27Conversão Beta
- Pode não haver ocorrências do parâmetro formal no
corpo. Ex - (lx. 3) 5 3
- Nada a converter!
- O parâmetro formal pode ocorrer várias vezes no
corpo - (lx. x x) 5
- 5 5
- 10
Uma variável pode possuir tanto uma ocorrência
atada como uma livre em uma expressão. Considere
o exemplo x ((lx. x 1) 4) Aqui x ocorre
livre (a primeira vez) e atada (a segunda).
28Conversão eta
- Sejam (lx. 1 x) e ( 1). Estas expressões se
comportam exatamente da mesma maneira, quando
aplicadas a um argumento ambas adicionam 1 ao
argumento. Conversão-z é o nome dado à regra que
expressa essa equivalência. Assim (lx. 1 x)
-gt ( 1) - Formalmente (lx. F x) -gt F
- desde que x não ocorra livre em F e F denote
uma função.
29Conversão eta
- A condição de que x não deve ocorrer livre em
em F previne conversões errôneas. Exemplo - (lx. x x) não é e-conversível para ( x)
- pois x ocorre livre em ( x).
- Os dois x são ligados. Assim
- (lx. x x) 5 ? ( 5 5) ? 10
30Teorremas de Church-Rosser
31Teoremas de Church-Rosser
32Teoremas de Church-Rosser
33Funções Recursivas
- No Cálculo lambda as funções não tem nomes.
- Cálculo lambda é a base da programação funcional.
- Um dos mecanismos mais importantes usados em
programação funcional é a recursividade. - Recursividade exige que se nomeie funções para
que possam ser referenciadas. - E agora? (Fico vermelho de vergonha!)
34Recursividade exemplo introdutório
- Suponha existir a primitiva SE com duas direções
e seja a abstração - (?xn. SE ( n 0) (1) ( n x (-n 1)))
- Vamos dar o nome de FAC à aplicação desta
abstração à FAC tem-se - FAC (?xn. SE ( n 0) (1) ( n x (-n 1))) FAC
- (?n. SE ( n 0) (1) ( n FAC (-n 1)))
- Que é a definição recursiva desejada.
35Transformação ? ao inverso
- Se já fosse disponível a definição recursiva
- Seja F (?x . F.)
- Usando Transformação ? ao contrário
- F (?f (?x . f.))F
- Ou F H F onde H (?f (?x . f.))
- F é dito ponto fixo de H
36Combinador de Ponto Fixo
- Para isto, invente-se, a título provisório, uma
função Y, a qual toma uma função como argumento e
devolve o seu ponto fixo como resultado. Logo
será YH F - Substituindo F por YH em F H F tem-se
- YH H (YH)
- Esta é uma definição não recursiva de F!
37Exercício Fac 1
- FAT Y H onde
- H (?fat. ? n. SE ( n 0) 1 ( n (fat (- n 1))))
- Assim FAT 1
- Y H 1
- H (Y H) 1
- (?fat. ?n.SE ( n 0) 1 ( n (fat (- n 1))))(Y H)
1 - (? n.SE ( n 0) 1 ( n (Y H (- n 1)))) 1
- SE ( 1 0) 1 ( 1 (Y H (- 1 1)))
- 1 (Y H 0) 1 (H (Y H) 0)
- 1 ((?fat.?n.SE ( n 0)1( n(fat(- n 1))))(Y
H) 0) - 1 ((?n.SE ( n 0) 1 ( n (Y H (- n 1)))) 0)
- 1 (SE ( 0 0) 1 ( n (Y H(- 0 1))))
- 1
38Exercícios (Redução)
39Exercícios (Recursividade)
40E se estas coisas fossem usadas em uma linguagem
real?
- Esta linguagem existe e é LISP!
- LISP é linguagem velha tem 40 anos...
- Mas LISP se mantem jóvem pois LISP é estensível,
suporta programação objeto e icônica!
41Noções de lisp
42Qual a razão de conhecer LISP?
- Segundo McDermot e Charniac a razão ér a mesma de
aprender francês se vai estudar na França é a
lingua natural falada pelos franceses! - Será isto ainda verdade?
- Nem tanto, mas...
- Será a Programação Funcional?
43Razões para usar LISP (1/4)
- LISP é uma linguagem funcional pobre, mas raros
são os profissionais de IA que escolhem LISP por
suas características funcionais. Exatamente por
esta razão ela é pobre em termos funcionais
juntam-se outras facilidades que mascaram o
estilo funcional puro!
44Razões para usar LISP (2/4)
- LISP é estensível e se não se gosta de um
interface oferecido é fácil criar outro. - LISP tem programa e dados com a mesma estrutura
de dados listas. Logo, um programa pode
facilmente ler a ele mesmo, modificar-se durante
a execução e continuar funcionando modificado sem
interrupção isto é, torna-se fácil implementar
algoritmos de aprendizado.
45Razões para usar LISP (3/4)
- Estruturas de dados são facilmente manipuladas em
LISP. - Por exemplo
- A pilha é a própria lista
- Existem primitivas para ler, juntar novo elemento
na pilha, etc. - Árvores são implementadas como listas de listas.,
s3endo fácil percorrê-las e modificá-las.
46Razões para usar LISP (4/4)
- É fácil aprender LISP e seu aprendizado ajuda a
desenvolver capacidades mentais. Foi exatamente
acreditando nisto que Papert, criou no MIT a
linguagem LOGO, subconjunto de LISP, com ênfase
gráfica, para uso do aprendizado de crianças. As
experiências tem sido animadoras. - E como nasceu esta linguagem?
47Lisp Nota histórica (1/3)
- John McCarthy vinha trabalhando há anos em uma
linguagem que fosse, como provado por Turing,
equivalente à sua máquina. Em 1960, dando aula no
MIT demonstrou que a função eval era capaz de
simular a máquina de Turing, resultado teórico de
grande valor.
48Lisp Nota histórica (2/3)
- Um dos alunos de John McCarthy, Steve Russel
comentou sendo verdade este teorema, basta
implementar eval e teremos a Máquina de
Turing, ao que McCarthy contestou Não confunda
teoria com prática, este é um resultado teórico,
para ter valor prático tem de percorrer um longo
caminho.
49Lisp Nota histórica (3/3)
- Russel não se satisfez. Implementou eval e
algumas outras funções em Máquina IBM704,
apresentou seu trabalho e assim nasceu Lisp,
linguagem fruto do espírito prático de aluno com
grande conhecimento teórico. Guarda ainda hoje
lembranças do passado - car contents of address register
- cdr contents of decrement register
- Símbolos do assembler do IBM704.
50Sintaxe de Lisp
- Vocabulário de Lisp
- Atomos elementos indivisíveis, podendo ser
- Números ex 1, 13, 15, -.35, etc.
- Identificadores sequencias de letras e números
ex Lisa, Jane1, fibo, etc. - Identificadores reservados , -, /, , car, cdr,
etc. - Delimitadores (,)
51Sintaxe de Lisp
- Linguagem Lisp
- Lisp atom lista
- Atom identificador identificador reservado
número - Lista (atom) (atom lista)
52Lisp Puro
- Lisp Puro contem as seguintes funções primitivas
- Car primeiro elemento de uma lista
- Cdr o que sobra de uma lista tirando o 1º
elemento - Cons constroi lista dado um elemento e uma
lista - Eql retorna T se os dois elementos que se seguem
são iguais, NIL no caso contrario - Atom retorna T se elemento que o segue é
atomico, NIL em caso contrário.
53Semantica operacional de Lisp Puro
- Seletores car, cdr
- gt (car (a d f))
- gt A
- gt (cdr (a s d f g))
- gt (s d f g)
- Construtor
- gt (cons a (s d f g))
- gt (a s d f g)
- Predicado atômico
- gt (atom jane)
- gt T
- gt (atom (a s d f g))
- gt NIL
- Predicado egalitário
- gt (eql casa casa)
- gt T
- gt (eql 10 20)
- gt NIL
54Assignação e valor de atomo
- (set a 10)
- A
- (setq b 20)
- B
- B
- 20
- B
- B
- (atom b)
- T
- (atom b)
- T
- (setq c (a s d))
- C
- C
- (a s d)
- (car c)
- A
- (cdr c)
- (s d)
- (atom c)
- NIL
- (atom c)
- T
55Manipulação de listas exemplos
- (setq v (e i o u))
- V
- (cons a v)
- (a e i o u)
- (car (q w e r t))
- Q
- (cdr (q w e r t))
- (w e r t)
- (cdr (car v))
- nil
- (car (cdr (cdr (a s d f g))))
- D
- (caddr (a s d f g))
- D
- (atom v)
- Nil
- (eql v v)
- T
- (eql v v)
- nil
56Operações aritméticas
- ( 2 3 4 5)
- 14
- (1 2)
- 3
- (2 3)
- 6
- ( 2 3 4 )
- 24
- ( ( 2 3) ( 1 2 3))
- 30
- ( 2 ( 5 6 3) 2)
- 360
- e assim não é preciso chamar a calculadora do
computador...
57Novas Funções
- (defun nome-da-função (variáveis ligadas)
- (corpo da definição))
- Corpos
- Cond
- Program
- if
58Exemplos de novas funções
- Encontra o segundo elemento de uma lista
- (defun segundo (lista)
- (cadr lista))
- Calcula o fatorial de um número
- (defun fat (n)
- (cond (( gt n 0) (Numero negativo não tem
fatorial)) - (( n 0) 1)
- (( n 1) 1)
- (T (fat (- n 1)))))
-
59- Lê uma lista até um elemento dado retornando o
que sobra - (defun resto (lista elemento)
- (cond ((eql (car lista) elemento) cdr lista)
- (T (resto ((cdr lista) elemento )))))
60Exercícios
- Escreva 2 funções Lisp para juntar novos
telefones e consultar uma lista de nomes e de
telefones. - Sugestão use como estrutura de dados uma lista
de pares, (nome telefone)
- Sabendo que sua verão de Lisp usa gt e lt para
ordem alfabética, escreva função Lisp para
colocar em ordem um lista de nomes. - E se fosse a lista de endereços do exercício
anterior?
61Que faço com isso tudo?
- Não!
- Não jogue o pobre cálculo ? no lixo!
- Ele é a base das linguagens funcionais e de Lisp,
que apesar de todas as suas impurezas vale o
estudo!
Jogou!