Está en la página 1de 10

IA 2020-2, Grupo 2 Prof. Rolando A.

Maguiña Pérez
EAPIS-FISI UNMSM

PRÁCTICA GUIADA DE LABORATORIO 2

INTRODUCCIÓN
Con la intención de aprender aspectos del lenguaje Common Lisp tales como primitivas para imprimir en
pantalla y para definir variables, definir funciones propias, y también algunas de las estructuras de control
disponibles en el lenguaje, enseguida se plantean varias preguntas. En anexo se describen funciones de
Common Lisp que podrán ser útiles para resolver las preguntas planteadas mediante el entorno LispWorks.

Los códigos respectivos que responden a dichas preguntas, deben estar consignados en un archivo con
extensión .lsp; cada alumno debe enviar el archivo con dichos códigos al correo electrónico:
rmaguinap@unmsm.edu.pe.

PREGUNTAS
1) Definir una función que cada vez que se ejecute, el resultado sea:
(la delincuencia ha aumentado en nuestra ciudad)
2) Dados 2 números imaginarios, los cuales deberán ser pasados por teclado, se pide:
a) Escribir un programa que implemente un menú de opciones para obtener la suma (suma dos números
imaginarios; p.e. 2 + 3i con 6 + 4i), resta o multiplicación de los números imaginarios. Use la
condicional COND. Se desea que el programa interactúe con el usuario de modo escoja la operación
que desea. Para imprimir por pantalla los mensajes que se requieran use PRINT.
b) Modificar el programa del anterior ítem de modo que luego del ingreso de los números por teclado, y
del resultado obtenido, el prompt retorne para un nuevo ingreso de números.
Nota: un número imaginario en Common Lisp se representa así: #C(a b); donde ‘a’ se refiere a la parte real
y ‘b’ a la imaginaria.
3) Definir una función que implemente la función signo
1 si u  0
f(u)=
-1 u<0

4) Se desea crear el juego “Adivina el Número”. La computadora pensará un número aleatorio entre 1 y 20,
y te pedirá que intentes adivinarlo. La computadora te dirá si cada intento es muy alto o muy bajo. Tú
ganas si adivinas el número en seis intentos o menos. Este es un buen juego para codificar ya que usa
números aleatorios y bucles, y recibe entradas del usuario en un programa corto.

Dado que este programa es un juego, nos referiremos al usuario como el jugador. Pero llamarlo “usuario”
también sería correcto. Así es como el programa se muestra al jugador al ejecutarse. El texto que el jugador
ingresa está en negrita.

Hola! ¿cómo te llamas?


Alberto
Bueno, Alberto, estoy pensando en un número entre 1 y 20.
Intenta adivinar.
10
Tu estimación es muy alta.
Intenta adivinar.
2

a) Usando LOOP-WHILE-DO para los bucles, RANDOM para la generación de números aleatorios y
FORMAT para imprimir los mensajes, codificar el juego en Common Lisp.

b) Usando ahora variables locales donde sea factible, codificar el juego en Common Lisp.
IA 2020-2, Grupo 2 Prof. Rolando A. Maguiña Pérez
EAPIS-FISI UNMSM

ANEXO

Definición de funciones con nombre


DEFUN
- Construcción de funciones que serán invocadas fuera del contexto donde se definieron
Formato:
(defun <nombre_función> (parámetro1 parámetro 2 ....parámetroN)
( expresión1 )
( expresión2 )
( expresiónM ))
- Devuelve el nombre de la función

EJM. EJM. Llamada de función:


(defun triple (x) > (triple 6)
"funcion simple con cadena de documentación"
18
(* x 3))

Llamado de la función definida por el usuario se hace con:


(nombre_función valor_1er_argto valor_2do_argto...valor_n-ésimo_argto)

Funciones para procesamiento de listas


