Embed
Email

Inteligencia artificial

Document Sample

Shared by: qingyunliuliu
Categories
Tags
Stats
views:
1
posted:
11/26/2011
language:
Spanish
pages:
20
UNIVERSIDAD NACIONAL MAYOR DE SAN



MARCOS

Universidad del Perú, Decana de América







FACULTAD DE INGENIERÍA DE SISTEMAS E



INFORMATICA









DESARROLLO MANUAL LISP







CURSO : INTELIGENCIA ARTIFICIAL







ALUMNOS :





CCAIPANI SANCHEZ MARCO 07200078



GARAUNDO RODRIGUEZ CARLOS 07200021



ROJAS ALVARADO GIOVANNA 07200042



SULCA PAUCAR EDER KIM 07200115









2010-2

Tutorial Lisp







Tipo de dato: Átomos



Son de dos tipos: Átomos y Listas algunos ejemplos son: b, 8, mi_nombre, nil, T.



Evaluar un átomo da como resultado el valor asignado a dicho átomo. Los números son

especiales, siempre retornará su mismo valor.





Usaremos „setq‟ y/o „setf‟ para asignar el valor a un átomo:





> (setq numero 100)



100



Lisp no diferencia mayúsculas de minúsculas, los atomos „AbC‟ y „abc‟ son lo mismo.









Tipo de Dato: Listas







Son ejemplos de listas: (e), (* 8 9), (), nil. Se considera a „nil‟ un átomo y lista a la vez. Una

lista vacía se representa con: (). La evaluación de una lista siempre invoca una función:



(FUNCION argumento1, argumento2, … argumentoN)









> (* 5 4 2) se utiliza notación prefija

40



> (setq inicio 90)

90



> (+ inicio 10)

100



Al momento de evaluar una lista, primero se evalúa todos los argumentos y luego aplicarles la

función a ellos.

Funciones para construcción de Listas









Función especial QUOTE



Esta función retorna un argumento y NO lo evalúa. Tal argumento puede ser un término

cualquiera.



Notación: (quote termino)



Donde termino puede ser átomo/lista.



Ejemplo:



> (quote (+ 2 3))



(+ 2 3)



> (quote (esto es una prueba))



(ESTO ES UNA PRUEBA)



La función quote puede ser sustituida por un el símbolo: '



Ejemplo:



> ' (+ 2 3)



(+ 2 3)







Función CAR



CAR admite un único argumento que debe ser una lista o una expresión cuyo valor sea una

lista y devuelve el primer elemento de dicha lista.



Notación: ( car Lista )



Ejemplo:



> (car ( quote (( esta) es una prueba)))



(ESTA)



> ( car ( quote (() ( esta es una prueba))))



NIL



Función CDR



CDR recibe también una lista (solo un argumento) y devuelve el resto de la lista después de

eliminar el primer elemento (CAR lista). Por lo tanto puede contemplarse como la función

complementaria de CAR. Se podrá acceder a cualquier término de una lista mediante los

anidamientos apropiados de CAR y CDR.



Notación: ( cdr Lista )







Ejemplos:



> ( cdr ( quote (esta es una prueba)))



(ES UNA PRUEBA)







> (cdr (quote ((esta es) una prueba)))



(UNA PRUEBA)





Entonces se tendrá:



(CAR lista) ;primer término



(CAR (CDR lista)) ;segundo término



(CAR (CDR (CDR lista))) ;tercer término



Y así sucesivamente... Para simplificar las expresiones se permite crear nombres compuestos

para anidamientos de CAR y CDR de la siguiente manera:



 Comenzando por una primera letra C

 Una letra A por cada CAR o una D por cada CDR

 Terminando con una letra R



Ejemplos:



