Documento 1504996

Anuncio
Programaión Orientada a la Inteligenia Artiial
Curso: 3
Tiempo:
NO se permite NINGÚN material auxiliar NI aluladora
Advertenias: Deben responderse en hojas
Poner el nombre en
todas
separadas
o
2h.
las uestiones de LISP y PROLOG.
las hojas. Se valorará espeialmente el estilo, la adeuada dou-
mentaión del ódigo, que el examen esté ompensado y que no inluya errores oneptuales
importantes.
Original.
Septiembre 2007
PROBLEMA 1 (lisp). VALORACIÓN 2.75
Se quiere representar los datos de edad y altura de personas mediante listas asoiaión. Dena un
proedimiento Lisp grabar que aepte un número variable de listas del tipo '(Juan 15 181), donde
Juan es una persona de 15 años y de 181 ms. de altura. El proedimiento grabar deberá denir
una lista asoiaión (on laves: nombre, edad y altura) para ada una de las personas de la lista y
grabar dihas listas asoiaión en un hero a:\personas.dat. Por ejemplo,
>
(grabar '(juan 15 181) '(pedro 25 185) '(antonio 75 165))
hará que el ontenido del hero sea:
((nombre . juan) (edad . 15) (altura . 181))
((nombre . pedro) (edad . 25) (altua . 185))
((nombre . antonio) (edad . 75) (altura . 165))
Por otra parte, denir un proedimiento leer que lea los datos del hero a:\personas.dat, teniendo
en uenta que son listas asoiaión del tipo menionado anteriormente, y produza una lista on tres
sublistas: una sublista on todos los nombres, otra on todas las edades y otra on todas las alturas.
Por ejemplo, en el aso del hero anterior de tres elementos:
>
(leer)
((juan pedro antonio) (15 25 75) (181 185 165))
SOLUCIÓN, por Severino Fernández Galán
(defun grabar (&rest personas)
(let (lista-asoiaion)
(with-open-file (salida "a:\\personas.dat" :diretion :output)
(dolist (persona personas)
(setf
lista-asoiaion
(list (ons 'nombre (first persona))
(ons 'edad (seond persona))
(ons 'altura (third persona))))
(print lista-asoiaion salida)))))
(defun leer ()
(let (nombres edades alturas)
(with-open-file (entrada "a:\\personas.dat" :diretion :input)
(do ((lista-asoiaion (read entrada nil) (read entrada nil)))
((not lista-asoiaion) (list nombres edades alturas))
(setf nombres (ons (rest (asso 'nombre lista-asoiaion)) nombres))
(setf edades (ons (rest (asso 'edad lista-asoiaion)) edades))
(setf alturas (ons (rest (asso 'altura lista-asoiaion)) alturas))))))
1
PROBLEMA 2 (lisp). VALORACIÓN 2.50
Considere una lista de números enteros. Dena en Lisp un proedimiento que determine si hay valores
repetidos en diha lista. Cree otro proedimiento para eliminar los valores repetidos de la lista, de
manera que úniamente quede la primera apariión del valor repetido. Diseñe un proedimiento que,
dada una lista de enteros, agrupe en sublistas los subonjuntos monótonos reientes de diha lista;
por ejemplo,
>
(agrupa '(1 2 3 2 1 2 3 3 8 10 5))
((1 2 3)(2)(1 2 3 3)(8 10)(5))
de manera que en ada sublista ada elemento debe ser menor o igual que el siguiente.
SOLUCIÓN, por Severino Fernández Galán
(defun hay-repetidos (lista)
(ond ((< (length lista) 2) nil)
((member (first lista) (rest lista)) t)
(t (hay-repetidos (rest lista)))))
(defun elimina-repetidos (lista)
(let (lista-aux)
(dolist (valor lista (reverse lista-aux))
(unless (member valor lista-aux)
(setf lista-aux (ons valor lista-aux))))))
(defun agrupa (lista)
;; Funion pedida
(let ((lista-aux (list (list (first lista)))))
(dolist (valor (rest lista) (invierte lista-aux))
(if (< valor (first (first lista-aux)))
(setf lista-aux (ons (list valor) lista-aux))
(setf lista-aux (ons (ons valor (first lista-aux)) (rest lista-aux)))))))
(defun invierte (lista)
;; Invierte el orden de las sublistas de lista,
;; asi omo el orden de los elementos de ada sublista.
(let (lista-aux)
(dolist (sublista lista lista-aux)
(setf lista-aux (ons (reverse sublista) lista-aux)))))
PROBLEMA 3 (prolog). VALORACIÓN 2.25
doble_seguido(L1,L2)
seguidas en la lista L2.
Implemente el prediado
L1
apareza dos vees
que se verique uando ada elemento de la lista
Por ejemplo,
2
?- doble_seguido([a,,f℄,[f,f,a,a,,℄).
Yes
SOLUCIÓN, por Félix Hernández del Olmo
doble_seguido([℄,[℄).
doble_seguido(L1,L2) :append(La1,[X|Lz1℄,L1),append(La2,[X,X|Lz2℄,L2),
append(La1,Lz1,L11),append(La2,Lz2,L21),
doble_seguido(L11,L21).
PROBLEMA 4 (prolog). VALORACIÓN 2.50
Implemente el prediado
aplanar(L1,L2).
Este prediado debe onstruir
que ontiene todos los elementos de la lista de listas
L1.
L2
omo una lista simple
SOLUCIÓN, por Félix Hernández del Olmo
aplanar([℄,[℄) :- !.
aplanar(X,[X℄) :- atom(X),!.
aplanar([X|Xs℄,Zs):-aplanar(X,X0),aplanar(Xs,Xs0),append(X0,Xs0,Zs).
3
Descargar