Water Jug
Há dois jarros d'água com as respectivas capacidades: 1º 3 litros e o 2º 4 litros. O propósito do problema é que ocorra uma situação final de que o jarro cuja capacidade é de 4 litros fique com apenas 2 litros. Assim não se tem atenção sobre o jarro de capacidade de 3 litros, podendo o mesmo possuir qualquer situação final (vazio ou com qualquer quantidade de litros). Assim foram identificados ocorrências de operações de encher, esvaziar e mover. Um ponto a observar é que a movimentação exige o cuidado de não ultrapassar a capacidade dos respectivos jarros
%----------- Buscas ---------------------------------------------
Neste ponto se localiza as buscas de Largura e Profundidade cuja descrição
pode ser vista acessando sua página respectiva através da página principal.
Dessa forma é facilitada a visualização do trecho específico referente ao problema.
% ---------- Representação de Estados para o Problema ----------
% Estado Inicial
estado_inicial([0,0]).
% Estado Final
[_,2] e_a_meta.
% Operações possíveis/permitidas para mudanças de estado.
operacao(encher_A) transforma [A,B] em [3,B] :- A < 3.
operacao(encher_B) transforma [A,B] em [A,4] :- B < 4.
operacao(esvaziar_A) transforma [A,B] em [0,B] :- A > 0.
operacao(esvaziar_B) transforma [A,B] em [A,0] :- B > 0.
operacao(mover_A_para_B) transforma [A,B] em [0,B1] :- A>0, B<4, B1 is A+B, B1=<4.
operacao(mover_B_para_A) transforma [A,B] em [A1,0] :- B>0, A<3, A1 is A+B, A1=<3.
operacao(mover_A_para_B) transforma [A,B] em [A1,4] :- B<4, A>0, A1 is A+B-4.
operacao(mover_B_para_A) transforma [A,B] em [3,B1] :- A<3, B>0, B1 is A+B-3.
Resolução por busca em largura
| ?- resolva_bl.
Estado inicial: [0,0].
encher_A: [3,0].
mover_A_para_B: [0,3].
encher_A: [3,3].
mover_A_para_B: [2,4].
esvaziar_B: [2,0].
mover_A_para_B: [0,2].
yes
Resolução por busca em profundidade
| ?-
# 0.05 seconds to consult jarros.pl [d:\users\jaque\ia\]
| ?- resolva_bp.
Estado inicial: [0,0].
encher_A: [3,0].
encher_B: [3,4].
esvaziar_A: [0,4].
mover_B_para_A: [3,1].
esvaziar_A: [0,1].
mover_B_para_A: [1,0].
encher_B: [1,4].
mover_B_para_A: [3,2].
yes