You are given two jugs, a 5-gallon one and a 2-gallon one. Neither has any measuring markers on it. The 5-gallon jug is initially filled up completelu. How can you get exactly 2 gallons of water into the 2-gallon jug?

:- op(900,fy,'not').

solve(Goal, Goal, Path, Path).

solve(Current, Goal, Path, Solution)
    edge(Step, Current, New),
    not marked(solve(New, Goal, _, _)),
    solve(New, Goal, Path:Step, Solution).

edge(pour_a_down_drain, A:B , 0:B).
edge(pour_b_down_drain, A:B , A:0).
edge(pour_a_into_b, A:B, C:D) :-
       A>0, B<2, T is A+B, (T>=2, C is T-2, D=2 ; T<2, C=0, D=T) .
edge(pour_b_into_a, A:B, C:D) :-
       B>0, A<5, T is A+B, (T>=5, D is T-5, C=5 ; T<5, C=T, D=0) .

reset_marked :- retractall(marked(_)),
      asserta( (marked(X) :- asserta((marked(X):- !)), fail) ).

jug_problem(X,Y,Z) :- reset_marked, solve(X,Y,start,Z).

?-jug_problem(5:0, A:1, Answer).