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. 2 a Semana. Febrero 2007 PROBLEMA 1 (lisp). VALORACIÓN 2.75 Considere una representaión en Lisp de grafos no dirigidos onsistente en una lista donde ada elemento es a su vez otra lista formada por un nodo y una lista on sus veinos. (Obviamente, en el nivel superior hay una lista por ada nodo del grafo.) Construya una funión es-onexo que determine si un grafo dado es onexo, es deir, si existe al menos un amino entre ada par de nodos del mismo. Por ejemplo, > (es-onexo '((a (b )) (b ( a)) ( (b a)))) T > (es-onexo '((a (b)) (b (a)) ( (d)) (d ()))) nil Una opión para determinar si un grafo no dirigido es onexo onsiste en borrar suesivamente, de entre los nodos on veinos, ualquiera de los que posean menor número de veinos, hasta enontrar un nodo sin veinos. Si en ese momento no quedaran más nodos en el grafo, éste sería onexo; en aso ontrario, no sería onexo. SOLUCIÓN, por Severino Fernández Galán (defun es-onexo (grafo) ;; Determina si 'grafo' es un grafo onexo. (do ((grafo-aux grafo (borra-nodo grafo-aux))) ((null (adar grafo-aux)) (not (rest grafo-aux))) ; Cuerpo de DO: nil )) (defun borra-nodo (grafo) ;; Devuelve el resultado de borrar un nodo de 'grafo'. ;; El nodo borrado se elige omo aquel on menor numero de veinos. ;; En aso de empate, se elige uno ualquiera. (let ((resultado) (nodo-a-borrar (nodo-on-menos-veinos grafo))) (dolist (nodo-y-veinos grafo resultado) (ond ((eq (first nodo-y-veinos) nodo-a-borrar) ) ((member nodo-a-borrar (seond nodo-y-veinos)) (setf resultado (ons 1 (t (list (first nodo-y-veinos) (remove nodo-a-borrar (seond nodo-y-veinos))) resultado))) (setf resultado (ons nodo-y-veinos resultado))))))) (defun nodo-on-menos-veinos (grafo) ;; Devuelve el nodo on menor numero de veinos de 'grafo'. ;; En aso de empate, se elige uno ualquiera. ;; No se tienen en uenta los nodos sin veinos del grafo. (let* ((grafo-aux (quita-nodos-aislados grafo)) (nodo-resultado (aar grafo-aux)) (numero-de-veinos-resultado (length (adar grafo-aux)))) (dolist (nodo grafo-aux nodo-resultado) (when (and (< (length (seond nodo)) numero-de-veinos-resultado) (not (null (seond nodo)))) (setf numero-de-veinos-resultado (length (seond nodo))) (setf nodo-resultado (first nodo)))))) (defun quita-nodos-aislados (grafo) ;; Devuelve el grafo resultante de quitar los nodos aislados de 'grafo'. (let (resultado) (dolist (nodo grafo resultado) (when (not (null (seond nodo))) (setf resultado (ons nodo resultado)))))) PROBLEMA 2 (lisp). VALORACIÓN 2.75 Dena en Lisp tres arrays bidimensionales, uno de 5x3, otro de 3x4 y otro de 4x2. Rellene dihos arrays on los valores de i − j, donde (i, j) son las oordenadas de ada asilla del array. Esriba una funión MULTIPLICA que devuelva en un array bidimensional el produto matriial de un número variable de arrays bidimensionales. Aplique diha funión a los tres arrays iniiales. SOLUCIÓN, por Severino Fernández Galán (setf array5x3 (make-array '(5 3))) (setf array3x4 (make-array '(3 4))) (setf array4x2 (make-array '(4 2))) (defun rellena (array) ;; Rellena un array on valores i-j. ;; (i,j) son las oordenadas de ada elemento del array. (dotimes (i (array-dimension array 0) array) 2 (dotimes (j (array-dimension array 1)) (setf (aref array i j) (- i j))))) (defun multiplia (&rest arrays) ;; Devuelve el produto matriial de un numero variable de arrays. (let ((resultado (first arrays))) (dolist (array (rest arrays) resultado) (setf resultado (multiplia-2 resultado array))))) (defun multiplia-2 (array1 array2) ;; Devuelve el produto matriial de dos arrays. (let ((resultado (make-array (list (array-dimension array1 0) (array-dimension array2 1)) :initial-element 0))) (dotimes (i (array-dimension resultado 0) resultado) (dotimes (j (array-dimension resultado 1)) (dotimes (k (array-dimension array1 1)) (setf (aref resultado i j) (+ (aref resultado i j) (* (aref array1 i k) (aref array2 k j))))))))) ;;; > (multiplia (rellena array5x3) (rellena array3x4) (rellena array4x2)) ;;; #2A((12 14) (-12 -4) (-36 -22) (-60 -40) (-84 -58)) PROBLEMA 3 (prolog). VALORACIÓN 3.00 Teniendo en uenta la asa que se muestra en la gura, onsidere la forma de representarla en un onjunto de prediados Prolog on el objetivo de implementar el prediado telefono/2. En diho prediado, el primer parámetro orresponde on la habitaión en la que nos enontramos. El segundo parámetro onsiste en una lista on el amino reorrido hasta algún teléfono. Diho amino no debe tener ilos, en otras palabras, la lista no debe ontener dos elementos iguales. 3 jardin dormitorio1 exterior bano2 salon (telefono) bano1 pasillo dormitorio2 dormitorio3 (telefono) cocina Por ejemplo: ?- telefono(oina,Camino). Camino = [oina,pasillo,dormitorio3℄ ; Camino = [oina,pasillo,salon℄ ; No En resumen, se pide: 1. Representaión en Prolog de la asa (on sus teléfonos) para poder ejeutar 2. El prediado telefono/2. SOLUCIÓN, por Félix Hernández del Olmo puerta(jardin,salon). puerta(salon,pasillo). puerta(pasillo,bano1). puerta(pasillo,dormitorio1). puerta(pasillo,dormitorio2). puerta(pasillo,dormitorio3). puerta(pasillo,oina). puerta(pasillo,exterior). puerta(dormitorio1,bano2). telefono(salon). telefono(dormitorio3). telefono(A,Camino):-ir(A,B,Camino),telefono(B). 4 telefono/2. ir(A,B,Camino):-ir(A,B,[℄,Camino). ir(X,X,Nodos_reorridos,[X℄). ir(X,Y,Nodos_reorridos,[X|Camino℄) :(puerta(X,Z);puerta(Z,X)), not(member(Z,Nodos_reorridos)), ir(Z,Y,[Z|Nodos_reorridos℄,Camino). PROBLEMA 4 (prolog). VALORACIÓN 1.50 Implemente el prediado interseion/3, el ual se umplirá uando el terer argumento sea la interseión de los dos primeros. Note que las listas de los dos primeros argumentos no deben ontener elementos dupliados. Por ejemplo, ?- interseion([1,2,3℄,[3,4,5℄,Z). Z= [3℄ ; No SOLUCIÓN, por Félix Hernández del Olmo interseion([℄,X,[℄). interseion([X|A℄,Y,[X|B℄) :member(X,Y),!, interseion(A,Y,B). interseion([X|A℄,Y,B) :- interseion(A,Y,B). 5