Courses/CS 460/Fall 2005/Homework/Jeff Bailey/Nov 19

From CSWiki

Jump to: navigation, search

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