LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem...

30
LISP – Uma Introdução LISP – Uma Introdução Claudio Esperança Claudio Esperança

Transcript of LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem...

Page 1: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

LISP – Uma IntroduçãoLISP – Uma Introdução

Claudio EsperançaClaudio Esperança

Page 2: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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

Page 3: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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

Page 4: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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

Page 5: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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”)

Page 6: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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

Page 7: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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

Page 8: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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)

Page 9: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

Exemplo de sessão com o CLISPExemplo de sessão com o CLISP

Page 10: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

Á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

Page 11: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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

Page 12: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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

Page 13: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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

Page 14: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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

Page 15: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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

Page 16: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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

Page 17: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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

Page 18: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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!

Page 19: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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

Page 20: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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

Page 21: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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 ...

Page 22: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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

Page 23: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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)

Page 24: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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

Page 25: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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

Page 26: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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

Page 27: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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

Page 28: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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

Page 29: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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

Page 30: LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

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)