>(car '(a b c d ))



A



> (cadr '(a b c d e))



B



CL-USER 12 : 5 > (caddr '(a b c d e))



C



CL-USER 13 : 5 > (cadddr '(a b c d e))



D

Función CONS



Es el constructor de lista básico. Construye listas insertando elementos en listas existentes

(incluso vacías). El nuevo elemento ocupa el primer lugar de la lista (CAR lista).



Notación: (cons nuevo_elemento lista)



El nuevo_elemento puede ser un átomo/ una lista.



Ejemplo:



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



(A B C E)



> setq a 2



2



> (cons a l)



(2 . 4)



> (cons 'a (cons 'b (cons 'c 'd)))



(A B C . D)







Función LISTAS



Una lista puede ser una secuencia de átomos separados por un espacio y encerrados por

paréntesis, incluyendo la posibilidad de que una lista contenga una sublista que cumple con las

mismas características.



También se podría decir que es una cadena de CONSES enlazados por sus componentes CDR

y terminada por un NIL, la lista vacía. Los componentes CAR de los conses son conocidos

como los elementos de la lista.



Notación: (list término1 término2 ..... términok)



Donde



K es el número de elementos de la lista.



término = un atomo / una sublista/nil.



Ejemplo:



> (list 'c 'o 'n 'o 'c 'e 'r '* 'l 'i 's 'p)



(C O N O C E R * L I S P)

> (list (list 'a 'b) (list 'c 'd 'e))



((A B) (C D E))







>(list 3 4 'a (car '(b c)) (+ 6 -2))



(3 4 A B 4)







La función APPEND



APPEND Se utiliza para combinar listas. Elimina el primer nivel de anidación de cada una de

las listas que recibe para combinar todas en una misma lista. Si una de las listas que recibe

está vacía esta lista no aparecerá en la lista resultante.



Notacion: (append lista lista ...)







Ejemplo:



> (append '(a b c) '(d e f) '() '(g))



(A B C D E F G)







> (append '(f) '(i) '(s) '(i))



(F I S I)







Backquote y Comma



El operador („) o quote dentro de una lista denota que la expresión siguiente no va a ser

evaluada es decir que simplemente muestra lo que la persona digito:



Ejemplo:



>(setq a 10) asigna 10 al atomo “a”



>(setq b 20) asigna 20 al atomo “b”



>(list `(+ a b) a b (+ a b)) estamos creando la lista con los valores



((+ A B) 10 20 30) “(+ a b)” “10” “20” “30”



Esto es debido a que el operador quote se encontraba presente por eso la lisp no lo toma

como código.

El operador (`) o backquote sirve para simplificar el uso de muchos quote dentro de una

lista dicho operador se coloca fuera del paréntesis y procedemos a quitar los quote que

existan dentro siendo el resultado el mismo en ambos casos.



Ejemplo:



>(setq x 1)



>(setq y 2) asignamos los valores 1 2 3 4



>(setq z 3) a los atomos “x” “y” “z” “w”



>(setq w 4)



>(list ‘x ‘y ‘z ‘w) debido que es muy engorroso tipear muchas



XYZW veces el operador quote esta operación se



>`( x y z w) simplifica anteponiendo el operador backquote



XYZW







La coma dentro de una lista con un backquote indica que ese atomo o elemento será evaluado

por lisp. es decir si dentro de una lista con un backquote se antepone una coma delante de un

atomo este mostrara el valor asignado.







Ejemplo:



>(setq x 1)



>(setq y 2) asignamos los valores 1 2 3 4



>(setq z 3) a los atomos “x” “y” “z” “w”



>(setq w 4)



>`( x y ,z w) poniendo la coma lisp procede a la evaluación



XY3W del átomo mostrando su valor previamente

asignado que es 3

Acceso a las listas



Las funciones primitivas para accesar a los elementos de una lista son Car y Cdr. Car

devuelve el primer elemento de una lista el equivalente de esta primitiva es FIRST.



Ejemplo:



>(car `(( a b c) 2 60 `( x y))) la lista es (list `( a b c) 2 60 `( x y))



(A B C) siendo el primer elemento de esta (A B C)



Ejemplo:



>(first `(( a b c) 2 60 `( x y)))



(A B C)



Notar que los resultados son los mismos.







Cdr devuelve los elementos restantes menos el primero, otro nombre que se le da a esta

función es REST.



Ejemplo:



> (cdr `(( a b c) 2 60 `( x y)))



(2 60 (QUOTE (X Y)))







Ejemplo:



> (rest `(( a b c) 2 60 `( x y)))



