You are on page 1of 3

Programación Declarativa

Universidad de Málaga 3.o de Ingeniería Informática
E.T.S.I. Informática Enero de 2008

Tema 6. Grafos y espacios de estados

Ejercicios

Ejercicio 1. Un camino euleriano es un camino que va desde un nodo X a un nodo Y pasando
exactamente una vez por cada arco del grafo. Un circuito euleriano es un camino euleriano
que empieza y acaba en el mismo nodo. Define los predicados Prolog:
camino_euleriano(X,Y,Cs)
circuito_euleriano(X,Cs)

que permiten obtener caminos y circuitos eulerianos de un grafo. Escribe versiones para
grafos orientados, no orientados y etiquetados.
Ejercicio 2. Un camino hamiltoniano es un camino que va desde un nodo X a un nodo
Y pasando exactamente una vez por cada nodo del grafo. Un circuito hamiltoniano es un
camino hamiltoniano que empieza y acaba en el mismo nodo (éste sí se visita dos veces, al
principio y al final). Define los predicados Prolog:
camino_hamiltoniano(X,Y,Cs)
circuito_hamiltoniano(X,Cs)

que permiten obtener caminos y circuitos hamiltonianos de un grafo. Escribe versiones para
grafos orientados, no orientados y etiquetados.
Ejercicio 3. Las siguientes figuras se pueden dibujar sin levantar el lápiz del papel y sin
trazar dos veces la misma recta.

a b c

d e f b d
b c
a e
g h i
a c

d e j f g h
Escribe un programa Prolog que, para cada figura, obtenga el orden en que deben ser trazadas
sus rectas; es decir, el orden por el que se pasa por los puntos etiquetados.
Observa que cada figura puede representarse como un grafo no dirigido, donde los puntos
etiquetados se corresponden con los nodos y los trazos con aristas. El trazado de la figura se
corresponde, por tanto, con un camino euleriano del grafo correspondiente.
Ejercicio 4. Tres misioneros y tres caníbales se disponen a cruzar un río con una canoa con
capacidad para dos personas. Escribe un programa que genere un plan para cruzar el río,

1

] Modifica la definición de la plantilla y del predicado mover/2 de forma que obtengamos como solución la secuencia de movimientos realizados.Vs).. (0.Solución) que resuelve un problema de espacio de estados IdProblema. Por ejemplo. 5). Define el predicado: resolver(IdProblema.Sol).Vs). Por ejemplo: ?. verter_comp_Y_en_X. la devorará. Un granjero. para el problema de los contenedores obtenemos como primera solución: ?. y en la que sólo puede remar el granjero.teniendo en cuenta que nunca puede haber menos misioneros que caníbales en alguna de las márgenes del río. y si la cabra queda a solas con la col.. Aplica esta estrategia para resolver los problemas anteriores. teniendo en cuenta que si el lobo queda a solas con la cabra. cuentan con un bote con capacidad para tres personas. Los maridos son tan celosos que en ningún caso permitirían que sus esposas se encontraran en compañía de otros hombres sin estar ellos mismos presentes. y otra que la represente como la secuencia de movimientos realizados..resolver(cont. Sol = [ (0. Escribe dos versiones: una que represente la Solución como la secuencia de estados visitados. ¿Cuáles son las ventajas e inconvenientes con respecto a la búsqueda en profundidad? Ejercicio 10. (5.ProfMáx..Vs) :. Ejercicio 7.Y).findall(Y. una cabra y una col desean cruzar un río con la ayuda de una barca con capacidad para cualesquiera dos de ellos. llenar_y. (8. Para huir. Ejercicio 5. Ejercicio 6. 0). definido en términos del predicado pre- definido findall/3.resolver(cont. (8. (5. aplicando una búsqueda por profundización progresiva con profundidad máxima de ProfMáx. La plantilla de la búsqueda en anchura que hemos estudiado devuelve como solución la secuencia de estados visitados. Ejercicio 8. 2 . . se la comerá. Escribe un programa Prolog que genere un plan para cruzar el río. 5). Un sabio dispone de dos relojes de arena con capacidad para medir 7 y 11 minutos respectivamente. El siguiente predicado vecinos(X. 5). Cinco matrimonios se encuentran aislados por una inundación. . vaciar_x.Sol). 0). 0).] Ejercicio 9. un lobo. Sol = [ llenar_x. pues serían devorados.arco(X. Los relojes se ponen en marcha simultáneamente y cuando uno se acaba se puede: dejar acabar al otro volver los dos relojes volver uno solo de los relojes Escribir un programa Prolog que genere una secuencia de movimientos de los relojes que permita medir una cantidad N de minutos. permite obtener todos los vecinos de un nodo X en una lista Vs: vecinos(X. Escribe un programa Prolog que genere un plan para salvar a estos matrimonios. llenar_y.

d arco(d. Vs = [a.e).vecinos(a.Por ejemplo. arco(f. Utilizando vecinos/2.vecinos(g. 3 . c g arco(c. arco(c. resolver_anchura(IdProblema.Vs).e). No ?. No Observa que si un nodo no tiene vecinos. considera el siguiente grafo dirigido: arco(a.Y) que realiza un recorrido en anchura para comprobar si los nodos X e Y están conectados. vecinos/2 devuelve la lista vacía.Vs). No ?. d. Vs = [] . Los siguientes objetivos obtienen todos los vecinos de un nodo dado sin necesidad de retro- ceso: ?. define los siguientes predicados Prolog: conectados_anchura(X. arco(b.g). La ventaja de obtener todos los vecinos de un nodo de forma simultánea es que nos permite programar diferentes versiones de la búsqueda en anchura. e arco(d. b.vecinos(d. Vs = [b.b).c).d).Vs). e] . b arco(d. c] .a).d). arco(d. a f arco(a.Solución) que resuelve un problema de espacio de es- tados IdProblema empleando una búsqueda en anchura.b).d).