Courses/CS 460/Fall 2005/Homework/Xuong Tsan/Dec 3

From CSWiki

Jump to: navigation, search

Dec 3 homework solutions


Contents


[edit] Homework Page

Homework page is: | http://cs.calstatela.edu/~wiki/index.php/Courses/CS_460/Fall_2005/Homework/Xuong_Tsan


[edit] Tutorial, Testing, and Debugging

local
   proc{MakeJug Id Size Amount ?Jug}
 %     Amount =< 0 = true
 %     Size >= Amount = true
      Jug = {MakeRecord jug [id size amount]}
      Jug.id = Id
      Jug.size = Size
      Jug.amount = Amount
   end  

   proc{FillJug Jug ?NJug}
      Amount
   in
      Amount=Jug.size
      NJug = {MakeJug Jug.id Jug.size Amount}
      {Browse 'Fill'#NJug}
   end

   proc{EmptyJug Jug ?NJug}
      NJug = {MakeJug Jug.id Jug.size 0}
      {Browse 'Empty'#NJug}
   end

   proc{PourJug Jug1 Jug2 ?NJug2}
      if Jug2.amount == 0 then
	 if Jug1.amount > Jug2.size then
	     NJug2 = {MakeJug Jug2.id Jug2.size Jug2.size}
	 else
	    NJug2 = {MakeJug Jug2.id Jug2.size Jug1.amount}
	 end
	 
% NJug1 = {EmptyJug Jug1}
      else
	 local Cap Remain Fill in
	    Cap = Jug2.size - Jug2.amount
	  %  Remain = Jug1.amount - Cap
	    Fill = Jug2.amount + Cap
	    NJug2 = {MakeJug Jug2.id Jug2.size Fill}
	   % {Browse Remain}
	   % {Browse Cap}
	    % {MakeJug Jug1.id Jug1.size Remain}
	 end
      end
  %    {EmptyJug Jug1}
      {Browse 'Pour from  '#Jug1#' to  '#Jug2}
     
   end

   proc {IsFilled Jug ?Ans}
      if Jug.size == Jug.amount then Ans = true
      else
	Ans = false
      end
   end
   
   
   proc{JugPluz Jug1 Jug2 Measure ?Ans}
      J1 J2 Lop Mn Nlop Opt ExitL 
   in
      %Make sure Source > Sink
      if Jug1 < Jug2 then
	 J2 = {MakeJug 1 Jug1 0}
	 J1 = {MakeJug 2 Jug2 0}
      else
	 J1 = {MakeJug 1 Jug1 0}
	 J2 = {MakeJug 2 Jug2 0}
      end
      ExitL=0
      %Find the Number of loop
      Lop = (J1.size * J2.size) div Measure
      {For 0 Lop 1 proc{$ I}
		  %    if ExitL == 1 then ExitL=1
		%      else
			 if Measure == (I*J2.size mod J1.size) then
			    Mn = I*J2.size
			    Nlop = I
			    Opt = 1
			%    ExitL=1
			    {Browse Mn}
			 elseif Measure ==  (((J1.size * J2.size) - (I*J2.size)) mod J1.size) then
			    Mn = ((J1.size * J2.size) - (I*J2.size))
			    Nlop = I			 
			% {Browse Mn}
			% {Browse Nlop}
			    Opt = 2
			 %   ExitL=1
			 else
			% Nlop = I
			%Opt = 0
			    {Browse 'Keep Looking for subset of mutually prime'}
		        % Opt = 0
			 end
		      end
		 %  end
      }
      {Browse J1#J2}
   Ans = {MakeResult J1 J2 Mn Nlop Opt}
      
   end

   fun {MakeResult J1 J2 Mn Nlop Opt}
      Jug1 Jug2 Jug3 Jug4 Jug5 Jug6 Remain Remain2 InCap PourIn 
   in
      if Nlop >  0 then       
	if Opt == 1 then
	   Jug2={FillJug J2}
	   Jug1={PourJug Jug2 J1}
	   InCap = J1.size - J1.amount
	   if InCap > J2.amount then
	      Jug3={EmptyJug J2}
	   else
	    %  {Browse 'hi'}
	      Remain = J2.amount -InCap
	      Jug3={MakeJug J2.id J2.size Remain}
	      {Browse 'Remain of J2 '#Jug3}
	   end
	   {MakeResult Jug1 Jug3 Mn Nlop-1 Opt}	
	else
	   
	   Jug1={FillJug J1}
	  % {Browse 'this'#Jug1}
	   Jug2={PourJug Jug1 J2}
	 %  {Browse 'that'#Jug2}
	 %  PourIn = Jug1.amount - Jug2.amount
	   InCap = J2.size - Jug2.amount
	   Remain= Jug1.amount - Jug2.amount
	 %  {Browse PourIn}
	   if Remain == 0 then
	      Jug3={EmptyJug Jug1}
	   else
	      Jug3={MakeJug Jug1.id Jug1.size Remain}
	      {Browse 'Remain of J1'#Jug3#' and '#Jug2}
	   end
	   if {IsFilled Jug2} then
	      Jug4 = {EmptyJug Jug2}
	      Jug5 = {PourJug Jug3 Jug4}
	      Remain2 = Jug3.amount - Jug4.amount
	   if Remain2 == 0 then
	      Jug5={EmptyJug Jug1}
	   else
	      Jug6={MakeJug Jug1.id Jug1.size Remain2}
	      {Browse 'Remain of J1'#Jug5#' and '#Jug6}
	      {MakeResult Jug5 Jug6 Mn Nlop-1 Opt}	   

	   end
	   else
	      {MakeResult Jug1 Jug3 Mn Nlop-1 Opt}

	   end
	end
	
      else
	 Opt=Opt
      end
     
   end
   
in
   %{Browse 1}
   %{Browse {EmptyJug {FillJug {MakeJug 1 3 0}}}}
   %{Browse '***********'}
   %{Browse {PourJug {MakeJug 1 5 3} {MakeJug 2 5 2}}}
   {Browse {JugPluz 9 5 8}}
end