Courses/CS 460/Fall 2005/Homework/Jeff Bailey/Nov 19
From CSWiki
< Courses | CS 460 | Fall 2005 | Homework | Jeff Bailey
Contents |
[edit] Jugs
Couldnt quite figure this out. Just posted so I could work on it more later.
local
proc {MakeJug Size Amount ?Jug}
Amount =< 0 = true
Size >= Amount = true
Jug = {MakeRecord jug [size amount]}
Jug.size = Size
Jug.amount = Amount
end
proc {Replace List OldItem NewItem ?NewList}
TempList
in
TempList = {List.subtract List OldItem}
NewList = {List.append TempList NewItem}
end
proc {FillJug State ?NewState}
Jug NewJug
in
Jug.amount = 0
NewJug = {MakeJug Jug.size Jug.size}
NewState = {Replace State Jug NewJug}
end
proc {PourJug State ?NewState}
Jug1 Jug2 NewJug1 NewJug2 TempState
in
Jug1 = Jug2 =: false
choice Space in
Space = Jug2.size - Jug2.volume
if (Space >= Jug1.amount) then
NewJug1 = {MakeJug Jug1.size 0}
NewJug2 = {MakeJug Jug2.size (Jug1.amount + Jug2.amount)}
else
NewJug1 = {MakeJug Jug1.size (Jug1.amount - Space)}
NewJug2 = {MakeJug Jug2.size Jug2.size}
end
[] Space in
Space = Jug1.size - Jug1.volume
if (Space >= Jug2.amount) then
NewJug1 = {MakeJug Jug1.size (Jug1.amount + Jug2.amount)}
NewJug2 = {MakeJug Jug2.size 0}
else
NewJug1 = {MakeJug Jug1.size Jug1.size}
NewJug2 = {MakeJug Jug2.size (Jug2.amount - Space)}
end
end
TempState = {Replace Jugs Jug1 NewJug1}
NewState = {Replace TempState Jug2 NewJug2}
end
proc {Jugs States Goal ?Results}
State NewState
in
State = {List.last States}
choice
NewState = {Fill State Jug NewJug}
[]
NewState = {PourJug State}
end
% if its a dupe, kill it.
{Member States NewState} = false
% if NewState is a solution, stop
if {Some NewState fun {$ Jug} Jug.amount = Goal end} then
Results = {List.append States [NewState]}
else
Results = {Jugs {List.append States [NewState]} Goal}
end
end
StartState
StartStates
ResultStates
in
StartState = [{MakeJug 5 0} {MakeJug 3 0}]
StartStates = [StartState]
ResultStates = {SearchOne {Jugs StartStates 4}}
{Browse ResultStates}
end

