Courses/CS 460/Fall 2005/Homework/Joey Leung/Nov 19

From CSWiki

Jump to: navigation, search

[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