Documento 1504997

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.
1
a
Semana.
Febrero 2008
PROBLEMA 1 (lisp). VALORACIÓN 2.50
Dena una maro en Lisp, INTERCAMBIA1, que dada una lista, L, y dos enteros, p1 y p2, interambie los ontenidos de las posiiones p1 y p2 de L. Permítase que sea opional espeiar p2 al
llamar a la maro, de tal modo que p2 tome el valor 1 si no es espeiado. Por ejemplo:
>
(INTERCAMBIA1 '(1 2 3 4 5) 2 3)
(1 3 2 4 5)
>
(INTERCAMBIA1 '(1 2 3 4 5) 4)
(4 2 3 1 5)
Por otra parte, dena una funión, INTERCAMBIA2, que opere del mismo modo que INTERCAMBIA1, pero que permita espeiar mediante un parámetro lave direión si p1 y p2 se reeren a
posiiones ontadas desde el prinipio de la lista haia la dereha o desde el nal de la lista haia
la izquierda. Por defeto, el valor de direión es izquierda. Por ejemplo:
>
(INTERCAMBIA2 '(1 2 3 4 5) 2 3 :direion 'dereha)
(1 3 2 4 5)
>
(INTERCAMBIA2 '(1 2 3 4 5) 4)
(1 5 3 4 2)
SOLUCIÓN, por Severino Fernández Galán
(defmaro interambia1 (l p1 &optional (p2 1))
`(let ((result)
(ontador 1)
(elemento1 (first (nthdr (1- ,p1) ,l)))
(elemento2 (first (nthdr (1- ,p2) ,l))))
(dolist (e ,l (reverse result))
(ond ((= ontador ,p1)
(setf result (ons elemento2 result)))
((= ontador ,p2)
(setf result (ons elemento1 result)))
(t
(setf result (ons e result))))
(setf ontador (1+ ontador)))))
(defun interambia2 (l p1 &optional (p2 1) &key (direion 'izquierda))
(if (eq direion 'dereha)
(interambia1 l p1 p2)
(reverse (interambia1 (reverse l) p1 p2))))
1
PROBLEMA 2 (lisp). VALORACIÓN 2.50
En el problema del viajante se onsideran reorridos entre N iudades tal que, partiendo de una de
las iudades, se pasa sólo una vez por el resto de iudades y se regresa a la iudad iniial. Por ejemplo,
dadas las iudades A, B, C y D, las listas (A C D B) y (C D A B) representan dos reorridos válidos.
El primer reorrido parte de A, sigue haia C, sigue haia D, sigue haia B y naliza en A. Dena
en Lisp una funión CONEXIONES-COMUNES que, dados dos reorridos, alule el número de
onexiones entre dos iudades que se presentan tanto en un reorrido omo en el otro. Diha funión
también mostrará en pantalla las onexiones omunes. Por ejemplo:
>(CONEXIONES-COMUNES
'(A B C D E F G) '(G E C D F B A))
(A B)
(C D)
(G A)
3
ya que las onexiones A-B, C-D y G-A son las únias omunes en los dos reorridos. (Obsérvese que
no estamos teniendo en uenta el sentido de la onexión entre dos iudades, es deir, la onexión A-B
es equivalente a la B-A.)
SOLUCIÓN, por Severino Fernández Galán
(defun onexiones-omunes (reorrido1 reorrido2)
;; Calula el numero de onexiones omunes entre dos reorridos hamiltonianos
(let ((result 0)
(siguiente-onexion nil)
(reorrido-aux reorrido1))
(dolist (iudad reorrido1 result)
(setf reorrido-aux (rest reorrido-aux))
(if (null reorrido-aux)
(setf siguiente-onexion (list iudad (first reorrido1)))
(setf siguiente-onexion (list iudad (first reorrido-aux))))
(when (pertenee siguiente-onexion reorrido2)
(print siguiente-onexion)
(setf result (1+ result))))))
(defun pertenee (onexion reorrido)
;; Determina si ierta onexion entre dos iudades pertenee o no
;; a un reorrido dado
(or
(eq (first onexion) (seond (member (seond onexion) reorrido)))
(eq (seond onexion) (seond (member (first onexion) reorrido)))
(or
(and
(eq (first onexion) (first reorrido))
(eq (seond onexion) (first (last reorrido))))
(and
(eq (first onexion) (first (last reorrido)))
(eq (seond onexion) (first reorrido))))))
2
PROBLEMA 3 (prolog). VALORACIÓN 2.00
Considerando el siguiente onjunto de prediados en Prolog,
hombre(juan).
hombre(eduardo).
asado(juan).
soltero(P) :- hombre(P), not(asado(P)).
muestre las trazas de ejeuión de las siguientes onsultas:
1.
?- soltero(juan).
2.
?- soltero(Quien).
3.
?- not(asado(Quien)).
SOLUCIÓN, por Félix Hernández del Olmo
Compruébelo en el intérprete swi-prolog
PROBLEMA 4 (prolog). VALORACIÓN 3.00
Implemente el prediado
dos vees en la lista
L2.
doble(L1,L2) que se verique uando ada elemento de la lista L1 apareza
Note que no se requiere que los elementos estén ordenados.
Por ejemplo,
?- doble([a,,f℄,[,a,f,a,f,℄).
Yes
SOLUCIÓN, por Félix Hernández del Olmo
doble([℄,[℄).
doble(L1,L2) :append(La1,[X|Lz1℄,L1),append(La2,[X|Lz2℄,L2),
append(La2,Lz2,L21),
append(La21,[X|Lz21℄,L21),
append(La1,Lz1,L11),
append(La21,Lz21,L22),
doble(L11,L22).
3
Documentos relacionados
Descargar