(2 60 (QUOTE (X Y)))







Last devuelve una lista en la que se han eliminado todos los elementos menos el último.



Ejemplo:



>(last `(( a b c) 2 60 `( x y)))



((QUOTE (X Y)))



Se pueden usar combinaciones de car y cdr para accesar cualquier elemento de la lista. Esto

equivale también a las primitivas First, second third… hasta el tenth.

>(car (cdr (cdr `(( a b c) 2 60 `( x y))))) devuelve el tercer elemento de la lista

60



> (caddr `(( a b c) 2 60 `( x y))) forma mas simplificada

60





>(third `(( a b c) 2 60 `( x y))) forma más actual



60





Modificar el valor de los Átomos



A diferencia de „setq‟, el comando „setf‟ toma una funcion como primer argumento. Con el

comando „setf‟ podemos modificar el valor de un átomo:



> (setq lista ‘( a b c))



(A B C)



> (setf (caddr lista) 8)



8



> lista



(A 8 8)



Como se nota en el ejemplo se hace uso tambien del comando „car‟ y sus combinaciones „cadr‟

„caddr‟ para elegir la posición de la lista según la cantidad de d‟s que hayan.







Igualdad



Debemos entender que las reservadas T y nil se entienden como True y Sin Valor.



EQ compara atomos, EQUAL compara listas. Debemos notar que equal y eq son diferentes:

eq 8 8 => T



eq ‘m ‘m => T



eq ‘(m) ‘(m) => nil



equal 8 8 => T



equal ‘m ‘m => T



equal ‘(m) ‘(m) => T

Tutorial: “Introduction to LISP”



Autor: Milos Hauskrecht



http://www.cs.pitt.edu/~milos/courses/cs2740/Lectures/LispTutorial.pdf







APPLY: (apply función (argumentos))





Aplica una función (que recibe como primer argumento) a una lista de

argumentos. La función puede ser un objeto de código compilado, una expresión-

lambda, o un símbolo.



Ejemplo:



CL-USER 3 : 1 > (apply '+ '(2 4 6))

12



Igualdad o equivalencia



Existen tres predicados para evaluar los cuales son = , equal, eq: “=” solo es

utilizado para valores numéricos



Ejemplo:



