DRA. ÁNGELA GARCÍA GONZÁLEZ DPTO CIENCIAS FARMACÉUTICAS Y ...
Tema 1: Introducción a L - Dpto. Ciencias de la ...
Transcript of Tema 1: Introducción a L - Dpto. Ciencias de la ...
INTELIGENCIA ARTIFICIAL CURSO 2005-06
Tema 1:Introducción a LISP
Carmen Graciani Díaz
José Luis Ruiz Reina
Dpto. Ciencias de la Computación e Inteligencia Artificial
UNIVERSIDAD DE SEVILLA
IA 2005-06
��� ��� Introducción a LISP 1. 1
Introducción a Lisp
r John McCarthy, 1958
r List Processing
r Procesamiento simbólico
r Lenguaje para la Inteligencia Artificial
• Solucionadores expertos de problemas: diagnosis de infecciones,simulación de circuitos eléctricos, . . .
• Razonamiento: representación del conocimiento, . . .
• Aprendizaje
• Lenguaje Natural
• . . .
IA 2005-06
��� ��� Introducción a LISP 1. 2
Una sesión con LISP
r Arrancar un intérprete: clisp
r Interactuar con él:
• El usuario escribe una expresión en el intérprete.
• El intérprete de LISP reconoce la expresión como larepresentación escrita de un objeto LISP.
• El objeto es evaluado. Su valor es un objeto LISP.
• El intérprete elige una representación escrita del valor obtenido.
• El intérprete escribe dicha representación.
r Cerrar el intérprete: (exit)
IA 2005-06
��� ��� Introducción a LISP 1. 3
Depurando errores en CLISP
r Ante un error el intérprete abre un depurador de errores.
r Se habilitan distintos comandos para obtener información acerca delerror cometido.• :h: lista de comandos disponibles
• :a: cerrar el depurador
r Si se comete un nuevo error antes de cerrar el depurador de erroresse abre uno nuevo.
IA 2005-06
��� ��� Introducción a LISP 1. 4
Procesamiento simbólico
r Elementos fundamentales: átomos (atoms).
r Grupos de átomos conforman listas (lists) que a su vez se puedenagrupar formando listas de listas, . . .
r Átomos y listas, conjuntamente, son denominados expresiones sim-bólicas (symbolic expressions) o simplemente expresiones.
IA 2005-06
��� ��� Introducción a LISP 1. 5
Tipos de datos básicos
r Átomos:
• números: 27,3.14, . . .
• símbolos: foo, FIRST, +, . . .
• No hay distinción entre mayúsculas y minúsculas.
• caracteres: #\A, #\Space
• cadenas: "Buenos días", "Ho\"l\"a"
• array: #(a b 0 "nil" 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)
r Listas: Paréntesis izquierdo, cero o más expresiones, paréntesisderecho
IA 2005-06
��� ��� Introducción a LISP 1. 6
Números
r Existen distintos tipos de números:
• Enteros: 14, 0, -7
• Racionales: 4/5, -2/1
• Coma 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
IA 2005-06
��� ��� Introducción a LISP 1. 7
Listas
r La lista ((a a p) ()) contiene dos elementos:
• la lista (a a p) y
• la lista ().
r La lista (a a p) contiene tres elementos:
• los símbolos a, a y p.
r La lista () está vacía.
IA 2005-06
��� ��� Introducción a LISP 1. 8
Lenguaje interpretado
r Símbolos como variables: símbolos a los que se puede asociar unvalor.
r Símbolos como constantes: T, NIL, pi, . . . o símbolos declaradoscomo tales utilizando defconst. Tienen asociado un determinadoelemento.
r Constantes: números, caracteres o cadenas. Su valor es el propioelemento.
IA 2005-06
��� ��� Introducción a LISP 1. 9
Lenguaje interpretado
r Llamadas a funciones: listas no vacías
• Primer elemento: función
• Restantes elementos: expresiones cuyo valor se utilizarán comoargumentos de la función.
• Los elementos se evalúan de izquierda a derecha.
Su valor es el resultado de la aplicación de la función.
IA 2005-06
��� ��� Introducción a LISP 1. 10
Lenguaje interpretado
r LISP evalúa expresiones.
r Ciclo: Lee, evalúa, escribe.> 2.72.7> (+ 3 5)8> (+ (* 2 2) (/ 2 2))5
r En algunas expresiones la evaluación puede tener efectos colatera-les.> (format t "Escribe:")Escribe:NIL
• Valor de la expresión: NIL
• Efecto colateral: Escritura por pantalla de la cadena "Escribe:"
IA 2005-06
��� ��� Introducción a LISP 1. 11
Notación LISP
r De la notación tradicional a la notación LISP.8 · f(x, a + 3) =⇒ (* 8 (f (+ a 3)))
• Notación prefija,
• paréntesis delante del símbolo de función,
• eliminación de comas.
IA 2005-06
��� ��� Introducción a LISP 1. 12
La función quote
r (QUOTE <expresión>) =⇒ <expresión>
> (quote (+ 2 3))(+ 2 3)
r ’<expresión> ≡ (QUOTE <expresión>)
> ’(+ 2 3)(+ 2 3)
IA 2005-06
��� ��� Introducción a LISP 1. 13
Lenguaje interpretado
r Una función especifica cómo hacer algo.
r LISP proporciona algunas funciones (primitivas): +, FIRST, AREF, . . .
r El usuario puede definir sus propias funciones a partir de los anteri-ores.
IA 2005-06
��� ��� Introducción a LISP 1. 14
Definiendo funciones
r La forma especial DEFUN
(DEFUN <nombre>(<parámetros>)<documentación><cuerpo>)
r <nombre>: símbolo al que se asocia la función.
r <parámetros>: sucesión de símbolos a los que se asignará, tempo-ralmente, el valor de los argumentos con los que se utilice la función.
r <documentación>: cadena en la que se describe la función. Esopcional.
r <cuerpo>: sucesión de expresiones que se evalúan cuando se uti-liza la función.
IA 2005-06
��� ��� Introducción a LISP 1. 15
Definiendo funciones
> (defun cuadrado (x) "Cuadrado de un numero" (* x x))CUADRADO
r (cuadrado 4) =⇒ 16:
• Se evalúa cuadrado: función definida por el usuario.
• Se evalúa 4: 4
• Se asocia al parámetro de cuadrado, x, el valor 4.
• Se evalúa la expresión que compone el cuerpo de cuadrado:
• Se evalúa *: función primitiva de LISP para calcular elproducto.
• Se evalúa x: 4
• Se evalúa x: 4
• Se calcula el producto con argumentos 4 y 4: 16
• Se elimina la asociación del parámetro.
IA 2005-06
��� ��� Introducción a LISP 1. 16
Definiendo funciones
> (defun siete () (+ 4 1 2)))SIETE
r (siete) =⇒ 7
• Se evalúa siete: función definida por el usuario.
• Se evalúa la expresión que compone el cuerpo de siete:
• Se evalúa +: función primitiva de LISP para calcular la suma.
• Se evalúa 4: 4
• Se evalúa 1: 1
• Se evalúa 2: 2
• Se calcula la suma con argumentos 4, 1 y 2:
IA 2005-06
��� ��� Introducción a LISP 1. 17
Editar funciones
r Abrir un editor de texto: emacs
r Escribir las diferentes expresiones en un fichero con extensión .lsp
r Pedir al intérprete que evalúe las expresiones contenidas en dichofichero: (load <fichero>)
r Compilar el fichero: (compile-file <fichero>)
IA 2005-06
��� ��� Introducción a LISP 1. 18
Principios de buena programación
r Comentar los funciones definidas.
r Utilizar nombres descriptivos.
r Las funciones deben ser cortas, con pocos argumentos y tener unobjetivo claro.
r Evitar riesgos:
• Las funciones deben hacer las menos presunciones posibles y
• deben informar ante situaciones inesperadas.
r Utilizar abstracción de funciones y de datos.
r Programación modular
r La programación sin efectos colaterales es preferible aunque no obli-gatoria
IA 2005-06
��� ��� Introducción a LISP 1. 19
Valores lógicos: T y NIL
r El símbolo T tiene asociado el valor lógico "verdadero".
r El símbolo NIL tiene asociado el valor lógico "falso".
• () ≡ ’() ≡ NIL
r Un predicado es una función que devuelve un valor de verdad.
> (listp ’(a b c))T> (listp 27)NIL
r Para las funciones condicionales y proposicionales cualquier elemen-to distinto de NIL tiene el valor lógico "verdadero".> (and 3 4 5)5
IA 2005-06
��� ��� Introducción a LISP 1. 20
Predicados de igualdad
r (= <num1> <num2>): Igualdad numérica
r (EQ <arg1> <arg2>): Comprueba si <arg1> y <arg2> son sím-bolos (o caracteres) idénticos
.
r (EQL <arg1> <arg2>): Comprueba si sus argumentos satisfacenEQ, si no comprueba si son números del mismo tipo y valor.
r (EQUAL <arg1> <arg2>): Comprueba si sus argumentos satis-facen EQL, si no comprueba si son listas y sus elementos satisfacenEQUAL. También sirve para comparar cadenas.
r (EQUALP <arg1> <arg2>): Comprueba si sus argumentos satis-facen EQUAL, si no comprueba si son arrays o estructuras y si suselementos satisfacen EQUALP. En la igualdad numérica o de cade-nas no distingue tipos.
IA 2005-06
��� ��� Introducción a LISP 1. 21
Predicados de igualdad
> (eq ’a ’A)T> (eq 3 3)T> (eq (first ’(a b c)) ’a)T> (eq 3 3.0)NIL> (eq ’(a b c) ’(a b c))NIL> (eql 3 3.0)NIL> (eql 3.0 3.0)T> (eql ’(a b) ’(a b))NIL> (equal (cons ’a ’(b)) (append ’(a) ’(b)))T
IA 2005-06
��� ��� Introducción a LISP 1. 22
Operadores lógicos
r La forma especial AND
• Tiene un número arbitrario de argumentos.
• Evalúa los mismos de izquierda a derecha.
• Termina en cuanto aparece el valor NIL ("falso").
• Si no aparece devuelve el valor del último argumento.
r La forma especial OR
• Tiene un número arbitrario de argumentos.
• Evalúa los mismos de izquierda a derecha.
• Termina en cuanto aparece un valor distinto de NIL ("verdadero").
• Si no aparece devuelve NIL.
IA 2005-06
��� ��� Introducción a LISP 1. 23
Operadores lógicos
(and (listp x) (> (length x) 5))
Devuelve T o NIL independientemente del valor de x.
(or (= y 0) (> (/ x y) 100))
Devuelve T si x/y es mayor que 0, incluso cuando y = 0.
IA 2005-06
��� ��� Introducción a LISP 1. 24
Expresiones condicionales
r La forma especial IF:
(IF <condición><consecuencia><alternativa>)
r Evalúa <condición>:
• Si el valor es distinto de NIL ("verdadero") devuelve el valor de<consecuencia>,
• en caso contrario devuelve el valor de <alternativa>.
IA 2005-06
��� ��� Introducción a LISP 1. 25
Expresiones condicionales
r La forma especial COND:
(COND <pares>)
r <pares>: sucesión de expresiones de la forma(<condicion> <consecuencia>)
siendo <consecuencia> una sucesión de expresiones LISP.
• Evalúa los elemento <condicion> hasta que aparece un valordistinto de NIL ("verdadero").
• Evalúa la correspondiente <consecuencia>. Evalúa cada unade las expresiones que la componen, devolviendo como el valorel último obtenido.
IA 2005-06
��� ��� Introducción a LISP 1. 26
Expresiones condicionales
(if (= y 0) 9999999 (/ x y))
Devuelve el valor de x/y cuando y 6= 0 y 91999.999 cuando y = 0.
(cond((< x 3) (format t "Es pequeño") x)((< x 5) (format t "Es mediano") (* x 2))(t (* x x)))
IA 2005-06
��� ��� Introducción a LISP 1. 27
Modelos de recursión
r Descendente numérico:
(defun f(... n ...)(if (= 0 n)
<...><... (f ... (- n 1) ...) ...>))
r Ejemplo:
(defun factorial(n)(if (= 0 n)
1(* n (factorial (- n 1)))))
IA 2005-06
��� ��� Introducción a LISP 1. 28
Traza
r (TRACE <f1>...<fN>), (UNTRACE <f1>...<fN>)> (trace factorial *)(FACTORIAL *)> (factorial 2)1. Trace: (FACTORIAL ’2)2. Trace: (FACTORIAL ’1)3. Trace: (FACTORIAL ’0)3. Trace: FACTORIAL ==> 13. Trace: (* ’1 ’1)3. Trace: * ==> 12. Trace: FACTORIAL ==> 12. Trace: (* ’2 ’1)2. Trace: * ==> 21. Trace: FACTORIAL ==> 22> (untrace *)(*)> (factorial 2)1. Trace: (FACTORIAL ’2)2. Trace: (FACTORIAL ’1)3. Trace: (FACTORIAL ’0)3. Trace: FACTORIAL ==> 12. Trace: FACTORIAL ==> 11. Trace: FACTORIAL ==> 22
IA 2005-06
��� ��� Introducción a LISP 1. 29
Modelos de recursión
r Listas lineales:
(defun f(... l ...)(if (endp l)
<...><... (first l)
(f ... (rest l) ...) ...>))
r Ejemplo:
(defun suma-lista(l)(if (endp l)
0(+ (first l)(suma-lista (rest l)))))
IA 2005-06
��� ��� Introducción a LISP 1. 30
Modelos de recursión
r Recursión cruzada: funciones parp e imparp
(defun parp(n)(if (= n 0)
t(imparp (- n 1))))
(defun imparp(n)(if (= n 0)
nil(parp (- n 1))))
IA 2005-06
��� ��� Introducción a LISP 1. 31
Variables globales y locales
r (SETF <var1> <val1>...<varM> <valM>)
> (setf a 9 b 7)7
r (LET ((<var1> <val1>)...(<varM> <valM>))
<e1>...<eN>)> (let ((a 2)(b 3)) (+ a b))5> (+ a b)16> (let ((x 2)(y (+ 1 x))) (+ x y))Error
r (LET* ((<var1> <val1>)...(<varN> <valN>))
<e1>...<eM>)> (let* ((x 2)(y (+ 1 x))) (+ x y))5
IA 2005-06
��� ��� Introducción a LISP 1. 32
Número arbitrario de argumentos
> (defun lista (&rest ys) ys)LISTA> (lista 1 2 3)(1 2 3)> (lista 1 2 3 4 5 6 7 8)(1 2 3 4 5 6 7 8)
IA 2005-06
��� ��� Introducción a LISP 1. 33
Argumentos clave
r (MEMBER <arg> <lista>): Comprueba si <arg> es un elementode <lista> y devuelve la <lista> a partir de la primera apariciónde <arg>.
r Por defecto compara utilizando EQL
> (member ’(a b c) ’((a) b (c d) (a b c)))NIL> (member ’(a b c) ’((a) b (c d) (a b c)) :test #’equal)((A B C))
IA 2005-06
��� ��� Introducción a LISP 1. 34
Argumentos clave
> (defun f (&key x y) (list x y))F> (f :y 3 :x 5)(5 3)> (defun f (x &key y (z 2)) (list x y z))F> (f 5 :y 3 :z 4)(5 3 4)> (f 5 :z 4 :y 3)(5 3 4)> (f 5 :y 3)(5 3 2)> (f 5)(5 NIL 2)
IA 2005-06
��� ��� Introducción a LISP 1. 35
Funciones como objetos
> (function +)#<SYSTEM-FUNCTION +>> (symbol-function ’+)#<SYSTEM-FUNCTION +>> #’+#<SYSTEM-FUNCTION +>> (apply #’+ ’(1 2 3))6> (funcall #’+ 1 2 3)6> (lambda (x) (+ x 100))#<CLOSURE :LAMBDA (X) (+ X 100)>> ((lambda (x) (+ x 100)) 4)104> (funcall #’(lambda (x) (+ x 100)) 4)104
IA 2005-06
��� ��� Introducción a LISP 1. 36
Funciones como argumentos de entrada
r (FUNCALL <fn> <e1>...<eN>): Llamada a la función <fn> conargumentos <e1>...<eN>
(funcall #’+ 1 2 3) =⇒ 6(funcall #’(lambda (x) (* 2 x)) 3) =⇒ 6
r (APPLY <fn> <args>): Llamada a la función <fn> con argumen-tos los elementos de la lista <args>
(apply #’max ’(4 5 7)) =⇒ 7(apply #’(lambda (x y) (* 2 x y)) ’(3 4)) =⇒ 24
r (MAPCAR <fn> <l>): Lista con los resultados de las llamadas a lafunción <fn> con cada elemento de la lista <l> como argumento
(mapcar #’(lambda (x) (* x x)) ’(1 2 3 4 5)) =⇒ (1 4 9 16 25)(mapcar #’atom ’(a (b) 3)) =⇒ (T NIL T)
IA 2005-06
��� ��� Introducción a LISP 1. 37
Funciones
r Observaciones:
• La función como argumento debe ser una expresión cuyo valorsea una función.
• Uso de #’ para forzar a obtener el valor funcional.
• A veces es necesario symbol-function.
IA 2005-06
��� ��� Introducción a LISP 1. 38
Funciones de Entrada-Salida
r (FORMAT <destino> <cadena de control> <x1>...<xN>))> (format t "~a mas ~a igual a ~a. ~%" 2 3 (+ 2 3))2 mas 3 igual a 5.NIL
r (READ)> (read)(+ 2 2)
(+ 2 2)> (eval (read))(+ 2 2)
4> (defun pide (frase)
(format t "~a " frase)(read))
PIDE> (pide "Su edad, por favor:")Su edad, por favor: 2323
IA 2005-06
��� ��� Introducción a LISP 1. 39
Matrices
r Creación: (MAKE-ARRAY <dimensiones>)
> (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 2)#2A((2 2) (2 2))> (make-array ’(3 3)
:initial-contents ’((a b c)(1 2 3)(x y z)))
#2A((A B C) (1 2 3) (X Y Z))
IA 2005-06
��� ��� Introducción a LISP 1. 40
Matrices
r Acceso: (AREF <matriz> <i1>...<iN>)
> (setf *matriz*(make-array ’(3 3)
:initial-contents ’((a b c)(1 2 3)(x y z))))
#2A((A B C) (1 2 3) (X Y Z))> *matriz*#2A((A B C) (1 2 3) (X Y Z))> (aref *matriz* 0 0)A> (aref *matriz* 1 1)2
IA 2005-06
��� ��� Introducción a LISP 1. 41
Matrices
r Modificación:(SETF (AREF <matriz> <i1...<iN>) <expresion>)> *matriz*#2A((A B C) (1 2 3) (X Y Z))> (setf (aref *matriz* 1 2) ’h)H> (setf (aref *matriz* 1 1) 4)4> *matriz*#2A((A B C) (1 4 H) (X Y Z))
IA 2005-06
��� ��� Introducción a LISP 1. 42
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 2005-06
��� ��� Introducción a LISP 1. 43
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 2005-06
��� ��� Introducción a LISP 1. 44
Creación de estructuras
r(DEFSTRUCT (<nombre> (:CONSTRUCTOR <función constructura>)(:CONC-NAME <prefijo>)(:PRINT-FUNCTION <función de escritura>))
<campo1>...<campoN>)
r Ejemplo:
(defstruct (punto (:constructor crea-punto)(:conc-name coordenada-)(:print-function escribe-punto)
xy)
(defun escribe-punto (punto &optional (canal t) profundidad)(format canal "Punto de abcisa ~a y ordenada ~a"
(coordenada-x punto)(coordenada-y punto)))
IA 2005-06
��� ��� Introducción a LISP 1. 45
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 2005-06
��� ��� Introducción a LISP 1. 46
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 2005-06
��� ��� Introducción a LISP 1. 47
Bibliografía
r Steele, G.L. Common Lisp the Language, 2nd edition (D. P., 1990).http://www.cs.cmu.edu/afs/cs.cmu.edu/project/-
ai-repository/ai/html/cltl/cltl2.html
r Winston, P.H. y Horn, B.K. LISP (3a. ed.) (Addison–Wesley, 1991).
r Graham, P. ANSI Common Lisp (Prentice Hall, 1996).
IA 2005-06
��� ��� Introducción a LISP 1. 48