<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Artisan Coder &#187; search</title>
	<atom:link href="http://www.artisancoder.com/tag/search/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.artisancoder.com</link>
	<description>Software development as a craft</description>
	<lastBuildDate>Thu, 09 Sep 2010 14:42:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Escape from Zurg</title>
		<link>http://www.artisancoder.com/2009/08/escape-from-zurg/</link>
		<comments>http://www.artisancoder.com/2009/08/escape-from-zurg/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 17:16:39 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Scheme]]></category>
		<category><![CDATA[search]]></category>

		<guid isPermaLink="false">http://www.ventonegro.org/?p=114</guid>
		<description><![CDATA[Lately I have been reading about searching in game trees. So a friend of mine sent me the &#8220;Escape from Zurg&#8221; paper, which talks about problem solving by tree searching with Haskell. In a large class of problems one is given a start state and some predicate for a desired final state. Moreover, the rules [...]]]></description>
			<content:encoded><![CDATA[<p>Lately I have been reading about searching in <a href="http://en.wikipedia.org/wiki/Game_tree" title="Game tree">game trees</a>. So a friend of mine sent me the <a href="http://web.engr.oregonstate.edu/~erwig/papers/Zurg_JFP04.pdf" title="Escape from Zurg">&#8220;Escape from Zurg&#8221; paper</a>, which talks about problem solving by tree searching with Haskell.</p>
<p>In a large class of problems one is given a start state and some predicate for a desired final state. Moreover, the rules that dictate how a successor state is generated from a previous one are also given. Take a board game for instance, like tic-tac-toe. There is the initial state (which is the empty board), the predicate for a desired state (a state in which tree pieces of mine are aligned), and rules to create one state from another (the rules of the game). Another example of such problems is the &#8220;Escape from Zurg&#8221; one, that is stated as follows:</p>
<blockquote>
<p>Buzz, Woody, Rex, and Hamm have to escape from Zurg. They merely have to cross one last bridge before they are free. However, the bridge is fragile and can hold at most two of them at the same time. Moreover, to cross the bridge a flashlight is needed to avoid traps and broken parts. The problem is that our friends have only one flashlight with one battery that lasts for only 60 minutes (this is not a typo: <em>sixty</em>). The toys need different times to cross the bridge (in either direction):</p>
<table>
<tbody>
<tr>
<th>TOY</th>
<th>TIME</th>
</tr>
<tr>
<td>Buzz</td>
<td>5 minutes</td>
</tr>
<tr>
<td>Woody</td>
<td>10 minutes</td>
</tr>
<tr>
<td>Rex</td>
<td>20 minutes</td>
</tr>
<tr>
<td>Hamm</td>
<td>25 minutes</td>
</tr>
</tbody>
</table>
<p>Since there can be only two toys on the bridge at the same time, they cannot cross the bridge all at once. Since they need the flashlight to cross the bridge, whenever two have crossed the bridge, somebody has to go back and bring the flashlight to those toys on the other side that still have to cross the bridge. The problem now is: In which order can the four toys cross the bridge in time (that is, in 60 minutes) to be saved from Zurg?</p>
</blockquote>
<p>This class of problems is usually solved by searching. The initial state and all the successors ultimately build a DAG (directed acyclic graph) that is called the <em>search space</em>. Some search spaces are small, like tic-tac-toe playing or even the &#8220;Escape from Zurg&#8221; puzzle. Others are large, like playing Reversi; even larger, like playing Chess; others are infinite. Needless to say that that are better searching ways than others. This same puzzle, for instance, <a href="http://benjisimon.blogspot.com/2008/04/escape-from-zurg-scheme-solution.html" title="Escape From Zurg - A Scheme Solution">was solved in Scheme</a> by Ben Simon using the cool <tt>amb</tt> operator. The <tt>amb</tt> operator uses first-class continuations to backtrack and take another path in case the first one fails. It was an elegant solution for this puzzle, but it is not adequate for general searching because it backtracks blindly. There are others ways to search blindly, for instance <em>depth-first search</em> and <em>breadth-first search</em>.</p>
<p>In a depth-first search, we analyse the successors of a given state until there are no more successors to analyse, and then backtrack to a previous level of the tree. In a breadth-first search, we analyse the whole fringe of the tree (the <em>horizon nodes</em>) before expanding it one level further using the successor rules. This is good for infinite search spaces, because we will eventually find a solution if there is one. The implementation in Scheme is straightforward:</p>

<div class="wp_codebox"><table><tr id="p1146"><td class="code" id="p114code6"><pre class="scheme" style="font-family:monospace;">&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>depth<span style="color: #66cc66;">-</span>first states successors goal?<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null?</span> states<span style="color: #66cc66;">&#41;</span>
      #f
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>state <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> states<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>goal? state<span style="color: #66cc66;">&#41;</span>
            state
            <span style="color: #66cc66;">&#40;</span>depth<span style="color: #66cc66;">-</span>first <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> <span style="color: #66cc66;">&#40;</span>successors state<span style="color: #66cc66;">&#41;</span>
                                 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> states<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                         successors
                         goal?<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>breadth<span style="color: #66cc66;">-</span>first states successors goal?<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null?</span> states<span style="color: #66cc66;">&#41;</span>
      #f
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>state <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> states<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>goal? state<span style="color: #66cc66;">&#41;</span>
            state            
            <span style="color: #66cc66;">&#40;</span>breadth<span style="color: #66cc66;">-</span>first <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> states<span style="color: #66cc66;">&#41;</span>
                                   <span style="color: #66cc66;">&#40;</span>successors state<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                           successors
                           goal?<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>This is actually all we need for simple searches. Of course we need to supply the initial state, the procedure that generates successors and the goal predicate. These are specific for each kind of problem. Let&#8217;s see the Zurg problem procedures:</p>

<div class="wp_codebox"><table><tr id="p1147"><td class="code" id="p114code7"><pre class="scheme" style="font-family:monospace;">&nbsp;
<span style="color: #808080; font-style: italic;">;; the type of the states found in our puzzle</span>
<span style="color: #66cc66;">&#40;</span>define<span style="color: #66cc66;">-</span>type state
  <span style="color: #66cc66;">&#40;</span>previous unprintable:<span style="color: #66cc66;">&#41;</span>       <span style="color: #808080; font-style: italic;">;; previous state</span>
  near                          <span style="color: #808080; font-style: italic;">;; toys in near shore</span>
  far                           <span style="color: #808080; font-style: italic;">;; toys in far shore</span>
  flashlight                    <span style="color: #808080; font-style: italic;">;; location of flashlight</span>
  time<span style="color: #66cc66;">&#41;</span>                         <span style="color: #808080; font-style: italic;">;; time consumed so far</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>start<span style="color: #66cc66;">-</span>state<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>make<span style="color: #66cc66;">-</span>state #f
              '<span style="color: #66cc66;">&#40;</span>buzz woody rex hamm<span style="color: #66cc66;">&#41;</span>
              '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
              'near
              <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>final<span style="color: #66cc66;">-</span>state? state<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null?</span> <span style="color: #66cc66;">&#40;</span>state<span style="color: #66cc66;">-</span>near state<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&lt;=</span> <span style="color: #66cc66;">&#40;</span>state<span style="color: #66cc66;">-</span>time state<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">60</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; at most two toys can travel across the bridge</span>
<span style="color: #808080; font-style: italic;">;; the flashlight must be used in all crossings</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>successors state<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>orig <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eqv?</span> <span style="color: #66cc66;">&#40;</span>state<span style="color: #66cc66;">-</span>flashlight state<span style="color: #66cc66;">&#41;</span>
                        'near<span style="color: #66cc66;">&#41;</span>
                  <span style="color: #66cc66;">&#40;</span>state<span style="color: #66cc66;">-</span>near state<span style="color: #66cc66;">&#41;</span>
                  <span style="color: #66cc66;">&#40;</span>state<span style="color: #66cc66;">-</span>far state<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>dest <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eqv?</span> <span style="color: #66cc66;">&#40;</span>state<span style="color: #66cc66;">-</span>flashlight state<span style="color: #66cc66;">&#41;</span>
                        'near<span style="color: #66cc66;">&#41;</span>
                  <span style="color: #66cc66;">&#40;</span>state<span style="color: #66cc66;">-</span>far state<span style="color: #66cc66;">&#41;</span>
                  <span style="color: #66cc66;">&#40;</span>state<span style="color: #66cc66;">-</span>near state<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">map</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>toy<span style="color: #66cc66;">-</span>pair<span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>toy1 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> toy<span style="color: #66cc66;">-</span>pair<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                 <span style="color: #66cc66;">&#40;</span>toy2 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> toy<span style="color: #66cc66;">-</span>pair<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span>make<span style="color: #66cc66;">-</span>next<span style="color: #66cc66;">-</span>state state
                              <span style="color: #66cc66;">&#40;</span>remove toy2
                                      <span style="color: #66cc66;">&#40;</span>remove toy1 orig<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                              <span style="color: #66cc66;">&#40;</span>ucons toy1
                                     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> toy2 dest<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                              <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">max</span> <span style="color: #66cc66;">&#40;</span>time<span style="color: #66cc66;">-</span>cost toy1<span style="color: #66cc66;">&#41;</span>
                                   <span style="color: #66cc66;">&#40;</span>time<span style="color: #66cc66;">-</span>cost toy2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span>product orig orig<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>The previous procedures use some utilities:</p>

<div class="wp_codebox"><table><tr id="p1148"><td class="code" id="p114code8"><pre class="scheme" style="font-family:monospace;">&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>make<span style="color: #66cc66;">-</span>next<span style="color: #66cc66;">-</span>state state orig dest time<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eqv?</span> <span style="color: #66cc66;">&#40;</span>state<span style="color: #66cc66;">-</span>flashlight state<span style="color: #66cc66;">&#41;</span> 'near<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>make<span style="color: #66cc66;">-</span>state state orig dest 'far <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">+</span> <span style="color: #66cc66;">&#40;</span>state<span style="color: #66cc66;">-</span>time state<span style="color: #66cc66;">&#41;</span> time<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>make<span style="color: #66cc66;">-</span>state state dest orig 'near <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">+</span> <span style="color: #66cc66;">&#40;</span>state<span style="color: #66cc66;">-</span>time state<span style="color: #66cc66;">&#41;</span> time<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; the time each toy takes to cross the bridge</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> time<span style="color: #66cc66;">-</span>cost
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>costs '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>buzz . <span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span>
                 <span style="color: #66cc66;">&#40;</span>woody . <span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span>
                 <span style="color: #66cc66;">&#40;</span>rex . <span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span>
                 <span style="color: #66cc66;">&#40;</span>hamm . <span style="color: #cc66cc;">25</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>toy<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>pair <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">assv</span> toy costs<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> pair
             <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> pair<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>ucons a b<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">memv</span> a b<span style="color: #66cc66;">&#41;</span>
      b
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> a b<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>product lis1 lis2<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> lp1 <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>lis1 lis1<span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#40;</span>res '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null?</span> lis1<span style="color: #66cc66;">&#41;</span>
        res
        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>i1 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> lis1<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> lp2 <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>lis2 lis2<span style="color: #66cc66;">&#41;</span>
                    <span style="color: #66cc66;">&#40;</span>res res<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null?</span> lis2<span style="color: #66cc66;">&#41;</span>
                <span style="color: #66cc66;">&#40;</span>lp1 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> lis1<span style="color: #66cc66;">&#41;</span> res<span style="color: #66cc66;">&#41;</span>
                <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>i2 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> lis2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">member</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> i2 i1<span style="color: #66cc66;">&#41;</span> res<span style="color: #66cc66;">&#41;</span>
                      <span style="color: #66cc66;">&#40;</span>lp2 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> lis2<span style="color: #66cc66;">&#41;</span> res<span style="color: #66cc66;">&#41;</span>
                      <span style="color: #66cc66;">&#40;</span>lp2 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> lis2<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> i1 i2<span style="color: #66cc66;">&#41;</span> res<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>Our <tt>successors</tt> procedure does not take time in account. So it is possible for a branch of the tree to go on indefinitely. To guarantee that we will arrive at a solution, we use a breadth-first search:</p>

<div class="wp_codebox"><table><tr id="p1149"><td class="code" id="p114code9"><pre class="scheme" style="font-family:monospace;">&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>print<span style="color: #66cc66;">-</span>path state<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> loop <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>state state<span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span>path '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> state
        <span style="color: #66cc66;">&#40;</span>loop <span style="color: #66cc66;">&#40;</span>state<span style="color: #66cc66;">-</span>previous state<span style="color: #66cc66;">&#41;</span>
              <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> state path<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">for-each</span> println path<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>print<span style="color: #66cc66;">-</span>path <span style="color: #66cc66;">&#40;</span>breadth<span style="color: #66cc66;">-</span>first <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>start<span style="color: #66cc66;">-</span>state<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> successors final<span style="color: #66cc66;">-</span>state?<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>With the result:</p>
<pre>
#&lt;state #14 near: (buzz woody rex hamm) far: () flashlight: near time: 0&gt;
#&lt;state #15 near: (rex hamm) far: (buzz woody) flashlight: far time: 10&gt;
#&lt;state #16 near: (woody rex hamm) far: (buzz) flashlight: near time: 20&gt;

#&lt;state #17 near: (woody) far: (rex hamm buzz) flashlight: far time: 45&gt;
#&lt;state #18 near: (buzz woody) far: (rex hamm) flashlight: near time: 50&gt;
#&lt;state #19 near: () far: (buzz woody rex hamm) flashlight: far time: 60&gt;
</pre>
<p>If we change our <tt>successors</tt> procedure a little, we can use depth-first search:</p>

<div class="wp_codebox"><table><tr id="p11410"><td class="code" id="p114code10"><pre class="scheme" style="font-family:monospace;">&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>successors2 state<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>orig <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eqv?</span> <span style="color: #66cc66;">&#40;</span>state<span style="color: #66cc66;">-</span>flashlight state<span style="color: #66cc66;">&#41;</span>
                        'near<span style="color: #66cc66;">&#41;</span>
                  <span style="color: #66cc66;">&#40;</span>state<span style="color: #66cc66;">-</span>near state<span style="color: #66cc66;">&#41;</span>
                  <span style="color: #66cc66;">&#40;</span>state<span style="color: #66cc66;">-</span>far state<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>dest <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eqv?</span> <span style="color: #66cc66;">&#40;</span>state<span style="color: #66cc66;">-</span>flashlight state<span style="color: #66cc66;">&#41;</span>
                        'near<span style="color: #66cc66;">&#41;</span>
                  <span style="color: #66cc66;">&#40;</span>state<span style="color: #66cc66;">-</span>far state<span style="color: #66cc66;">&#41;</span>
                  <span style="color: #66cc66;">&#40;</span>state<span style="color: #66cc66;">-</span>near state<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>filter <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">s</span><span style="color: #66cc66;">&#41;</span>
              <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&lt;=</span> <span style="color: #66cc66;">&#40;</span>state<span style="color: #66cc66;">-</span>time <span style="color: #b1b100;">s</span><span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">60</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>          <span style="color: #808080; font-style: italic;">;; filtering out bad states</span>
            <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">map</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>toy<span style="color: #66cc66;">-</span>pair<span style="color: #66cc66;">&#41;</span>
                   <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>toy1 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> toy<span style="color: #66cc66;">-</span>pair<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                         <span style="color: #66cc66;">&#40;</span>toy2 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> toy<span style="color: #66cc66;">-</span>pair<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                     <span style="color: #66cc66;">&#40;</span>make<span style="color: #66cc66;">-</span>next<span style="color: #66cc66;">-</span>state state
                                      <span style="color: #66cc66;">&#40;</span>remove toy2
                                              <span style="color: #66cc66;">&#40;</span>remove toy1 orig<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                                      <span style="color: #66cc66;">&#40;</span>ucons toy1
                                             <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> toy2 dest<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                                      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">max</span> <span style="color: #66cc66;">&#40;</span>time<span style="color: #66cc66;">-</span>cost toy1<span style="color: #66cc66;">&#41;</span>
                                           <span style="color: #66cc66;">&#40;</span>time<span style="color: #66cc66;">-</span>cost toy2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                 <span style="color: #66cc66;">&#40;</span>product orig orig<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>print<span style="color: #66cc66;">-</span>path <span style="color: #66cc66;">&#40;</span>depth<span style="color: #66cc66;">-</span>first <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>start<span style="color: #66cc66;">-</span>state<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> successors2 final<span style="color: #66cc66;">-</span>state?<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>The advantage of changing the successors procedure is that depth-first searches are usually faster than breadth-first searches, in this case 483ms vs. 24630ms. Also, it uses less memory. So it is always a good idea to try to cut the search space as soon as possible.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.artisancoder.com/2009/08/escape-from-zurg/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
