LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem...
Transcript of LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem...
LISP – Uma IntroduçãoLISP – Uma Introdução
Claudio EsperançaClaudio Esperança
Por quê LISP?Por quê LISP? É uma linguagem cujos rudimentos É uma linguagem cujos rudimentos
podem ser explicados em uma aulapodem ser explicados em uma aula– Poucas construções permitem fazer muitoPoucas construções permitem fazer muito
Permite ilustrar bem os princípios da Permite ilustrar bem os princípios da recursãorecursão– Não vamos usar comandos de repetiçãoNão vamos usar comandos de repetição
Estruturas de dados complexas podem Estruturas de dados complexas podem ser expressas de forma simplesser expressas de forma simples
Não dá margem a “encher de lingüiça”Não dá margem a “encher de lingüiça”– Uma função freqüentemente pode ser Uma função freqüentemente pode ser
verificada visualmenteverificada visualmente
RecursosRecursos
Diversas implementações grátisDiversas implementações grátis– Recomendo a implementação de Common Recomendo a implementação de Common
Lisp do Dr Bruno HaibleLisp do Dr Bruno Haible Ver Ver http://clisp.cons.orghttp://clisp.cons.org Distribuição binária para MS-Windows na Distribuição binária para MS-Windows na
página do curso página do curso http://www.lcg.ufrj.br/algoritmoshttp://www.lcg.ufrj.br/algoritmos
Diversos livros, alguns grátisDiversos livros, alguns grátis– Recomendo “The Little Lisper” de Daniel P. Recomendo “The Little Lisper” de Daniel P.
Friedman e Matthias Felleisen, Mcmillan Friedman e Matthias Felleisen, Mcmillan Publishing CompanyPublishing Company
Características do LISPCaracterísticas do LISP
LISP = LISt Processing Inventada por McCarthy (1959) Implementa o Cálculo Lambda de
Church– Teoria de funções recursivas– Linguagem “funcional”
Muito usada em Inteligência Artificial
Características do LISPCaracterísticas do LISP
Manipulação de informação simbólica Versão inicial do Lisp era pouco prática
(sem iteração) Muitas versões e dialetos: Franz, Mac,
Inter, Common (praticamente o padrão) e Scheme (variante “enxuta”)
Diferenças entre LISP e outras Diferenças entre LISP e outras linguagenslinguagens
Programas e Dados têm a mesma formaProgramas e Dados têm a mesma forma– É trivial escrever um programa que escreve um É trivial escrever um programa que escreve um
programaprograma Não se trabalha com variáveis Não se trabalha com variáveis
armazenadas (embora LISP suporte armazenadas (embora LISP suporte variáveis)variáveis)– Em “C++” podemos implementar uma função Em “C++” podemos implementar uma função
para inserir um elemento X numa variável L do para inserir um elemento X numa variável L do “tipo” lista“tipo” lista
– Em LISP, escreve-se uma função que, dados Em LISP, escreve-se uma função que, dados um elemento X e uma lista L, retorna uma lista um elemento X e uma lista L, retorna uma lista igual a L com X inseridoigual a L com X inserido
Usando LISPUsando LISP
LISP é freqüentemente implementada LISP é freqüentemente implementada por um interpretadorpor um interpretador– Usuário entra com uma expressãoUsuário entra com uma expressão– Interpretador avalia expressão e imprime o Interpretador avalia expressão e imprime o
resultadoresultado Exemplo:Exemplo:
> (+ 3 4 5 6) > (+ 3 4 5 6)
1818
> (+ (+ 3 4) (+ (+ 4 5) 6)) > (+ (+ 3 4) (+ (+ 4 5) 6))
2222
Usando o intepretador CLISPUsando o intepretador CLISP Ajuda: a qualquer momento durante a Ajuda: a qualquer momento durante a
interação digite interação digite helphelp O interpretador numera os comandosO interpretador numera os comandos Ao cometer um erro, o interpretador Ao cometer um erro, o interpretador
escreve uma mensagem de erro e entra escreve uma mensagem de erro e entra num “num “break loopbreak loop”, isto é, num depurador ”, isto é, num depurador ((debuggerdebugger))
No nosso curso, não é necessário No nosso curso, não é necessário realmente aprender a usar o depurador, realmente aprender a usar o depurador, por isso, digite por isso, digite quitquit para voltar ao modo para voltar ao modo de interação normalde interação normal
Para sair do programa, digite Para sair do programa, digite (bye)(bye)
Exemplo de sessão com o CLISPExemplo de sessão com o CLISP
ÁtomosÁtomos São os elementos mais simples da São os elementos mais simples da
linguagemlinguagem Podem serPodem ser
– SímbolosSímbolos a b c xxx x1 x-1 a b c xxx x1 x-1
– Constantes Constantes Números: Números: 1 2 1.33 -2.951 2 1.33 -2.95 Cadeias: Cadeias: “abc de” “x y z”“abc de” “x y z”
Um símbolo pode ser associado a um valorUm símbolo pode ser associado a um valor– Conceito semelhante ao de “variável” em Conceito semelhante ao de “variável” em
linguagens imperativaslinguagens imperativas
NIL e TNIL e T
Os símbolos Os símbolos nilnil e e t t são especiais pois são especiais pois seus valores são eles própriosseus valores são eles próprios
Quando o LISP está interpretando uma Quando o LISP está interpretando uma expressão booleana, o átomo expressão booleana, o átomo nilnil é é usado para denotar o valor “falso”usado para denotar o valor “falso”
tt denota o valor booleano “verdadeiro”, denota o valor booleano “verdadeiro”, mas qualquer valor diferente de mas qualquer valor diferente de nil nil é é entendido como verdadeiroentendido como verdadeiro
NIL e T - ExemploNIL e T - Exemplo
> (<= 2 3)> (<= 2 3)
TT
> (> 3 4)> (> 3 4)
NILNIL
> (and 2 t)> (and 2 t)
TT
> (and 2 nil)> (and 2 nil)
NILNIL
Avaliando SímbolosAvaliando Símbolos O interpretador sempre tenta avaliar O interpretador sempre tenta avaliar
símbolos a menos que sejam símbolos a menos que sejam precedidos por um apóstrofe (precedidos por um apóstrofe (quotequote))> b> b*** - EVAL: variable B has no value*** - EVAL: variable B has no value> 'b> 'bBB> nil> nilnilnil> t> ttt
Avaliando ListasAvaliando Listas Assim como os símbolos, quando uma Assim como os símbolos, quando uma
lista é apresentada ao interpretador, lista é apresentada ao interpretador, esta é entendida como uma função e esta é entendida como uma função e avaliada a menos que seja precedida avaliada a menos que seja precedida por um apóstrofepor um apóstrofe> (+ 1 2)> (+ 1 2)
33
> '(+ 1 2)> '(+ 1 2)
(+ 1 2)(+ 1 2)
>> (a b c) (a b c)
*** - EVAL: the function A is undefined*** - EVAL: the function A is undefined
ListasListas Em LISP, se algo não é um átomo, então Em LISP, se algo não é um átomo, então
é uma listaé uma lista Uma lista é uma seqüência de átomos ou Uma lista é uma seqüência de átomos ou
listas entre parênteses. Por exemplo:listas entre parênteses. Por exemplo:(a b c) (a b c) ; Lista com 3 elementos; Lista com 3 elementos(d (e f) g) (d (e f) g) ; Lista com 3 elementos; Lista com 3 elementos
Observe que os elementos das listas têm Observe que os elementos das listas têm que estar separados por um ou mais que estar separados por um ou mais espaços em brancoespaços em branco
Observe também que ponto-e-vírgula Observe também que ponto-e-vírgula denota o início de um comentário em denota o início de um comentário em LISPLISP
FunçõesFunções O primeiro elemento de uma lista pode O primeiro elemento de uma lista pode
portanto denotar o nome de uma funçãoportanto denotar o nome de uma função– Nesse caso, os demais elementos são os Nesse caso, os demais elementos são os
argumentos da funçãoargumentos da função Muitas funções são pré-definidas em Muitas funções são pré-definidas em
LISPLISP As seguintes são as que usaremos mais:As seguintes são as que usaremos mais:
– Aritmética: Aritmética: + - / *+ - / *– Relacionais: Relacionais: > = < >= <=> = < >= <=– Lógicas: Lógicas: and or notand or not– Manipulação de listas: Manipulação de listas: cons car cdrcons car cdr– Condicionais: Condicionais: if condif cond
Definindo FunçõesDefinindo Funções A forma especial A forma especial defundefun é usada para definir é usada para definir
uma funçãouma função(defun (defun nomenome lista-de-argumentoslista-de-argumentos expressãoexpressão))– Define uma função chamada Define uma função chamada nomenome que avalia que avalia
expressãoexpressão substituindo os símbolos da l substituindo os símbolos da lista-de-ista-de-argumentos argumentos pelos valores passados quando a pelos valores passados quando a função for invocadafunção for invocada
ExemploExemplo> (defun test (a b) (* 2 (+ a b)))> (defun test (a b) (* 2 (+ a b)))
TESTTEST
> (test 3 4)> (test 3 4)
14 14
Examinando ListasExaminando Listas (car lista)(car lista) retorna o primeiro elemento retorna o primeiro elemento
de de listalista– Um sinônimo de Um sinônimo de carcar é é firstfirst– CAR CAR = Contents of Address Register= Contents of Address Register
(cdr lista)(cdr lista) retorna a lista sem o seu retorna a lista sem o seu primeiro elementoprimeiro elemento– Um sinônimo de Um sinônimo de cdrcdr é é restrest– CDRCDR= Contents of Decrement Register= Contents of Decrement Register
Uma lista vazia Uma lista vazia () () também pode ser também pode ser escrita como escrita como nilnil– nilnil é tanto um átomo como uma lista! é tanto um átomo como uma lista!
Examinando Listas - ExemploExaminando Listas - Exemplo
> (car '(a b))> (car '(a b))
AA
> (cdr '(a b))> (cdr '(a b))
(B)(B)
> (car (cdr '(a b)))> (car (cdr '(a b)))
BB
> (cdr (cdr '(a b)))> (cdr (cdr '(a b)))
NILNIL
Cons- truindo ListasCons- truindo Listas (cons elem lista)(cons elem lista) retorna uma cópia de retorna uma cópia de
listalista com com elem elem inserido como seu inserido como seu primeiro elementoprimeiro elemento
Exemplo:Exemplo:> (cons 'a '(b c))> (cons 'a '(b c))(A B C)(A B C)> (cons 'a '(b))> (cons 'a '(b))(A B)(A B)> (cons 'a nil)> (cons 'a nil)(A)(A)
Teorema: Teorema: (cons (car L) (cdr L)) = L(cons (car L) (cdr L)) = L
Cons Cons O que acontece se passarmos um átomo O que acontece se passarmos um átomo
como segundo argumento de como segundo argumento de conscons??> (cons 'a 'b)> (cons 'a 'b)
(A . B)(A . B) De onde veio o ponto entre A e B?De onde veio o ponto entre A e B? Resposta:Resposta:
– O ponto sempre existe num cons, mas nem O ponto sempre existe num cons, mas nem sempre é impressosempre é impresso
– Para entender, precisamos rever um Para entender, precisamos rever um conceito anterior ...conceito anterior ...
Conses (Conses (S-ExpressionsS-Expressions))
Em LISP, se algo não é um átomo, Em LISP, se algo não é um átomo, então é um então é um conscons ou “ ou “S-expression”S-expression”
Um Um conscons nada mais é que um registro nada mais é que um registro com dois campos, o primeiro é com dois campos, o primeiro é chamado de chamado de carcar e o segundo de e o segundo de cdrcdr
A regra do ponto:A regra do ponto:– O O conscons é escrito com o valor dos dois é escrito com o valor dos dois
campos entre parênteses ou separados por campos entre parênteses ou separados por um pontoum ponto
– EntretantoEntretanto, se o campo , se o campo cdrcdr é é nilnil ou um ou um conscons, o ponto pode ser omitido, o ponto pode ser omitido
Conses – ExemplosConses – Exemplos> (cons 'a 'b)> (cons 'a 'b)(A . B)(A . B)> '(a . b)> '(a . b)(A . B)(A . B)> '(a . nil)> '(a . nil)(A)(A)> '(a . (b . (c . nil)))> '(a . (b . (c . nil)))(A B C)(A B C)> '(a . (b . c))> '(a . (b . c))(A B . C)(A B . C)> '((a . b) . c)> '((a . b) . c)((A . B) . C)((A . B) . C)> '((a . b) . (b . c))> '((a . b) . (b . c))((A . B) B . C)((A . B) B . C)
Conses e ListasConses e Listas Podemos ver então que listas são Podemos ver então que listas são
conses que nunca são escritos com conses que nunca são escritos com pontospontos– Muitos autores preferem ignorar conses que Muitos autores preferem ignorar conses que
não são listasnão são listas Afinal, o que é então uma lista?Afinal, o que é então uma lista? Eis uma resposta formal:Eis uma resposta formal:
– AxiomaAxioma: : nilnil é uma lista é uma lista– TeoremaTeorema: Se : Se LL é uma lista, e é uma lista, e elemelem é um é um
átomo ou uma lista, então átomo ou uma lista, então (cons elem L)(cons elem L) é é uma listauma lista
Cond -icionaisCond -icionais A forma especial A forma especial condcond permite escrever permite escrever
funções que envolvem decisõesfunções que envolvem decisões Forma geral:Forma geral:
(cond (cond (bool1 expr1)(bool1 expr1) (bool2 expr2)(bool2 expr2) ...... (boolN exprN)(boolN exprN)))
Funcionamento:Funcionamento:– As expressões lógicas são avaliadas As expressões lógicas são avaliadas
sucessivamentesucessivamente– Se Se boolIboolI é verdadeira então o é verdadeira então o condcond avalia e retorna avalia e retorna
exprIexprI– Se nenhuma expressão lógica for avaliada como Se nenhuma expressão lógica for avaliada como
verdadeira, o verdadeira, o condcond retorna retorna nilnil
If – then – else If – then – else O O condcond pode ser usado como um if-then- pode ser usado como um if-then-
else:else:(cond (cond (bool1 expr1)(bool1 expr1)
(bool2 expr2)(bool2 expr2)
(bool3 expr3)(bool3 expr3)
(t expr4))(t expr4))– É equivalente à seguinte construçãoÉ equivalente à seguinte construção
if if bool1 then expr1bool1 then expr1
else if bool2 then expr2else if bool2 then expr2
else if bool3 then expr3else if bool3 then expr3
else expr4else expr4
ExemploExemplo> (cond ((= 1 2) 'a)> (cond ((= 1 2) 'a) ((> 2 3) 'b)((> 2 3) 'b) ((< 3 4) 'c)((< 3 4) 'c)))CC> (defun f (lista elem)> (defun f (lista elem) (cond ((eq lista nil) nil)(cond ((eq lista nil) nil) ((eq (car lista) elem) t)((eq (car lista) elem) t) (t (f (cdr lista) elem))(t (f (cdr lista) elem)) ))))FF> (f '(a b c) 'c)> (f '(a b c) 'c)TT> (f '(a b c) 'd)> (f '(a b c) 'd)NILNIL
Expressões LógicasExpressões Lógicas
São montadas com o auxílio das São montadas com o auxílio das funções que implementam os funções que implementam os predicados relacionais e lógicos predicados relacionais e lógicos tradicionaistradicionais– Predicados lógicos: Predicados lógicos: and or notand or not– Predicados relacionais: Predicados relacionais: > = < >= <=> = < >= <=
Argumentos devem ser númerosArgumentos devem ser números Para comparar símbolos usa-se o predicadoPara comparar símbolos usa-se o predicado eq eq Para comparar conses estruturalmente usa-se o Para comparar conses estruturalmente usa-se o
predicadopredicado equal equal
Expressões Lógicas - ExemplosExpressões Lógicas - Exemplos
> (or (< 2 3) (> 2 3))> (or (< 2 3) (> 2 3))
TT
> (= 'a 'b)> (= 'a 'b)
*** - argument to = should be a number: A*** - argument to = should be a number: A
> (eq 'a 'b)> (eq 'a 'b)
NILNIL
> (eq 'a 'a)> (eq 'a 'a)
TT
> (eq '(a b) '(a b))> (eq '(a b) '(a b))
NILNIL
> (equal '(a b) '(a b))> (equal '(a b) '(a b))
TT
ExercíciosExercícios Escreva as funçõesEscreva as funções
– (apaga L X)(apaga L X) Dada uma lista L e um elemento X , retorna L Dada uma lista L e um elemento X , retorna L
sem X. Se L não contém elem inicialmente, sem X. Se L não contém elem inicialmente, retorna uma cópia exata de Lretorna uma cópia exata de L
> (apaga ‘(a b c d a) ‘a) > (apaga ‘(a b c d a) ‘a) (b c d)(b c d)
– (acresc L X Y)(acresc L X Y) Dada uma lista L, um elemento X e um Dada uma lista L, um elemento X e um
elemento Y, retorna uma cópia de L onde um Y elemento Y, retorna uma cópia de L onde um Y é inserido depois de cada Xé inserido depois de cada X
> (acresc ‘(a b c d a) ‘a ‘k)> (acresc ‘(a b c d a) ‘a ‘k)(a k b c d a k)(a k b c d a k)