Escolar Documentos
Profissional Documentos
Cultura Documentos
Curso 20112012
Universidad de Sevilla
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.1
Introduccin a Lisp o
x
Lambda clculo a
Lenguaje interpretado
u u
Procesamiento simblico o
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.2
Introduccin a Lisp o
x
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.3
El usuario escribe una expresin en el intrprete. o e El intrprete de Lisp reconoce la expresin como la representacin escrita de un e o o objeto Lisp. El objeto es evaluado. Su valor es un objeto Lisp. El intrprete elige una representacin escrita del valor obtenido. e o El intrprete escribe dicha representacin. e o
u u u
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.4
Introduccin a Lisp o
x
Expresiones
> 1 1 > (+ 2 3) 5 > (+ (- 5 2) (* 3 3)) 12
Primeras observaciones:
u u u
Notacin preja: funcin y argumentos. Parntesis. Expresiones anidadas o o e Atomos y listas Sintcticamente simple a
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.5
Introduccin a Lisp o
x
Evaluacin o
> (+ (- 5 2) (* 3 3)) 12
Todo se eval a u
u
IA-I 20112012
1.6
Introduccin a Lisp o
x
La funcin quote: o
> (quote (+ (- 5 2) (* 3 3))) (+ (- 5 2) (* 3 3)) > (+ (- 5 2) (* 3 3)) (+ (- 5 2) (* 3 3))
Otro ejemplo:
> x *** - EVAL: variable X has no value 1. Break> abort > x X > (esto (es) (una lista)) *** - EVAL: undefined function ESTO 1. Break> abort > (esto (es) (una lista)) (ESTO (ES) (UNA LISTA))
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.7
Introduccin a Lisp o
x
Algunas observaciones
u u u
IA-I 20112012
1.8
Introduccin a Lisp o
x
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.9
Introduccin a Lisp o
x
Valores vs. Modicaciones > (setf x (a b c d)) (A B C D) > (remove b x) (A C D) > x (A B C D) > (setf x (remove b x)) (A C D) > x (A C D)
Los programas se comportan como funciones en el sentido matemtico, dependiendo a exclusivamente de sus datos de entrada Vericacin formal o
Cc Ia
Introduccin a Lisp o
IA-I 20112012
1.10
Atmicos: o
u u u
No atmicos: o
u u u u
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 (reina mercedes) :CIUDAD sevilla) Tablas hash
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.11
Pares y listas
x
Pares punteados:
u u
1
x
Listas
u u
Un tipo especial de par punteado (pero el tipo de dato no atmico ms com n) o a u Ejemplo: la lista (1 2 3)
nil 1 2 3
Introduccin a Lisp o
IA-I 20112012
Cc Ia
1.12
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.13
=> (C D E)
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.14
N meros u
x
Enteros: 14, 0, -7 Racionales: 4/5, -2/1 Coma otante: 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
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.15
Funciones aritmticas e
* (+ X-1 ... X-N) (+ 3 7 5) * (- X-1 ... X-N) (- 123 7 5) (- 3) * (* X-1 ... X-N) (* 2 7 5) * (/ X Y) (/ 6 2) (/ 5 2.0) * (MOD X Y) (mod 7 2) * (EXPT X Y) (expt 2 3) * (SQRT X) (sqrt 16)
IA-I 20112012
15 111 -3 70 3 2.5 1 8 4
Cc Ia
Introduccin a Lisp o
1.16
() () NIL
Pero en general, cualquier elemento distinto de NIL tiene el valor lgico verdadero. o
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.17
Predicados aritmticos e
x
Predicados aritmticos: e
* (= X-1 ... X-N) (= 2 2.0 (+ 1 1)) (= 1 2 1) * (> X-1 ... X-N) (> 4 3 2 1) (> 4 3 3 2) * (>= X-1 ... X-N) (>= 4 3 3 2) (>= 4 3 3 5) * (< X-1 ... X-N) * (<= X-1 ... X-N) => => => => => => T NIL T NIL T NIL
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.18
Predicados de tipos
* (ATOM X) (atom 3) (atom hola) (atom (1 2 3)) * (SYMBOLP X) (symbolp a) (symbolp 3) * (NUMBERP X) (numberp 4) (numberp 3.4) (numberp (1)) * (CONSP X) (consp (1 . 2)) (consp nil) (consp (2 5)) => => => => => T T NIL T NIL
=> T => T => NIL => T => NIL => T => => NIL T
Introduccin a Lisp o
Cc Ia
1.19
Predicados de igualdad
* (EQ X Y) (eq 3 3) (eq 3 3.0) (eq 3.0 3.0) (eq (first (a b c)) a) (eq (cons a (b c)) (a b c)) * (EQL X Y) (eql 3.0 3.0) (eql (cons a (b)) (cons a (b))) * (EQUAL X Y) (equal (cons a (b)) (cons a (b))) => => => => => => => => T NIL NIL T NIL T NIL T
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.20
Expresiones condicionales
x
Eval a <condicin>: u o Si el valor es distinto de NIL (verdadero) devuelve el valor de <consecuencia>, en caso contrario devuelve el valor de <alternativa>.
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.21
Expresiones condicionales
x
<pares>: sucesin de expresiones de la forma o (<condicion><consecuencias>) siendo <consecuencias> una sucesin de expresiones Lisp. o
Eval a los elemento <condicion> hasta que aparece un valor distinto de NIL (veru dadero). Eval a la correspondiente <consecuencias>. Eval a cada una de las expresiones que u u la componen, devolviendo como el valor el ultimo obtenido. Ejemplo: (cond ((< x 3) (format t "Es peque~o") x) n ((< x 5) (format t "Es mediano") (* x 2)) (t (* x x)))
Cc Ia
Introduccin a Lisp o
IA-I 20112012
1.22
Condicionales
* (IF TEST ENTONCES [EN-CASO-CONTRARIO]) (if (> 2 1) 1 2) => 1 (if (> 1 2) 1) => NIL * (WHEN TEST E-1 ... E-N) (when (= 1 1) 1 2 3) (when (= 1 2) 1 2 3) => => 3 NIL
* (UNLESS TEST E-1 ... E-N) (unless (= 1 1) 1 2 3) => NIL (unless (= 1 2) 1 2 3) => 3 * (COND L-1 ... L-N) > (defun notas (n) (cond ((< n 5) suspenso) ((< n 7) aprobado) ((< n 9) notable) (t sobresaliente) )) NOTAS > (notas 8) NOTABLE
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.23
Operadores lgicos o
* (NOT X) (not (= (+ 1 1) 2)) (not (= (+ 1 1) 3)) * (OR E-1 ... E-N) (or nil 2 3) (or (eq a b) (eq a c)) * (AND E-1 ... E-N) (and 1 nil 3) (and 1 2 3) => => => => => => NIL T 2 NIL NIL 3
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.24
Pertenencia:
* (MEMBER E L [:TEST #PREDICADO]) (member x (a x b x c)) (member x (a (x) b)) (setf l ((a b) (c d))) (member (c d) l) (member 2.0 (1 2 3)) (member (c d) l :test #equal) (member 2.0 (1 2 3) :test #=) (member 2.0 (1 2 3) :test #<) => => => => => => => => (X B X C) NIL ((A B) (C D)) NIL NIL ((C D)) (2 3) (3)
Listas de asociacin: o
* (ASSOC ITEM A-LISTA [:TEST PREDICADO]) (assoc b ((a 1) (b 2) (c 3))) (assoc (b) ((a 1) ((b) 1) (c d))) (assoc (b) ((a 1) ((b) 1) (c d)) :test #equal) => => => (B 2) NIL ((B) 1)
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.25
Variables locales
* (LET ((VAR-1 VAL-1)...(VAR-M VAL-M)) E-1 ... E-N) (setf a 9 b 7) => 7 (let ((a 2)(b 3)) (+ a b)) => 5 (+ a b) => 16 (let ((x 2)(y (+ 1 x))) (+ x y)) => Error * (LET* ((VAR-1 VAL-1) ... (VAR-N VAL-N)) E-1 ... E-M) (let* ((x 2)(y (+ 1 x))) (+ x y)) => 5
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.26
Deniendo funciones
x
<nombre>: s mbolo al que se asocia la funcin. o <parmetros>: sucesin de s a o mbolos a los que se asignar, temporalmente, el valor a de los argumentos con los que se utilice la funcin. o <documentacin>: cadena en la que se describe la funcin. Es opcional. o o <cuerpo>: sucesin de expresiones que se eval an cuando se utiliza la funcin. o u o
u u
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.27
Deniendo funciones
x
Ejemplo:
> (defun cuadrado (x) "Cuadrado de un numero" (* x x)) CUADRADO
Se eval a cuadrado: funcin denida por el usuario. u o Se eval a 4: 4 u Se asocia al parmetro de cuadrado, x, el valor 4. a Se eval a la expresin que compone el cuerpo de cuadrado: u o Se eval a *: funcin primitiva de Lisp para calcular el producto. u o Se eval a x: 4 u Se eval a x: 4 u Se calcula el producto con argumentos 4 y 4: 16 Se elimina la asociacin del parmetro. o a
Cc Ia
Introduccin a Lisp o
IA-I 20112012
1.28
Deniciones recursivas
x
Recursin o
> (defun factorial (n) (if (= n 0) 1 (* n (factorial (- n 1))))) FACTORIAL > (factorial 3) 6
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.29
IA-I 20112012
1.30
Descendente numrico: e
(defun f (... n ...) (if (= 0 n) <...> <... (f ... (- n 1) ...) ...>))
Ejemplo:
(defun factorial (n) (if (= 0 n) 1 (* n (factorial (- n 1)))))
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.31
Listas lineales:
(defun f (... l ...) (if (endp l) <...> <... (first l) (f ... (rest l) ...) ...>))
Ejemplo:
(defun suma-lista (l) (if (endp l) 0 (+ (first l) (suma-lista (rest l)))))
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.32
(defun subconjunto (l1 l2) (if (endp l1) t (and (member (first l1) l2) (subconjunto (rest l1) l2))))
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.33
(defun elimina-uno (x l) (cond ((endp l) l) ((equal x (first l)) (rest l)) (t (cons (first l) (elimina-uno x (rest l))))))
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.34
(defun permutacion (l1 l2) (cond ((endp l1) (endp l2)) ((member (car l1) l2) (permutacion (rest l1) (elimina-uno (car l1) l2))) (t nil)))
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.35
(defun par-p (n) (cond ((= n 0) t) ((= n 1) nil) (t (impar-p (- n 1))))) (defun impar-p (n) (cond ((= n 0) nil) ((= n 1) t) (t (par-p (- n 1)))))
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.36
(defun comprime (l) (if (consp l) (comprime-aux (first l) 1 (rest l)) l)) (defun comprime-aux (x n l) (if (endp l) (list (n-elementos x n)) (let ((siguiente (car l))) (if (eql x siguiente) (comprime-aux x (+ n 1) (rest l)) (cons (n-elementos x n)(comprime-aux siguiente 1 (rest l))))))) (defun n-elementos (x n) (if (> n 1) (list n x) x))
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.37
Ejemplo:
(defun lista-cuadrados (ini fin) (do ((i ini (1+ i))) ((> i fin) terminado) (format t "~a ~a~%" i (* i i))))
u
La primera parte del do especica las variables del bucle (i en este caso), su valor inicial (ini) y cmo se actualiza en cada iteracin (se incrementa en uno) o o La segunda parte especica la condicin de parada ((>i fin)) y lo que se devuelve o (terminado) Finalmente, la expresin nal especica qu hacer en cada iteracin (escribir una o e o l nea con i y con el cuadrado de i)
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.38
Sesin: o
> (lista-cuadrados 1 5) 1 1 2 4 3 9 4 16 5 25 TERMINADO
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.39
Otro ejemplo:
;;; ;;; ;;; ;;; ;;; (ESPECULAR LISTA) > (especular (a b c c b a)) T > (especular (a b c g h h g c d a)) NIL
(defun especular (l) (let ((long (length l))) (and (evenp long) (do ((del 0 (1+ del)) (atr (1- long) (1- atr))) ((or (> del atr) (not (eq (nth del l) (nth atr l)))) (> del atr))))))
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.40
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.41
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.42
Ejemplos:
> (defun factor (x) (or (loop for i from 2 to (sqrt x) thereis (when (= (mod x i) 0) i)) x)) FACTOR > (factor 35) 5 > (defun es-primo (x) (= x (factor x))) ES-PRIMO > (es-primo 7) T > (es-primo 35) NIL > (loop for x from 2 to 100 count (es-primo x)) 25
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.43
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.44
Opciones iniciales:
(LOOP FOR <VARIABLE> FROM <INICIO> TO <FIN> ...) (LOOP FOR <VARIABLE> FROM <INICIO> TO <FIN> BY <INCREMENTO> ...) (LOOP FOR <VARIABLE> IN <LISTA> ...) (LOOP WHILE <CONDICION> ...) (LOOP UNTIL <CONDICION> ...)
Opciones centrales:
(LOOP ... WHEN <CONDICION> ...)
Opciones nales:
(LOOP (LOOP (LOOP (LOOP (LOOP (LOOP ... ... ... ... ... ... DO <EXPRESION>) COLLECT <EXPRESION>) APPEND <EXPRESION>) THEREIS <EXPRESION>) COUNT <EXPRESION>) SUMMING <EXPRESION>)
Cc Ia
Introduccin a Lisp o
IA-I 20112012
1.45
Escritura
x
La funcin format: o
(FORMAT DESTINO CADENA-DE-CONTROL X-1 ... X-N) > (format t "~&Linea 1 ~%Linea 2") Linea 1 Linea 2 NIL > (format t "~&El cuadrado de ~a es ~a" 3 (* 3 3)) El cuadrado de 3 es 9 NIL > (setf l (a b c)) (A B C) > (format t "~&La longitud de la lista ~a es ~a" l (length l)) La longitud de la lista (A B C) es 3 NIL
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.46
Escritura
x
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.47
Lectura
x
La funcin read o
(READ) > (read) a A > (setf a (read)) 2 2 > a 2 > (* (+ (read) (read)) 3 4 7 > (read) (+ 2 3) (+ 2 3)
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.48
Lectura
x
Ejemplo:
(defun calcula-cuadrados () (loop (let ((aux (read))) (if (numberp aux) (format t "~&El cuadrado de ~a es ~a~%" aux (* aux aux)) (return fin)))))
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.49
Matrices
x
Creacin: o
(MAKE-ARRAY DIMENSIONES [:INITIAL-CONTENTS EXPRESION]) > (make-array (2 2)) #2A((NIL NIL) (NIL NIL)) > (make-array (2 2 1)) #3A(((NIL) (NIL)) ((NIL) (NIL))) > (make-array (2 2) :initial-element #2A((2 2) (2 2)) > (make-array (3 3) :initial-contents ((a b (1 2 (x y #2A((A B C) (1 2 3) (X Y Z)) > (setf *matriz* (make-array (3 3) :initial-contents ((a (1 (x #2A((A B C) (1 2 3) (X Y Z))
2) c) 3) z)))
b c) 2 3) y z))))
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.50
Matrices
x
Acceso:
(AREF MATRIZ INDICE-1 ... INDICE-N) > *matriz* #2A((A B C) (1 2 > (aref *matriz* A > (aref *matriz* 2 > (aref *matriz* Z 3) (X Y Z)) 0 0) 1 1) 2 2)
Modicacin: o
(SETF (AREF MATRIZ INDICE-1 ... INDICE-N) EXPRESION) > *matriz-2* #2A((1 2 3) (8 H 4) (7 6 5)) > (setf (aref *matriz-2* 1 2) h) H > (setf (aref *matriz-2* 1 1) 4) 4 > *matriz-2* #2A((A B C) (1 4 H) (X Y Z))
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.51
Matrices
x
Ejemplo
;;; ;;; ;;; ;;; ;;; ;;; ;;; ;;; (SUMA-COLUMNAS MATRIZ) > (setf mat (make-array (3 3) :initial-contents ((1 2 3) (4 5 6) (7 8 9)))) #2A((1 2 3) (4 5 6) (7 8 9)) > (suma-columnas mat) #(12 15 18)
(defun suma-columnas (a) (let* ((dim (array-dimensions a)) (f (first dim)) (c (second dim)) (res (make-array (list c)))) (loop for i from 0 to (- c 1) do (setf (aref res i) (loop for j from 0 to (- f 1) summing (aref a j i)))) res))
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.52
Estructuras (ejemplo)
> (defstruct persona (nombre nil) (estado casado) (calle nil) (ciudad Sevilla)) PERSONA > (setf ejemplo-1 (make-persona :nombre ana :calle (Reina Mercedes))) #S(PERSONA :NOMBRE ANA :ESTADO CASADO :CALLE (REINA MERCEDES) :CIUDAD SEVILLA) > (setf ejemplo-2 (make-persona :nombre pepe :ciudad Huelva)) #S(PERSONA :NOMBRE PEPE :ESTADO CASADO :CALLE NIL :CIUDAD HUELVA) > (persona-ciudad ejemplo-1) SEVILLA > (persona-nombre ejemplo-2) PEPE > (setf (persona-nombre ejemplo-1) (Ana Maria)) (ANA MARIA) > ejemplo-1 #S(PERSONA :NOMBRE (ANA MARIA) :ESTADO CASADO :CALLE (REINA MERCEDES) :CIUDAD SEVILLA)
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.53
Estructuras (ejemplo)
> (setf ejemplo-3 ejemplo-1) #S(PERSONA :NOMBRE (ANA MARIA) :ESTADO CASADO :CALLE (REINA MERCEDES) :CIUDAD SEVILLA) > (setf (persona-calle ejemplo-3) (tetuan)) (TETUAN) > ejemplo-3 #S(PERSONA :NOMBRE (ANA MARIA) :ESTADO CASADO :CALLE (TETUAN) :CIUDAD SEVILLA) > ejemplo-1 #S(PERSONA :NOMBRE (ANA MARIA) :ESTADO CASADO :CALLE (TETUAN) :CIUDAD SEVILLA) > (setf ejemplo-4 (copy-persona ejemplo-2)) #S(PERSONA :NOMBRE PEPE :ESTADO CASADO :CALLE NIL :CIUDAD HUELVA) > (setf (persona-ciudad ejemplo-4) cadiz) CADIZ > ejemplo-4 #S(PERSONA :NOMBRE PEPE :ESTADO CASADO :CALLE NIL :CIUDAD CADIZ) > ejemplo-2 #S(PERSONA :NOMBRE PEPE :ESTADO CASADO :CALLE NIL :CIUDAD HUELVA)
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.54
Estructuras
x
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.55
Estructuras (ejemplo)
> (setf *punto-1* (crea-punto :x 2 :y 3)) Punto de abcisa 2 y ordenada 3 > (coordenada-y *punto-1*) 3 > (setf (coordenada-y *punto-1*) 5) 5 > *punto-1* Punto de abcisa 2 y ordenada 5 > (punto-p *punto-1*) T > (punto-p (2 5)) NIL
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.56
Estructuras (ejemplo)
> (setf *punto-2* (copy-punto *punto-1*)) Punto de abcisa 2 y ordenada 5 > (equal *punto-1* *punto-2*) NIL > (equalp *punto-1* *punto-2*) T > (setf (coordenada-y *punto-2*) 3) 3 > *punto-2* Punto de abcisa 2 y ordenada 3 > (setf *punto-3* (crea-punto :y 3 :x 2)) Punto de abcisa 2 y ordenada 3 > (equalp *punto-2* *punto-3*) T
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.57
Las matrices no son tan exibles como las listas, pero permiten acceso rpido a sus componentes y ahorran espacio a
u u
Ventajas: acceso y actualizacin en tiempo constante o Inconveniente: al crear un array necesitamos reservar el espacio de antemano
Una buena solucin que permite utilizacin dinmica del espacio y aco o a ceso y actualizaciones rpidas son las tablas hash a
u u
Las tablas hash almacenan asociaciones (clave,valor) La clave puede ser de cualquier tipo (n meros, s u mbolos, funciones,...)
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.58
Tablas hash
x
Creacin (MAKE-HASH-TABLE): o
> (setf *tabla* (make-hash-table)) #S(HASH-TABLE EQL)
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.59
Tablas hash
x
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.60
Argumentos opcionales
(defun factorial (n &optional (resultado 1)) (if (= n 0) resultado (factorial (- n 1) (* n resultado)))) (factorial 3) (factorial 3 4) => 6 => 24
Argumentos clave
(defun f (&key (x 1) (y 2)) (list x y)) (f :x 5 :y 3) (f :y 3 :x 5) (f :y 3) (f)
(5 (5 (1 (1
3) 3) 3) 2)
Introduccin a Lisp o
IA-I 20112012
1.61
Valores de un s mbolo
x
Hemos visto:
DATOS EN LISP: - Nmeros: 3, 2.5, u - Cadenas: "hola", - Smbolos: adios, - Listas: (1 s 3), - Estructuras - Matrices, etc. 14.3, ... "el perro come", ... fun, fact, cuadrado, ... (1 (a (b))), ...
Expresadas mediante lambda (lambda (x) (* x x)) (lambda (x y) (cond ((> x 0) 1) ((< x 0) -1) (t 0)))
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.62
Valores de un s mbolo
x
Usualmente:
> (setf cuadrado 8) 8 > (defun cuadrado (x) (* x x)) CUADRADO
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.63
Evaluacin en Lisp o
u
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.64
Listas (E1 E2 ... En) * Se evala el VALOR FUNCIONAL de E1. u - Si es un smbolo: valor funcional. - Una lambda-expresin: la funcin que representa. o o * Se evalan E2 ... En (los argumentos) recursivamente. u * Se "aplica" la funcin obtenida en primer lugar a los o valores de los argumentos. Ejemplo: (cuadrado 4) => 16 (cuadrado cuadrado) => 64 ((lambda (m n) (+ m n)) (cuadrado 2) cuadrado)
=>
12
Quote (Exp): el valor representado por Exp Ejemplo: (cuadrado 4) => (cuadrado 4)
La funcin function (#Exp): valor funcional de Exp o Ejemplos: #cuadrado => #<CLOSURE :LAMBDA (X) (* X X)> #(lambda (x) (* 2 x)) => #<CLOSURE :LAMBDA (X) (* 2 X)>
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.65
La funcin FUNCALL o
(FUNCALL FN E-1 ... E-N) (funcall #+ 1 2 3) (funcall #cuadrado 4) (funcall #(lambda (x) (* 2 x)) 3) => 6 => 16 => 6
La funcin APPLY o
(APPLY FN ARGS) (apply #+ (1 2 3)) (apply #max (4 5 7)) (apply #(lambda (x y) (* 2 x y)) (3 4)) => 6 => 7 => 24
Observaciones:
u u u
El primer argumento de funcall y de apply debe ser algo cuyo valor sea una funcin o Uso de # para forzar a obtener el valor funcional A veces es necesario symbol-function
Cc Ia
Introduccin a Lisp o
IA-I 20112012
1.66
* (REMOVE-IF-NOT PREDICADO L), (REMOVE-IF PREDICADO L) (remove-if-not #atom ((a) b (c) d)) (remove-if #atom ((a) b (c) d)) => (B C) => ((A) (C))
* (COUNT-IF PREDICADO L), (COUNT-IF-NOT PREDICADO L) (count-if #atom ((a) b (c) d e)) (count-if-not #atom ((a) b (c) d e)) => 3 => 2
* (FIND-IF PREDICADO L), (FIND-IF-NOT PREDICADO L) (find-if #atom ((a) b (c) d e)) (find-if-not #atom ((a) b (c) d e)) => B => (A)
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.67
* (FIND-IF PREDICADO LISTA), (FIND-IF-NOT PREDICADO LISTA) (find-if #atom ((a) b (c) d e)) (find-if-not #atom ((a) b (c) d e)) => B => (A)
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.68
* (SOME PREDICADO L), (SOME PREDICADO L1 ... LN) (some (some (some (some #atom ((1) a)) #atom ((1) (a))) #< (1 2) (1 3)) #< (1 2) (1 0)) => => => => T NIL T NIL
IA-I 20112012
Cc Ia
Introduccin a Lisp o
1.69
Bibliograf a
x
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.) (AddisonWesley, 1991).
Cc Ia
Introduccin a Lisp o
IA-I 20112012
1.70