Courses/CS 460/Fall 2005/Homework/Joey Leung/Nov 19
From CSWiki
< Courses | CS 460 | Fall 2005 | Homework | Joey Leung
[edit] Jug Puzzle Solver
Does not work. Could not figure out how to put it in record.
local
fun {Jug}
{Action [[{MakeJug 5 0} {MakeJug 3 0}]] 4}
end
proc {MakeJug Capacity Amount ?J}
J = {MakeRecord jug [cap amount]}
J.cap = Capacity
J.amount = Amount
end
fun {Action CurrentState GaolState}
Current Record in
Current = {List.last CurrentState}
{Append CurrentState [Record]}
if {Some Record fun {$ J} J.amount \= GaolState end}
then
choice
{Fill}
[] {Empty Current Record}
[] {Transfer Current Record}
End
{Member Record CurrentState} = false
{Action {Append CurrentState [Record]} GaolState}
end
end
proc {Fill}
{MakeJug J.1.cap J.1.cap}
end
proc {Empty}
{MakeJug J.1.cap 0}
end
proc {Transfer Current Record}
J1 J2 in
choice
{Tran J1 J2}
[] {Tran J2 J1}
end
end
proc {Tran X Y}
S N1 N2 in
S = Y.cap - Y.amount
if (S >= X.amount) then
N1 = {MakeJug X.cap 0}
N2 = {MakeJug Y.cap (X.amount + Y.amount)}
else
N1 = {MakeJug X.cap (X.amount - S)}
N2 = {MakeJug Y.cap Y.cap}
end
end
proc {Append Xs Ys Zs}
choice
Xs = nil Ys = Zs
[] X Xr in
Xs = X | Xr
Zs = X | {Append Xr Ys}
end
end
in
{Browse {SearchAll Jug}}
end

