Você está na página 1de 6

Tópicos:

O que fazem o programa Eliza ou o Programa Doctor ? (marar pediu para


baixar e testar um desses)

A Linguagem LISP

A linguagem LISP (LISt Processing) foi inspirada pelo Cálculo Lambda [footnote O Cálculo
Lambda foi um formalismo desenvolvido nos anos 30 pelo matemático Alonzo Church]. A principal
característica do Cálculo Lambda é tratar funções como entidades que podem ser, como um dado
qualquer, utilizadas como argumentos retornadas como valores de outras funções. Esta
característica é preservada na linguagem LISP onde dados e funções tem exatamente o mesmo
status.
O Cálculo Lambda é um modelo teórico
Podemos apontar em relação ao Cálculo Lambda:
• Simplicidade: só existem três tipos de expressões (s-expressões, átomos e listas);
• Completo: não existe função que não possa ser representada;
• Generalidade: funções podem ser passadas como argumentos, simplificadas, comparadas,
etc.
Lisp é uma família de linguagens que possuem uma longa história; as primeiras idéias-
chave para a linguagem foram desenvolvidas por John McCarthy em 1956, durante um projeto de
pesquisa em inteligência artificial. A motivação de McCarthy surgiu da idéia de desenvolver uma
linguagem algébrica para processamento de listas para trabalho em IA (inteligência artificial).
Esforços para a implementação de seus primeiros dialetos foram empreendidos no IBM 704, IBM
7090, DEC PDP-1, DEC PDP-6 e DEC PDP-10.
O dialeto principal entre 1960 e 1965 foi o Lisp 1.5. No início dos anos 70, houve outros
dois dialetos predominantes, desenvolvidos através de esforços anteriores: MacLisp e Interlisp.
O MacLisp aperfeiçoou a noção de variáveis especiais e o suporte a erros. Também
introduziu o conceito com número variável de argumentos, macros, arrays, cálculos rápidos, além
de enfatizar a velocidade de execução.
O Interlisp introduziu muitas idéias na metodologia no ambiente de execução. Uma de suas idéias
que influenciou os dialetos mais recentes foi à construção que mais tarde inspiraria a macro Loop,
implementada por Warren Teitelman.
Apesar das primeiras implementações do Lisp terem sido feitas nos IBM 704 e 7090,
trabalhos posteriores concentravam-se nos DEC PDP-6 e PDP-10, este último sendo o baluarte
do Lisp e das pesquisas em IA (inteligência artificial) em lugares como o MIT (Massachussets
Institute of Tecnology) e as Universidades de Stanford e Carnegie-Mellon até metade dos anos 70.
O computador PDP-10 e seu antecessor, o PDP-6 eram por definição, especialmente adequados
para o Lisp, devido a possuírem palavras de 36 bits e endereços de 18 bits. Esta arquitetura
permitia um registro de um conscell (par pontuado) em uma única palavra de memória, em
instruções simples extraiam o seu car e cdr. Esses computadores possuíam também poderosas
instruções de pilha, que proporcionavam rápida chamada às funções; porém suas limitações em
1973 eram evidentes: suportavam um pequeno número de pesquisadores utilizando o Lisp e seu
endereçamento em 18 bits limitava o espaço dos programas. Uma resposta para o problema de
endereçamento foi o desenvolvimento do "Lisp Machine", um computador dedicado especialmente
à tarefa de trabalhar com a linguagem. Outra solução foi à utilização de computadores de uso
geral com maior capacidade de endereçamento, como o DEC VAX e o S1 Mark IIA.
Ao final dos anos 70, um grupo de pesquisadores do MIT (Massachussets Institute of
Tecnology) deram início ao projeto NIL (New Implementation of Lisp) para o DEC VAX. Um dos
êxitos do programa foi consertar muito dos já históricos, porém irritantes "bugs" que a linguagem
apresentava. Simultaneamente, pesquisadores da Universidade de Stanford começaram o
desenvolvimento de um dialeto específico para o supercomputador S1 Mark IIA, dialeto conhecido
como S1 Lisp, que possuía a característica de não ser totalmente funcional.
Esforços de padronização da linguagem iniciaram-se em 1969, quando Anthony Hearn e
Martin Griss da Universidade de Utah definiram o Standard Lisp, um subconjunto do Lisp 1.5 e de
outros dialetos. Nos anos seguintes, o mesmo grupo desenvolveu uma nova implementação
conhecida como PSL (Portable Standard Lisp), que chegou a ser utilizado até meados da década
de 80, devido a sua grande portabilidade.
Durante a segunda metade dos anos 70, um importante avanço ocorreu: foi à implementação do
Scheme Lisp, projetado por Gerald Sussman e Guy L. Steele Jr., o qual consiste em um dialeto
relativamente simples, cujo projeto trouxe de volta alguns dos conceitos originais da semântica da
linguagem.
No final dos anos 70, a programação orientada a objetos trouxe a sua contribuição.
Inspirados em alguns conceitos do Small Talk, pesquisadores do MIT (Massachussets Institute of
Tecnology) desenvolveram o Flavors, primeiro Lisp com orientação a objetos. A própria Xerox
também desenvolveu o seu dialeto Lisp: O LOOPS (Lisp Object-Oriented Programming System).
A facilidade de utilização, adaptação e extensão da linguagem Lisp, aliada à sua origem
acadêmica, fez com que surgissem dezenas de versões diferentes: FranzLisp, ZetaLisp, LeLisp,
MacLisp, InterLisp, Scheme, T, Nil, XLisp, AutoLisp, etc, para nomear apenas as mais relevantes.
Esta variedade de dialetos começou a tornar difícil a livre comunicação entre os membros da
comunidade Lisp. Para obviar este problema, em Abril de 1981 os grupos de pesquisa Symbolics,
NIL, S1 e SPICE reuniram-se para criar um Standard denominado Common Lisp com o objetivo
de facilitar a troca de idéias (e programas).
Citado por Antônio Menezes Leitão, “sendo a linguagem Common Lisp o herdeiro legítimo
de todas as outras, ela deve suportar a maioria das capacidades que estas possuem. Como é
lógico isto impede a estabilização da linguagem, que ainda não parou de evoluir, sendo ampliada
de tempos a tempos para incorporar novos (e velhos) paradigmas de programação. Felizmente,
essa ampliação evita (na medida em que isso é possível) alterar funcionalidades das versões
anteriores e assim um programa Common Lisp tem a garantia de funcionar independentemente do
estado atual da linguagem. O programa pode não estar tecnologicamente atual, mas estará
sempre funcionalmente atual“.