CONS
- 2 argumentos: 1 elemento (1 átomo o una lista) y 1 lista
- añade el elemento al inicio de la lista existente
EJM.
(cons 'lunes (miercoles viernes)) → (lunes miercoles viernes)
(cons 1 '(3 5 7 9)) → (1 3 5 7)

LIST
- n argumentos: argumentos pueden ser átomos o listas
- crea una lista con los argumentos declarados

EJM.
(list 'luna 'sol) → (luna sol)
(list 'ppc 'ap 'apra) → (ppc ap apra)
(list 'luna nil) → (luna nil)
(list '(solo)) → ((solo))

APPEND
- n argumentos: argumentos deben ser listas
- une las listas en una sola lista

EJM.
(append '(1 3 5 7) '(2 4 6)) → (1 3 5 7 2 4 6)
(append '(aa bb cc) '(dd ee ff))→ (aa bb cc dd ee ff)

*DIFERENCIAS
(cons '(lu ma mi) '(ju vi sa do)) → ((lu ma mi) ju vi sa do)
(list '(lu ma mi) '(ju vi sa do)) → ((lu ma mi) (ju vi sa do))
(append '(lu ma mi) '(ju vi sa do)) → (lu ma mi ju vi sa do)
IA 2020-2, Grupo 2 Prof. Rolando A. Maguiña Pérez
EAPIS-FISI UNMSM

OTRAS FUNCIONES PARA PROCESAMIENTO DE LISTAS


REVERSE
Sintaxis:
(reverse <expresión>)
- argto: 1 lista
- retorna la lista con el orden de sus elementos invertido

EJM.
CL-USER > (reverse '(aa bb cc dd))
(DD CC BB AA)

CL-USER > (reverse '(bd (2 3) hh jj))


(JJ HH (2 3) BD)

LENGTH
Sintaxis:
(length <expresión>)
- argto: 1 lista
- proporciona el número de elementos de una lista o el número de caracteres de una cadena o string

EJMS.
CL-USER > (length '((a b) kk mm))
3

CL-USER 37 > (length '(nil))


1

CL-USER 40 > (length "solo")


4

NTH
Sintaxis:
(nth <entero> <lista>)
- argto: 1 número entero y 1 lista
- proporciona el n-ésimo elemento de la lista contando desde elemento 0
(A B C D E F )
Indices de posición 0 1 2 3 4 5

EJM.
CL-USER 49 > (nth 3 '(u alianza cristal san-martin muni))
SAN-MARTIN

CL-USER 47 > (setq L '(1 3 5 7))


(1 3 5 7)

CL-USER 48 > (nth 3 L)


7

REMOVE
- Formato: (remove Elemento Lista)
- Recibe dos argumentos, cualquier elemento y una lista, y devuelve una nueva lista con todos los elementos
de dicha lista excepto el elemento declarado:

EJM.
IA 2020-2, Grupo 2 Prof. Rolando A. Maguiña Pérez
EAPIS-FISI UNMSM

> (setq principales-clubes '(u al cr boys muni))


(U AL CR BOYS MUNI)

>(remove 'muni principales-clubes)


(U AL CR BOYS)

DEFINICIÓN DE VARIABLES GLOBALES Y CONSTANTES


1) Definición de constantes
Para definir constantes en Common Lisp se utiliza DEFCONSTANT.

DEFCONSTANT
Formato:
(defconstant cte1 form1)
- form1 es evaluada y el resultado se almacena en la constante cte1.
- Devuelve siempre el nombre de la constante que se acaba de definir.
- El valor de una constante no se puede modificar.
- No se puede definir más de una constante en una expresión.

EJM.
CL-USER 23 > (defconstant cervantes '(miguel de cervantes y saavedra))
CERVANTES

La función DEFCONSTANT
Según el ejemplo, cervantes es una constante cuyo valor es una lista con el sobrenombre del escritor. Es
decir, siempre que se evalúe cervantes, el resultado será su valor:

CL-USER 26 > cervantes


(MIGUEL DE CERVANTES Y SAAVEDRA)

CL-USER 27 > (reverse cervantes)


(SAAVEDRA Y CERVANTES DE MIGUEL)

Obsérvese que el símbolo cervantes aparece dos veces en la definición: como símbolo dentro de la lista y
como nombre de la constante. En realidad, tanto las constantes como las variables no son sino simples
símbolos a los que se ha asociado un valor.

2) Definición de variables globales


Para definir variables globales se utiliza DEFVAR, el cual permite definir variables globales dándoles un valor
inicial (opcional). Existe el convenio de definir las variables globales con dos asteriscos para que las
expresiones que las utilizan sean más legibles.

DEFVAR
Formato:
(defvar *var1* [valor_inicial])
- Valor_inicial que es opcional es evaluado y el resultado se almacena en la variable global *var1*.
- Devuelve el nombre de la variable que se acaba de definir.
- No se puede definir más de una variable en una expresión.

EJM.
CL-USER 28 > (defvar *humedad-prom* 80)
*HUMEDAD-PROM*

CL-USER > (defvar *t-ra*)


IA 2020-2, Grupo 2 Prof. Rolando A. Maguiña Pérez
EAPIS-FISI UNMSM

*T-RA*

Si se define una misma variable más de una vez, sólo tiene efecto la primera definición. P.e., si se define de
nuevo la variable *humedad-prom* con otro valor inicial, permanece el valor dado la primera vez:

CL-USER > *humedad-prom*


80

CL-USER > (defvar *humedad-prom* 90)


*HUMEDAD-PROM*

CL-USER 50 > *humedad-prom*


80

Si se define una variable, pero no se le da valor, utilizar esa variable dará error porque no tiene un valor
asignado. Por ejemplo, evaluar *t-ra* da error porque es una variable que no tiene asociado ningún valor:

CL-USER > *t-ra*


Error: The variable *T-RA* is unbound.

DEFPARAMETER
Formato:
(defparameter *var1* [valor_inicial])
- Valor_inicial que es opcional es evaluado y el resultado se almacena en la variable global *var1*.
- Devuelve el nombre de la variable que se acaba de definir.

CL-USER > (defparameter *t-ra* 16)


16

CL-USER > (defparameter *t-ra* 20)


20

3) Asignación
Para poder asignar o modificar el valor de una variable, se utiliza SETQ (proviene de “set quote”):

SETQ
La función SETQ siempre devuelve el valor que se ha asignado a la variable. P.e. se puede modificar el valor
de *humedad-prom* que con defvar no se pudo re-asignar, así:

CL-USER > (setq *humedad-prom* 90)


90

CL-USER > *humedad-prom*


90

También se puede comprobar que el valor de una constante no se puede modificar.


CL-USER > (setq cervantes '(el manco de lepanto))

Error: CERVANTES is a constant and cannot be set or bound.

SETF
Los símbolos se utilizan para dar nombre a las variables. Una variable puede tomar como valor cualquier objeto
LISP.

CL-USER > (setf equipos-de-futbol '(u alianza cristal muni))


IA 2020-2, Grupo 2 Prof. Rolando A. Maguiña Pérez
EAPIS-FISI UNMSM

(U ALIANZA CRISTAL MUNI)

Es más general que SETQ.


La forma especial SETF es la utilizada para asignar valores a una variable o a una posición (variable
generalizada).

ASIGNACION DE VARIABLES LOCALES


LET
Formato:
(LET ((var-1 valor-1)
(var-2 valor-2)
...
(var-n valor-n))
cuerpo)

- Es una función especial que permite crear variables locales.


- El primer argumento para LET es una lista de pares variable-valor. Las n formas para valor son evaluadas,
luego se crean n variables locales para sustentar los resultados, finalmente se evalúan las formas en el
cuerpo del LET.

EJM.
CL-USER > (let ((x 2))
(sqrt x))
1.4142135

Análisis
Se inicializa la variable local x a 2, el cuerpo está constiuido por una sola expresión que lo que hace es
obtener la raíz cuadrada de x.

CL-USER > (let ((L '(En elecciones votar a conciencia)))


(print L))

(EN ELECCIONES VOTAR A CONCIENCIA)


(EN ELECCIONES VOTAR A CONCIENCIA)

I/O
FORMAT
Formato general:
(format t “Lo que se quiere imprimir en pantalla”)

Esta función normalmente devuelve el valor de NIL, pero como efecto lateral produce que se escriba en
pantalla. Cuando se quiere escribir en la pantalla el primer argumento debería de ser el símbolo t . El
segundo argumento debe ser una cadena devuelve NIL.

EJM.
> (format t "no existe solucion al problema")
no existe solucion al problema
NIL
La cadena de control del format puede contener también órdenes para formateado especial, las cuales
comienzan con el caracter ‘‘~’’. Enseguida, se presentan las principales directivas usadas en format.
~%: produce que format empiece una línea nueva.
> (format t "La suma ~& de los numeros")
IA 2020-2, Grupo 2 Prof. Rolando A. Maguiña Pérez
EAPIS-FISI UNMSM

La suma
de los numeros
NIL

~S: inserta la representación impresa de un objeto LISP en el mensaje que el FORMAT imprime; para cada ~S
en la cadena de control del format, FORMAT requiere de un argumento extra.
EJM.
> (format t "De ~S a ~S en ~S minutos" 'Lima '(Callao) 15)
De LIMA a (CALLAO) en 15 minutos
NIL

~A: imprime un objeto sin usar las comillas; se diferencia de ~S porque este incluye las comillas mientras que
~A no las incluye.
EJM.
> (defun prueba (x)
(format t "~&Con comillas: ~S" x)
(format t "~&Sin comillas: ~A" x))
PRUEBA

> (prueba "ven la diferencia")


Con comillas: "ven la diferencia"
Sin comillas: ven la diferencia
NIL

PRINT
Formato general:
(print par1)
par1 puede ser un átomo o una lista, o una cadena; imprime par1 y luego vuelve a imprimirlo
Caso par1 fuese una cadena:
EJM.
> (print “Hola, mundo”)

“Hola, mundo”
“Hola, mundo”

> (format t “Hola, mundo")


Hola, mundo
NIL

Caso par1 fuese un átomo o una lista, PRINT escribe éste y luego vuelve a imprimirla.
EJM.
> (print 'fisi)
FISI
FISI

> (print '(michi go nine-men damas-chinas))

(MICHI GO NINE-MEN DAMAS-CHINAS)


(MICHI GO NINE-MEN DAMAS-CHINAS)

Condicionales
COND
Formato:
IA 2020-2, Grupo 2 Prof. Rolando A. Maguiña Pérez
EAPIS-FISI UNMSM

(cond (<condición1> <acción1>)


(<condición2> <acción2>)
..
(<condiciónN> <acciónN>)
)

- argumentos son cláusulas


- examina una por una hasta encontrar una cuya condición o predicado sea V
cuando la encuentra evalúa la acción y retorna su valor, no examina más cláusulas
se puede forzar la interpretación de una acción utilizando t en la respectiva condición

EJM. Definir una función que compare dos números y que emita un mensaje adecuado sobre el resultado
obtenido.

(defun compara (x y)
(cond ((> x y) (format t "el primero es mayor que el segundo"))
((= x y) (format t "los numeros son iguales"))
((< x y) (format t "el primero es menor que el segundo"))
)
)
> (compara 39 67)
el primero es menor que el segundo
NIL

IF
Formato:
(if (condición) <acción si se cumple condición> <acción si no se cumple>)

EJM. Definir una función que proporcione el valor absoluto de un número.

(defun va (x)
(if (< x 0) (* x -1) x))

> va(-4)
4

ITERACIONES
DOLIST
Formato:
(dolist ((var lista [resultado])
cuerpo)

- La evaluación de lista debe dar una lista como resultado


- Realiza tantas iteraciones como elementos (de más alto nivel) tenga la lista
- En cada iteración var tiene asignado como valor el elemento de la lista cuya posición se corresponde con
dicha iteración
- Al terminar el proceso devuelve el valor resultado, excepto cuando en el cuerpo se evalúa alguna sentencia
RETURN, en cuyo caso se devuelve el valor indicado por ésta
EJM.
CL-USER > (dolist (x ‘(a b c d)) (print x))

A
B
C
D
IA 2020-2, Grupo 2 Prof. Rolando A. Maguiña Pérez
EAPIS-FISI UNMSM

NIL

EJM.
Dada una lista de números enteros, definir una función que coloque los impares en una lista y los pares en
otra.

Sol.

(setq L1 nil)
(setq L2 nil)

(defun filtro (L)


(dolist (e L)
(if (evenp e) (setq L1 (cons e L1)) (setq L2 (cons e L2)))
)
(format t “La lista de pares es: ~S” L1)
)

EJM.
CL-USER > (lista-pares '(3 5 7 9 12 14))
la lista de pares es (14 12 8)
NIL

CL-USER > L1
(14 12 8)

LOOP
Formato:
(loop for <variable> in <lista> do
cuerpo)

- Realiza tantas iteraciones como elementos tenga la lista <lista>.


- En c/ iteración a <variable> se le asigna como valor el elemento cuya posición se corresponde con
dicha iteración

EJM.
CL-USER > (loop for x in ’(a b c ) do (print x))

A
B
C
NIL

Formato:
(loop while <condición> do
cuerpo)
Realiza las iteraciones mientras se cumpla la condición.

EJMS.

CL-USER > (let ((x 7) (res nil))


(loop while (> x 0) do
(setf res (cons x res) x (- x 1))
)
IA 2020-2, Grupo 2 Prof. Rolando A. Maguiña Pérez
EAPIS-FISI UNMSM

res
)

(1 2 3 4 5 6 7)

CL-USER > (let ((L '(aa bb dd)))


(loop while (not (null L)) do
(print (car L)) (setq L (cdr L)))
)

AA
BB
DD
NIL

Formato:
(loop until <condición> do
cuerpo)

Realiza las iteraciones hasta que se cumpla la condición.

EJM.

CL-USER > (let ((x 3)(res nil))


(loop until (= x 0) do
(setf res (cons x res) x (- x 1))
)
res
)
(1 2 3)

CL-USER > (let ((L '(aa bb dd)))


(loop until (null L) do
(print (car L)) (setq L (cdr L))
)
)
AA
BB
DD
NIL

RAMP

También podría gustarte