You are on page 1of 8

EJERCICIOS CON FUNCIONES APLICATIVAS

1.- Supuesto evaluada la expresión (setq X (list '(+ 1 2))) que se obtiene al evaluar las
expresiones simbólicas siguientes:

Expresiones Evaluación
X ((+ 1 2))
(eval X) Error

2.- Al evaluar las expresiones siguientes alguna da error. Di cual de ellas es, e indica la
causa. Di el resultado que se obtiene al evaluar las otras.

Expresiones Evaluación
(eval (car (cdr '(a b c)))) Error
(eval (cons 'quote '((1 2 3)) )) (1 2 3)
(eval (cons 'quote (list (list 'A 'B)))) (a b)

3.- Se han evaluado las expresiones:

(setq a 'b)
(setq b (list a 'b))

Di el resultado de evaluar la expresión siguiente:


(append b (list b) (eval a)) ⇒ (b b (b b) b b)

4.- Se han evaluado las expresiones siguientes:

(setq c '(+ 3 7))


(setq x 'c)
(setq y x)

Di el resultado de evaluar las expresiones siguientes:

Epresiones Evaluación
(list x y (eval x) c (eval c)) (c c (+ 3 7) (+ 3 7) 10)
(eval (append (eval y) (list (eval (eval y))))) 20

5.- Define la suma de un número variable de vectores de cualquier dimensión,


utilizando mapcar
6.- Define las siguientes funciones para trabajar con matrices nxn para un n cualquiera
utilizando mapcar:

a) la suma de dos matrices


b) el producto de una matriz por un número real.
c) la función que devuelve la primera columna de una matriz.
d) la función que dada una matriz devuelve la matriz que se obtiene de
eliminar su primera columna.
e) la matriz traspuesta de una dada.

SOLUCIÓN

(defun s2matrices (n m)
(mapcar 's2vectores n m))
(s2matrices '((1 0 2) (9 3 8) (7 4 6)) '((7 4 6) (9 3 8) (1 0 2)))

(defun pcolumna (m)


(mapcar 'car m))

(defun epcolumna (m)


(mapcar 'cdr m))

(defun traspuesta (m)


(cond
((null (car m)) nil)
(t (cons (mapcar 'car m)
(traspuesta (mapcar 'cdr m)) )) ))
(traspuesta '((1 2 3) (1 2 3) (1 2 3)))

7.- Define la suma de un número variable de matrices nxn para un n cualquiera.

SOLUCIÓN

(defun snmatrices (&rest l)


(apply 'mapcar (cons 'snv l)))

(snmatrices '((1 1 1) (1 1 1) (1 1 1))


'((1 1 1) (1 1 1) (1 1 1))
'((1 1 1) (1 1 1) (1 1 1)))
8.- Dada la siguiente definición de función:

(defun incognita (l)


(cond
((and (atom l) (not (numberp l))) 0)
((numberp l) 1)
(t (apply '+ (mapcar 'incognita l))) ))

Explica que hace, sabiendo que L es una lista. Pon algunos ejemplos y da un
nombre que consideres apropiado a dicha función INCOGNITA.

9.- Di que hace la función INCOGNITA:

(defun incognita (x l1 l2)


(aux (mapcar x l1 l2)) )

(defun aux (l)


(cond
((null l) nil)
(t (cons (list (car l) (car l)) (aux (cdr l)))) ))

SOLUCIÓN

X debe se una función con dos argumentos. L1 y L2 deben ser listas cuyos
elementos sean argumentos válidos para la función X.
Al aplicar MAPCAR la función X a L1 y L2 hasta que una de ellas termine,
MAPCAR devuelve la lista formada por los sucesivos valores dados por X.
La función auxiliar actúa sobre la lista devolviendo la lista que se obtiene al
duplicar cada uno de los elementos, introduciendo cada pareja en una lista.

Ejemplo: (incognita '+ '(1 2 3 4) '(5 1 2 8))


==> ((6 6) (3 3) (5 5) (12 12))
ALMACENAMIENTO DE DATOS
1.- a) Se desea pasar una lista de asociación a lista de propiedad. Hay que tener en
cuenta que en esta hay que considerar que se deben almacenar las claves y los valores
de ésta y en algún sitio el nombre de la lista de asociación.

b) También se desea implementar el caso contrario, es decir, de lista de propiedad a lista


de asociación.

SOLUCIÓN

a)
(setq figura '((es-un cubo) (color verde) (tamaño grande) (encima-de mesa)))

(defun a-propiedad (nombre la)


(cond
((null la) '(está vacía))
((null (cdr la)) (setf (get nombe (caar la)) (cadar la)))
(t (and (seft (get nombre (caar la)) (cadar la))
(a-propiedad nombre (cdr la))) ) ))

b)
(setf (get 'p1 'color) 'rojo)
(setf (get 'p1 'es) 'cubo)
(setf (get 'p1 'esta) 'mesa)
(setf (get 'p1 'tiene) 'picos)

(defun to assoc (nombre)


(let ((claves (symbol-plist nombre)))
(cond
((null claves) nil)
(t (a-pares claves)) )))
(defun a-pares (l)
(cond
((null l) nil)
((null (cdr l)) (list (car l) '()))
(t (cons (list (car l) (cadr l)) (a-pares (cddr l)) )) ))
2. Se ha evaluado la expresión:
(setq SIMBOLO '((tipo lista) (list 7) (numberp 9) (atomp 3)))
Las siguientes expresiones se evalúan secuencialmente, di el resultado de sus
evaluaciones.
a) SIMBOLO
b) tipo
c) list
d) (assoc 'list 'SIMBOLO)
e) list
f) (eval (assoc 'list SIMBOLO))

3. Se ha evaluado la expresión: (setq L '((A 1) (B 2) (C 3)) )


Di cual de las expresiones siguientes dan error y porqué. Si no dan error di el resultado
de su evaluación.
a) (apply 'assoc 'A L)
b) (funcall 'assoc 'A L)
c) (eval (list 'assoc ''A 'L))

4. Se suponen evaluadas las expresiones siguientes:

(setf (get 'PEDRO 'CENTR-TRABAJO) 'EUI)


(setf (get 'PEDRO 'TFNO) '(2 34 56 12))
(setf (GET 'EUI 'TFNO) '(3 31 86 56))

Escribe una expresión que devuelva el teléfono de la EUI sin utilizar el símbolo EUI.

SOLUCIÓN

(get (get 'PEDRO 'CENTRO-TRABAJO) 'TFNO)

5. Se han evaluado las expresiones siguientes:

(setf (get 'CIRCULO 'AREA) '(LAMBDA (X) (* 2 3.14 X)) )


(setf (get 'FIGURA1 'FORMULA) 'CIRCULO)
(setf (get 'FIGURA1 'RADIO) 3)

Escribe una expresión lisp utilizando la función APPLY tal que el valor de su
evaluación sea el área del círculo FIGURA1 es decir, 18.84. En la expresión no puede
aparecer el átomo CIRCULO.

SOLUCIÓN

(apply (get (get 'FIGURA1 'FORMULA) 'AREA) (list (get 'FIGURA1 'RADIO)))
6. Evaluadas las siguientes expresiones:
(setq AMIGOS '((alberto (luis)) (andres (juan charlie jose)) (maria (andres alberto
miguel)) (pedro (marcos)) ))
(setf (get 'charlie 'es-un) 'perro)
(setf (get 'juan 'es-un) 'hombre)
(setf (get 'jose 'es-un) 'hombre)
(setf (get 'hombre 'tipo) 'mamifero)
(seft (get 'perro 'tipo) 'mamifero)
(setf (get 'hombre 'piensa) T)
(setf (get 'perro 'piensa) NIL)
(setf (get 'mamifero 'clase-de) 'animal)
(setf (get 'animal 'se-mueve) T)

Se pide:

a) Construir una expresión que diga si juan piensa, sin utilizar el símbolo"juan".
b) Construir una expresión que devuelva todos los amigos, consideramos que la amistad
no tiene las propiedades ni simétrica ni transitiva.
c) Construir una expresión que diga si charlie se mueve
d) Construir una expresión que diga si José es un animal
e) Construir una expresión que compruebe si algún amigo de Andrés piensa, sin utilizar
los nombres de sus amigos.

SOLUCIÓN
a)
(get 'hombre 'piensa) -> (get (get 'juan 'es-un) 'piensa) ->
(assoc 'andres amigos)

b)
(mapcar 'car amigos)

c)
(get 'animal 'se-mueve)
(get (get 'mamifero 'clase-de) 'se-mueve)
(get (get (get 'perro 'tipo) 'clase-de) 'se-mueve)
(get (get (get (get 'charlie 'es-un) 'tipo) 'clase-de) 'se-mueve)

d)
(equal (get 'mamifero 'clase-de) 'animal)
(equal (get (get 'hombre 'tipo) 'clase-de) 'animal)
(equal (get (get (get 'jose 'es-un) 'tipo) 'clase-de) 'animal)

e)
(get 'hombre 'piensa)
(get (get 'juan 'es-un) 'piensa)
(eval (cons 'or
(mapcar '(lambda (x) (get (get x 'es-un) 'piensa))
(cadr (assoc 'andres amigos)) ) ))
7. Supuesto evaluadas las expresiones siguientes:
(setq l '((base 2) (altura 5)))
(defun analiza (x y z)
(cond
((assoc yx) x)
(t (append x (list (list y z)))) ))
Di que se obtiene al evaluar secuencialmente:
1) (analiza l 'altura 3)
2) L
3) (analiza l 'color 'rojo)
4) L

8. Dadas las siguientes expresiones


(putprop 'problema '+ 'función)
(putprop 'problema '(1 2 3) 'argumentos)

Construir una expresión que recupere la función y los argumentos de las dos listas de
propiedad anteriores y devuelva el resultado de aplicar la función a dichos argumentos.

SOLUCIÓNES POSIBLES
(apply (get 'problema 'función) (get 'proplema 'argumento))
(eval (cons (get 'problema 'funcion) (get 'problema 'argumento)))
(eval (append (list (get 'problema 'funcion) (get 'problema 'argumento))))
(eval (cons 'funcall (cons (quote (get 'problema 'funcion))
(get 'problema 'argumentos))))

9. Almacenar en la variable P el siguiente polinomio: 3x a la 6 +5x a la 5 + 10x a la 4


+x al cuadrado + 1
según las siguientes representaciones de datos:
1) lista
2) lista de asociación
3) lista de propiedad

SOLUCIÓN

2) Lista de asociación donde el primer elemento de par indica la potencia a la que


está elevada X y el segundo elemento la constante que multiplica a ésta.
(setq P '((x6 3) (x5 5) (x4 10) (x2 1) (x0 1)))
10. La siguiente lista de asociación contiene la definición de una serie de palabras

(setq DICCIONARIO '((aprobar (demostrar aptitud))


(diplomado (al aprobar todos los exámenes))
(exámenes (pruebas de aptitud))
(pruebas (indicios concluyentes))
(demostrar (hacer evidente un hecho))
(indicio (pistas que deja un hecho))
(hecho (acabado))
(aptitud (demostrar indicios de diplomado)) ))

Expandir una palabra consiste en sustituirla por su definición si se encuentra en el


diccionario, en caso contrario se deja como está.
Expandir una frase consiste en expandir cada una de sus palabras.

Se pide:

a) Definir la función EXPANDE1 que aplicada a una FRASE y a un DICCIONARIO,


devuelva el resultado de expandir la frase utilizando ese diccionario. Por ejemplo:
(EXPANDE1 '(NECESITO APROBAR) DICCIONARIO)
==> (NECESITO DEMOSTRAR APTITUD)

b) Definir la función EXPANDE a la que se pasarán como parámetros una FRASE, un


DICCIONARIO y un entero N opcional, de modo que devuelva el resultado de expandir
N veces la frase utilizando ese diccionario. Por ejemplo:
(EXPANDE '(NECESITO APROBAR) DICCIONARIO 2)
==> (NECESITO HACER EVIDENTE UN HECHO DEMOSTAR INDICIOS DE
APROBADO)

SOLUCIÓN

a)
(defun expande1 (frase diccionario)
(cond
((null frase) nil)
((assoc (car frase) diccionario) (append (cadr (assoc (car frase)
diccionario))
(expande1 (cdr frase)
diccionario) ))
(t (cons (car frase) (expande1 (cdr frase) diccionario) )) ))

b)
(defun expande (frase diccionario &optional (n 1))
(cond
(( equal n 1) (expande1 frase diccionario))
(t (expande (expande1 frase diccionario) diccionario (- n 1))) ))

You might also like