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