Skip to content

Instantly share code, notes, and snippets.

@aarroyoc
Created May 21, 2018 08:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aarroyoc/99ae5f127449292580a08180712e1f8b to your computer and use it in GitHub Desktop.
Save aarroyoc/99ae5f127449292580a08180712e1f8b to your computer and use it in GitHub Desktop.
Problema de las jarras - PROLOG
%%% Algoritmo primero en profundidad con profundidad máxima
% resolver (Id_Problema,PMax,Solucion)
resolver_pmax(Problema,PMax,[Eo|Solucion]) :-
estado_inicial(Problema,Eo),
resolver_pmax_aux(Problema,Eo,PMax,[Eo],Solucion).
% resolver(Id_Problema,Ei,NumPasos,Visitados,Solucion)
resolver_pmax_aux(Problema,En,_,_,[]) :-
estado_final(Problema,En).
resolver_pmax_aux(Problema,Ei,NumPasos,Visitados,[En|Es]) :-
NumPasos > 0,
NumPasos1 is NumPasos-1,
mover(Problema,Ei,En),
no_esta(En,Visitados),
resolver_pmax_aux(Problema,En,NumPasos1,[En|Visitados],Es).
no_esta(_,[]).
no_esta(X,[Y|Ys]) :-
X \== Y,
no_esta(X,Ys).
%%% Problema de las jarras
%%%
%%% estado(ContenidoA,ContenidoB)
%%%
%%% Se dispone de dos jarras que
%%% pueden contener 4 y 3 litros respectivamente. No tienen marcas de medición.
%%% Hay una bomba para echar agua en las jarras, se puede echar agua de las
%%% jarras al suelo y de una jarra a otra. Inicialmente están vacías. Deberemos
%%% conseguir tener 2 litros en la jarra de 4 y 0 en la de 3.
estado_inicial(jarras,estado(0,0)).
estado_final(jarras,estado(2,0)).
% Llenar jarras
mover(jarras,estado(X,_),estado(X,CapacidadB)) :-
capacidadB(CapacidadB).
mover(jarras,estado(_,Y),estado(CapacidadA,Y)) :-
capacidadA(CapacidadA).
% Vaciar jarras
mover(jarras,estado(_,Y),estado(0,Y)).
mover(jarras,estado(X,_),estado(X,0)).
% Traspasar entre jarras
mover(jarras,estado(X,Y),estado(ContenidoA,ContenidoB)) :-
capacidadA(CapacidadA),
Trasvase is CapacidadA-X,
Trasvase > 0,
ContenidoA is X+Trasvase,
ContenidoB is Y-Trasvase,
ContenidoA =< CapacidadA,
ContenidoB >= 0.
mover(jarras,estado(X,Y),estado(ContenidoA,ContenidoB)) :-
capacidadB(CapacidadB),
Trasvase is CapacidadB-Y,
Trasvase > 0,
ContenidoA is X-Trasvase,
ContenidoB is Y+Trasvase,
ContenidoA >= 0,
ContenidoB =< CapacidadB.
mover(jarras,estado(X,Y),estado(ContenidoA,ContenidoB)) :-
capacidadA(CapacidadA),
ContenidoA is X+Y,
ContenidoB is 0,
ContenidoA =< CapacidadA.
mover(jarras,estado(X,Y),estado(ContenidoA,ContenidoB)) :-
capacidadB(CapacidadB),
ContenidoA is 0,
ContenidoB is X+Y,
ContenidoB =< CapacidadB.
capacidadA(4).
capacidadB(3).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment