1. Universidad Nacional de Trujillo
Facultad de Ciencias Físicas y
Matemáticas
Escuela Profesional de
Informática
Monografía
Problema del lobo la cabra y la col
Implementación en Prolog.
Autores:
- Méndez Vargas Yoner Daniel.
- Morales Castillo José Antonio.
- Muñoz Huertas Bernardo Franco.
Profesor:
- Ing. Arturo Díaz Pulido
Trujillo – Perú
2014
2. Universidad Nacional de Trujillo – Escuela de Informática
Problema del lobo la cabra y la col
2
INDICE
Dedicatoria ........................................................................................................................3
Introducción ......................................................................................................................4
1. Capítulo I: Marco Teórico ......................................................................................5
1.1 Realidad Problemática.....................................................................................5
2. Capítulo II: Conceptos y Algoritmos Asociados.....................................................6
2.1 Búsqueda en Profundidad ...............................................................................6
2.1.1 Definición ..........................................................................................6
2.1.2 Algoritmo ..........................................................................................6
2.1.3 Pseudocódigo....................................................................................6
2.2 Problema del lobo, la cabra y la col ...................................................................7
2.2.1 Definición ..........................................................................................7
2.2.2 Planteamiento del Problema ............................................................7
2.2.3 Algoritmo ..........................................................................................8
2.2.3.1 Pseudocodigo.....................................................................9
2.3 Programa en Prolog.........................................................................................9
Conclusiones....................................................................................................................20
Referencias ......................................................................................................................21
3. Universidad Nacional de Trujillo – Escuela de Informática
Problema del lobo la cabra y la col
3
A todos los que confían en lo que
podemos hacer y esperan lo
mejor de nosotros
4. Universidad Nacional de Trujillo – Escuela de Informática
Problema del lobo la cabra y la col
4
Introducción
Este acertijo es un forma parte de los denominados “puzzles de cruzar el río”, en los que el
objetivo es mover una serie de objetos al otro lado del río siguiendo una serie de normas.
La aparición más temprana de este problema es en el manuscrito medieval Propositiones
ad Acuendos Juvenes, los tres objetos son un lobo, una cabra y una col. Existen variaciones
de este acertijo siendo los objetos una cabra, una oveja y un repollo; un zorro, una gallina y
unas semillas; un zorro, un ganso y una mazorca de maíz y una pantera, un cerdo y unas
gachas. La lógica del acertijo sigue siendo la misma.
Este acertijo ha formado parte del folclore de los afroamericanos, Camerún, Cabo Verde,
Dinamarca, Etiopía, Ghana, Italia, Rusia, Rumania, Escocia, Sudán, Uganda, Zambia y
Zimbabue. En algunos lugares de África, se han encontrado variaciones del juego en las
cuales la barca no puede llevar dos objetos en lugar de sólo uno.
Este acertijo era uno de los favoritos de Lewis Carroll, y ha sido incluido en varios libros de
matemática recreativa.
El acertijo también ha sido parodiado en el episodio Adiós, Maggie, adiós de la temporada
20 de la serie de animación Los Simpson. En él, Homer debe cruzar un río con Maggie,
Santa's Little Helper y un veneno para ratas. No puede dejar al perro con Maggie ni a
Maggie con el veneno.
5. Universidad Nacional de Trujillo – Escuela de Informática
Problema del lobo la cabra y la col
5
I. Capítulo 1: Marco Teórico
1.1. Realidad Problemática
La creatividad es en el mundo moderno una condición altamente deseable,
tan importante como la información y el conocimiento. En efecto, ella
flexibiliza las estructuras mentales que subyacen a la generación de nuevos
patrones y a la solución de situaciones problemáticas; en un mundo
altamente competitivo como en el que vivimos, esto sirve para generar
capacidad de diferenciación y con ella lograr ventaja competitiva
sostenible.
Dentro de esta óptica global y más específicamente dentro del proyecto los
acertijos y la creatividad se convierten en pieza clave para agregar valor a
los procesos educativos.
Por así decirlo, la creatividad (frontera), exploran múltiples maneras de
apropiar y generar conocimiento (caminos), valoran el trabajo colaborativo
(acompañar), repiensan los entornos de aprendizaje (hábitat) y generan
una transformación educacional con informática (cambio). De allí surgió la
necesidad de profundizar en la temática de los acertijos como espacios de
aprendizaje creativo.
Prolog se puede utilizar para resolver, básicamente, cualquier tipo de
problema. Principalmente es útil en la gestión de Juegos, en Inteligencia
Artificial y Sistemas Expertos, como lenguaje especialmente pensado para
construir bases de conocimientos basados en la lógica que forman parte
importante de cualquier agente inteligente, en la construcción de
Compiladores e Intérpretes, en el Reconocimiento del Lenguaje Natural,
etc.
6. Universidad Nacional de Trujillo – Escuela de Informática
Problema del lobo la cabra y la col
6
II. Capítulo 2: Conceptos y Algoritmos Asociados.
2.1. Búsqueda en Profundidad (Depth First Search).
2.1.1. Definición:
Una búsqueda en profundidad o Depth First Search en inglés es un
algoritmo que permite recorrer todos los nodos de un grafo o árbol de
manera ordenada pero no uniforme. Su funcionamiento consiste en ir
expandiendo todos y cada uno de los nodos que va localizando, de
forma recurrente, en un camino concreto. Cuando ya no quedan más
nodos que visitar en dicho camino, regresa (Backtracking), de modo
que repite el mismo proceso con cada uno de los hermanos del nodo ya
procesado.
Análogamente existe el algoritmo de búsqueda en anchura (BFS –
Breadth First Search).
2.1.2. Algoritmo.
Sea G = (V, A) un grafo convexo, V’ = V un conjunto de vértices, A’ un
vector de arcos inicialmente vacío y P un vector auxiliar inicialmente
vacío:
a) Se introduce el vértice inicial en P y se elimina del conjunto V’.
b) Mientras V’ no sea vacío repetir los puntos 3 y 4. En otro caso
parar.
c) Se toma el último elemento de P como vértice activo.
d) Si el vértice activo tiene algún vértice adyacente que se
encuentre en V’:
- Se toma el de menor índice.
- Se inserta en P como último elemento.
- Se elimina de V’.
- Se inserta en A’ el arco que le une con el vértice activo.
- Si el vértice activo no tiene adyacentes se elimina de P.
2.1.3. Pseudocódigo:
DFS (grafo G)
PARA CADA vértice u V [G] HACER
Estado[u] NO_VISITADO
Padre[u] NULO
Tiempo0
PARA CADA vértice u V [G] HACER
SI estado[u]=no visitado ENTONCES
DFS-recorrer (u, tiempo)
7. Universidad Nacional de Trujillo – Escuela de Informática
Problema del lobo la cabra y la col
7
DFS-recorrer (nodo u, int t)
Estado[u]VISITADO
Tiempotiempo+1
D[u]tiempo
PARA CADA v Vecinos[u] HACER
SI estado[v]=NO VISITADO ENTONCES
Padre[v]u
DFS-recorrer (v, t)
Estado[u]TERMINADO
Tiempotiempo+1
F[u]tiempo
2.2. Problema del lobo la cabra y la col
2.2.1. Definición:
Hace mucho tiempo un granjero fue al mercado y compró un lobo,
una cabra y una col. Para volver a su casa tenía que cruzar un río. El
agricultor dispone de una barca para cruzar a la otra orilla, pero en
la barca solo caben él y una de sus compras.
Si el lobo se queda solo con la cabra se la come, si la cabra se queda
sola con la col se la come.
El reto del granjero era cruzar él mismo y dejar sus compras a la
otra orilla del río, dejando cada compra intacta. ¿Cómo lo hizo?
2.2.2. Planteamiento del Problema
Este problema nos sirve para explicar métodos de representación de
espacios de búsqueda. Para ello utilizaremos el paradigma del espacio
de estados que consiste en representar la situación actual de problema
en estados.
Sobre el ejemplo presentado, fijaremos primeramente un operador de
transición del estado. Representaremos con un tupla los elementos que
se transportan en el bote en cada viaje (ida, vuelta). Denominaremos al
Lobo con una L, a la cabra con una C y a la col con una X. Debemos de
fijar también un estado inicial que en nuestro problema será el listado
de los elementos que tengamos en la margen derecha del río (). Y el
estado final al que queremos llegar que será (L, C, X), Resumiendo:
Operador: (ida, vuelta) elementos que se transportan en el bote
Estado inicial: () -vacío-
Estado final: (L,C,X)
Asumimos como premisa inicial que si el granjero está en medio de los
tres elementos estos no interactúan entre sí, es decir el lobo no se come
a la cabra si el pastor está en esa orilla y lo mismo con la cabra y la col.
A continuación se dibuja el espacio de búsqueda de soluciones
8. Universidad Nacional de Trujillo – Escuela de Informática
Problema del lobo la cabra y la col
8
Los nodos del árbol del espacio de soluciones representan diversos
estados del problema. Las líneas que unen los nodos representan
los operadores, es decir el viaje del bote.
Como vemos la solución viene dada por 4 viajes (ida y vuelta), hasta
llegar al estado final (L,C,X). Por supuesto un ordenador o un
procesador no llega directamente a esa solución sino que irá
construyendo el espacio de búsqueda según el algoritmo que
elijamos. El método que elijamos será el que determine la eficiencia
en encontrar la solución. Por ejemplo, no es lo mismo ir
construyendo el espacio de búsqueda en profundidad que en
amplitud.
2.2.3. Algoritmo.
PRIMERO:
El granjero pasa la cabra y regresa solo.
SEGUNDO:
El granjero pasa el lobo y regresa con la cabra.
TERCERO:
El granjero pasa la col y regresa solo.
CUARTO:
El granjero pasa la cabra.
9. Universidad Nacional de Trujillo – Escuela de Informática
Problema del lobo la cabra y la col
9
2.2.3.1 Pseudocódigo.
Algoritmo: Busqueda General
Est_abiertos.insertar(Estado inicial)
Actual← Est_abiertos.primero()
mientras no es_final?(Actual) y no Est_abiertos.vacia?() hacer
Est_abiertos.borrar_primero()
Est_cerrados.insertar(Actual)
Hijos ← generar_sucesores(Actual)
Hijos ← tratar_repetidos(Hijos, Est_cerrados, Est_abiertos)
Est_abiertos.insertar(Hijos)
Actual ← Est_abiertos.primero()
fin
2.3 Programa en Prolog
% .: Proyecto de programacin Logica:.
% --- Solucion ---
% #region Datos del problema
% estado inicial
inicio(estado(lado(1, Lobos, Cabras, Col), lado(0, 0, 0, 0), CapBote)):-
write('tcantidad de Lobos : '), read(Lobos),
write('tcantidad de Cabras : '), read(Cabras),
write('tcantidad de Col : '), read(Col),
write('tcapacidad del Bote : '), read(CapBote).
% estado final
fin(estado(lado(0, 0, 0, 0), lado(1, _, _, _), _)).
% restrincion(es) de peligro
% no hay peligro solo cuando en ambos lados los animales estan a salvo
sin_problemas(E):-
E = estado(Li, Lf, _),
es_seguro(Li),
es_seguro(Lf).
% no hay cabras y en la orilla hay lobos y coles
es_seguro(L):-
L = lado(_, Lobos, Cabras, Col),
Cabras = 0, Lobos > 0, Col > 0.
% no hay cabras, pero en la orilla hay lobos
es_seguro(L):-
L = lado(_, Lobos, Cabras, _),
Cabras = 0, Lobos > 0.
% no hay cabras, pero en la orilla hay coles
es_seguro(L):-
L = lado(_, _, Cabras, Col),
Cabras = 0, Col > 0.
% no hay lobos ni coles, pero en la orilla hay cabras
10. Universidad Nacional de Trujillo – Escuela de Informática
Problema del lobo la cabra y la col
10
es_seguro(L):-
L = lado(_, Lobos, Cabras, Col),
Cabras > 0, Lobos = 0, Col = 0.
% las cabras y el hombre estan en la misma orilla
es_seguro(L):-
L = lado(Hombre, _, Cabras, _),
Cabras > 0, Hombre = 1.
% no queda ningun elemento en la orilla
es_seguro(L):-
L = lado(_, Lobos, Cabras, Col),
Cabras = 0, Lobos = 0, Col = 0.
% Son movimientos posibles cuando ...
% viaje el Hombre de un lado a otro
ir_desde(Ei, Ef):-
Ei = estado(Li1, Li2, CB),
Li1 = lado(Hi1, Lobi1, Cabi1, Coli1),
Li2 = lado(Hi2, Lobi2, Cabi2, Coli2),
Ef = estado(Lf1, Lf2, CB),
Lf1 = lado(Hf1, Lobf1, Cabf1, Colf1),
Lf2 = lado(Hf2, Lobf2, Cabf2, Colf2),
Hf1 is Hi2, Hf2 is Hi1,
Lobf1 is Lobi1, Lobf2 is Lobi2,
Colf1 is Coli1, Colf2 is Coli2,
Cabf1 is Cabi1, Cabf2 is Cabi2,
% M = '.: vija el Hombre al otro lado :.',
% ' H,'+Cabi1+'Cab -> '
sin_problemas(Ef).
% viaje el Hombre con las Cabras de Ei a Ef cuando Cabras = CB-1
ir_desde(Ei, Ef):-
Ei = estado(Li1, Li2, CB),
Li1 = lado(Hi1, Lobi1, Cabi1, Coli1),
Li2 = lado(Hi2, Lobi2, Cabi2, Coli2),
Ef = estado(Lf1, Lf2, CB),
Lf1 = lado(Hf1, Lobf1, Cabf1, Colf1),
Lf2 = lado(Hf2, Lobf2, Cabf2, Colf2),
Cabi1 =:= (CB-1),
Cabf1 is Cabi1 - (CB - 1),
Cabf2 is Cabi2 + (CB - 1),
Hf1 is Hi2, Hf2 is Hi1,
Lobf1 is Lobi1, Lobf2 is Lobi2,
Colf1 is Coli1, Colf2 is Coli2,
% M = '.: viaja el Hombre con ,'+Cabi1+'Cabras del lado 1 al lado 2
sin_problemas(Ef).
11. Universidad Nacional de Trujillo – Escuela de Informática
Problema del lobo la cabra y la col
11
% viaje el Hombre con las Cabras de Ef a Ei cuando Cabras = CB-1
ir_desde(Ei, Ef):-
Ei = estado(Li1, Li2, CB),
Li1 = lado(Hi1, Lobi1, Cabi1, Coli1),
Li2 = lado(Hi2, Lobi2, Cabi2, Coli2),
Ef = estado(Lf1, Lf2, CB),
Lf1 = lado(Hf1, Lobf1, Cabf1, Colf1),
Lf2 = lado(Hf2, Lobf2, Cabf2, Colf2),
Cabi2 =:= (CB-1),
Cabf1 is Cabi1 + (CB - 1),
Cabf2 is Cabi2 - (CB - 1),
Hf1 is Hi2, Hf2 is Hi1,
Lobf1 is Lobi1, Lobf2 is Lobi2,
Colf1 is Coli1, Colf2 is Coli2,
% M = '.: viaja el Hombre con ,'+Cabi2+'Cabras del lado 2 al lado 1
sin_problemas(Ef).
% viaje el Hombre con las Cabras de Ei a Ef cuando Cabras < CB-1
% y la cantidad de Col y Lobos caben en el espacio vacio
ir_desde(Ei, Ef):-
Ei = estado(Li1, Li2, CB),
Li1 = lado(Hi1, Lobi1, Cabi1, Coli1),
Li2 = lado(Hi2, Lobi2, Cabi2, Coli2),
Ef = estado(Lf1, Lf2, CB),
Lf1 = lado(Hf1, Lobf1, Cabf1, Colf1),
Lf2 = lado(Hf2, Lobf2, Cabf2, Colf2),
% si las Cabras es menor que la capacidad del bote
Cabi1 < (CB-1), Coli1 =< (CB - 1) - Cabi1, Lobi1 =< (((CB - 1) - Cabi1) - Coli1),
% el granjero se lleva todas las Cabras, las Lobos y Col que quepan en el bote
Cabf1 is 0, Cabf2 is Cabi2 + Cabi1,
Colf1 is 0, Colf2 is Coli2 + Coli1,
Lobf1 is 0, Lobf2 is Lobi2 + Lobi1,
Hf1 is Hi2, Hf2 is Hi1,
%M = '.: viaja el Hombre con '+Lobi1+'Lobos,'+Cabi1+'Cabras,'+Coli1+'Col
%del lado 1 al lado 2 :.',
sin_problemas(Ef).
% viaje el Hombre con las Cabras de Ei a Ef cuando Cabras < CB-1
% y la cantidad de Lobos cabe en el espacio vacio
ir_desde(Ei, Ef):-
Ei = estado(Li1, Li2, CB),
Li1 = lado(Hi1, Lobi1, Cabi1, Coli1),
Li2 = lado(Hi2, Lobi2, Cabi2, Coli2),
12. Universidad Nacional de Trujillo – Escuela de Informática
Problema del lobo la cabra y la col
12
Ef = estado(Lf1, Lf2, CB),
Lf1 = lado(Hf1, Lobf1, Cabf1, Colf1),
Lf2 = lado(Hf2, Lobf2, Cabf2, Colf2),
% si las Cabras es menor que la capacidad del bote
Cabi1 < (CB-1), Lobi1 =< (CB - 1) - Cabi1,
% el granjero se lleva todas las Cabras y las Lobos
Cabf1 is 0, Cabf2 is Cabi2 + Cabi1,
Lobf1 is 0, Lobf2 is Lobi2 + Lobi1,
Hf1 is Hi2, Hf2 is Hi1,
Colf1 is Coli1, Colf2 is Coli2,
%M = '.: viaja el Hombre con '+Lobi1+'Lobos y '+Cabi1+'Cabras del
% lado 1 al lado 2 :.',
sin_problemas(Ef).
% viaje el Hombre con las Cabras de Ei a Ef cuando Cabras < CB-1
% y la cantidad de Col cabe en el espacio vacio
ir_desde(Ei, Ef):-
Ei = estado(Li1, Li2, CB),
Li1 = lado(Hi1, Lobi1, Cabi1, Coli1),
Li2 = lado(Hi2, Lobi2, Cabi2, Coli2),
Ef = estado(Lf1, Lf2, CB),
Lf1 = lado(Hf1, Lobf1, Cabf1, Colf1),
Lf2 = lado(Hf2, Lobf2, Cabf2, Colf2),
% si las Cabras es menor que la capacidad del bote
Cabi1 < (CB-1), Coli1 =< (CB - 1) - Cabi1,
% el granjero se lleva todas las Cabras y las Lobos
Cabf1 is 0, Cabf2 is Cabi2 + Cabi1,
Colf1 is 0, Colf2 is Coli2 + Coli1,
Hf1 is Hi2, Hf2 is Hi1,
Lobf1 is Lobi1, Lobf2 is Lobi2,
% M = '.: viaja el Hombre con '+Cabi1+'Cabras y '+Coli1+'Col del lado
% 1 al lado 2 :.',
sin_problemas(Ef).
% viaje el Hombre con las Cabras de Ei a Ef cuando Cabras < CB-1
ir_desde(Ei, Ef):-
Ei = estado(Li1, Li2, CB),
Li1 = lado(Hi1, Lobi1, Cabi1, Coli1),
Li2 = lado(Hi2, Lobi2, Cabi2, Coli2),
Ef = estado(Lf1, Lf2, CB),
Lf1 = lado(Hf1, Lobf1, Cabf1, Colf1),
Lf2 = lado(Hf2, Lobf2, Cabf2, Colf2),
% si las Cabras es menor que la capacidad del bote
13. Universidad Nacional de Trujillo – Escuela de Informática
Problema del lobo la cabra y la col
13
Cabi1 < (CB-1),
% el granjero se lleva todas las Cabras
Cabf1 is 0,
Cabf2 is Cabi2 + Cabi1,
Hf1 is Hi2, Hf2 is Hi1,
Lobf1 is Lobi1, Lobf2 is Lobi2,
Colf1 is Coli1, Colf2 is Coli2,
% M = '.: viaja el Hombre con '+Cabi1+'Cabras del lado 1 al lado 2
% :.',
sin_problemas(Ef).
% viaje el Hombre con las Cabras de Ef a Ei cuando Cabras < CB-1
ir_desde(Ei, Ef):-
Ei = estado(Li1, Li2, CB),
Li1 = lado(Hi1, Lobi1, Cabi1, Coli1),
Li2 = lado(Hi2, Lobi2, Cabi2, Coli2),
Ef = estado(Lf1, Lf2, CB),
Lf1 = lado(Hf1, Lobf1, Cabf1, Colf1),
Lf2 = lado(Hf2, Lobf2, Cabf2, Colf2),
% si las Cabras es menor que la capacidad del bote
Cabi2 < (CB-1),
% el granjero se lleva todas las Cabras
Cabf2 is 0,
Cabf1 is Cabi2 + Cabi1,
Hf1 is Hi2, Hf2 is Hi1,
Lobf1 is Lobi1, Lobf2 is Lobi2,
Colf1 is Coli1, Colf2 is Coli2,
% M = '.: viaja el Hombre con '+Cabi2+'Cabras del lado 2 al lado 1
% :.',
sin_problemas(Ef).
% viaje el Hombre de Ei a Ef cuando Cabras < CB-1 y Lobos > CB-1
ir_desde(Ei, Ef):-
Ei = estado(Li1, Li2, CB),
Li1 = lado(Hi1, Lobi1, Cabi1, Coli1),
Li2 = lado(Hi2, Lobi2, Cabi2, Coli2),
Ef = estado(Lf1, Lf2, CB),
Lf1 = lado(Hf1, Lobf1, Cabf1, Colf1),
Lf2 = lado(Hf2, Lobf2, Cabf2, Colf2),
% verifico que Cabras < CB-1 y Lobos > CB-1
Cabi1 < (CB - 1), Lobi1 > (CB - 1),
% muevo las cabras y las lobos que quepan en el bote
14. Universidad Nacional de Trujillo – Escuela de Informática
Problema del lobo la cabra y la col
14
Cabf1 is 0, Cabf2 is Cabi1 + Cabi2,
Lobf1 is Lobi1 - ((CB - 1) - Cabi1), Lobf2 is Lobi2 + ((CB - 1) - Cabi1),
Colf1 is Coli1, Colf2 is Coli2,
Hf1 is Hi2, Hf2 is Hi1,
% Lobt is ((CB - 1) - Cabi1),
% M = '.: viaja el Hombre con '+Lobt+'Lobos y '+Cabi1+'Cabras del lado
% 1 al lado 2 :.',
sin_problemas(Ef).
% viaja el Hombre de Ei a Ef cuando Cabras > CB-1 y no hay Cabras ni Lobos
% en la orilla que cargar
ir_desde(Ei, Ef):-
Ei = estado(Li1, Li2, CB),
Li1 = lado(Hi1, Lobi1, Cabi1, Coli1),
Li2 = lado(Hi2, Lobi2, Cabi2, Coli2),
Ef = estado(Lf1, Lf2, CB),
Lf1 = lado(Hf1, Lobf1, Cabf1, Colf1),
Lf2 = lado(Hf2, Lobf2, Cabf2, Colf2),
% si las Cabras es mayor que la capacidad del bote
Cabi1 >= (CB-1), Lobi1 =:= 0, Coli1 =:= 0,
% y no hay Lobos ni Col en la orilla, el Hombre se lleva las Cabras que caben en el bote
Cabf1 is Cabi1 - (CB-1),
Cabf2 is Cabi2 + (CB-1),
Hf1 is Hi2, Hf2 is Hi1,
Lobf1 is Lobi1, Lobf2 is Lobi2,
Colf1 is Coli1, Colf2 is Coli2,
% Cabt is Cabi1 - (CB-1),
% M = '.: viaja el Hombre con '+Cabt+'Cabras del lado 1 al lado 2 :.',
sin_problemas(Ef).
% viaje el Hombre de Ei a Ef con otro elemento cuando Cabras > CB-1
% y la suma de las Lobos y las Col es < CB-1
ir_desde(Ei, Ef):-
Ei = estado(Li1, Li2, CB),
Li1 = lado(Hi1, Lobi1, Cabi1, Coli1),
Li2 = lado(Hi2, Lobi2, Cabi2, Coli2),
Ef = estado(Lf1, Lf2, CB),
Lf1 = lado(Hf1, Lobf1, Cabf1, Colf1),
Lf2 = lado(Hf2, Lobf2, Cabf2, Colf2),
% si las Cabras es mayor que la capacidad del bote
Cabi1 >= (CB-1), (Lobi1 + Coli1) =< (CB-1),
% y las Lobos + Col < CB-1, el granjero se los lleva
15. Universidad Nacional de Trujillo – Escuela de Informática
Problema del lobo la cabra y la col
15
Lobf1 is 0, Lobf2 is Lobi2 + Lobi1,
Colf1 is 0, Colf2 is Coli2 + Coli1,
Hf1 is Hi2, Hf2 is Hi1,
Cabf1 is Cabi1, Cabf2 is Cabi2,
% M = '.: viaja el Hombre con '+Lobi1+'Lobos y '+Coli1+'Col del
% lado 1 al lado 2 :.',
sin_problemas(Ef).
% viaje el Hombre de Ef a Ei con otro elemento cuando Cabras > CB-1
% y la suma de las Lobos y las Col es < CB-1
ir_desde(Ei, Ef):-
Ei = estado(Li1, Li2, CB),
Li1 = lado(Hi1, Lobi1, Cabi1, Coli1),
Li2 = lado(Hi2, Lobi2, Cabi2, Coli2),
Ef = estado(Lf1, Lf2, CB),
Lf1 = lado(Hf1, Lobf1, Cabf1, Colf1),
Lf2 = lado(Hf2, Lobf2, Cabf2, Colf2),
% si las Cabras es mayor que la capacidad del bote
Cabi2 >= (CB-1), (Lobi2 + Coli2) =< (CB-1),
% y las Lobos + Col < CB-1, el granjero se los lleva
Lobf2 is 0, Lobf1 is Lobi2 + Lobi1,
Colf2 is 0, Colf1 is Coli2 + Coli1,
Hf1 is Hi2, Hf2 is Hi1,
Cabf1 is Cabi1, Cabf2 is Cabi2,
% M = '.: viaja el Hombre con '+Lobi2+'Lobos y '+Coli2+'Col del
% lado 2 al lado 1 :.',
sin_problemas(Ef).
% viaje el Hombre con las Lobos cuando Lobos = CB-1
ir_desde(Ei, Ef):-
Ei = estado(Li1, Li2, CB),
Li1 = lado(Hi1, Lobi1, Cabi1, Coli1),
Li2 = lado(Hi2, Lobi2, Cabi2, Coli2),
Ef = estado(Lf1, Lf2, CB),
Lf1 = lado(Hf1, Lobf1, Cabf1, Colf1),
Lf2 = lado(Hf2, Lobf2, Cabf2, Colf2),
Lobi1 =:= (CB - 1),
Lobf1 is Lobi1 - (CB - 1),
Lobf2 is Lobi2 + (CB - 1),
Hf1 is Hi2, Hf2 is Hi1,
Cabf1 is Cabi1, Cabf2 is Cabi2,
Colf1 is Coli1, Colf2 is Coli2,
16. Universidad Nacional de Trujillo – Escuela de Informática
Problema del lobo la cabra y la col
16
% M = '.: viaja el Hombre con '+Lobi1+'Lobos del lado 1 al lado 2
% :.',
sin_problemas(Ef).
% viaje el Hombre con las Lobos cuando Lobos < CB-1 y caben Col
ir_desde(Ei, Ef):-
Ei = estado(Li1, Li2, CB),
Li1 = lado(Hi1, Lobi1, Cabi1, Coli1),
Li2 = lado(Hi2, Lobi2, Cabi2, Coli2),
Ef = estado(Lf1, Lf2, CB),
Lf1 = lado(Hf1, Lobf1, Cabf1, Colf1),
Lf2 = lado(Hf2, Lobf2, Cabf2, Colf2),
% si las Lobos son menor que la capacidad del bote y caben Col
Lobi1 < (CB - 1), Coli1 =< (CB - 1) - Lobi1,
% el granjero se lleva todas las lobos y los Col que quepan
Lobf1 is 0, Lobf2 is Lobi2 + Lobi1,
Colf1 is 0, Colf2 is Coli2 + Coli1,
Hf1 is Hi2, Hf2 is Hi1,
Cabf1 is Cabi1, Cabf2 is Cabi2,
% M = '.: viaja el Hombre con '+Lobi1+'Lobos y '+Coli1+' del lado 1
% al lado 2 :.',
sin_problemas(Ef).
% viaje el Hombre con las Lobos cuando Lobos < CB-1
ir_desde(Ei, Ef):-
Ei = estado(Li1, Li2, CB),
Li1 = lado(Hi1, Lobi1, Cabi1, Coli1),
Li2 = lado(Hi2, Lobi2, Cabi2, Coli2),
Ef = estado(Lf1, Lf2, CB),
Lf1 = lado(Hf1, Lobf1, Cabf1, Colf1),
Lf2 = lado(Hf2, Lobf2, Cabf2, Colf2),
% si las Lobos son menor que la capacidad del bote
Lobi1 < (CB - 1),
% el granjero se lleva todas las lobos
Lobf1 is 0,
Lobf2 is Lobi2 + Lobi1,
Hf1 is Hi2, Hf2 is Hi1,
Cabf1 is Cabi1, Cabf2 is Cabi2,
Colf1 is Coli1, Colf2 is Coli2,
% M = '.: viaja el Hombre con '+Lobi1+'Lobos del lado 1 al lado 2
sin_problemas(Ef).
% viaje el Hombre con los Col cuando Col = CB-1
17. Universidad Nacional de Trujillo – Escuela de Informática
Problema del lobo la cabra y la col
17
ir_desde(Ei, Ef):-
Ei = estado(Li1, Li2, CB),
Li1 = lado(Hi1, Lobi1, Cabi1, Coli1),
Li2 = lado(Hi2, Lobi2, Cabi2, Coli2),
Ef = estado(Lf1, Lf2, CB),
Lf1 = lado(Hf1, Lobf1, Cabf1, Colf1),
Lf2 = lado(Hf2, Lobf2, Cabf2, Colf2),
Coli1 =:= (CB - 1),
Colf1 is Coli1 - (CB - 1),
Colf2 is Coli2 + (CB - 1),
Hf1 is Hi2, Hf2 is Hi1,
Cabf1 is Cabi1, Cabf2 is Cabi2,
Lobf1 is Lobi1, Lobf2 is Lobi2,
% M = '.: viaja el Hombre con '+Coli1+'Col del lado 1 al lado 2
% :.',
sin_problemas(Ef).
% viaje el Hombre con los Col de Ei a Ef cuando Col < CB-1
% y caben Lobos
ir_desde(Ei, Ef):-
Ei = estado(Li1, Li2, CB),
Li1 = lado(Hi1, Lobi1, Cabi1, Coli1),
Li2 = lado(Hi2, Lobi2, Cabi2, Coli2),
Ef = estado(Lf1, Lf2, CB),
Lf1 = lado(Hf1, Lobf1, Cabf1, Colf1),
Lf2 = lado(Hf2, Lobf2, Cabf2, Colf2),
Coli1 < (CB - 1), Lobi1 =< (CB - 1) - Coli1,
Colf1 is 0, Colf2 is Coli2 + Coli1,
Lobf1 is 0, Lobf2 is Lobi2 + Lobi1,
Hf1 is Hi2, Hf2 is Hi1,
Cabf1 is Cabi1, Cabf2 is Cabi2,
% M = '.: viaja el Hombre con '+Lobi1+'Lobos y '+Coli1+'Col del
% lado 1 al lado 2 :.',
sin_problemas(Ef).
% viaje el Hombre con los Col de Ei a Ef cuando Col < CB-1
ir_desde(Ei, Ef):-
Ei = estado(Li1, Li2, CB),
Li1 = lado(Hi1, Lobi1, Cabi1, Coli1),
Li2 = lado(Hi2, Lobi2, Cabi2, Coli2),
Ef = estado(Lf1, Lf2, CB),
Lf1 = lado(Hf1, Lobf1, Cabf1, Colf1),
Lf2 = lado(Hf2, Lobf2, Cabf2, Colf2),
18. Universidad Nacional de Trujillo – Escuela de Informática
Problema del lobo la cabra y la col
18
Coli1 < (CB - 1),
Colf1 is 0,
Colf2 is Coli2 + Coli1,
Hf1 is Hi2, Hf2 is Hi1,
Cabf1 is Cabi1, Cabf2 is Cabi2,
Lobf1 is Lobi1, Lobf2 is Lobi2,
% M = '.: viaja el Hombre con '+Coli1+'Col del lado 1 al lado 2
% :.',
sin_problemas(Ef).
% viaje el Hombre con los Col de Ei a Ef cuando Col > CB-1
ir_desde(Ei, Ef):-
Ei = estado(Li1, Li2, CB),
Li1 = lado(Hi1, Lobi1, Cabi1, Coli1),
Li2 = lado(Hi2, Lobi2, Cabi2, Coli2),
Ef = estado(Lf1, Lf2, CB),
Lf1 = lado(Hf1, Lobf1, Cabf1, Colf1),
Lf2 = lado(Hf2, Lobf2, Cabf2, Colf2),
Coli1 > (CB - 1),
Colf1 is Coli1 - (CB - 1),
Colf2 is Coli2 + (CB - 1),
Hf1 is Hi2, Hf2 is Hi1,
Cabf1 is Cabi1, Cabf2 is Cabi2,
Lobf1 is Lobi1, Lobf2 is Lobi2,
% Colt is (CB - 1),
% M = '.: viaja el Hombre con '+Colt+'Col del lado 1 al lado 2
% :.',
sin_problemas(Ef).
% #fin region Datos del problema
mostrar([E]):-
E = estado(L1, L2, _),
L1 = lado(H1, Lob1, Cab1, Col1),
L2 = lado(H2, Lob2, Cab2, Col2),
write(H1),write('t'),write(Lob1),write('t'),write(Cab1),write('t'),write(Col1),
write(' ---- '),
write(H2),write('t'),write(Lob2),write('t'),write(Cab2),write('t'),write(Col2),nl.
% write('.: incialmente estan todos en el lado 1 :.'),nl.
mostrar([E|List]):-
mostrar(List),
E = estado(L1, L2, _),
L1 = lado(H1, Lob1, Cab1, Col1),
L2 = lado(H2, Lob2, Cab2, Col2),
write(H1),write('t'),write(Lob1),write('t'),write(Cab1),write('t'),write(Col1),
19. Universidad Nacional de Trujillo – Escuela de Informática
Problema del lobo la cabra y la col
19
write(' ---- '),
write(H2),write('t'),write(Lob2),write('t'),write(Cab2),write('t'),write(Col2),nl.
% write(M),nl.
% resolver(E, C, R) realiza una busqueda en profundidad donde :
% E: Estado de partida
% C: Camino recorrido (en reversa)
% R: Camino total hasta la solucion (en reversa)
resolver(E, C, C) :- fin(E).
resolver(E, C, R) :- ir_desde(E, E1), not(member(E1, C)),
resolver(E1, [E1|C], R).
solucion:-
nl,
write(' .: Problema de la Loborra, la Cabca, el Colrano y el Hombre (version
general) :.'),
nl,nl,
write('- Entrada de datos...'),nl,
inicio(Ei),
Ei = estado(Li, Lf, CB),
Ef = estado(Lf, Li ,CB),
fin(Ef),
E = Ei,
resolver(E, [E], R),nl,
write('- Solucion encontrada mediante busqueda en profundidad...'),nl,
write('tLado 1'),write('ttt'),write('tLado 2'),nl,
write('HtLobtCabtCol'),
write(' '),
write('HtLobtCabtCol'),nl,
mostrar(R).
20. Universidad Nacional de Trujillo – Escuela de Informática
Problema del lobo la cabra y la col
20
Conclusiones
Los problemas lógicos tienen una gran importancia didáctica en los procesos de
formación. Se pueden utilizar para desarrollar diferentes capacidades como por
ejemplo:
La observación, la creatividad y la crítica.
La memorización y la agilidad mental.
La iniciativa y la creatividad
El cálculo matemático y el razonamiento lógico.
Los problemas lógicos sirven para poner a prueba a las personas, haciendo
trabajar a la mente, y muchas veces sin saberlo, nos ayudan a adquirir nuevas
capacidades mentales lo cual es muy importante para un ingeniero en
informática ya que en forma común una de nuestras tareas es proponer
soluciones por computada a muchos problemas de la vida cotidiana no bastando
solamente con proponer una solución sino que debe ser la mejor solución
posible lo cual es una de las capacidades que se esperan desarrollar en el curso.
21. Universidad Nacional de Trujillo – Escuela de Informática
Problema del lobo la cabra y la col
21
Referencias.
Bibliografía.
Nilsson, Nils J., Artificial Intelligence: A New Synthesis, Morgan Kaufmann,
1998.
Simon, Herbert A., Las ciencias de lo artificial, Comares, 2006.
Colaboradores de Wikipedia. Inteligencia artificial [en línea]. Wikipedia, La
en ciclopedia libre, 2009 [fecha de consulta: 2 de enero del 2009].
Disponible en
http://es.wikipedia.org/w/index.php?title=Inteligencia_artificial&oldid=22
98 6524>.
Webgrafía.
Wikipedia - Búsqueda en profundidad
http://es.wikipedia.org/wiki/B%C3%BAsqueda_en_profundidad
Departamento de Matemática Aplicada - Búsqueda en Profundidad
http://www.dma.fi.upm.es/java/matematicadiscreta/busqueda/