8 puzzle prolog codigo
¿Por qué no puedo obtener una respuesta para Ship Puzzle con Prolog? (2)
El número de argumentos para el término ship(...)
en la segunda línea (después del predicado de solución) es incorrecto. Es:
middleShip(ship(_,_,_,_,''Black'',_),Shipes),
mientras que debería ser:
middleShip(ship(_,_,_,''Black'',_),Shipes),
No he comprobado si esto funciona, pero esto está causando que tu solucionador falle con seguridad.
Necesito resolver el problema Ship Puzzle con el uso de Prolog. Aquí están los hechos.
Hay 5 barcos.
- El barco griego sale a las seis y lleva café.
- El barco en el medio tiene una chimenea negra.
- El barco inglés sale a las nueve.
- El barco francés con chimenea azul está a la izquierda de un barco que transporta café.
- A la derecha del barco que transporta cacao hay un barco que va a Marsella.
- El barco brasileño se dirige a Manila.
- Al lado del barco que transporta arroz hay un barco con una chimenea verde.
- Un barco que va a Génova sale a las cinco.
- El barco español sale a las siete y está a la derecha del barco que va a Marsella.
- El barco con una chimenea roja va a Hamburgo.
- Al lado del barco que sale a las siete hay un barco con una chimenea blanca.
- El barco en la frontera lleva maíz.
- El barco con una chimenea negra sale a las ocho.
- El barco que transporta maíz está anclado al lado del barco que transporta arroz.
- El barco a Hamburgo sale a las seis.
¿Qué barco va a Port Said? ¿Qué barco lleva té?
Busco respuestas en Internet, pero no pude encontrar ninguna. Así que me refiero a ''The Zebra Puzzle'' y en consecuencia arreglé el código para este problema. Este es mi código Prolog, el problema.
exists(A,(A,_,_,_,_)).
exists(A,(_,A,_,_,_)).
exists(A,(_,_,A,_,_)).
exists(A,(_,_,_,A,_)).
exists(A,(_,_,_,_,A)).
rightOf(A,B,(B,A,_,_,_)).
rightOf(A,B,(_,B,A,_,_)).
rightOf(A,B,(_,_,B,A,_)).
rightOf(A,B,(_,_,_,B,A)).
middleShip(A,(_,_,A,_,_)).
lastShip(A,(_,_,_,_,A)).
nextTo(A,B,(B,A,_,_,_)).
nextTo(A,B,(_,B,A,_,_)).
nextTo(A,B,(_,_,B,A,_)).
nextTo(A,B,(_,_,_,B,A)).
nextTo(A,B,(A,B,_,_,_)).
nextTo(A,B,(_,A,B,_,_)).
nextTo(A,B,(_,_,A,B,_)).
nextTo(A,B,(_,_,_,A,B)).
solution(PortSaidShip, TeaCarrier) :-
Shipes = (ship(_,_,_,_,_),ship(_,_,_,_,_),ship(_,_,_,_,_),ship(_,_,_,_,_),ship(_,_,_,_,_)),
exists(ship(''Greek'',6,''Coffee'',_,_),Shipes),
middleShip(ship(_,_,_,_,''Black'',_),Shipes),
exists(ship(''English'',9,_,_,_),Shipes),
rightOf(ship(_,_,''Coffee'',_,_),ship(''French'',_,_,''Blue'',_),Shipes),
rightOf(ship(_,_,_,_,''Marseille''),ship(_,_,''Cocoa'',_,_),Shipes),
exists(ship(''Brazilian'',_,_,_,''Manila''),Shipes),
nextTo(ship(_,_,_,''Green'',_),ship(_,_,''Rice'',_,_),Shipes),
exists(ship(_,5,_,_,''Genoa''),Shipes),
rightOf(ship(''Spanish'',7,_,_,_),ship(_,_,_,_,''Marseille''),Shipes),
exists(ship(_,_,_,''Red'',''Hamburg''),Shipes),
nextTo(ship(_,_,_,''White'',_),ship(_,7,_,_,_),Shipes),
lastShip(ship(_,_,''Corn'',_,_),Shipes),
exists(ship(_,8,_,''Black'',_),Shipes),
nextTo(ship(_,_,''Corn'',_,_),ship(_,_,''Rice'',_,_),Shipes),
exists(ship(_,6,_,_,''Hamburg''),Shipes),
exists(ship(PortSaidShip,_,_,_,''Port Said''),Shipes),
exists(ship(TeaCarrier,_,''Tea'',_,_),Shipes).
Pero cuando ejecuto el programa dirá ''falso''.
Entonces, ¿cómo puedo resolver esto?
gracias
Tu preguntaste:
Entonces, ¿cómo puedo resolver esto?
La siguiente es una metodología general, que siempre funciona para programas Prolog puros y monótonos como el tuyo. Su problema real es que un objetivo específico debería tener éxito, pero falla. Entonces tienes un fracaso inesperado . Para localizar la parte responsable de su programa, ahora generalizaremos sistemáticamente su programa. Paso a paso. Hasta que tengamos un pequeño fragmento de programa pequeño. Esta técnica se llama a veces división de programas y, en ocasiones , modificación de programas .
Antes que nada, agregue lo siguiente a su código:
:- op(950, fy, *).
*_.
:- initialization(solution(_Port, _Carrier)).
Ahora eliminaremos un objetivo después del otro agregando un *
delante de él y luego volveremos a ejecutar el programa. Así que prepárate para volver a ejecutar tu programa un par de veces. Para cargar el programa ingrese en el toplevel:
?- [shipes].
Esto funciona prácticamente en todas partes, como en SICStus, GNU, SWI, YAP. Recibirá ahora una advertencia sobre una "directiva fallida" o similar. Entonces, sea feliz, ¡ya puede reproducir el problema con facilidad!
Comience agregando un *
en el último objetivo. Puede intentar varios a la vez. Para volver a cargar después de la modificación, puede volver a ingresar a ese objetivo, o
en SICStus, mejor estado
ensure_loaded(shipes).
Esto verifica si el archivo ha sido modificado y solo lo vuelve a ejecutar si se ha vuelto a cargaren SWI, ingresa
make.
Finalmente, obtuve el siguiente fragmento de programa:
middleShip(A,(_,_,A,_,_)).
solution(PortSaidShip, TeaCarrier) :-
Shipes = (ship(_,_,_,_,_),ship(_,_,_,_,_),ship(_,_,_,_,_),ship(_,_,_,_,_),ship(_,_,_,_,_)),
* exists(ship(''Greek'',6,''Coffee'',_,_),Shipes),
middleShip(ship(_,_,_,_,''Black'',_),Shipes),
* exists(ship(''English'',9,_,_,_),Shipes),
* rightOf(ship(_,_,''Coffee'',_,_),ship(''French'',_,_,''Blue'',_),Shipes),
* rightOf(ship(_,_,_,_,''Marseille''),ship(_,_,''Cocoa'',_,_),Shipes),
* exists(ship(''Brazilian'',_,_,_,''Manila''),Shipes),
* nextTo(ship(_,_,_,''Green'',_),ship(_,_,''Rice'',_,_),Shipes),
* exists(ship(_,5,_,_,''Genoa''),Shipes),
* rightOf(ship(''Spanish'',7,_,_,_),ship(_,_,_,_,''Marseille''),Shipes),
* exists(ship(_,_,_,''Red'',''Hamburg''),Shipes),
* nextTo(ship(_,_,_,''White'',_),ship(_,7,_,_,_),Shipes),
* lastShip(ship(_,_,''Corn'',_,_),Shipes),
* exists(ship(_,8,_,''Black'',_),Shipes),
* nextTo(ship(_,_,''Corn'',_,_),ship(_,_,''Rice'',_,_),Shipes),
* exists(ship(_,6,_,_,''Hamburg''),Shipes),
* exists(ship(PortSaidShip,_,_,_,''Port Said''),Shipes),
* exists(ship(TeaCarrier,_,''Tea'',_,_),Shipes).
¡Entonces debe comprender cuatro líneas de código para comprender su problema!
Como otros ya han indicado, el problema es que una vez que usas ship/6
y en otras situaciones ship/5
.
Otra observación: en lugar de (_,_,_,A,B)
escriba mejor [_,_,_,A,B]
que es la notación de lista común.