O cálculo lâmbda
As linguagens de programação funcionais, como Lisp, ML, Haskell são baseadas no
Lambda Cálculo. A principal característica do Lambda Cálculo são as entidades que podem ser
utilizadas como argumentos e retornadas como valores de outras funções.

Sintaxe
Uma abstração lambda é um tipo de expressão que denota uma função:
(λx. + x 1)

O λ determina que existe uma função, e é imediatamente seguido por uma variável,
denominada parâmetro formal da função.
(λ . + X 1)
A função de x que incrementa x de 1

Uma expressão lambda deve ter a forma:


<exp> ::= <constante>
| <variavel>
| <exp> <exp>
| λ.<variavel> <exp

E parênteses podem ser utilizados para prevenir ambiguidades.

Sintaxe LISP
O LISP recebe uma instrução, a processa e depois a imprime, utilizando um método
conhecido como read-eval-print, semelhante ao utilizado por outras linguagens: como o
Matlab e o Prolog.

Os elementos primitivos são as unidades mais básicas com as quais podemos


trabalhar, sejam variáveis números ou strings.
Ex.: >>1
Output:
1

A partir de elementos primitivos podemos construir combinações, utilizando uma notação


pré-fixa, com a forma (operador operando_1 operando_2).
Ex.:
>> (+ 2 6)
Output:
8

É possível ainda construir combinações que utilizem como operandos outras


combinações.
Ex.:
>> (- (+ 2 6) 1)
Output:
7

Devido a essa capacidade de aninhar expressões o LISP utiliza os parênteses (que lhe
renderam piadas em relação a sua considerável quantidade) para definir relações de
precedencia.

Podemos ainda armazenar resultados em variáveis utilizando o operador setq.


Ex.:
>> (setq a 5)
Output:
5

Vale salientar que LISP não possui a rigidez de outras linguagens no que tange aos
identificadores (símbolos), são perfeitamente aceitos pela linguagem simbolos como
1+52*8.
Ex.:
>> (setq 1+52*8 2)
>> 1+52*8

Output:
2
2

Como em qualquer linguagem de programação podemos construir rotinas (operadores)


para serem utilizados como recurso da linguagem. Para tal também utilizamos
combinações de elementos. São quatro elementos ao todo, o primeiro deles é o operador
defun, seguido do nome da rotina, da lista de variáveis e por fim da rotina propriamente
dita.
Ex.:
>> ( defun pow (x) (* x x) )
Output:
POW

Condicionais
Em LISP o valor NIL é considerado como falso e tudo que for diferente de NIL é tomado como verdadeiro.
Contudo foi criado um valor T que é utilizado como verdade por funções que possuem resposta booleana.
Para realizar o desvio de código é utilizado o operador if. Esse operador possui 4 elementos o operador if, a
condição a ser verificada, sua resposta em caso afirmativo e sua resposta em caso negativo.
As condicionais são comumente chamadas de predicados já que implementam o conceito de (p -> q) (se p
então q)
Ex.:
>> (if (> 4 3) 25 -25)
Output:
25

