Programaión Orientada a la Inteligenia Artiial NO se permite NINGÚN material auxiliar NI aluladora Advertenias: Deben responderse en hojas Poner el nombre en todas separadas Curso: 3o Tiempo: 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. 2a Semana. Febrero 2009 PROBLEMA 1 (lisp). VALORACIÓN 2.50 El 8-puzzle es un juego formado por 8 asillas uadradas desplazables en un tablero de 3x3. Una de las eldas del tablero está siempre vaía y las asillas se suelen numerar del 1 al 8. Se ha deidido representar el problema del 8-puzzle en Lisp mediante un array bidimensional de instanias de la estrutura CASILLA. Esta estrutura onsta de un ampo NUMERO uyo valor por defeto es 0, el entero que asoiaremos a la asilla vaía. El otro ampo de CASILLA es SITUACION-CASILLA-VACIA, que toma el valor por defeto 'NINGUNA-DIRECCION si la asilla atual no limita al norte, sur, este u oeste on la asilla vaía; por el ontrario, si la asilla vaía se enontrara al norte, sur, este u oeste de la asilla atual, el valor del ampo SITUACION-CASILLA-VACIA de la asilla atual tomaría el valor 'NORTE, 'SUR, 'ESTE u 'OESTE, respetivamente. Se pide, en primer lugar, denir la estrutura CASILLA en los términos expresados on anterioridad y rear un 8-puzzle onreto on los siguientes valores numérios leídos de izquierda a dereha y de arriba a abajo: 1, 0, 2, 4, 6, 3, 7, 8 y 5. En segundo lugar, defínase una funión MUEVE-CASILLA-VACIA que admita omo parámetros un 8-puzzle y un parámetro lave DIRECCION. El parámetro lave DIRECCION podrá admitir los valores 'NORTE, 'SUR, 'ESTE u 'OESTE y la funión MUEVE-CASILLA-VACIA atualizará el 8-puzzle orrespondiente moviendo, si es posible, la asilla vaía en la direión indiada. SOLUCIÓN, por Severino Fernández Galán (defstrut asilla (numero 0) (situaion-asilla-vaia 'ninguna-direion)) (defvar (defvar (defvar (defvar (defvar (defvar (defvar (defvar (defvar asilla11 asilla12 asilla13 asilla21 asilla22 asilla23 asilla31 asilla32 asilla33 (make-asilla :numero (make-asilla)) (make-asilla :numero (make-asilla :numero (make-asilla :numero (make-asilla :numero (make-asilla :numero (make-asilla :numero (make-asilla :numero 1 :situaion-asilla-vaia 'este)) 2 :situaion-asilla-vaia 'oeste)) 4)) 6 :situaion-asilla-vaia 'norte)) 3)) 7)) 8)) 5)) (defvar 8-puzzle (make-array '(3 3) :initial-ontents (list (list asilla11 asilla12 asilla13) (list asilla21 asilla22 asilla23) (list asilla31 asilla32 asilla33)))) 1 (defun mueve-asilla-vaia (8-puzzle &key direion) (let (asilla-vaia-x asilla-vaia-y asilla-no-vaia-x asilla-no-vaia-y asilla-aux) ; Determinar las oordenadas "x" e "y" de la asilla vaia (dotimes (x 3) (dotimes (y 3) (when (= 0 (asilla-numero (aref 8-puzzle x y))) (setf asilla-vaia-x x) (setf asilla-vaia-y y)))) (setf asilla-no-vaia-x asilla-vaia-x asilla-no-vaia-y asilla-vaia-y) ; Determinar las oordenadas "x" e "y" de la asilla ; a la que se desplazara la asilla vaia (ase direion (norte (setf asilla-no-vaia-x (1- asilla-no-vaia-x))) (sur (setf asilla-no-vaia-x (1+ asilla-no-vaia-x))) (este (setf asilla-no-vaia-y (1+ asilla-no-vaia-y))) (oeste (setf asilla-no-vaia-y (1- asilla-no-vaia-y)))) ; Interambiar asilla si ello es posible (unless (or (> asilla-no-vaia-x 2) (< asilla-no-vaia-x 0) (> asilla-no-vaia-y 2) (< asilla-no-vaia-y 0)) (setf asilla-aux (aref 8-puzzle asilla-no-vaia-x asilla-no-vaia-y)) (setf (aref 8-puzzle asilla-no-vaia-x asilla-no-vaia-y) (aref 8-puzzle asilla-vaia-x asilla-vaia-y)) (setf (aref 8-puzzle asilla-vaia-x asilla-vaia-y) asilla-aux) ; Atualizar el ampo "situaion-asilla-vaia" del 8-puzzle (atualizar-situaion-asilla-vaia 8-puzzle asilla-no-vaia-x asilla-no-vaia-y)))) ;; Dadas las oordenadas de la asilla vaia, atualiza la informaion ;; del ampo "situaion-asilla-vaia" en el 8-puzzle (defun atualizar-situaion-asilla-vaia (8-puzzle asilla-vaia-x asilla-vaia-y) (dotimes (x 3) (dotimes (y 3) (ond ((and (= x asilla-vaia-x) (= (1+ y) asilla-vaia-y)) (setf 2 (asilla-situaion-asilla-vaia (aref 8-puzzle x y)) 'este)) ((and (= x asilla-vaia-x) (= (1- y) asilla-vaia-y)) (setf (asilla-situaion-asilla-vaia (aref 8-puzzle x y)) 'oeste)) ((and (= y asilla-vaia-y) (= (1+ x) asilla-vaia-x)) (setf (asilla-situaion-asilla-vaia (aref 8-puzzle x y)) 'sur)) ((and (= y asilla-vaia-y) (= (1- x) asilla-vaia-x)) (setf (asilla-situaion-asilla-vaia (aref 8-puzzle x y)) 'norte)) (t (setf (asilla-situaion-asilla-vaia (aref 8-puzzle x y)) 'ninguna-direion)))))) PROBLEMA 2 (lisp). VALORACIÓN 2.50 Suponga que todo lo pedido en el problema anterior para el juego del 8-puzzle ha sido odiado orretamente y se puede reutilizar en el presente problema. Dena una funión Lisp CAMINOS que admita omo parámetros dos 8-puzzles, 8-PUZZLE-1 y 8-PUZZLE-2, y esriba en pantalla todos los aminos posibles para llegar de 8-PUZZLE-1 a 8-PUZZLE-2. La funión CAMINOS también admitirá un terer parámetro LIMITE-DE-MOVIMIENTOS, que será un entero que limite la longitud de los aminos onsiderados. Un ejemplo de amino de longitud 3 sería ('NORTE 'ESTE 'SUR), que representa los movimientos suesivos a los que es sometida la asilla vaía para llegar desde 8-PUZZLE-1 hasta 8-PUZZLE-2. SOLUCIÓN, por Severino Fernández Galán (defun aminos (8-puzzle-1 8-puzzle-2 limite-movimientos &optional amino-parial) (ond ((iguales 8-puzzle-1 8-puzzle-2) (print (reverse amino-parial))) ((= limite-movimientos (length amino-parial)) nil) (t (let ((8-puzzle-norte (opia-de 8-puzzle-1)) (8-puzzle-sur (opia-de 8-puzzle-1)) (8-puzzle-este (opia-de 8-puzzle-1)) (8-puzzle-oeste (opia-de 8-puzzle-1))) (mueve-asilla-vaia 8-puzzle-norte :direion 'norte) (mueve-asilla-vaia 8-puzzle-sur :direion 'sur) (mueve-asilla-vaia 8-puzzle-este :direion 'este) (mueve-asilla-vaia 8-puzzle-oeste :direion 'oeste) (unless (iguales 8-puzzle-1 8-puzzle-norte) (aminos 8-puzzle-norte 8-puzzle-2 3 limite-movimientos (ons 'norte amino-parial))) (unless (iguales 8-puzzle-1 8-puzzle-sur) (aminos 8-puzzle-sur 8-puzzle-2 limite-movimientos (ons 'sur amino-parial))) (unless (iguales 8-puzzle-1 8-puzzle-este) (aminos 8-puzzle-este 8-puzzle-2 limite-movimientos (ons 'este amino-parial))) (unless (iguales 8-puzzle-1 8-puzzle-oeste) (aminos 8-puzzle-oeste 8-puzzle-2 limite-movimientos (ons 'oeste amino-parial))))))) ;; Determina si los ontenidos numerios de 8-puzzle-1 y 8-puzzle-2 son iguales (defun iguales (8-puzzle-1 8-puzzle-2) (let ((resultado t)) (dotimes (x 3 resultado) (dotimes (y 3) (unless (= (asilla-numero (aref 8-puzzle-1 x y)) (asilla-numero (aref 8-puzzle-2 x y))) (setf resultado nil)))))) ;; Devuelve una opia de 8-puzzle-1 (defun opia-de (8-puzzle-1) (let ((resultado (make-array '(3 3)))) (dotimes (x 3 resultado) (dotimes (y 3) (setf (aref resultado x y) (make-asilla)) (setf (asilla-numero (aref resultado x y)) (asilla-numero (aref 8-puzzle-1 x y))) (setf (asilla-situaion-asilla-vaia (aref resultado x y)) (asilla-situaion-asilla-vaia (aref 8-puzzle-1 x y))))))) PROBLEMA 3 (prolog). VALORACIÓN 2.00 Asumiendo que hemos argado en el intérprete Prolog el siguiente programa sum(X,0,X). sum(X,s(Y),s(Z)):-sum(X,Y,Z). desriba la respuesta del intérprete y la traza de las siguientes onsultas: 1. ?- sum([a,b,℄,s(0),X). 2. ?- sum(X,s(0),Z). 4 SOLUCIÓN, por Félix Hernández del Olmo Compruebe la respuesta en un intérprete prolog. PROBLEMA 4 (prolog). VALORACIÓN 3.00 Construya el prediado sinvoales/2 en el que el segundo argumento onsiste en la palabra (o frase) del primer argumento pero sin voales. Ejemplo: ?- sinvoales(arroz,rrz). true ?- sinvoales(pilatos,X). X = plts SOLUCIÓN, por Félix Hernández del Olmo voal(X) :- name(aeiou,Voales), member(X,Voales). sinvoales([℄,[℄). sinvoales([X|Xs℄,Ys) :- voal(X), !, sinvoales(Xs,Ys). sinvoales([X|Xs℄,[X|Ys℄) :- sinvoales(Xs,Ys). sinvoales(X,Y) :- name(X,XL), sinvoales(XL,YL), !, name(Y,YL). 5