
hpacheco
By: a guest on Mar 19th, 2010 | syntax:
Prolog | size: 1.33 KB | hits: 98 | expires: Never
inicio(b(0,0)).
objectivo(b(2,_)).
sucessor(b(X,Y), b(0,Y)):- X>0. % esvaziar X
sucessor(b(X,Y), b(4,Y)):- X < 4. % encher X
sucessor(b(X,Y), b(X,0)):- Y > 0. % esvaziar Y
sucessor(b(X,Y), b(X,3)):- Y < 3. % encher Y
sucessor(b(X,Y), b(X1,3)):- Y < 3, X > 0, (X + Y) >= 3, X1 is X - (3 - Y). % esvaziar X para o Y até Y ficar cheio
sucessor(b(X,Y), b(0,Y1)):- X > 0, Y < 3, (X + Y) =< 3, Y1 is (X + Y). % despejar X até X ficar vazio
sucessor(b(X,Y), b(4,Y1)):- Y < 3, (X + Y) >= 4, Y1 is Y - (4 - X). % esvaziar Y para o X ate X ficar cheio
sucessor(b(X,Y), b(X1,0)):- Y > 0, X < 3, (X + Y) =< 3, X1 is (X + Y). % despejar Y até o Y ficar vazio
% dfs
resolve_dfs:-
inicio(Ei),
dfs(Ei, [Ei], S),
write(S).
% caso base
dfs(E, _, [E]):- objectivo(E).
% adiciona V aos estados já visitados
dfs(E, V, [E|R]):-
sucessor(E,E2), not(member(E2, V)), dfs(E2, [E2|V], R).
% bfs
resolve_bfs:-
inicio(Ei),
bfs( [[Ei]], S),
reverse(S, S1),
write(S1).
% caso base
bfs( [[E|Cam]|_], [E|Cam]):- objectivo(E).
bfs( [[E|Cam]|R], S):-
% os filhos vão ser encontrados através de uma lista
% que contem o caminho até ao pai e o pai
findall( [E2, E|Cam], (sucessor(E,E2), not(member(E2,[E|Cam]))), LS),
append(R, LS, L), bfs(L, S).