Também para manipular condicionais existe o operados cond que se comporta de forma semelhante ao
switch-case do C. Sua sintaxe é:

(cond (condição-1 expressão-1)


(condição-2 expressão-2)
condição-n expressão-n))

O LISP irá testar a condição-1, caso seja verdadeira assumimos o valor de expressão-1, caso contrário
analisaremos o valor  de condição-2 e assim sucessivamente, caso todas as condições falhem
assumiremos o valor NIL.
Ex.:
>> (cond ((> 4 3) 1)
((< 5 10) 2) )
Output:
1

LISP possui ainda estruturas de daso que auxiliam na manipulação da informação. Um exemplo é o cons
que armazena um par de elementos.
Ex.:
>> (cons 4 3)
Output:
(4 . 3)

Há ainda a lista (que dá nome a linguagem), ela é definida por:


(list <expressão-1> <expressão-2> … <expressão-n>)
Ex.:
>> (list 1 2 3 4 5)
Output:
(1 2 3 4 5)

São vários os recursos disponibilizados pelo LISP, contudo esse relatório busca apenas uma introdução a
linguagem LISP.

Sistemas Especialistas construídos em LISP


O MYCIN foi um dos primeiros sistemas especialista, desenvolvido no início da década de 70 na
universidade de Stanford, foi o trabalho de dissertação de doutarado de Edward Shortliffe sob a orientação
de BruceBuchanan e outros.
Esse sistema foi desenvolvido com o intuito de diagnosticar pacientes que contraisse bactérias causadoras
de infecções graves e diagnosticar antibióticos com a dose adequada para o paciente. Esse sistema não foi
implementado realmente por diversas questões, éticas e técnicas, que forma abordadas na época. A sua
principal contribuição foi em relação ao raciocínio lógico e a estrutura de regras aplicadas no programa que
foi desenvolvido em LISP.
O MYCIN foi usado por diversos outros Sistemas Especialistas da área não-médica devido a sua
representação e abordagem de raciocínio.

Um Sistema Especialista é basicamente formado por três componentes:


• "Base de dados": base de conhecimento - descreve a situação corrente e a meta;
• "Conjunto de operadores": mecanismos para exploração - unidades que operam sobre a base de
dados;
• "Estratégia de controle": Raciocínio Para Frente (bottom-up) - aplicação de operadores sobre as
estruturas na base de dados que descreve a situação do domínio de uma tarefa para produzir uma
situação modificada, e Raciocínio Para Trás (top-down) - aplicação de operadores sobre as metas
para reduzí-las às submetas. A combinação dos dois raciocínios também é possível.

Em microcontroladores, podem ser usadas diversas ferramentas para construir


sistemas especialistas:
• Diversas ferramentas do tipo "shell", tais como EXPERT-EASE, M-1, INSIGHT, ARBORIST,
EXSYS, ES/P, PERSONAL CONSULTANT, GURU, NEXPERT, e outras de 16 e 32 bits permitem
o desenvolvimento de Sistemas Especialistas em microcomputadores;
• Podemos utilizar ao invés de "shells" demais linguagens de programação como: BASIC, FORTRAN,
ALGOL, PASCAL, FORTH entre outras. Algumas linguagens de programação que foram
desenvolvidas especificamente para facilitar o desenvolvimento de aplicações de IA como LISP,
PROLOG e LOGO são mais utilizadas.

http://www.din.uem.br/ia/especialistas/basese.html

Comparação entre linguagens funcionais


(caso da LISP) e declarativas.
Programação funcional é um paradigma de programação que trata a computação como uma avaliação de
funções matemáticas e que evita estados ou dados mutáveis. Ela enfatiza a aplicação de funções, ao
contrário da programação imperativa, que enfatiza mudanças no estado do programa.

A Programação Declarativa preocupa-se em dizer ao computador "O QUE" precisa ser feito, cabendo ao
computador decidir qual a melhor solução para essa solicitação. As linguagens definidas por este paradigma
não podem ser consideradas como linguagens de programação, e sim, como sub-linguagens. O grande
mercado que envolve a computação utiliza-se bastante destas linguagens. Tem-se como seus principais
representantes:
XML
SQL

Aplicações WEB e Científicas em LISP

http://www.inf.ufsc.br/~func/#Fundamentos Te
óricos de Programacäo Funcional -
http://www.facom.ufu.br/~madriana/PF/LambdaCal.pdf
http://www.dca.fee.unicamp.br/courses/EA072/lisp9596/index.html

Você também pode gostar