% ------------------------------------------------------------------------------
% Autor: Ariana Barrera - Diana Gutièrrez
% Fecha: 01/ 05/ 2011
% Proyecto Final de Aplicaciòn
% Inteligencia Artificial
% Universidad Rafael Landìvar, Guatemala
% ------------------------------------------------------------------------------
% mover( canibal, misionero)
% Aqui seleccionamos una combinaciòn de misionero/ canibal para
% poner en el bote y comenzar a validar el estado
mover( 1 ,1 ) . % pasamos un canibal y un misionero
mover( 1 ,0 ) . % pasamos un canibal
mover( 0 ,1 ) . % pasamos un misionero
mover( 2 ,0 ) . % pasamos dos canibales
mover( 0 ,2 ) . % pasamos dos misioneros
% estado( CA,MA,CB,MB,P)
% donde:
% CA - Caníbales en la orilla A
% MA - Misioneros en la orilla A
% CB - Caníbales en la orilla B
% MB - Misioneros en la orilla B
% P - Posicion del Bote 0 = A; 1 = B
% Movimiento de misioneros y canibales de la orilla A a la B
accion( estado( CA,MA,CB,MB,0 ) ,estado( CAF,MAF,CBF,MBF,1 ) ) :-
mover( X,Y) , % llamamos a la combinacion de Misioneros y Canibales
CAF is CA- X, MAF is MA- Y, % Salen misioneros y canibales de la orilla A
CBF is CB+ X, MBF is MB+ Y, % Entran misioneros y canibales de la orilla B
CAF >= 0 , validarPaso( CAF,MAF,CBF,MBF) . % Se verifica que el estado sea valido
% Movimiento de misioneros y canibales de la orilla B a la A
accion( estado( CA,MA,CB,MB,1 ) ,estado( CAF,MAF,CBF,MBF,0 ) ) :-
mover( X,Y) , % llamamos a la combinacion de Misioneros y Canibales
CBF is CB- X, MBF is MB- Y, % Salen misioneros y canibales de la orilla B
CAF is CA+ X, MAF is MA+ Y, % Entran misioneros y canibales de la orilla B
CBF >= 0 , validarPaso( CAF,MAF,CBF,MBF) . % Se verifica que el estado sea valido
% Validamos los valores resultantes de caníbales y
% misioneros luego de un posible paso
validarPaso( CAF,MAF,CBF,MBF) :- MAF > 0 , MBF> 0 , CAF =< MAF, CBF =< MBF.
% Existan misioneros en ambas orillas, Canibales en A y B < Misioneros en A y B
validarPaso( _,MAF,CBF,MBF) :- MAF = 0 , MBF> 0 , CBF =< MBF.
% Ya se pasaron todos los misioneros a B, que haya por lo menos uno en B,Canibales en B < Misioneros en B
validarPaso( CAF,MAF,_,MBF) :- MAF > 0 , MBF= 0 , CAF =< MAF.
% Exista por lo menos 1 misionero en A, No hayan misioneros en B, Canibales en A < Misioneros en A
validarPaso( _,MAF,_,MBF) :- MAF = 0 , MBF= 0 .
% No existan misioneros ni en A ni en B
% estado final
% Es el estado final del algoritmo, cuando el numero de Misioneros y Canibales
% ingresado al inicio ya se encuentra en la orilla B
estadoFinal( estado( _,_,CM,CM,1 ) ) .
% predicados de manejo de listas
pertenece( X,[ X| _] ) . % La cabeza de la lista sea el elemento que buscamos.
pertenece ( X,[ _| Ls] ) :- pertenece( X,Ls) . % si no lo es, ignora la cabeza y se vuelve a llamar
insertarFinal( [ ] ,X,[ X] ) . % Predicados para insertar al final de la lista de estados
insertarFinal( [ L| Ls] ,X,[ L| R] ) :- insertarFinal( Ls,X,R) .
% algoritmo de búsqueda en profundidad
busquedaProf( S,V,V) :- estadoFinal( S) . % Cuando la busqueda en profundidad
busquedaProf( S,V,LS) :- accion( S,NS) , % Predicado para llamar a la validacion de estados
not( pertenece( NS,V) ) , % Ver que no exista el estado en la lista
insertarFinal( V,NS,NV) , % Actualizo la lista de estados visitados
busquedaProf( NS,NV,LS) .% Se pasa al siguiente estado
% predicado a llamar para la ejecucciòn del algoritmo
resolverCanMis( CM,S) :- busquedaProf( estado( CM,CM,0 ,0 ,0 ) ,[ estado( CM,CM,0 ,0 ,0 ) ] ,S) .
JSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KJSBBdXRvcjogQXJpYW5hIEJhcnJlcmEgLSBEaWFuYSBHdXRpw6hycmV6CiUgRmVjaGE6IDAxLzA1LzIwMTEKJSBQcm95ZWN0byBGaW5hbCBkZSBBcGxpY2FjacOybgolIEludGVsaWdlbmNpYSBBcnRpZmljaWFsCiUgVW5pdmVyc2lkYWQgUmFmYWVsIExhbmTDrHZhciwgR3VhdGVtYWxhCiUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgolIG1vdmVyKGNhbmliYWwsIG1pc2lvbmVybykKJSBBcXVpIHNlbGVjY2lvbmFtb3MgdW5hIGNvbWJpbmFjacOybiBkZSBtaXNpb25lcm8vY2FuaWJhbCBwYXJhCiUgcG9uZXIgZW4gZWwgYm90ZSB5IGNvbWVuemFyIGEgdmFsaWRhciBlbCBlc3RhZG8KbW92ZXIoMSwxKS4gJSBwYXNhbW9zIHVuIGNhbmliYWwgeSB1biBtaXNpb25lcm8KbW92ZXIoMSwwKS4gJSBwYXNhbW9zIHVuIGNhbmliYWwKbW92ZXIoMCwxKS4gJSBwYXNhbW9zIHVuIG1pc2lvbmVybwptb3ZlcigyLDApLiAlIHBhc2Ftb3MgZG9zIGNhbmliYWxlcwptb3ZlcigwLDIpLiAlIHBhc2Ftb3MgZG9zIG1pc2lvbmVyb3MKCiUgZXN0YWRvKENBLE1BLENCLE1CLFApCiUgZG9uZGU6CiUgQ0EgLSBDYW7DrWJhbGVzIGVuIGxhIG9yaWxsYSBBCiUgTUEgLSBNaXNpb25lcm9zIGVuIGxhIG9yaWxsYSBBCiUgQ0IgLSBDYW7DrWJhbGVzIGVuIGxhIG9yaWxsYSBCCiUgTUIgLSBNaXNpb25lcm9zIGVuIGxhIG9yaWxsYSBCCiUgUCAgLSBQb3NpY2lvbiBkZWwgQm90ZSAwID0gQTsgMSA9IEIKCiUgTW92aW1pZW50byBkZSBtaXNpb25lcm9zIHkgY2FuaWJhbGVzIGRlIGxhIG9yaWxsYSBBIGEgbGEgQgphY2Npb24oZXN0YWRvKENBLE1BLENCLE1CLDApLGVzdGFkbyhDQUYsTUFGLENCRixNQkYsMSkpOi0KICAgIG1vdmVyKFgsWSksICUgbGxhbWFtb3MgYSBsYSBjb21iaW5hY2lvbiBkZSBNaXNpb25lcm9zIHkgQ2FuaWJhbGVzCiAgICBDQUYgaXMgQ0EtWCwgTUFGIGlzIE1BLVksICAgICUgU2FsZW4gbWlzaW9uZXJvcyB5IGNhbmliYWxlcyBkZSBsYSBvcmlsbGEgQQogICAgQ0JGIGlzIENCK1gsIE1CRiBpcyBNQitZLCAgICAlIEVudHJhbiBtaXNpb25lcm9zIHkgY2FuaWJhbGVzIGRlIGxhIG9yaWxsYSBCCiAgICBDQUYgPj0wLCB2YWxpZGFyUGFzbyhDQUYsTUFGLENCRixNQkYpLiAlU2UgdmVyaWZpY2EgcXVlIGVsIGVzdGFkbyBzZWEgdmFsaWRvCgolIE1vdmltaWVudG8gZGUgbWlzaW9uZXJvcyB5IGNhbmliYWxlcyBkZSBsYSBvcmlsbGEgQiBhIGxhIEEKYWNjaW9uKGVzdGFkbyhDQSxNQSxDQixNQiwxKSxlc3RhZG8oQ0FGLE1BRixDQkYsTUJGLDApKTotCiAgICBtb3ZlcihYLFkpLCAlIGxsYW1hbW9zIGEgbGEgY29tYmluYWNpb24gZGUgTWlzaW9uZXJvcyB5IENhbmliYWxlcwogICAgQ0JGIGlzIENCLVgsIE1CRiBpcyBNQi1ZLCAgICAlIFNhbGVuIG1pc2lvbmVyb3MgeSBjYW5pYmFsZXMgZGUgbGEgb3JpbGxhIEIKICAgIENBRiBpcyBDQStYLCBNQUYgaXMgTUErWSwgICAgJSBFbnRyYW4gbWlzaW9uZXJvcyB5IGNhbmliYWxlcyBkZSBsYSBvcmlsbGEgQgogICAgQ0JGID49MCwgdmFsaWRhclBhc28oQ0FGLE1BRixDQkYsTUJGKS4gJVNlIHZlcmlmaWNhIHF1ZSBlbCBlc3RhZG8gc2VhIHZhbGlkbwoKJSBWYWxpZGFtb3MgbG9zIHZhbG9yZXMgcmVzdWx0YW50ZXMgZGUgY2Fuw61iYWxlcyB5CiUgbWlzaW9uZXJvcyBsdWVnbyBkZSB1biBwb3NpYmxlIHBhc28KdmFsaWRhclBhc28oQ0FGLE1BRixDQkYsTUJGKTotIE1BRiA+IDAsIE1CRj4wLCBDQUYgPTxNQUYsIENCRiA9PE1CRi4KJSBFeGlzdGFuIG1pc2lvbmVyb3MgZW4gYW1iYXMgb3JpbGxhcywgQ2FuaWJhbGVzIGVuIEEgeSBCIDwgTWlzaW9uZXJvcyBlbiBBIHkgQgp2YWxpZGFyUGFzbyhfLE1BRixDQkYsTUJGKTotIE1BRiA9IDAsIE1CRj4wLCBDQkYgPTxNQkYuCiUgWWEgc2UgcGFzYXJvbiB0b2RvcyBsb3MgbWlzaW9uZXJvcyBhIEIsIHF1ZSBoYXlhIHBvciBsbyBtZW5vcyB1bm8gZW4gQixDYW5pYmFsZXMgZW4gQiA8IE1pc2lvbmVyb3MgZW4gQgp2YWxpZGFyUGFzbyhDQUYsTUFGLF8sTUJGKTotIE1BRiA+IDAsIE1CRj0wLCBDQUYgPTxNQUYuCiUgRXhpc3RhIHBvciBsbyBtZW5vcyAxIG1pc2lvbmVybyBlbiBBLCBObyBoYXlhbiBtaXNpb25lcm9zIGVuIEIsIENhbmliYWxlcyBlbiBBICA8IE1pc2lvbmVyb3MgZW4gQQp2YWxpZGFyUGFzbyhfLE1BRixfLE1CRik6LSBNQUYgPSAwLCBNQkY9MC4KJSBObyBleGlzdGFuIG1pc2lvbmVyb3MgbmkgZW4gQSBuaSBlbiBCCgolIGVzdGFkbyBmaW5hbAolIEVzIGVsIGVzdGFkbyBmaW5hbCBkZWwgYWxnb3JpdG1vLCBjdWFuZG8gZWwgbnVtZXJvIGRlIE1pc2lvbmVyb3MgeSBDYW5pYmFsZXMKJSBpbmdyZXNhZG8gYWwgaW5pY2lvIHlhIHNlIGVuY3VlbnRyYSBlbiBsYSBvcmlsbGEgQgplc3RhZG9GaW5hbChlc3RhZG8oXyxfLENNLENNLDEpKS4KCiUgcHJlZGljYWRvcyBkZSBtYW5lam8gZGUgbGlzdGFzCnBlcnRlbmVjZShYLFtYfF9dKS4gJSBMYSBjYWJlemEgZGUgbGEgbGlzdGEgc2VhIGVsIGVsZW1lbnRvIHF1ZSBidXNjYW1vcy4KcGVydGVuZWNlKFgsW198THNdKTotcGVydGVuZWNlKFgsTHMpLiAlIHNpIG5vIGxvIGVzLCBpZ25vcmEgbGEgY2FiZXphIHkgc2UgdnVlbHZlIGEgbGxhbWFyCgppbnNlcnRhckZpbmFsKFtdLFgsW1hdKS4gJSBQcmVkaWNhZG9zIHBhcmEgaW5zZXJ0YXIgYWwgZmluYWwgZGUgbGEgbGlzdGEgZGUgZXN0YWRvcwppbnNlcnRhckZpbmFsKFtMfExzXSxYLFtMfFJdKTotaW5zZXJ0YXJGaW5hbChMcyxYLFIpLgoKJSBhbGdvcml0bW8gZGUgYsO6c3F1ZWRhIGVuIHByb2Z1bmRpZGFkCmJ1c3F1ZWRhUHJvZihTLFYsVik6LSBlc3RhZG9GaW5hbChTKS4gJSBDdWFuZG8gbGEgYnVzcXVlZGEgZW4gcHJvZnVuZGlkYWQKYnVzcXVlZGFQcm9mKFMsVixMUyk6LSBhY2Npb24oUyxOUyksICAlIFByZWRpY2FkbyBwYXJhIGxsYW1hciBhIGxhIHZhbGlkYWNpb24gZGUgZXN0YWRvcwogICAgICAgICAgICAgICAgICAgICAgIG5vdChwZXJ0ZW5lY2UoTlMsVikpLCAlICBWZXIgcXVlIG5vIGV4aXN0YSBlbCBlc3RhZG8gZW4gbGEgbGlzdGEKICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRhckZpbmFsKFYsTlMsTlYpLCAlIEFjdHVhbGl6byBsYSBsaXN0YSBkZSBlc3RhZG9zIHZpc2l0YWRvcwogICAgICAgICAgICAgICAgICAgICAgIGJ1c3F1ZWRhUHJvZihOUyxOVixMUykuJSBTZSBwYXNhIGFsIHNpZ3VpZW50ZSBlc3RhZG8KCiUgcHJlZGljYWRvIGEgbGxhbWFyIHBhcmEgbGEgZWplY3VjY2nDsm4gZGVsIGFsZ29yaXRtbwpyZXNvbHZlckNhbk1pcyhDTSxTKTotIGJ1c3F1ZWRhUHJvZihlc3RhZG8oQ00sQ00sMCwwLDApLFtlc3RhZG8oQ00sQ00sMCwwLDApXSxTKS4=