>(= (* 25 3) (/ (+ 100 50) 2)

T



El igual evalua expresiones numéricas, “equal” devuelve el valor verdadero si las 2

expresiones comparadas son isomorficas es decir son iguales en todo.



Ejemplo:



>(setf a (list ‘m ’n ’p) asigna una lista al atomo “a” los

elementos son (M N P)

(M N P)



>(setf b (list ‘m ’n’p) asigna una lista al atomo “b” los

elementos son (M N P)

(M N P)



>(equal a b) evaluamos las 2 expresiones y el

resultado es T =true

T

“eq” devuelve valor de verdad si los 2 argumentos apuntan hacia el mismo objeto.



Ejemplo:







> (setf a (list 1 2 3)) asigna una lista en “a”

(1 2 3)



> (setf b (list 1 2 3)) asigna otra lista en “b”

(1 2 3)



> (setf c a) apunta “c” a “a”

(1 2 3)



> (eq a b) verifica si cumple la condición

NIL y es falso puesto que apuntan a 2 listas

diferentes



> (eq c a) devuelve Verdadero puesto que los dos

T elementos apuntan a la misma lista



Variables con let



Uno de los operadores más comunes en Lisp es let, que permite la creación de

nuevas variables locales.



Una expresión let tiene dos partes: Primero viene una lista de expresiones

definiendo las nuevas variables locales, cada una de ellas con la forma (variable

expresión). Cada variable es inicializada con el valor que regrese la expresión

asociada a ella.



Despues de la lista de variables y valores, viene el cuerpo de let constituido por

una serie de expresiones que son evaluadas en orden.







Ejemplo:



> let ((x 1)(y 2)) (+ x y))

3



En el ejemplo anterior se han creado dos variables, x e y, con los valores 1 y 2

respectivamente. Esas variables son validas dentro del cuerpo de let.

NUMBERP: (numberp )







Identifica átomos numéricos,



Ejemplos:



CL-USER 9 : 8 > (NUMBERP 2)

T



CL-USER 10 : 8 > (NUMBERP ‘PERRO)

NIL



SYMBOLP: (symbolp )



Identifica símbolos



Ejemplos:



CL-USER 1 > (symbolp 2)

NIL



CL-USER 2 > (symbolp 'perro)

T



Funciones Matemáticas:



ZEROP



Devuelve T si su entrada es 0 y Nil en caso contrario.



Ejemplo:



CL-USER 7 : 4 > ( zerop 0 )

T



CL-USER 8 : 5 > ( zerop 4)

NIL



ODDP



Devuelve T si su entrada es un numero impar y Nil en caso contrario.



Ejemplo:

CL-USER 9 : 5 > ( oddp 28)

NIL



CL-USER 10 : 5 > ( oddp 27)

T

EVENP



Devuelve T si su entrada es un numero par y Nil en caso contrario.



Ejemplo:



CL-USER 11 : 5 > ( evenp 28)

T



CL-USER 12 : 5 > ( evenp 27)

NIL



Función (



Devuelve T si su primera entrada es mayor que la segunda.



Ejemplo:



CL-USER 14 : 5 > ( > 2 3)

NIL



OTRAS FUNCIONES PARA TRATAMIENTO DE LISTAS



REVERSE: (reverse lista)



Devuelve una lista con sus elementos invertidos. Opera únicamente sobre el

primer nivel de anidación. Las listas anidadas a otros niveles no son afectadas.

Suele utilizarse para volver a su orden original los objetos en listas construidas

mediante CONS.



Ejemplo:



CL-USER 15 > ( reverse '( a b (c d ) e ))

(E (C D) B A)



CL-USER 5 > (reverse ' ( ´´M´´ ´´A´´ ´´D´´ ´´R´´ ´´I´´ ´´D´´))

(´´D´´ ´´I´´ ´´R´´ ´´D´´ ´´A´´ ´´M´´)



CL-USER 7 : 1 > (reverse ' ( 1 2 3 4 5 6 7 8))

(8 7 6 5 4 3 2 1)

LENGTH: (length lista)



Devuelve un número entero que indica el número de elementos de una lista.



Sólo cuenta elementos en el primer nivel de anidación. No se consideran los

elementos incluidos en sub-listas.



Ejemplo:



CL-USER 8 : 1 > (length '((0 . "CIRCLE")(8 . "0")(10 242.426 157.686

0.0)(40 . 27.7503)))

4



SUBST: (subst elemento_nuevo elemento_antiguo lista)



Busca un elemento antiguo en una lista y devuelve una copia de ésta con un

elemento nuevo en lugar de cada aparición del elemento antiguo.



Ejemplo:



CL-USER 3 : 1 > (subst nil 'd ' ( m a d r i d ))

(M A NIL R I NIL)



ASSOC: (assoc elemento lista_asoc)





Busca una lista de asociaciones de un elemento y devuelve la entrada asociada de

la lista.



Ejemplo:

CL-USER 4 : 1 > (assoc 10 '((0 5)(8 3)(10 242.426 157.68)))

(10 242.426 157.68)



LAST: ( last Lista )



Devuelve el último término de la lista.



Ejemplo:



CL-USER 9 : 1 > ( last '( 1 2 3 4 5 6 7 8 9 ) )

LISTP

LISTP: (listp )



Sirve para distinguir si el argumento es lista, retornando T, o no es lista

retornando NIL.



Ejemplo:



CL-USER 11> (listp 'fisi)

NIL



CL-USER 5 : 1 > ( listp ' (1 2 '( a b )))

T



Funciones Lógicas



NOT



Toma un argumento y regresa t si es nil, o regresa nil de otra manera.



Ejemplo:

CL-USER 2> (not nil)

T



CL-USER 3> (not ‘(g y a))

NIL

AND



Toma cualquier número de argumentos y regresa nil si alguno de sus argumentos

es nil, de otra manera regresa un no-nil (regresara el ultimo elemento).



Ejemplo:



CL-USER 10 > (and ‘f ‘i ‘s ‘i)

I



CL-USER 11 > (and 1 nil 2 3)

NIL



CL-USER 12> (and ‘(a b)‘(nil 1 2) 7)

7

OR



Toma cualquier número de argumentos y regresa nil si todos sus argumentos son

nil, de otra manera regresa un no-nil.

Ejemplo:



CL-USER 9 > (or ‘a nil ‘b ’c)

A



CL-USER 18> (or nil nil )

NIL



Funciones:





Es posible definir nuevas funciones con defun que toma tres argumentos: un

nombre, una lista de parámetros y una o más expresiones que conforman el

cuerpo de la función.



Ejemplo:



> (defun tercero (parametro) (caddr parametro))

TERCERO



En este caso vemos el nombre de la nueva función que vendría a ser “tercero” el

parámetro de la función “parámetro” y el desarrollo o cuerpo de lo que la función

tercero realizara.



>(tercero (list 1 2 3))

3



El resultado de la nueva función es una ya conocida la cual elige el tercer

elemento de una lista.



Función de impresión



PRINT



Algunas funciones pueden producir salidas. La más simple es print, que imprime

su argumento y luego lo regresa.



Ejemplo:

CL-USER 17 : 3 > (print 3)

3

3



El primer 3 de arriba fue el valor impreso, el segundo el regresado.

FORMAT

Si se desea una salida más complicada, se necesitará usar un formato.

Esta función escribe la cadena en “cad” en la pantalla y devuelve NIL. “cad”

puede contener caracteres de control. Alguno de ellos son los siguientes:



- % nueva línea

- ~D si el argumento es un número decimal

- ~A si el argumento es un carácter ASCII

- ~B si el argumento es un número binario

- ~O si el argumento es un número octal

~X si el argumento es un número hexadecimal



He aquí un ejemplo:



CL-USER 6> (format t "An atom: ~S~%and a list: ~S~%and an integer:

~D~%"nil (list 5) 6)

An atom: NIL

and a list: (5)

and an integer: 6



Condicionales:



En lisp encontramos también el condicional IF. Este toma tres argumentos: una

expresión test, una expresión then y una expresión else.



La expresión test es evaluada, si su valor es verdadero, la expresión then es

evaluada; si su valor es falso, la expresión else es evaluada:



Ejemplo:



> (if (listp ’(a b c d) ) …(1)

(+ 1 2) …(2)

(+ 3 4) …(3)

)

3







En la línea (1) notamos que se tiene la expresión test la cual será evaluada si

cumple esta condición la cual indica pregunta si es que „( a b c d) es una lista

entonces si su valor es verdadero procederá a ejecutar el contenido de fila (2)

que es el resultado de una suma y si el valor es falso procede a realizar el

desarrollo de la expresión else que es la suma de 3 y 4.



Si se necesita establecer más de un argumento en la cláusula then o else de un

enunciado if, se puede usar la forma especial progn.

PROGN: (if expr_prueba expr_then [expr_else])



Calcula las expresiones secuencialmente y devuelve el valor de la última expresión

(progn [expr]...)

Se suele utilizar progn para calcular varias expresiones cuando sólo se espera,

como en cada una de las ramas del IF, una sola expresión.



Ejemplo:



CL-USER 7 : 2 > setq a 7

7



CL-USER 8 : 2 > setq b 0

0



CL-USER 9 : 2 > setq c 5

5



CL-USER 10 : 2 > (if (> a 5)

(progn

(setq a (+ b 7))

(setq b (+ c 8)))

(setq b 4)

)

13



COND: (cond (prueba1 resultado1 ...) ...)



Los condicionales más complicados pueden ser definidos usando la forma

especial cond, que equivale a una construcción if ... else if ... fi.

Un cond consiste en el símbolo cond seguido por varias cláusulas cond, cada una

de las cuales es una lista. El primer elemento de una cláusula cond es la

condición; el resto de elementos (si hay alguno) son la acción.

La forma cond encuantra la primera cláusula cuya condición evelúa a verdad (es

decir, no evalúa a nil); luego ejecuta la acción correspondiente y regresa el vaor

resultante. Ninguna de las restantes condiciones son evaluadas; ni son ninguna

acción excepto la correspondiente a la condición seleccionada.



Ejemplo:



CL-USER 11 : 2 > setq a 3

3



CL-USER 12 : 2 > (cond

((evenp a) a) ;si a es par regresar a

((> a 7) (/ a 2)) ;pero si a es mayor que 7 regresar a/2

(( setq x'b

B



CL-USER 14 : 3 > (case x

(a 5)

((d e) 7)

((b f) 3)

(otherwise 9)

)

3



La cláusula otherwise al final significa que si x no es a, b, d, e, o f, el enunciado

case regresará 9.



Funciones de iteración:



LOOP



Es la función de iteración más simple de LISP, esta ejecuta su cuerpo

repetidamente hasta que regresa una forma especial.



Por ejemplo:



CL-USER 5 : 2 > setq a 4

4



CL-USER 6 : 2 > (loop

(setq a (+ a 1))

(when (> a 7) (return a))

)

8

DOLIST: (dolist (indice-var Lista [resultado]) cuerpo)



Liga una variable a los elementos de una lista en orden y detenerse cuando la

lista llegue al final.



Ejemplo:



CL-USER 15 : 3 > dolist (x '(a b c)) (print x))

A

B

C

NIL



Dolist siempre regresa nil. Note que el valor de x en el ejemplo anterior nunca

fue nil: el NIL debajo del C fue el valor regresado por dolist, imprimido por el

bucle leer-evaluar-imprimir.



DO



Es el iteractivo más poderoso de LISP. Permite asignar varias variables, hacer

pasos de iteración como uno quiera y especificar la condición de terminación



Un enunciado do tiene el siguiente aspecto:



CL-USER 16 : 3 > (do ((x 1 (+ x 1))

(y 1 (* y 2)))

((> x 5) y)

(print y)

(print 'working)

)

1

WORKING

2

WORKING

4

WORKING

8

WORKING

16

WORKING

32



MAPCAR: (mapcar funcion lista1 lista2 lista3 …… listaN)



Opera sobre los elementos sucesivos de las listas hasta terminar con la lista más

corta. De cada lista se escoje un átomo en respectivo orden y ejecutan la

función.



Por ejemplo:



CL-USER 36 > (mapcar 'cons '(a b c) '(1 2))

((A . 1) (B . 2))



CL-USER 42 > (mapcar '+ '(1 2 3) '(4 5 6) '(7 8 9))

(12 15 18)



Related docs
Other docs by qingyunliuliu
CONTOURLP_ION
Views: 0  |  Downloads: 0
Route_description_car
Views: 0  |  Downloads: 0
1598_0130
Views: 0  |  Downloads: 0
PreparingtotaketheGRE08
Views: 0  |  Downloads: 0
d4_english
Views: 0  |  Downloads: 0
Slide 1 - tonywhiddon.org
Views: 0  |  Downloads: 0
cibinninger
Views: 0  |  Downloads: 0
Steve Jobs
Views: 3  |  Downloads: 0
By registering with docstoc.com you agree to our
privacy policy

You are almost ready to download!

You are almost ready to download!