You are on page 1of 52

Programacin Funcional

Lisp
(LISt Processing)

Dr. Gustavo Padrn-Rivera

Programacin Lgica y Funcional 1


Programacin funcional
La programacin funcional significa, entre otras cosas, escribir
programas que trabajan regresando valores, en lugar de modificar
cosas.
Paradigma dominante en Lisp

Programacin Lgica y Funcional 2


Introduction
Developed by John McCarthy, MIT, in the late 1950s
the original idea was to implement a language based on mathematical functions that
McCarthy was using to model problem solving
A student implemented the first interpreter, and it was quickly adopted for AI
programming:
symbolic computing
list processing
recursion
early Lisp was based almost entirely on recursive and so
Lisp had no local variables nor iterative control structures (loops)
and since Lisp was interpreted, there was no compiler for early Lisp
DARPA sponsored an effort in the early 1980s to develop a standard for
Lisp, and so Common Lisp (CL) was born.

Programacin Lgica y Funcional 3


Some CL Uses
CL is a very successful language in that
it is extremely powerful as an AI tool
those that use it love it
And yet CL is a very uncommon language because
it is very complicated
most software development is in C++ (with some in Java, C#, C, Python, Ada, etc) such that
few programmers would choose to use CL for development
The most important software developed from CL includes:
Emacs
G2 (a real-time expert system)
AutoCAD
Igor Engraver (musical notation editor and publisher)
Yahoo Store

Programacin Lgica y Funcional 4


Why Study CL?
Learn about functional programming
Learn how to utilize recursion better
Learn about symbolic computing
Gain experience in other languages and syntax
Get a better idea of such concepts as scope, binding, memory
allocation, etc.
Learn a little about AI problem solving
But primarily: learn a new language!
one that is very VERY different from what you have already experienced
Programacin Lgica y Funcional 5
Iniciar y salir de Common Lisp
Arrancar un interprete: clisp
Cerrar el interprete: (exit) o (quit)

Programacin Lgica y Funcional 6


Top-level
A Lisp Top-Level is a program which allows interactive evaluation of
Lisp expressions.
Uno escribe expresiones Lisp en el Top-Level, y el sistema despliega
sus valores.
El prompt > indica que Lisp esta esperando que una expresion sea
escrita. La expresion es evaluada al pulsar enter.
> 1
1
>

Programacin Lgica y Funcional 7


Operaciones matemticas
Expresiones y Notacin prefija
> 1
1
> (+ 2 3)
5
> (+ (- 5 2) (* 3 3))
12

Programacin Lgica y Funcional 8


Generalidad del prefijo
Si queremos sumar tres numeros en notacion normal(infija),
necesitaramos usar dos veces el operador +: 2+3+4.
En Lisp solo necesitamos agregar otro argumento:
> (+)
0
> (+ 2)
2
> (+ 2 3)
5
> (+ 2 3 5)
10

Programacin Lgica y Funcional 9


Operaciones matemticas
Evaluacin
> (+ (- 5 2) (* 3 3))
12
Regla de evaluacin (bsica)
De izquierda a derecha
Todo se evalua
Usar quote para evitar evaluaciones:
> '(+ (- 5 2) (* 3 3))
(+ (- 5 2) (* 3 3))

Programacin Lgica y Funcional 10


Ejemplos con quote
Otro ejemplo:
> x
*** - EVAL: variable X has no value
1. Break> abort

> 'x
X

> (esto (es) (una lista))


*** - EVAL: undefined function ESTO
Break> abort

> '(esto (es) (una lista))


(ESTO (ES) (UNA LISTA))

Programacin Lgica y Funcional 11


Construccin de listas (list)
Se puede construir listas usando el operador list que es una funcin, y
por lo tanto, sus argumentos son evaluados. Ej.
> ( list 'mis (+ 4 2) 'colegas )
(MIS 6 COLEGAS )
Esttica minimalista y pragmtica, observen que los programas Lisp se
representan como listas.

Programacin Lgica y Funcional 12


Proteccin de listas
Si una lista es precedida por el operador quote, la evaluacin regresa
la misma lista, en otro caso, la lista es evaluada como si fuese cdigo.
Ej.
> ( list '(+ 2 3) (+ 2 3))
((+ 2 3) 5)

Programacin Lgica y Funcional 13


Listas vacas
En Lisp hay dos formas de representar la lista vacia, como un par de
parntesis o con el smbolo NIL. Ej.
> ()
NIL
> NIL
NIL

Programacin Lgica y Funcional 14


Constructor de listas (cons)
La funcin cons construye listas.
Si su segundo argumento es una lista, regresa una nueva lista con el
primer argumento agregado en el frente. Ej.
> ( cons 'a '(b c d))
(A B C D)

> ( cons 'a ( cons 'b nil ))


(A B)
El segundo ejemplo es equivalente a:
> ( list 'a 'b)
(A B)

Programacin Lgica y Funcional 15


Acceso a listas (car y cdr)
Las funciones primitivas para accesar los elementos de una lista son
car y cdr. El car de una lista es su primer elemento (el mas a la
izquierda) y el cdr es el resto de la lista (menos el primer elemento).
Ej.
> (car '(a b c))
A car abreviacin de "Contents of the Address
> (cdr '(a b c)) part of Register number" (Contenido de la
parte direccin del nmero de registro).
(B C)
cdr "Contents of the Decrement part
of Register number" (contenido de la parte
decremento del nmero de registro).

Programacin Lgica y Funcional 16


Acceso a listas (car y cdr)
Se pueden usar combinaciones de car y cdr para accesar cualquier
elemento de la lista. Ej.
> (car (cdr (cdr '(a b c d ))))
?
> ( caddr '(a b c d))
?
> ( third '(a b c d))
?

Todas son C?

Programacin Lgica y Funcional 17


Salidas y entradas de valores
Salida: funcin format
> (format t "~a mas ~a igual a ~a. ~%" 2 3 (+ 2 3))
2 mas 3 igual a 5.
NIL
Entrada: funcin read
> (defun pide (frase)
(format t "~a " frase)
(read))
PIDE
> (pide "Su edad, por favor:")
Su edad, por favor: 23
23

Programacin Lgica y Funcional 18


Variables globales
> (setf *var_global* 3)
>*VAR_GLOBAL*
> (+ *var_global* 5)
> 8

Programacin Lgica y Funcional 19


El paradigma de la programacion funcional
Valores vs. Modificaciones
1. > (setf x '(a b c d))
(A B C D)

2. > (remove 'b x)


(A C D)
> x
(A B C D)

3. > (setf x (remove 'b x))


(A C D)
> x
(A C D)

Programacin Lgica y Funcional 20


Tipos de datos bsicos Una lista punteada (dotted list)
es una cuyo ltimo cons no tiene
NIL como su CDR, sino otro
Atmicos: objeto de informacin (que
tampoco ser un CONS, ya que
Nmeros: 27, 3.14, . . . entonces el CONS anteriormente
Smbolos: foo, FIRST, +, . . . mencionado no hubiera sido el
caracteres: #nA, #nSpace ltimo CONS de la lista).

No atmicos:
Pares punteados y listas: (a . b), (a b c d e)
Cadenas: "Buenos das"
Arrays: #(a b 0 nil), #3A(((0 0) (1 1) (2 2)) ((0 1) (1 2) (2 3)))
Estructuras: #S(PERSONA :NOMBRE (ana maria) :ESTADO casado :CALLE
(avenida Morelos) :CIUDAD Xalapa)
Tablas hash

Programacin Lgica y Funcional 21


Pares y listas
Pares punteados:
Construtor: cons
Ejemplo: (cons 1 2) se evala al par (1 . 2)

Listas
Un tipo especial de par punteado (pero el tipo de dato no atmico ms
comn)
>(list 1 2 3)
Ejemplo: la lista (1 2 3)

Programacin Lgica y Funcional 22


Actividad - Funciones bsicas con listas
* (CONS X Y)
(cons 'a 'b)
(cons 'a '(b c))
(cons 'a (cons 'b (cons 'c '())))
(cons '(a b) '(c d))
* (LIST X-1 ... X-N)
(list 'a 'b 'c)
(list '(a b) '(c d))
(list)
(list (list 'a 'b) (list 'c 'd 'e))
* (APPEND L-1 ... L-N)
(append '(a) '(b) '(c) '(x y))
(append '(a b) '(c d))
* (REVERSE L)
(reverse '(a (b c) d))

Programacin Lgica y Funcional 23


Resultados de la actividad anterior.
* (CONS X Y)
(cons 'a 'b) (A . B)
(cons 'a '(b c)) (A B C)
(cons 'a (cons 'b (cons 'c '()))) (A B C)
(cons '(a b) '(c d)) ((A B) C D)
* (LIST X-1 ... X-N)
(list 'a 'b 'c) (A B C)
(list '(a b) '(c d)) ((A B) (C D))
(list) NIL
(list (list 'a 'b) (list 'c 'd 'e)) ((A B) (C D))
* (APPEND L-1 ... L-N)
(append '(a) '(b) '(c) '(x y)) (A B C X Y)
(append '(a b) '(c d)) (A B C D)
* (REVERSE L)
(reverse '(a (b c) d)) (D (B C) A)

Programacin Lgica y Funcional 24


Listas

>(setf lista (A B C) (A B C)
>(car lista) A
>(cdr lista) (B C)
>(car (cdr lista)) ?
Cules son resultados?
>(car (cdr (cdr lista))) ?

Programacin Lgica y Funcional 25


Funciones de acceso a listas
* (FIRST L), (CAR L)
(first '(a b c)) A
(first ()) NIL
* (REST L), (CDR L)
(rest '(a b c)) (B C)
(rest ()) NIL
* (SECOND L)
(second '(a b c d)) B
(second '(a)) NIL
* (NTH N L)
(nth 2 '(a b c d)) C
* (LENGTH L)
(length '(a (b c) d)) 3
* (SUBSEQ L I J)
(subseq '(a b c d e f g h) 2 5) (C D E)

Programacin Lgica y Funcional 26


Nmeros
Existen distintos tipos de nmeros:
Enteros: 14, 0, -7
Racionales: 4/5, -2/1
Punto flotante: 4.634, -.543
Complejos: #C(3 46), #C(3.2, -5)
> (/ 22 7)
22/7
> (round (/ 22 7))
3 ;
1/7
> (float (/ 22 7))
3.142857
> #c(2 0)
2

Programacin Lgica y Funcional 27


Funciones aritmticas
* (+ X-1 ... X-N)
(+ 3 7 5) => 15
* (- X-1 ... X-N)
(- 123 7 5) => 111
(- 3) => -3
* (* X-1 ... X-N)
(* 2 7 5) => 70
* (/ X Y)
(/ 6 2) => 3
(/ 5 2.0) => 2.5
* (MOD X Y)
(mod 7 2) => 1
* (EXPT X Y)
(expt 2 3) => 8
* (SQRT X)
(sqrt 16) => 4
Programacin Lgica y Funcional 28
Actividad
Ejecutar estas funciones en la consola
(setq a 4 b 5.0 c 6.38 )
(setq d ( + a b ) )
(setq a ( + a 4))
(setq a ( + a 2.0))
(setq e ( * a b 0.25))
( setq l ( 1+ a))
(max a b c d e l )
(setq f ( min a b c d e l ) )
( setq g ( rem ( max a b c d e l ) ( min a b c d e l ) ) )
( abs (- 12.5))
( setq dis ( sqrt ( + ( expt a 2) (expt b 2 ) ) ) )

Programacin Lgica y Funcional 29


Valores lgicos T y NIL
El smbolo NIL tiene asociado el valor logico "falso".
El smbolo T tiene asociado el valor logico "verdadero".
Pero en general, cualquier elemento distinto de NIL tiene el valor
lgico "verdadero".
Un predicado es una funcin que devuelve un valor de verdad.
> (listp '(a b c))
T
> (listp 27)
NIL
>

Programacin Lgica y Funcional 30


Predicados aritmticos
* (= X-1 ... X-N)
(= 2 2.0 (+ 1 1)) => T
(= 1 2 1) => NIL
* (> X-1 ... X-N)
(> 4 3 2 1) => T
(> 4 3 3 2) => NIL
* (>= X-1 ... X-N)
(>= 4 3 3 2) => T
(>= 4 3 3 5) => NIL
* (< X-1 ... X-N)
* (<= X-1 ... X-N)

Programacin Lgica y Funcional 31


Predicados de igualdad eql is the same as eq, except that if
the arguments
are characters or numbers of the
* (EQ X Y) same type then their values are
(eq 3 3) T compared. Thus eql tells whether
(eq 3 3.0) NIL two objects are conceptually the
(eq 3.0 3.0) NIL same, whereas eq tells whether
two objects are implementationally
(eq (first '(a b c)) 'a) T identical. It is for this reason
(eq (cons 'a '(b c)) '(a b c)) NIL that eql, not eq, is the default
* (EQL X Y) comparison predicate
for operators that take sequences as
(eql 3.0 3.0) T arguments.
(eql (cons 'a '(b)) (cons 'a '(b))) NIL
* (EQUAL X Y)
(equal (cons 'a '(b)) (cons 'a '(b))) T

Programacin Lgica y Funcional 32


Expresiones condicionales
La forma especial IF:
(IF <condicion>
<consecuencia>
<alternativa>)
Mecanismo de evaluacion de un IF (forma especial):
Evalua <condicion>:
Si el valor es distinto de NIL ("verdadero") devuelve el valor de
<consecuencia>,
en caso contrario devuelve el valor de <alternativa>.
Ejemplo:
(DEFUN mi_funcion1 (x y) (if (= y 0) 9999999 (/ x 10)) )

Programacin Lgica y Funcional 33


Operadores lgicos
* (NOT X)
(not (= (+ 1 1) 2)) NIL
(not (= (+ 1 1) 3)) T
* (OR E-1 ... E-N)
(or nil 2 3) 2
(or (eq 'a 'b) (eq 'a 'c)) NIL
* (AND E-1 ... E-N)
(and 1 nil 3) NIL
(and 1 2 3) 3

Programacin Lgica y Funcional 34


Funciones IMPORTANTE: Cuando definimos una
funcin, s es necesario
el uso de parntesis para definir los
parmetros de esta; pero es
La forma especial DEFUN un error si los usamos cuando
queremos ejecutar dicha funcin.
(DEFUN <nombre>
(<parametros>)
<documentacion>
<cuerpo>)
<nombre>: smbolo al que se asocia la funcin.
<parametros>: sucesion de smbolos a los que se asignar, temporalmente,
el valor de los argumentos con los que se utilice la funcin.
<documentacion>: cadena en la que se describe la funcin. Es opcional.
<cuerpo>: sucesin de expresiones que se evalan cuando se utiliza la
funcin.

Programacin Lgica y Funcional 35


Funciones
La forma especial defun viene de define function.
Se utiliza para definir funciones.
(defun apellido (nombre)
"Selecciona el apellido de un nombre representado como una lista (en formato sajn)"
(first (last nombre)))
La funcin recibe un nombre last-name, tiene una lista de parmetros que contiene un nico
parmetro (name). Tambin tiene una cadena de documentacin que dice que es lo que la
funcin hace. El cuerpo de la funcin es (first (last name)). En general:
(defun function-name (parameter ...)
"Documentation string"
function-body ...)
Una vez definida, la funcin se puede utilizar como cualquier otra funcin LISP.
> (APELLIDO '(Gustavo Padron)) Padron
> (APELLIDO '(Antonio De las Cruces Revueltas)) REVUELTAS
> (APELLIDO '(Aristoteles)) Aristoteles

Programacin Lgica y Funcional 36


Actividad

Definir la funcin first-name.

Programacin Lgica y Funcional 37


Funciones - ejemplos
Ejemplo:
(defun cuadrado (x)
"Cuadrado de un numero"
(* x x))

(cuadrado 4) se evalua a 16:


Se evalua cuadrado: funcion denida por el usuario.
Se evalua 4: 4
Se asocia al parametro de cuadrado, x, el valor 4.
Se evalua la expresin que compone el cuerpo de cuadrado:
Se evalua *: funcin primitiva de Lisp para calcular el producto.
Se evalua x: 4
Se evalua x: 4
Se calcula el producto con argumentos 4 y 4: 16
Se elimina la asociacion del parmetro.

Programacin Lgica y Funcional 38


Actividad

Hacer script llamado Calculadora.lsp


Documentar sus scritps con: nombre, fecha, materia y una breve
descripcin. Los comentarios se colocan usando ;;
Hacer una calculadora: suma, resta, multiplicacin, divisin y raz
cuadrada.
funciones para obtener el rea y permetro de un tringulo, cuadrado
y crculo.

Programacin Lgica y Funcional 39


Examen

Funcin que devuelva el 3er elemento de una lista

Programacin Lgica y Funcional 40


Definiciones recursivas
Recursin:
> (defun factorial (n)
(if (= n 0) 1
(* n (factorial (- n 1)))))
FACTORIAL

> (factorial 3)
6

Programacin Lgica y Funcional 41


Traza de recursin
En general, TRACE (y UNTRACE) son herramientas tiles para depuracin:
> (trace factorial *)
(FACTORIAL *)

> (factorial 2)
1. Trace: (FACTORIAL '2)
2. Trace: (FACTORIAL '1)
3. Trace: (FACTORIAL '0)
3. Trace: FACTORIAL ==> 1
3. Trace: (* '1 '1)
3. Trace: * ==> 1
2. Trace: FACTORIAL ==> 1
2. Trace: (* '2 '1)
2. Trace: * ==> 2
1. Trace: FACTORIAL ==> 2
2

> (untrace)
(* FACTORIAL)

Programacin Lgica y Funcional 42


Actividad

Agregar en el script llamado Recursividad.lsp la siguiente funcin.


Realizar funcin recursiva para Fibonacci.
Documentar sus scritps con: nombre, fecha, materia y una breve
descripcin. Los comentarios se colocan usando ;;

Programacin Lgica y Funcional 43


Archivos

Guardarlo como hola.lsp


Compilar (File> compile)
Cargar (File>load)
Tambin existe el comando load and
compile

Programacin Lgica y Funcional 44


Actividad
1. (remove-first '( a b c ...) ) -> ( b c ...) --- remove the first item from
the list.
2. (remove-second '(a b c ...) ) -> (a c ...) -- remove the second item
from the list.
3. (insert-as-second 'b '(a c ...) ) -> (a b c ...) --- insert as the second
element.

4. NOTA: DOCUMENTAR SU CDIGO

Programacin Lgica y Funcional 45


Comando NULL
(null '()) => T
(null '(1 2 3)) => NIL
(null nil) => T
(null t) => NIL
(null 234.4) => NIL
(null "lisp") => NIL

Programacin Lgica y Funcional 46


Comando REST
(rest '(1 2 3)) => (2 3)
(rest (cons 'a 'b)) => B
(rest (cons '(1 2 3) '(a b c))) => (A B C)
(rest '()) => NIL (rest nil) => NIL

Programacin Lgica y Funcional 47


Actividad
Find the last box of a list.
Example:
* (my-last '(a b c d))
(D)

Find the K'th element of a list. The first element in the list is number 1
Example:
* (element-at '(a b c d e) 3)
C

Find the number of elements of a list.

Programacin Lgica y Funcional 48


Ideas grandes
Aunque este documento presenta un bosquejo rpido de Lisp, es
posible apreciar ya el retrato de un lenguaje de programacin inusual.
Un lenguaje con una sola sintaxis para expresar programas y datos.
Esta sintaxis se basa en listas, que son a su vez objetos en Lisp.
Las funciones, que son objetos del lenguaje tambien, se expresan
como listas.
Y Lisp mismo es un programa Lisp, programado casi por completo con
funciones Lisp que en nada dieren a las que podemos definir.

Programacin Lgica y Funcional 49


A practicar
No debe preocuparles que la relacion entre todas estas ideas no sea
del todo clara.
Lisp introduce tal cantidad de conceptos nuevos que toma tiempo
acostumbrarse a ellos y como usarlos.
Solo una cosa debe quedar clara: Las ideas detras Lisp son
extremadamente elegantes.

Programacin Lgica y Funcional 50


Para concluir
Si C es el lenguaje para escribir UNIX (Richard Gabriel), entonces
podramos describir a Lisp como el lenguaje para describir Lisp, pero
eso es una historia totalmente diferente.
Un lenguaje que puede ser escrito en si mismo, es algo distinto de un
lenguaje para escribir una clase partcular de aplicaciones.
Ofrece una nueva forma de programar: as como es posible escribir un
programa en el lenguaje, el lenguaje puede mejorarse para
acomodarse al programa!
Esto es un buen inicio para entender la escencia de Lisp.

Programacin Lgica y Funcional 51


Referencias
Graham, P. ANSI Common Lisp (Prentice Hall, 1995).
Norvig, P. Paradigms of Articial Intelligence Programming: Cases Studies in
Common Lisp (Morgan Kaufmann, 1992).
Seibel, P. Practical Common Lisp (Apress). http://www.gigamonkeys.com/book/
Steele, G.L. Common Lisp the Language, 2nd edition (D. P., 1990). http://www-
2.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/-ai/html/cltl/cltl2.html
Touretzky, D. Common Lisp: A Gentle Introduction to Symbolic Computation
(Benjamin-Cummings Pub Co).
http://www.cgi.cs.cmu.edu/afs/cs.cmu.edu/user/dst/www/LispBook/
Winston, P.R. y Horn, B.K. LISP (3a. ed.) (Addison{Wesley, 1991).
Tutorial online: http://www.n-a-n-o.com/lisp/cmucl-tutorials/LISP-tutorial-1.html

Programacin Lgica y Funcional 52

You might also like