Guest User

Untitled

a guest
Apr 20th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 2.20 KB | None | 0 0
  1. % Состояние кувшинов [v1, v2, ...]
  2. % Емкость кувшинов [c1, c2, ...]
  3. solve(Cs, V, Moves) :-
  4.     abolish(move, 2),
  5.     abolish(capacity, 2),
  6.     length(Cs, L),
  7.     prepair_cs(Cs, 1), 
  8.     prepair(L, 1),
  9.     prepair(L, 1, 1),
  10.     make_zero(Zero, L),
  11.     solve(V, Zero, [Zero], Moves).
  12. solve(V, State, _, []) :-
  13.     member(V, State).
  14. solve(V, State, History, [Move|Moves]) :-
  15.     move(State, Move),
  16.     update(State, Move, State1),
  17.     not(member(State1, History)),
  18.     solve(V, State1, [State|History], Moves).
  19.  
  20. prepair(L, L) :-
  21.     assert(:-(move(State, fill(L)), (get_val(State, L, V), capacity(L, C), C \= V))),
  22.     assert(:-(move(State, empty(L)), (get_val(State, L, V), 0 \= V))).
  23. prepair(L, I) :- I < L, I1 is I + 1,
  24.     assert(:-(move(State, fill(I)), (get_val(State, I, V), capacity(I, C), C \= V))),
  25.     assert(:-(move(State, empty(I)), (get_val(State, I, V), 0 \= V))), prepair(L, I1).
  26. prepair(L, L, L) :- !.
  27. prepair(L, L1, L2) :- L1 > L, L3 is L2 + 1, prepair(L, 1, L3).
  28. prepair(L, L1, L2) :- L1 =< L, L2 =< L, L11 is L1 + 1, L1 \= L2,
  29.     assert(:-(move(State, trans(L1, L2)),
  30.         (
  31.             get_val(State, L1, V1), V1 \= 0,
  32.             get_val(State, L2, V2), capacity(L2, C2), V2 \= C2
  33.         )
  34.     )), prepair(L, L11, L2).
  35. prepair(L, L1, L2) :- L1 =< L, L2 =< L, L11 is L1 + 1, L1 = L2, prepair(L, L11, L2).
  36. prepair_cs([], _).
  37. prepair_cs([C|Cs], I) :- I1 is I + 1, assert(capacity(I, C)), prepair_cs(Cs, I1).
  38.  
  39.  
  40. update(State, empty(X), State1) :- set_val(State, X, 0, State1).
  41. update(State, fill(X), State1) :- capacity(X, C), set_val(State, X, C, State1).
  42. update(State, trans(X, Y), State1) :- get_val(State, X, From), get_val(State, Y, To),
  43.     capacity(Y, CTo), adjust(From, To, CTo, RFrom, RTo),
  44.     set_val(State, X, RFrom, State2), set_val(State2, Y, RTo, State1).
  45.  
  46. set_val([_|Es], 1, Val, [Val|Es]).
  47. set_val([E|Es], Pos, Val, [E|Es1]) :- Pos > 1, Pos1 is Pos - 1, set_val(Es, Pos1, Val, Es1).  
  48. get_val([E|_], 1, E).
  49. get_val([_|Es], Pos, Val) :- Pos > 1, Pos1 is Pos - 1, get_val(Es, Pos1, Val).
  50.  
  51. adjust(From, To, CTo, 0, RTo) :- RTo is From + To, RTo =< CTo.
  52. adjust(From, To, CTo, RFrom, CTo) :- RTo1 is From + To, RTo1 > CTo, RFrom is RTo1 - CTo.  
  53.  
  54. make_zero([], 0).
  55. make_zero([0|Zs], L) :- L1 is L - 1, make_zero(Zs, L1).
Add Comment
Please, Sign In to add comment