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

Slides:



Advertisements
Apresentações semelhantes
Estruturação de Linguagens (Pascal e C++)
Advertisements

PRÓ-INFORMÁTICA QUALIFICAÇÃO PROFISSIONAL
Python: Recursão Claudio Esperança.
Programação em Java Prof. Maurício Braga
Processing – Elementos da Linguagem
Universidade Federal de Campina Grande – UFCG Centro de Engenharia Elétrica e Informática – CEEI Departamento de Sistemas e Computação – DSC Máquina de.
Elsa Carvalho 49 Universidade da Madeira Departamento de Matemática e Engenharias Programação em Lógica e Funcional (2000/01) (Actualizado em 2005/06)
Shell Script Professor: João Paulo
Universidade Federal de São Carlos Introdução à Linguagem C Comandos.
Introdução a Programação Renata Freire
Claudio Esperança Python: Comandos Básicos. Primeiros passos em programação Até agora só vimos como computar algumas expressões simples Expressões são.
Programação Lógica: PROLOG
Linguagem C Estruturas de Controle de Fluxos
Disciplina: AAM Profa. Ana Watanabe vol.3
Rodrigo de Toledo (original: Claudio Esperança)
01(c) 2007 Gustavo Motta1 Introdução ao -calculus Prof. Gustavo Motta Departamento de Informática/UFPB.
Introdução ao -calculus
Introdução ao JavaScript
Robson Godoi / Sandra Siebra
Semana 03: Comandos de desvio de fluxo. Expressões lógicas.
LISTAS Uma lista é uma estrutura de dados muito comum na programação não numérica (com particular destaque na computação simbólica onde representa quase.
Prolog Programação Lógica Ícaro A. Souza.
Prof. Natalia Castro Fernandes Engenharia de Telecomunicações – UFF 2º semestre/2012.
Linguagem de Programação II Parte IV
Linguagem de Programação II Parte IX
FTIN Formação Técnica em Informática
Paradigmas de Programação
Gramáticas Livres de Contexto
Entrada e saída.
Interpretador Python.
Entendendo as definições de classe
Fábio de Oliveira Borges
Semana 03 Comandos de desvio de fluxo. Expressões lógicas.
O Portal do Estudante de Computação
DESIGN E COMUNICAÇÃO MULTIMÉDIA 2011 / 2012 DESIGN E COMUNICAÇÃO MULTIMÉDIA 2011 / 2012 FORMADOR Gonçalo Miguel MÓDULO 25. Introdução ao ActionScript 3.0.
PrograMação para internet
PROGRAMAÇÃO PARA INTERNET Prof.: Jean Carlo Mendes
Faculdade Talentos Humanos - FACTHUS - Algoritmo I - Rogério Rodrigues
Paradigma funcional.
Sistemas Operacionais II O Shell Bash. Objetivos Conhecer a sintaxe dos comandos; Trabalhar com funções; Trabalhar com variáveis; Expressões aritméticas;
Algoritmos e Estrutura de Dados I Jean Carlo Mendes
ARQUIVOS.
Algumas notas sobre a linguagem de programação C
Aula prática 2 Operadores e Expressões Comandos de Decisão Comentários
Algoritmos e Estrutura de Dados I Jean Carlo Mendes
Introdução à complexidade de algoritmos Luiz Gonzaga da Silveira Junior.
Métodos Formais.
Acabias Marques Luiz. I - Introdução ao Ruby Parte 1 – Introdução a linguagem  O que é Ruby  Instalação  O IRB  Operadores Aritméticos  Tipos de.
Programação Funcional
Aula Prática 1 Monitoria IP/CC (~if669) (A partir do slide elaborado por Luís Gabriel)
Programação Lógica com Prolog
MatLab (Matrix Laboratory)
Aula Prática 3 Funções Monitoria Introdução à Programação.
Fundamentos de linguagens de programação
Algoritmos.
INE5363-Programação Funcional
Noções de lisp Lisp: LISp Processing J.M.Barreto INE-CTC-UFSC.
Programação de Computadores - 1
Programação Computacional Aula 9: Meu primeiro programa em C
Desenvolvimento WEB Prof. Renato de Oliveira Bastos
Profa. Maria Augusta Constante Puget
Programação Funcional 4a. Seção de Slides Tuplas e Definição de Funções Locais em Haskell.
Linguagens de Programação
Linguagens de Programação
Programação para Web I AULA 4 ESTRUTURAS DE CONTROLE.
11 Revisão da Linguagem C Prof. Kariston Pereira Adaptado de Material gentilmente fornecido pelo Prof. Rui Tramontin (DCC/UDESC)
Módulo I Capítulo 7: Funções e Procedimentos William Ivanski Curso de Programação C#
Lógica de Programação Aula 06 Prof. Marcelo Marcony.
IF E ITERAÇÃO WHILE Dilvan Moreira (baseado no livro Big Java e T. Munzner)
Calculo de Hoare Daniel Soares, Gabriel Alabarse Hernandez(150756) e Vanius Zapalowski(150843)
Transcrição da apresentação:

LISP – Uma Introdução Claudio Esperança

Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula Poucas construções permitem fazer muito Permite ilustrar bem os princípios da recursão Não vamos usar comandos de repetição Estruturas de dados complexas podem ser expressas de forma simples Não dá margem a “encher de lingüiça” Uma função freqüentemente pode ser verificada visualmente

Recursos Diversas implementações grátis Diversos livros, alguns grátis Recomendo a implementação de Common Lisp do Dr Bruno Haible Ver http://clisp.cons.org Distribuição binária para MS-Windows na página do curso http://www.lcg.ufrj.br/algoritmos Diversos livros, alguns grátis Recomendo “The Little Lisper” de Daniel P. Friedman e Matthias Felleisen, Mcmillan Publishing Company

Caracterí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 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 linguagens Programas e Dados têm a mesma forma É trivial escrever um programa que escreve um programa Não se trabalha com variáveis armazenadas (embora LISP suporte variáveis) Em “C++” podemos implementar uma função para inserir um elemento X numa variável L do “tipo” lista Em LISP, escreve-se uma função que, dados um elemento X e uma lista L, retorna uma lista igual a L com X inserido

Usando LISP LISP é freqüentemente implementada por um interpretador Usuário entra com uma expressão Interpretador avalia expressão e imprime o resultado Exemplo: > (+ 3 4 5 6) 18 > (+ (+ 3 4) (+ (+ 4 5) 6)) 22

Usando o intepretador CLISP Ajuda: a qualquer momento durante a interação digite help O interpretador numera os comandos Ao cometer um erro, o interpretador escreve uma mensagem de erro e entra num “break loop”, isto é, num depurador (debugger) No nosso curso, não é necessário realmente aprender a usar o depurador, por isso, digite quit para voltar ao modo de interação normal Para sair do programa, digite (bye)

Exemplo de sessão com o CLISP

Átomos São os elementos mais simples da linguagem Podem ser Símbolos a b c xxx x1 x-1 Constantes Números: 1 2 1.33 -2.95 Cadeias: “abc de” “x y z” Um símbolo pode ser associado a um valor Conceito semelhante ao de “variável” em linguagens imperativas

NIL e T Os símbolos nil e t são especiais pois seus valores são eles próprios Quando o LISP está interpretando uma expressão booleana, o átomo nil é usado para denotar o valor “falso” t denota o valor booleano “verdadeiro”, mas qualquer valor diferente de nil é entendido como verdadeiro

NIL e T - Exemplo > (<= 2 3) T > (> 3 4) NIL > (and 2 t) > (and 2 nil)

Avaliando Símbolos O interpretador sempre tenta avaliar símbolos a menos que sejam precedidos por um apóstrofe (quote) > b *** - EVAL: variable B has no value > 'b B > nil nil > t t

Avaliando Listas Assim como os símbolos, quando uma lista é apresentada ao interpretador, esta é entendida como uma função e avaliada a menos que seja precedida por um apóstrofe > (+ 1 2) 3 > '(+ 1 2) (+ 1 2) > (a b c) *** - EVAL: the function A is undefined

Listas Em LISP, se algo não é um átomo, então é uma lista Uma lista é uma seqüência de átomos ou listas entre parênteses. Por exemplo: (a b c) ; Lista com 3 elementos (d (e f) g) ; Lista com 3 elementos Observe que os elementos das listas têm que estar separados por um ou mais espaços em branco Observe também que ponto-e-vírgula denota o início de um comentário em LISP

Funções O primeiro elemento de uma lista pode portanto denotar o nome de uma função Nesse caso, os demais elementos são os argumentos da função Muitas funções são pré-definidas em LISP As seguintes são as que usaremos mais: Aritmética: + - / * Relacionais: > = < >= <= Lógicas: and or not Manipulação de listas: cons car cdr Condicionais: if cond

Definindo Funções A forma especial defun é usada para definir uma função (defun nome lista-de-argumentos expressão) Define uma função chamada nome que avalia expressão substituindo os símbolos da lista-de-argumentos pelos valores passados quando a função for invocada Exemplo > (defun test (a b) (* 2 (+ a b))) TEST > (test 3 4) 14

Examinando Listas (car lista) retorna o primeiro elemento de lista Um sinônimo de car é first CAR = Contents of Address Register (cdr lista) retorna a lista sem o seu primeiro elemento Um sinônimo de cdr é rest CDR= Contents of Decrement Register Uma lista vazia () também pode ser escrita como nil nil é tanto um átomo como uma lista!

Examinando Listas - Exemplo > (car '(a b)) A > (cdr '(a b)) (B) > (car (cdr '(a b))) B > (cdr (cdr '(a b))) NIL

Cons- truindo Listas (cons elem lista) retorna uma cópia de lista com elem inserido como seu primeiro elemento Exemplo: > (cons 'a '(b c)) (A B C) > (cons 'a '(b)) (A B) > (cons 'a nil) (A) Teorema: (cons (car L) (cdr L)) = L

Cons O que acontece se passarmos um átomo como segundo argumento de cons? > (cons 'a 'b) (A . B) De onde veio o ponto entre A e B? Resposta: O ponto sempre existe num cons, mas nem sempre é impresso Para entender, precisamos rever um conceito anterior ...

Conses (S-Expressions) Em LISP, se algo não é um átomo, então é um cons ou “S-expression” Um cons nada mais é que um registro com dois campos, o primeiro é chamado de car e o segundo de cdr A regra do ponto: O cons é escrito com o valor dos dois campos entre parênteses ou separados por um ponto Entretanto, se o campo cdr é nil ou um cons, o ponto pode ser omitido

Conses – Exemplos > (cons 'a 'b) (A . B) > '(a . b) > '(a . nil) (A) > '(a . (b . (c . nil))) (A B C) > '(a . (b . c)) (A B . C) > '((a . b) . c) ((A . B) . C) > '((a . b) . (b . c)) ((A . B) B . C)

Conses e Listas Podemos ver então que listas são conses que nunca são escritos com pontos Muitos autores preferem ignorar conses que não são listas Afinal, o que é então uma lista? Eis uma resposta formal: Axioma: nil é uma lista Teorema: Se L é uma lista, e elem é um átomo ou uma lista, então (cons elem L) é uma lista

Cond -icionais A forma especial cond permite escrever funções que envolvem decisões Forma geral: (cond (bool1 expr1) (bool2 expr2) ... (boolN exprN) ) Funcionamento: As expressões lógicas são avaliadas sucessivamente Se boolI é verdadeira então o cond avalia e retorna exprI Se nenhuma expressão lógica for avaliada como verdadeira, o cond retorna nil

If – then – else O cond pode ser usado como um if-then-else: (cond (bool1 expr1) (bool2 expr2) (bool3 expr3) (t expr4)) É equivalente à seguinte construção if bool1 then expr1 else if bool2 then expr2 else if bool3 then expr3 else expr4

Exemplo > (cond ((= 1 2) 'a) ((> 2 3) 'b) ((< 3 4) 'c) ) C > (defun f (lista elem) (cond ((eq lista nil) nil) ((eq (car lista) elem) t) (t (f (cdr lista) elem)) F > (f '(a b c) 'c) T > (f '(a b c) 'd) NIL

Expressões Lógicas São montadas com o auxílio das funções que implementam os predicados relacionais e lógicos tradicionais Predicados lógicos: and or not Predicados relacionais: > = < >= <= Argumentos devem ser números Para comparar símbolos usa-se o predicado eq Para comparar conses estruturalmente usa-se o predicado equal

Expressões Lógicas - Exemplos > (or (< 2 3) (> 2 3)) T > (= 'a 'b) *** - argument to = should be a number: A > (eq 'a 'b) NIL > (eq 'a 'a) > (eq '(a b) '(a b)) > (equal '(a b) '(a b))

Exercícios Escreva as funções (apaga L X) (acresc L X Y) Dada uma lista L e um elemento X , retorna L sem X. Se L não contém elem inicialmente, retorna uma cópia exata de L > (apaga ‘(a b c d a) ‘a) (b c d) (acresc L X Y) Dada uma lista L, um elemento X e um elemento Y, retorna uma cópia de L onde um Y é inserido depois de cada X > (acresc ‘(a b c d a) ‘a ‘k) (a k b c d a k)