2. • Para salir escriba (exit)
• Pruebe un comando de ejemplo como la multiplicación :
(* 5 6 20) => 600
• La anterior instrucción hará una multiplicación de los tres
números devolviendo 600 como resultado.
• Tenemos 2 tipos de datos: Atómicos y Listas
2 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6
3. b,4, color-casa ,etc.
Al evaluar un tipo de dato atómico, nos devuelve el valor que se le
ha asignado. Los números son un caso especial, siempre devuelven
el mismo valor.
20 = > 20
Si ponemos “edad-hermano” sin definirla con un valor, devuelve:
edad-hermano => Error (variable not defined)
Se asigna un valor con el comando:
(setq edad-hermano 19)=> 19
edad-hermano => 19
Existen palabras reservadas como nil , T, etc.
No se distinguen mayúscula y minúsculas: las variables ola y Ola son
la misma. 3 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6
4. (b), ( * 9 8) , (casa ( silla mesa e) j ), (), nil
• nil es a la vez un valor atómico y una lista : ()
• La evaluación de una lista siempre invoca una función.
(nombre-de-la-función argumento1…argumento n)
(* 50 10) => 5
(e 45,46,47) => Error (function not defined)
(+ edad-hermano 8) => 27
• Cuando evaluamos una lista, primero evaluamos los
argumentos para después aplicar la función
4 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6
5. • Lisp incluye operadores como +, - , * , /
• Además, incluye varias operaciones importantes.
Cons construye una lista de datos con una cola.
(cons 10 (cons 12 nil)) => (10 12)
Hay que tener en cuenta que el valor de la cola que significa
'nada' es nulo.
Si probamos con átomos que no están reservados.
(cons Jose nil) => Error: variable a is not defined.
¿Por qué sale ese error?
5 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6
6. Tenemos que decirle al intérprete que no evalúe al átomo Jose. Para ello se
pone adelante ‘
(cons ‘Jose nil) => (JOSE)
De forma abreviada se puede aplicar a una lista completa :
(cons ‘Jose ‘(Pepe Marta Carlos ))=> (JOSE PEPE MARTA CARLOS)
Veremos diferencias entre list y append.
(list ‘Jose ‘Marta ‘Carlos) => (JOSE MARTA CARLOS)
(list ‘Jose ‘(Marta Carlos)) => (JOSE (MARTA CARLOS))
(append ‘(Jose Marta) ‘(Carlos Carmen))=> (JOSE MARTA CARLOS CARMEN)
La diferencia es que append, usa a listas como argumentos para formar
otra lista. 6 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6
7. Si queremos listar, pero uno de los elementos a listar es resultado de una
operación, se pondrá entre paréntesis. Por ejemplo:
(list ‘Jose ‘24 (* edad-hermano 3) ‘ Marta ‘24) => (JOSE 24 75 MARTA 24)
Una coma dentro de un par de paréntesis antepuesto por una apóstrofe,
le dice a Lisp que, tiene evaluar lo que le sigue a la coma. Por ejemplo:
‘(Jose 24 ,(* edad-hermano 3) Marta 24)=> (JOSE 24 75 MARIA 24)
7 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6
8. Una vez que tenemos una lista construida, ¿Cómo accedemos a los miembros de
la lista?
• first : Primero de una lista.
(first ‘(Jose Marta Carlos)) => JOSE
(first ‘((Jose Marta Carlos) Carmen) )=> (JOSE MARTA CARLOS)
• rest : Toda la lista menos el primer elemento
(rest ‘(Jose Marta Carlos)) => (MARTA CARLOS)
(rest ‘((Jose Marta Carlos) Carmen) )=> (CARMEN)
• car y cdr se pueden combinar
(caar '((Jose Marta ) Carmen Miguel)) => JOSE
(cdar '((Jose Marta ) Carmen Miguel)) => (MARTA)
Se tiene que trabajar desde la derecha hacia la izquierda. 8 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6
9. • Por ejemplo, si escribimos:
(setq listaPrueba ‘(Ana Carla Patricia)) => (ANA CARLA PATRICIA)
(cons ‘Marcos listaPrueba) => (MARCOS ANA CARLA PATRICIA)
listaPrueba => (ANA CARLA PATRICIA)
• No tiene efectos secundarios, la lista no cambió. Necesitamos setq
para cambiar el valor de un átomo.
• setf es una versión de setq que tiene una función como primer
argumento.
(setf (cadr listaPrueba) ‘Antonio) => ANTONIO
listaPrueba => (ANA ANTONIO PATRICIA)
9 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6
10. • A continuación veremos 2 tipos de igualdad
(eq ‘Marta ‘Carlos) => nil
(eq ‘(jose) ‘(Jose)) => nil
(eq ‘Jose ‘JoSe) => T
(equal ‘Carlos ‘Carlos) => T
(equal ‘(Marta) ‘(Marta)) => T
(equal ‘(alumno profesor) ‘(alumno profesor)) => T
• (equal x, y) es T cuando (eq x y) es verdadero y cuando las cosas
se escriben iguales son verdaderas .
10 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6
11. • ¿Se puede el tratar a una lista como un conjunto, es decir, sin preservar
el orden?
(union ‘(Marta Carla) ‘(Marta Luis Juan)) => (JUAN LUIS MARTA CARLA)
(union ‘((Marta) (Carmen)) ‘((Marta))) => ((MARTA) (MARTA) (CARMEN))
(union ‘((Marta) (Carmen)) ‘((Marta)) :test ‘equal) => ((MARTA) (CARMEN))
• La condición de prueba para determinar si los 2 elementos en el
conjunto son los mismos es la función equal.
(adjoin ‘Marta ‘(Marta Carla Juan)) => (MARTA CARLA JUAN)
(set-difference ‘(Juan Marta Carla ) ‘(Marta Pedro Carla)) => (JUAN)
• adjoin y set-difference también pueden usar :test ‘equal. Incluso puede
proporcionar su propia función.
11 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6
12. (length ‘(Richard Cecilia Alonso)) => 3
(atom ‘1) => T
(atom ‘(Richard Cecilia Alonso)) => NIL
(listp ‘inteligencia) => NIL
(listp ‘(IA Modelos Redes)) => T
12 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6
13. (<= Alonso (and Bruno Carmen))
(not (not Daniel))
(or Pablo (not Pedro) Marcos)
(list ‘<= ‘Alonso (list ‘and ‘Bruno ‘Carmen)) => (<= ALONSO (AND BRUNO CARMEN))
(list ‘not (list ‘not ‘Daniel)) => (NOT (NOT DANIEL))
(list ‘or ‘Pablo (list ‘not ‘Pedro) ‘Marcos) => (OR PABLO (NOT PEDRO) MARCOS)
Tener en cuenta que los operadores KIF =>, <=, <=>, and, or, not serán
siempre el primer elemento de la lista.
13 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6
14. (defun <nombre> <documentación-de-cadena> (<argumentos>)
<cuerpo>)
(defun cubo (dato1) (* dato1 dato1 dato1))
cubo 6 => 216
Tenga en cuenta que no tenemos que citar a ninguno de los argumentos de
defun. Se atiende de forma automática.
La evaluación de una función para un conjunto de argumentos como
resultado en la última expresión valuada en el función de seguimiento.
14 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6
16. La evaluación de cond evalúa las pruebas hasta que una
de ellas se evalúe como verdadera. A continuación, se evalúa cada uno de
las formas adecuadas; la última evaluación es el valor de toda la función
cond.
Por ejemplo:
setq listaN ‘(25 12 100 20) => (25 12 100 20)
listaN => (25 12 100 20)
car listaN => 25
atom listaN => NIL
listp listaN => T
( cond ( (atom listaN) NIL) ((listp listaN) (car listaN)) (T NIL) ) => 25
16 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6
23. (and <form1> <form2>….<formn>)
• Evalúa a nil tan pronto como uno de los <formi> sea nulo.
De lo contrario se evalúa hasta <formn>
(or <form1> <form2>….<formn>)
• Evalúa al primer argumento no nulo. Si no hay ninguno
evalúa a cero.
(not <form>) y (null <form>) son idénticos.
• Por lo general, utilizan este último cuando el resultado debería
ser una lista.
23 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6
25. (let ((<var1> <init1>) (<var2> <init2>)…)<body> )
• Declarar las variables locales. Lo mejor es declarar
las variables antes de usarlas.
(dotimes (<contador> <limite> <result>)<body>)
(let ((sum 10))
(dotimes (i 10 sum ) (setq sum (- sum 1))))
(let ((sumatoria 0))
(dotimes (i 20 sumatoria )(setq sumatoria (+ sumatoria i)))) 25 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6
29. • Nada nuevo en esta sección
(defun factorial (numero)(if (eq numero 1) 1
(* numero (factorial (- numero 1)))
))
(factorial 5) -> 120
29 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6
32. • (mapcar <nombre-función><lista>)
- Mapcar aplica la función a cada elemento de
lista y devuelve una lista de los resultados.
(mapcar ‘atom ‘(alumno profesor (a b) )) => (T T nil )
(defun factorial (numero)(if (eq numero 1) 1
(* numero (factorial (- numero 1)))
))
(mapcar ‘factorial ‘(1 3 6)) => (1 6 720)
• Otras Operaciones de listas: remove-if, remove-if-not, some,
every, search, subseq, length
32 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6
35. • Una cadena en Lisp es técnicamente una serie de
caracteres.
• Tendrá que utilizar operadores especiales para trabajar con
cadenas: concatenar, subseq, de búsqueda.
• El código de ejemplo incluye la funcionalidad suficiente para
que no deberían tener que preocuparse sobre las cadenas
Además de la salida de los resultados de su razonador.
• La única cosa a tener en cuenta es cuando usted está
incluir una cita en el html que enviar de vuelta al
cliente. Sólo asegúrese de usar una para escapar de cualquier
tales citas. Un ejemplo aparece en la función
myfrontpage.
35 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6
36. • (print <form>) imprime tanto la evaluación de
<form> y vuelve a la evaluación de <form>.
• Es útil para la depuración.
• princ, print1, print todo trabajo es básicamente lo mismo
pero con pequeñas diferencias.
36 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6
37. (format <destination> <control-string> <optionalarguments>)
<destination>: imprime en la línea de comandos
Nil No imprime nada pero retorna cadenas sino imprime en el
flujo de <destination>
<control-string>: Al igual que printf/sprintf en C. Incluye
marcadores de posición para los argumentos
37 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6
38. <optional-arguments>: Los argumentos que se llenan en los
marcadores de posición en el control de cadena.
• ~A: Ascii—cualquier objeto Lisp
• ~D: Numeros decimales
• ~%: nueva linea
• ~~: tilde
38 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6
40. (trace <func-name1> <func-name2> … <funcnamen>)
• Cada vez que una de estas funciones se evalúa, Lisp imprime el
nombre de la función y los argumentos dado en la terminal.
Cada vez que una las funciones retornen salidas, Lisp imprime lo
que su valor de retorno era. Llamar a remontar varias veces se
sumará a la lista de funciones.
• Para desactivar el seguimiento de una función foo y bar, use
(untrace foo bar). Para desactivar todo el rastreo, use (untrace)
40 de 40
INTELIGENCIA ARTIFICIAL - CICLO 2012-I - GRUPO 6