Documento 1504994

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 2007
PROBLEMA 1 (lisp). VALORACIÓN 2.75
Considere una representaión en Lisp de grafos no dirigidos en la que ada enlae entre dos nodos se
representa por una lista (<nodo A>
<nodo B>).
Por tanto, una grafo estaría formado por una lista
de enlaes. Esriba una funión Lisp mayor-subgrafo-sin-hojas que, dado un grafo representado en
la notaión anterior, devuelva el mayor subgrafo sin nodos hoja del mismo. Un nodo hoja es aquel
que tiene un solo veino, por lo que la funión pedida deberá realizar repetidamente la loalizaión de
dihos nodos y su borrado del grafo. El grafo pedido es el resultante depués de diferentes operaiones
de borrado, de manera que nalmente todo nodo tenga al menos dos veinos. Por ejemplo,
>
(mayor-subgrafo-sin-hojas '((a b)(b )))
nil
>
(mayor-subgrafo-sin-hojas '((a b)(b )( a)(a d)(d e)))
'((a b)(b )( a))
SOLUCIÓN, por Severino Fernández Galán
(defun mayor-subgrafo-sin-hojas (grafo)
;; Determina el mayor subgrafo de 'grafo' que no posea nodos hoja
(let ((nodos-a-borrar nil)) ; Almaena los nodos on un solo veino de 'grafo'
(dolist (nodo (nodos grafo))
(if (= 1 (n-veinos nodo grafo))
(setf nodos-a-borrar (ons nodo nodos-a-borrar))))
(ond
((null nodos-a-borrar)
grafo)
(t
(setf grafo (borra nodos-a-borrar grafo))
(grafo-sin-hojas grafo)))))
(defun nodos (grafo)
;; Determina los nodos de 'grafo'
(let (resultado)
(dolist (enlae grafo resultado)
(if (not (member (first enlae) resultado))
(setf resultado (ons (first enlae) resultado)))
(if (not (member (seond enlae) resultado))
(setf resultado (ons (seond enlae) resultado))))))
1
(defun n-veinos (nodo grafo)
;; Determina el numero de veinos de 'nodo' en 'grafo'
(let ((resultado 0))
(dolist (enlae grafo resultado)
(if (member nodo enlae)
(setf resultado (+ 1 resultado))))))
(defun borra (nodos grafo)
;; Borra los enlaes de 'grafo' que ontengan algun nodo de 'nodos'
(let (resultado)
(dolist (enlae grafo resultado)
(unless (or (member (first enlae) nodos) (member (seond enlae) nodos))
(setf resultado (ons enlae resultado))))))
PROBLEMA 2 (lisp). VALORACIÓN 2.75
Denir en Lisp las siguientes maros que operan sobre una lista de números enteros:
La maro MAX-EVEN devuelve el mayor número par de la lista.
La maro NUM-ZEROS devuelve el número de eros de la lista.
La maro INTRODUCE-NEGATIVE devuelve la lista resultante de añadir a la dereha de
ada elemento el resultado de multipliar diho elemento por
−1.
Por tanto, el tamaño de la
lista resultante será el doble del de la iniial.
SOLUCIÓN, por Severino Fernández Galán
(defmaro max-even (lista)
; Devuelve el mayor numero par de 'lista'.
`(let (resultado)
(dolist (numero ,lista resultado)
(when (evenp numero)
(if (or (null resultado)
(> numero resultado))
(setf resultado numero))))))
(defmaro num-zeros (lista)
; Devuelve el numero de eros de 'lista'.
`(let ((resultado 0))
(dolist (numero ,lista resultado)
(when (zerop numero)
(setf resultado (1+ resultado))))))
(defmaro introdue-negative (lista)
2
; Devuelve una lista resultante de a\~{n}adir a la dereha de
; ada elemento el resultado de multipliar diho elemento por -1.
`(let (resultado)
(dolist (numero ,lista (reverse resultado))
(setf resultado (ons numero resultado))
(setf resultado (ons (* -1 numero) resultado)))))
PROBLEMA 3 (prolog). VALORACIÓN 3.00
Teniendo en uenta el plano de la asa que se muestra en la gura, onsidere la forma de representarlo
en un onjunto de prediados Prolog on el objetivo de implementar el prediado
ir/3.
En diho
prediado, los dos primeros parámetros se orresponden on la habitaión de donde se parte y aquella
donde se desea llegar. El terer parámetro onsiste en una lista on el amino reorrido, el ual no
debe tener ilos. En otras palabras, la lista no debe ontener dos elementos iguales.
Jardín
Dormitorio1
Exterior
Baño2
Salón
Baño1
Pasillo
Dormitorio2
Dormitorio3
Cocina
Por ejemplo:
?- ir(bano2,jardin,[jardin,salon,pasillo,dormitorio1,bano2℄).
yes
?- ir(bano2,jardin,Camino).
Camino = [jardin,salon,pasillo,dormitorio1,bano2℄ ;
no
En resumen, se pide:
1.
Representaión en Prolog de la asa para poder ejeutar
2.
El prediado
ir/3.
3
ir/3.
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).
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
sin_dupliados/2,
el ual se umplirá uando el segundo argumento sea
la lista sin dupliados del primer argumento.
Por ejemplo,
?- sin_dupliados([1,2,2,3,3,3℄,Z).
Z= [1,2,3℄ ;
No
SOLUCIÓN, por Félix Hernández del Olmo
sin_dupliados([℄,[℄).
sin_dupliados([X|A℄,Z) :- member(X,A),!,sin_dupliados(A,Z).
sin_dupliados([X|A℄,[X|Z℄) :- sin_dupliados(A,Z).
4
Descargar