Documento 1505001

Anuncio
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
Descargar