Documento 1504995

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