Thun/docs/sphinx_docs/_build/html/notebooks/Trees.html

1614 lines
241 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Treating Trees &#8212; Thun 0.2.0 documentation</title>
<link rel="stylesheet" href="../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript" src="../_static/documentation_options.js"></script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Newtons method" href="Newton-Raphson.html" />
<link rel="prev" title="Replacing Functions in the Dictionary" href="Replacing.html" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="treating-trees">
<h1>Treating Trees<a class="headerlink" href="#treating-trees" title="Permalink to this headline"></a></h1>
<p>Although any expression in Joy can be considered to describe a
<a class="reference external" href="https://en.wikipedia.org/wiki/Tree_structure">tree</a> with the quotes
as compound nodes and the non-quote values as leaf nodes, in this page I
want to talk about <a class="reference external" href="https://en.wikipedia.org/wiki/Binary_search_tree">ordered binary
trees</a> and how to
make and use them.</p>
<p>The basic structure, in a <a class="reference external" href="https://en.wikipedia.org/wiki/Algebraic_data_type">crude type
notation</a>, is:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">BTree</span> <span class="p">::</span> <span class="p">[]</span> <span class="o">|</span> <span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">BTree</span> <span class="n">BTree</span><span class="p">]</span>
</pre></div>
</div>
<p>That says that a BTree is either the empty quote <code class="docutils literal notranslate"><span class="pre">[]</span></code> or a quote with
four items: a key, a value, and two BTrees representing the left and
right branches of the tree.</p>
<div class="section" id="a-function-to-traverse-a-btree">
<h2>A Function to Traverse a BTree<a class="headerlink" href="#a-function-to-traverse-a-btree" title="Permalink to this headline"></a></h2>
<p>Lets take a crack at writing a function that can recursively iterate or
traverse these trees.</p>
<div class="section" id="base-case">
<h3>Base case <code class="docutils literal notranslate"><span class="pre">[]</span></code><a class="headerlink" href="#base-case" title="Permalink to this headline"></a></h3>
<p>The stopping predicate just has to detect the empty list:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="p">[</span><span class="n">R0</span><span class="p">]</span> <span class="p">[</span><span class="n">R1</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
<p>And since theres nothing at this node, we just <code class="docutils literal notranslate"><span class="pre">pop</span></code> it:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="p">[</span><span class="n">R0</span><span class="p">]</span> <span class="p">[</span><span class="n">R1</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
</div>
<div class="section" id="node-case-key-value-left-right">
<h3>Node case <code class="docutils literal notranslate"><span class="pre">[key</span> <span class="pre">value</span> <span class="pre">left</span> <span class="pre">right]</span></code><a class="headerlink" href="#node-case-key-value-left-right" title="Permalink to this headline"></a></h3>
<p>Now we need to figure out <code class="docutils literal notranslate"><span class="pre">R0</span></code> and <code class="docutils literal notranslate"><span class="pre">R1</span></code>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="p">[</span><span class="n">R0</span><span class="p">]</span> <span class="p">[</span><span class="n">R1</span><span class="p">]</span> <span class="n">genrec</span>
<span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="p">[</span><span class="n">R0</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="n">R1</span><span class="p">]</span> <span class="n">ifte</span>
</pre></div>
</div>
<p>Lets look at it <em>in situ</em>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">R0</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="n">R1</span>
</pre></div>
</div>
</div>
<div class="section" id="processing-the-current-node">
<h3>Processing the current node.<a class="headerlink" href="#processing-the-current-node" title="Permalink to this headline"></a></h3>
<p><code class="docutils literal notranslate"><span class="pre">R0</span></code> is almost certainly going to use <code class="docutils literal notranslate"><span class="pre">dup</span></code> to make a copy of the
node and then <code class="docutils literal notranslate"><span class="pre">dip</span></code> on some function to process the copy with it:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">dupdip</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="n">R1</span>
<span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">F</span> <span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="n">R1</span>
</pre></div>
</div>
<p>For example, if were getting all the keys <code class="docutils literal notranslate"><span class="pre">F</span></code> would be <code class="docutils literal notranslate"><span class="pre">first</span></code>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">R0</span> <span class="o">==</span> <span class="p">[</span><span class="n">first</span><span class="p">]</span> <span class="n">dupdip</span>
<span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">first</span><span class="p">]</span> <span class="n">dupdip</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="n">R1</span>
<span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">first</span> <span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="n">R1</span>
<span class="n">key</span> <span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="n">R1</span>
</pre></div>
</div>
</div>
<div class="section" id="recur">
<h3>Recur<a class="headerlink" href="#recur" title="Permalink to this headline"></a></h3>
<p>Now <code class="docutils literal notranslate"><span class="pre">R1</span></code> needs to apply <code class="docutils literal notranslate"><span class="pre">[BTree-iter]</span></code> to <code class="docutils literal notranslate"><span class="pre">left</span></code> and <code class="docutils literal notranslate"><span class="pre">right</span></code>. If
we drop the key and value from the node using <code class="docutils literal notranslate"><span class="pre">rest</span></code> twice we are left
with an interesting situation:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">key</span> <span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="n">R1</span>
<span class="n">key</span> <span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="p">[</span><span class="n">rest</span> <span class="n">rest</span><span class="p">]</span> <span class="n">dip</span>
<span class="n">key</span> <span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">rest</span> <span class="n">rest</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span>
<span class="n">key</span> <span class="p">[</span><span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span>
</pre></div>
</div>
<p>Hmm, will <code class="docutils literal notranslate"><span class="pre">step</span></code> do?</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">key</span> <span class="p">[</span><span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="n">step</span>
<span class="n">key</span> <span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span> <span class="p">[</span><span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="n">step</span>
<span class="n">key</span> <span class="n">left</span><span class="o">-</span><span class="n">keys</span> <span class="p">[</span><span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="n">step</span>
<span class="n">key</span> <span class="n">left</span><span class="o">-</span><span class="n">keys</span> <span class="n">right</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span>
<span class="n">key</span> <span class="n">left</span><span class="o">-</span><span class="n">keys</span> <span class="n">right</span><span class="o">-</span><span class="n">keys</span>
</pre></div>
</div>
<p>So:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">R1</span> <span class="o">==</span> <span class="p">[</span><span class="n">rest</span> <span class="n">rest</span><span class="p">]</span> <span class="n">dip</span> <span class="n">step</span>
</pre></div>
</div>
</div>
<div class="section" id="putting-it-together">
<h3>Putting it together<a class="headerlink" href="#putting-it-together" title="Permalink to this headline"></a></h3>
<p>We have:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="p">[[</span><span class="n">F</span><span class="p">]</span> <span class="n">dupdip</span><span class="p">]</span> <span class="p">[[</span><span class="n">rest</span> <span class="n">rest</span><span class="p">]</span> <span class="n">dip</span> <span class="n">step</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
<p>When I was reading this over I realized <code class="docutils literal notranslate"><span class="pre">rest</span> <span class="pre">rest</span></code> could go in
<code class="docutils literal notranslate"><span class="pre">R0</span></code>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="p">[[</span><span class="n">F</span><span class="p">]</span> <span class="n">dupdip</span> <span class="n">rest</span> <span class="n">rest</span><span class="p">]</span> <span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
<p>(And <code class="docutils literal notranslate"><span class="pre">[step]</span> <span class="pre">genrec</span></code> is such a cool and suggestive combinator!)</p>
</div>
<div class="section" id="parameterizing-the-f-per-node-processing-function">
<h3>Parameterizing the <code class="docutils literal notranslate"><span class="pre">F</span></code> per-node processing function.<a class="headerlink" href="#parameterizing-the-f-per-node-processing-function" title="Permalink to this headline"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="p">[[</span><span class="n">F</span><span class="p">]</span> <span class="n">dupdip</span> <span class="n">rest</span> <span class="n">rest</span><span class="p">]</span> <span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
<p>Working backward:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="p">[[</span><span class="n">F</span><span class="p">]</span> <span class="n">dupdip</span> <span class="n">rest</span> <span class="n">rest</span><span class="p">]</span> <span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="n">genrec</span>
<span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="p">[</span><span class="n">dupdip</span> <span class="n">rest</span> <span class="n">rest</span><span class="p">]</span> <span class="n">cons</span> <span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="n">genrec</span>
<span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="n">roll</span><span class="o">&lt;</span> <span class="p">[</span><span class="n">dupdip</span> <span class="n">rest</span> <span class="n">rest</span><span class="p">]</span> <span class="n">cons</span> <span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
<p>Ergo:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="n">roll</span><span class="o">&lt;</span> <span class="p">[</span><span class="n">dupdip</span> <span class="n">rest</span> <span class="n">rest</span><span class="p">]</span> <span class="n">cons</span> <span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="k">import</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">define</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">&#39;BTree-iter == [not] [pop] roll&lt; [dupdip rest rest] cons [step] genrec&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[] [23] BTree-iter&#39;</span><span class="p">)</span> <span class="c1"># It doesn&#39;t matter what F is as it won&#39;t be used.</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">nothing</span><span class="p">)</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[&quot;tommy&quot; 23 [] []] [first] BTree-iter&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">&#39;tommy&#39;</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[&quot;tommy&quot; 23 [&quot;richard&quot; 48 [] []] [&quot;jenny&quot; 18 [] []]] [first] BTree-iter&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">&#39;tommy&#39;</span> <span class="s1">&#39;richard&#39;</span> <span class="s1">&#39;jenny&#39;</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[&quot;tommy&quot; 23 [&quot;richard&quot; 48 [] []] [&quot;jenny&quot; 18 [] []]] [second] BTree-iter&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">23</span> <span class="mi">48</span> <span class="mi">18</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="adding-nodes-to-the-btree">
<h2>Adding Nodes to the BTree<a class="headerlink" href="#adding-nodes-to-the-btree" title="Permalink to this headline"></a></h2>
<p>Lets consider adding nodes to a BTree structure.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">BTree</span> <span class="n">value</span> <span class="n">key</span> <span class="n">BTree</span><span class="o">-</span><span class="n">add</span> <span class="o">==</span> <span class="n">BTree</span>
</pre></div>
</div>
<div class="section" id="adding-to-an-empty-node">
<h3>Adding to an empty node.<a class="headerlink" href="#adding-to-an-empty-node" title="Permalink to this headline"></a></h3>
<p>If the current node is <code class="docutils literal notranslate"><span class="pre">[]</span></code> then you just return
<code class="docutils literal notranslate"><span class="pre">[key</span> <span class="pre">value</span> <span class="pre">[]</span> <span class="pre">[]]</span></code>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span> <span class="o">==</span> <span class="p">[</span><span class="n">popop</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[[</span><span class="n">pop</span><span class="p">]</span> <span class="n">dipd</span> <span class="n">BTree</span><span class="o">-</span><span class="n">new</span><span class="p">]</span> <span class="p">[</span><span class="n">R0</span><span class="p">]</span> <span class="p">[</span><span class="n">R1</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
<p>Where <code class="docutils literal notranslate"><span class="pre">BTree-new</span></code> is:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">value</span> <span class="n">key</span> <span class="n">BTree</span><span class="o">-</span><span class="n">new</span> <span class="o">==</span> <span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="p">[]</span> <span class="p">[]]</span>
<span class="n">value</span> <span class="n">key</span> <span class="n">swap</span> <span class="p">[[]</span> <span class="p">[]]</span> <span class="n">cons</span> <span class="n">cons</span>
<span class="n">key</span> <span class="n">value</span> <span class="p">[[]</span> <span class="p">[]]</span> <span class="n">cons</span> <span class="n">cons</span>
<span class="n">key</span> <span class="p">[</span><span class="n">value</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="n">cons</span>
<span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="p">[]</span> <span class="p">[]]</span>
<span class="n">BTree</span><span class="o">-</span><span class="n">new</span> <span class="o">==</span> <span class="n">swap</span> <span class="p">[[]</span> <span class="p">[]]</span> <span class="n">cons</span> <span class="n">cons</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">&#39;BTree-new == swap [[] []] cons cons&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">&#39;&quot;v&quot; &quot;k&quot; BTree-new&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="n">BTree</span><span class="o">-</span><span class="n">new</span>
<span class="s1">&#39;v&#39;</span> <span class="o">.</span> <span class="s1">&#39;k&#39;</span> <span class="n">BTree</span><span class="o">-</span><span class="n">new</span>
<span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="o">.</span> <span class="n">BTree</span><span class="o">-</span><span class="n">new</span>
<span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="o">.</span> <span class="n">swap</span> <span class="p">[[]</span> <span class="p">[]]</span> <span class="n">cons</span> <span class="n">cons</span>
<span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="o">.</span> <span class="p">[[]</span> <span class="p">[]]</span> <span class="n">cons</span> <span class="n">cons</span>
<span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="p">[[]</span> <span class="p">[]]</span> <span class="o">.</span> <span class="n">cons</span> <span class="n">cons</span>
<span class="s1">&#39;k&#39;</span> <span class="p">[</span><span class="s1">&#39;v&#39;</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="o">.</span> <span class="n">cons</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="o">.</span>
</pre></div>
</div>
<p>(As an implementation detail, the <code class="docutils literal notranslate"><span class="pre">[[]</span> <span class="pre">[]]</span></code> literal used in the
definition of <code class="docutils literal notranslate"><span class="pre">BTree-new</span></code> will be reused to supply the <em>constant</em> tail
for <em>all</em> new nodes produced by it. This is one of those cases where you
get amortized storage “for free” by using <a class="reference external" href="https://en.wikipedia.org/wiki/Persistent_data_structure">persistent
datastructures</a>.
Because the tail, which is <code class="docutils literal notranslate"><span class="pre">((),</span> <span class="pre">((),</span> <span class="pre">()))</span></code> in Python, is immutable
and embedded in the definition body for <code class="docutils literal notranslate"><span class="pre">BTree-new</span></code>, all new nodes can
reuse it as their own tail without fear that some other code somewhere
will change it.)</p>
</div>
<div class="section" id="if-the-current-node-isn-t-empty">
<h3>If the current node isnt empty.<a class="headerlink" href="#if-the-current-node-isn-t-empty" title="Permalink to this headline"></a></h3>
<p>We now have to derive <code class="docutils literal notranslate"><span class="pre">R0</span></code> and <code class="docutils literal notranslate"><span class="pre">R1</span></code>, consider:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="n">R0</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">R1</span>
</pre></div>
</div>
<p>In this case, there are three possibilites: the key can be greater or
less than or equal to the nodes key. In two of those cases we will need
to apply a copy of <code class="docutils literal notranslate"><span class="pre">BTree-add</span></code>, so <code class="docutils literal notranslate"><span class="pre">R0</span></code> is pretty much out of the
picture.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">R0</span><span class="p">]</span> <span class="o">==</span> <span class="p">[]</span>
</pre></div>
</div>
</div>
<div class="section" id="a-predicate-to-compare-keys">
<h3>A predicate to compare keys.<a class="headerlink" href="#a-predicate-to-compare-keys" title="Permalink to this headline"></a></h3>
<p>The first thing we need to do is compare the the key were adding to see
if it is greater than the node key and <code class="docutils literal notranslate"><span class="pre">branch</span></code> accordingly, although
in this case its easier to write a destructive predicate and then use
<code class="docutils literal notranslate"><span class="pre">ifte</span></code> to apply it <code class="docutils literal notranslate"><span class="pre">nullary</span></code>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">R1</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="p">[</span><span class="n">P</span> <span class="o">&gt;</span><span class="p">]</span> <span class="p">[</span><span class="n">T</span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="n">ifte</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">P</span> <span class="o">&gt;</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">pop</span> <span class="n">roll</span><span class="o">&gt;</span> <span class="n">pop</span> <span class="n">first</span> <span class="o">&gt;</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="n">roll</span><span class="o">&gt;</span> <span class="n">pop</span> <span class="n">first</span> <span class="o">&gt;</span>
<span class="n">key</span> <span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">roll</span><span class="o">&gt;</span> <span class="n">pop</span> <span class="n">first</span> <span class="o">&gt;</span>
<span class="n">key</span> <span class="n">key_n</span> <span class="o">&gt;</span>
<span class="n">Boolean</span>
<span class="n">P</span> <span class="o">&gt;</span> <span class="o">==</span> <span class="n">pop</span> <span class="n">roll</span><span class="o">&gt;</span> <span class="n">pop</span> <span class="n">first</span> <span class="o">&gt;</span>
<span class="n">P</span> <span class="o">&lt;</span> <span class="o">==</span> <span class="n">pop</span> <span class="n">roll</span><span class="o">&gt;</span> <span class="n">pop</span> <span class="n">first</span> <span class="o">&lt;</span>
<span class="n">P</span> <span class="o">==</span> <span class="n">pop</span> <span class="n">roll</span><span class="o">&gt;</span> <span class="n">pop</span> <span class="n">first</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">&#39;P == pop roll&gt; pop first&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">&#39;[&quot;k&quot; &quot;v&quot; [] []] &quot;vv&quot; &quot;kk&quot; [0] P &gt;&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">P</span> <span class="o">&gt;</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="o">.</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">P</span> <span class="o">&gt;</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="s1">&#39;vv&#39;</span> <span class="o">.</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">P</span> <span class="o">&gt;</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="o">.</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">P</span> <span class="o">&gt;</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">.</span> <span class="n">P</span> <span class="o">&gt;</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">.</span> <span class="n">pop</span> <span class="n">roll</span><span class="o">&gt;</span> <span class="n">pop</span> <span class="n">first</span> <span class="o">&gt;</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="o">.</span> <span class="n">roll</span><span class="o">&gt;</span> <span class="n">pop</span> <span class="n">first</span> <span class="o">&gt;</span>
<span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="s1">&#39;vv&#39;</span> <span class="o">.</span> <span class="n">pop</span> <span class="n">first</span> <span class="o">&gt;</span>
<span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="o">.</span> <span class="n">first</span> <span class="o">&gt;</span>
<span class="s1">&#39;kk&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="o">.</span> <span class="o">&gt;</span>
<span class="kc">True</span> <span class="o">.</span>
</pre></div>
</div>
</div>
<div class="section" id="if-the-key-we-re-adding-is-greater-than-the-node-s-key">
<h3>If the key were adding is greater than the nodes key.<a class="headerlink" href="#if-the-key-we-re-adding-is-greater-than-the-node-s-key" title="Permalink to this headline"></a></h3>
<p>Here the parantheses are meant to signify that the right-hand side (RHS)
is not literal, the code in the parentheses is meant to have been
evaluated:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">T</span> <span class="o">==</span> <span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="p">(</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span> <span class="n">key</span> <span class="n">value</span> <span class="n">right</span><span class="p">)]</span>
</pre></div>
</div>
</div>
<div class="section" id="use-infra-on-k">
<h3>Use <code class="docutils literal notranslate"><span class="pre">infra</span></code> on <code class="docutils literal notranslate"><span class="pre">K</span></code>.<a class="headerlink" href="#use-infra-on-k" title="Permalink to this headline"></a></h3>
<p>So how do we do this? We know were going to want to use <code class="docutils literal notranslate"><span class="pre">infra</span></code> on
some function <code class="docutils literal notranslate"><span class="pre">K</span></code> that has the key and value to work with, as well as
the quoted copy of <code class="docutils literal notranslate"><span class="pre">BTree-add</span></code> to apply somehow:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">right</span> <span class="n">left</span> <span class="n">value_n</span> <span class="n">key_n</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">K</span>
<span class="o">...</span>
<span class="n">right</span> <span class="n">value</span> <span class="n">key</span> <span class="n">BTree</span><span class="o">-</span><span class="n">add</span> <span class="n">left</span> <span class="n">value_n</span> <span class="n">key_n</span>
</pre></div>
</div>
<p>Pretty easy:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">right</span> <span class="n">left</span> <span class="n">value_n</span> <span class="n">key_n</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">dipdd</span>
<span class="n">right</span> <span class="n">left</span> <span class="n">value_n</span> <span class="n">key_n</span> <span class="p">[</span><span class="n">value</span> <span class="n">key</span> <span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">dipdd</span>
<span class="n">right</span> <span class="n">value</span> <span class="n">key</span> <span class="n">BTree</span><span class="o">-</span><span class="n">add</span> <span class="n">left</span> <span class="n">value_n</span> <span class="n">key_n</span>
</pre></div>
</div>
<p>So:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">K</span> <span class="o">==</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">dipdd</span>
</pre></div>
</div>
<p>And:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">K</span><span class="p">]</span> <span class="n">infra</span>
</pre></div>
</div>
</div>
<div class="section" id="derive-t">
<h3>Derive <code class="docutils literal notranslate"><span class="pre">T</span></code>.<a class="headerlink" href="#derive-t" title="Permalink to this headline"></a></h3>
<p>So now were at getting from this to this:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">T</span>
<span class="o">...</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">K</span><span class="p">]</span> <span class="n">infra</span>
</pre></div>
</div>
<p>And so <code class="docutils literal notranslate"><span class="pre">T</span></code> is just:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">T</span> <span class="o">==</span> <span class="p">[</span><span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">K</span><span class="p">]</span> <span class="n">infra</span>
<span class="n">T</span> <span class="o">==</span> <span class="p">[</span> <span class="n">K</span><span class="p">]</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">infra</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">&#39;K == cons cons dipdd&#39;</span><span class="p">)</span>
<span class="n">define</span><span class="p">(</span><span class="s1">&#39;T == [K] cons cons cons infra&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">&#39;&quot;r&quot; &quot;l&quot; &quot;v&quot; &quot;k&quot; &quot;vv&quot; &quot;kk&quot; [0] K&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">K</span>
<span class="s1">&#39;r&#39;</span> <span class="o">.</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">K</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="o">.</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">K</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="o">.</span> <span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">K</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="o">.</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">K</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="o">.</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">K</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="o">.</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">K</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">.</span> <span class="n">K</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">.</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">dipdd</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="p">[</span><span class="s1">&#39;kk&#39;</span> <span class="mi">0</span><span class="p">]</span> <span class="o">.</span> <span class="n">cons</span> <span class="n">dipdd</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="p">[</span><span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="mi">0</span><span class="p">]</span> <span class="o">.</span> <span class="n">dipdd</span>
<span class="s1">&#39;r&#39;</span> <span class="o">.</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="mi">0</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="o">.</span> <span class="s1">&#39;kk&#39;</span> <span class="mi">0</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="o">.</span> <span class="mi">0</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="mi">0</span> <span class="o">.</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="mi">0</span> <span class="s1">&#39;l&#39;</span> <span class="o">.</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="mi">0</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="o">.</span> <span class="s1">&#39;k&#39;</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="mi">0</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="o">.</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">&#39;[&quot;k&quot; &quot;v&quot; &quot;l&quot; &quot;r&quot;] &quot;vv&quot; &quot;kk&quot; [0] T&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">T</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="o">.</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">T</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;vv&#39;</span> <span class="o">.</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">T</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="o">.</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">T</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">.</span> <span class="n">T</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">.</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">infra</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="o">.</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">infra</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[[</span><span class="mi">0</span><span class="p">]</span> <span class="n">K</span><span class="p">]</span> <span class="o">.</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">infra</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;vv&#39;</span> <span class="p">[</span><span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">K</span><span class="p">]</span> <span class="o">.</span> <span class="n">cons</span> <span class="n">infra</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="p">[</span><span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">K</span><span class="p">]</span> <span class="o">.</span> <span class="n">infra</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="o">.</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">K</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="o">.</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">K</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="o">.</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">K</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">.</span> <span class="n">K</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">.</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">dipdd</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="p">[</span><span class="s1">&#39;kk&#39;</span> <span class="mi">0</span><span class="p">]</span> <span class="o">.</span> <span class="n">cons</span> <span class="n">dipdd</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="p">[</span><span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="mi">0</span><span class="p">]</span> <span class="o">.</span> <span class="n">dipdd</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="o">.</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="mi">0</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="o">.</span> <span class="s1">&#39;kk&#39;</span> <span class="mi">0</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="o">.</span> <span class="mi">0</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="mi">0</span> <span class="o">.</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="mi">0</span> <span class="s1">&#39;l&#39;</span> <span class="o">.</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="mi">0</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="o">.</span> <span class="s1">&#39;k&#39;</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="mi">0</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="o">.</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="mi">0</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="p">[]</span> <span class="o">.</span> <span class="n">swaack</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="mi">0</span> <span class="s1">&#39;kk&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="o">.</span>
</pre></div>
</div>
</div>
<div class="section" id="if-the-key-we-re-adding-is-less-than-the-node-s-key">
<h3>If the key were adding is less than the nodes key.<a class="headerlink" href="#if-the-key-we-re-adding-is-less-than-the-node-s-key" title="Permalink to this headline"></a></h3>
<p>This is very very similar to the above:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">E</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="p">[</span><span class="n">P</span> <span class="o">&lt;</span><span class="p">]</span> <span class="p">[</span><span class="n">Te</span><span class="p">]</span> <span class="p">[</span><span class="n">Ee</span><span class="p">]</span> <span class="n">ifte</span>
</pre></div>
</div>
<p>In this case <code class="docutils literal notranslate"><span class="pre">Te</span></code> works that same as <code class="docutils literal notranslate"><span class="pre">T</span></code> but on the left child tree
instead of the right, so the only difference is that it must use
<code class="docutils literal notranslate"><span class="pre">dipd</span></code> instead of <code class="docutils literal notranslate"><span class="pre">dipdd</span></code>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Te</span> <span class="o">==</span> <span class="p">[</span><span class="n">cons</span> <span class="n">cons</span> <span class="n">dipd</span><span class="p">]</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">infra</span>
</pre></div>
</div>
<p>This suggests an alternate factorization:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ccons</span> <span class="o">==</span> <span class="n">cons</span> <span class="n">cons</span>
<span class="n">T</span> <span class="o">==</span> <span class="p">[</span><span class="n">ccons</span> <span class="n">dipdd</span><span class="p">]</span> <span class="n">ccons</span> <span class="n">cons</span> <span class="n">infra</span>
<span class="n">Te</span> <span class="o">==</span> <span class="p">[</span><span class="n">ccons</span> <span class="n">dipd</span><span class="p">]</span> <span class="n">ccons</span> <span class="n">cons</span> <span class="n">infra</span>
</pre></div>
</div>
<p>But whatever.</p>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">&#39;Te == [cons cons dipd] cons cons cons infra&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">&#39;[&quot;k&quot; &quot;v&quot; &quot;l&quot; &quot;r&quot;] &quot;vv&quot; &quot;kk&quot; [0] Te&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">Te</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="o">.</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">Te</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;vv&#39;</span> <span class="o">.</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">Te</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="o">.</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">Te</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">.</span> <span class="n">Te</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">.</span> <span class="p">[</span><span class="n">cons</span> <span class="n">cons</span> <span class="n">dipd</span><span class="p">]</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">infra</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="p">[</span><span class="n">cons</span> <span class="n">cons</span> <span class="n">dipd</span><span class="p">]</span> <span class="o">.</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">infra</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[[</span><span class="mi">0</span><span class="p">]</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">dipd</span><span class="p">]</span> <span class="o">.</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">infra</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;vv&#39;</span> <span class="p">[</span><span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">dipd</span><span class="p">]</span> <span class="o">.</span> <span class="n">cons</span> <span class="n">infra</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="p">[</span><span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">dipd</span><span class="p">]</span> <span class="o">.</span> <span class="n">infra</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="o">.</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">dipd</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="o">.</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">dipd</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="o">.</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">dipd</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">.</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">dipd</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="p">[</span><span class="s1">&#39;kk&#39;</span> <span class="mi">0</span><span class="p">]</span> <span class="o">.</span> <span class="n">cons</span> <span class="n">dipd</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="p">[</span><span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="mi">0</span><span class="p">]</span> <span class="o">.</span> <span class="n">dipd</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="o">.</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="mi">0</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="o">.</span> <span class="s1">&#39;kk&#39;</span> <span class="mi">0</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="o">.</span> <span class="mi">0</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="mi">0</span> <span class="o">.</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="mi">0</span> <span class="s1">&#39;v&#39;</span> <span class="o">.</span> <span class="s1">&#39;k&#39;</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="mi">0</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="o">.</span> <span class="p">[]</span> <span class="n">swaack</span>
<span class="s1">&#39;r&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;kk&#39;</span> <span class="mi">0</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="p">[]</span> <span class="o">.</span> <span class="n">swaack</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="mi">0</span> <span class="s1">&#39;kk&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="o">.</span>
</pre></div>
</div>
</div>
<div class="section" id="else-the-keys-must-be-equal">
<h3>Else the keys must be equal.<a class="headerlink" href="#else-the-keys-must-be-equal" title="Permalink to this headline"></a></h3>
<p>This means we must find:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">Ee</span>
<span class="o">...</span>
<span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span>
</pre></div>
</div>
<p>This is another easy one:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Ee</span> <span class="o">==</span> <span class="n">pop</span> <span class="n">swap</span> <span class="n">roll</span><span class="o">&lt;</span> <span class="n">rest</span> <span class="n">rest</span> <span class="n">cons</span> <span class="n">cons</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">pop</span> <span class="n">swap</span> <span class="n">roll</span><span class="o">&lt;</span> <span class="n">rest</span> <span class="n">rest</span> <span class="n">cons</span> <span class="n">cons</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="n">swap</span> <span class="n">roll</span><span class="o">&lt;</span> <span class="n">rest</span> <span class="n">rest</span> <span class="n">cons</span> <span class="n">cons</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">key</span> <span class="n">value</span> <span class="n">roll</span><span class="o">&lt;</span> <span class="n">rest</span> <span class="n">rest</span> <span class="n">cons</span> <span class="n">cons</span>
<span class="n">key</span> <span class="n">value</span> <span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">rest</span> <span class="n">rest</span> <span class="n">cons</span> <span class="n">cons</span>
<span class="n">key</span> <span class="n">value</span> <span class="p">[</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">cons</span> <span class="n">cons</span>
<span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">&#39;Ee == pop swap roll&lt; rest rest cons cons&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">&#39;[&quot;k&quot; &quot;v&quot; &quot;l&quot; &quot;r&quot;] &quot;vv&quot; &quot;k&quot; [0] Ee&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">Ee</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="o">.</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">Ee</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;vv&#39;</span> <span class="o">.</span> <span class="s1">&#39;k&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">Ee</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="o">.</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="n">Ee</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">.</span> <span class="n">Ee</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">.</span> <span class="n">pop</span> <span class="n">swap</span> <span class="n">roll</span><span class="o">&lt;</span> <span class="n">rest</span> <span class="n">rest</span> <span class="n">cons</span> <span class="n">cons</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;k&#39;</span> <span class="o">.</span> <span class="n">swap</span> <span class="n">roll</span><span class="o">&lt;</span> <span class="n">rest</span> <span class="n">rest</span> <span class="n">cons</span> <span class="n">cons</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="o">.</span> <span class="n">roll</span><span class="o">&lt;</span> <span class="n">rest</span> <span class="n">rest</span> <span class="n">cons</span> <span class="n">cons</span>
<span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="o">.</span> <span class="n">rest</span> <span class="n">rest</span> <span class="n">cons</span> <span class="n">cons</span>
<span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="p">[</span><span class="s1">&#39;v&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="o">.</span> <span class="n">rest</span> <span class="n">cons</span> <span class="n">cons</span>
<span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="p">[</span><span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="o">.</span> <span class="n">cons</span> <span class="n">cons</span>
<span class="s1">&#39;k&#39;</span> <span class="p">[</span><span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="o">.</span> <span class="n">cons</span>
<span class="p">[</span><span class="s1">&#39;k&#39;</span> <span class="s1">&#39;vv&#39;</span> <span class="s1">&#39;l&#39;</span> <span class="s1">&#39;r&#39;</span><span class="p">]</span> <span class="o">.</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">&#39;E == [P &lt;] [Te] [Ee] ifte&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="now-we-can-define-btree-add">
<h3>Now we can define <code class="docutils literal notranslate"><span class="pre">BTree-add</span></code><a class="headerlink" href="#now-we-can-define-btree-add" title="Permalink to this headline"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span> <span class="o">==</span> <span class="p">[</span><span class="n">popop</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[[</span><span class="n">pop</span><span class="p">]</span> <span class="n">dipd</span> <span class="n">BTree</span><span class="o">-</span><span class="n">new</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[[</span><span class="n">P</span> <span class="o">&gt;</span><span class="p">]</span> <span class="p">[</span><span class="n">T</span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="n">ifte</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
<p>Putting it all together:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">BTree</span><span class="o">-</span><span class="n">new</span> <span class="o">==</span> <span class="n">swap</span> <span class="p">[[]</span> <span class="p">[]]</span> <span class="n">cons</span> <span class="n">cons</span>
<span class="n">P</span> <span class="o">==</span> <span class="n">pop</span> <span class="n">roll</span><span class="o">&gt;</span> <span class="n">pop</span> <span class="n">first</span>
<span class="n">T</span> <span class="o">==</span> <span class="p">[</span><span class="n">cons</span> <span class="n">cons</span> <span class="n">dipdd</span><span class="p">]</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">infra</span>
<span class="n">Te</span> <span class="o">==</span> <span class="p">[</span><span class="n">cons</span> <span class="n">cons</span> <span class="n">dipd</span><span class="p">]</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">infra</span>
<span class="n">Ee</span> <span class="o">==</span> <span class="n">pop</span> <span class="n">swap</span> <span class="n">roll</span><span class="o">&lt;</span> <span class="n">rest</span> <span class="n">rest</span> <span class="n">cons</span> <span class="n">cons</span>
<span class="n">E</span> <span class="o">==</span> <span class="p">[</span><span class="n">P</span> <span class="o">&lt;</span><span class="p">]</span> <span class="p">[</span><span class="n">Te</span><span class="p">]</span> <span class="p">[</span><span class="n">Ee</span><span class="p">]</span> <span class="n">ifte</span>
<span class="n">BTree</span><span class="o">-</span><span class="n">add</span> <span class="o">==</span> <span class="p">[</span><span class="n">popop</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[[</span><span class="n">pop</span><span class="p">]</span> <span class="n">dipd</span> <span class="n">BTree</span><span class="o">-</span><span class="n">new</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[[</span><span class="n">P</span> <span class="o">&gt;</span><span class="p">]</span> <span class="p">[</span><span class="n">T</span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="n">ifte</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">&#39;BTree-add == [popop not] [[pop] dipd BTree-new] [] [[P &gt;] [T] [E] ifte] genrec&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[] 23 &quot;b&quot; BTree-add&#39;</span><span class="p">)</span> <span class="c1"># Initial</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">&#39;b&#39;</span> <span class="mi">23</span> <span class="p">[]</span> <span class="p">[]]</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[&quot;b&quot; 23 [] []] 88 &quot;c&quot; BTree-add&#39;</span><span class="p">)</span> <span class="c1"># Less than</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">&#39;b&#39;</span> <span class="mi">23</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">&#39;c&#39;</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]]</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[&quot;b&quot; 23 [] []] 88 &quot;a&quot; BTree-add&#39;</span><span class="p">)</span> <span class="c1"># Greater than</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">&#39;b&#39;</span> <span class="mi">23</span> <span class="p">[</span><span class="s1">&#39;a&#39;</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[]]</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[&quot;b&quot; 23 [] []] 88 &quot;b&quot; BTree-add&#39;</span><span class="p">)</span> <span class="c1"># Equal to</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">&#39;b&#39;</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[] 23 &quot;a&quot; BTree-add 88 &quot;b&quot; BTree-add 44 &quot;c&quot; BTree-add&#39;</span><span class="p">)</span> <span class="c1"># Series.</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">&#39;a&#39;</span> <span class="mi">23</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">&#39;b&#39;</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">&#39;c&#39;</span> <span class="mi">44</span> <span class="p">[]</span> <span class="p">[]]]]</span>
</pre></div>
</div>
</div>
<div class="section" id="a-set-like-datastructure">
<h3>A Set-Like Datastructure<a class="headerlink" href="#a-set-like-datastructure" title="Permalink to this headline"></a></h3>
<p>We can use this to make a set-like datastructure by just setting values
to e.g. 0 and ignoring them. Its set-like in that duplicate items added
to it will only occur once within it, and we can query it in
<cite>:math:`O(log_2 N)</cite> &lt;<a class="reference external" href="https://en.wikipedia.org/wiki/Binary_search_tree#cite_note-2">https://en.wikipedia.org/wiki/Binary_search_tree#cite_note-2</a>&gt;`__
time.</p>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[] [3 9 5 2 8 6 7 8 4] [0 swap BTree-add] step&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">9</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">5</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">8</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">6</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[</span><span class="mi">7</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]]</span> <span class="p">[]]]</span> <span class="p">[]]]</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">&#39;to_set == [] swap [0 swap BTree-add] step&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[3 9 5 2 8 6 7 8 4] to_set&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">9</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">5</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[</span><span class="mi">8</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">6</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[</span><span class="mi">7</span> <span class="mi">0</span> <span class="p">[]</span> <span class="p">[]]]</span> <span class="p">[]]]</span> <span class="p">[]]]</span>
</pre></div>
</div>
<p>And with that we can write a little program to remove duplicate items
from a list.</p>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">&#39;unique == [to_set [first] BTree-iter] cons run&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[3 9 3 5 2 9 8 8 8 6 2 7 8 4 3] unique&#39;</span><span class="p">)</span> <span class="c1"># Filter duplicate items.</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">7</span> <span class="mi">6</span> <span class="mi">8</span> <span class="mi">4</span> <span class="mi">5</span> <span class="mi">9</span> <span class="mi">2</span> <span class="mi">3</span><span class="p">]</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="interlude-the-cmp-combinator">
<h2>Interlude: The <code class="docutils literal notranslate"><span class="pre">cmp</span></code> combinator<a class="headerlink" href="#interlude-the-cmp-combinator" title="Permalink to this headline"></a></h2>
<p>Instead of all this mucking about with nested <code class="docutils literal notranslate"><span class="pre">ifte</span></code> lets just go
whole hog and define <code class="docutils literal notranslate"><span class="pre">cmp</span></code> which takes two values and three quoted
programs on the stack and runs one of the three depending on the results
of comparing the two values:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="n">a</span> <span class="n">b</span> <span class="p">[</span><span class="n">G</span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="p">[</span><span class="n">L</span><span class="p">]</span> <span class="nb">cmp</span>
<span class="o">-------------------------</span> <span class="n">a</span> <span class="o">&gt;</span> <span class="n">b</span>
<span class="n">G</span>
<span class="n">a</span> <span class="n">b</span> <span class="p">[</span><span class="n">G</span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="p">[</span><span class="n">L</span><span class="p">]</span> <span class="nb">cmp</span>
<span class="o">-------------------------</span> <span class="n">a</span> <span class="o">=</span> <span class="n">b</span>
<span class="n">E</span>
<span class="n">a</span> <span class="n">b</span> <span class="p">[</span><span class="n">G</span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="p">[</span><span class="n">L</span><span class="p">]</span> <span class="nb">cmp</span>
<span class="o">-------------------------</span> <span class="n">a</span> <span class="o">&lt;</span> <span class="n">b</span>
<span class="n">L</span>
</pre></div>
</div>
<p>We need a new non-destructive predicate <code class="docutils literal notranslate"><span class="pre">P</span></code>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">P</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">over</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">nullary</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">key</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">nullary</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">key</span> <span class="n">Q</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">key</span> <span class="n">popop</span> <span class="n">popop</span> <span class="n">first</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="n">popop</span> <span class="n">first</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">first</span>
<span class="n">key_n</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">key</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">nullary</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">key</span> <span class="n">key_n</span>
<span class="n">P</span> <span class="o">==</span> <span class="n">over</span> <span class="p">[</span><span class="n">popop</span> <span class="n">popop</span> <span class="n">first</span><span class="p">]</span> <span class="n">nullary</span>
</pre></div>
</div>
<p>Here are the definitions again, pruned and renamed in some cases:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">BTree</span><span class="o">-</span><span class="n">new</span> <span class="o">==</span> <span class="n">swap</span> <span class="p">[[]</span> <span class="p">[]]</span> <span class="n">cons</span> <span class="n">cons</span>
<span class="n">P</span> <span class="o">==</span> <span class="n">over</span> <span class="p">[</span><span class="n">popop</span> <span class="n">popop</span> <span class="n">first</span><span class="p">]</span> <span class="n">nullary</span>
<span class="n">T</span><span class="o">&gt;</span> <span class="o">==</span> <span class="p">[</span><span class="n">cons</span> <span class="n">cons</span> <span class="n">dipdd</span><span class="p">]</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">infra</span>
<span class="n">T</span><span class="o">&lt;</span> <span class="o">==</span> <span class="p">[</span><span class="n">cons</span> <span class="n">cons</span> <span class="n">dipd</span><span class="p">]</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">infra</span>
<span class="n">E</span> <span class="o">==</span> <span class="n">pop</span> <span class="n">swap</span> <span class="n">roll</span><span class="o">&lt;</span> <span class="n">rest</span> <span class="n">rest</span> <span class="n">cons</span> <span class="n">cons</span>
</pre></div>
</div>
<p>Using <code class="docutils literal notranslate"><span class="pre">cmp</span></code> to simplify <cite>our code above at
``R1`</cite> &lt;#If-the-current-node-isnt-empty.&gt;`__:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">R1</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">P</span> <span class="p">[</span><span class="n">T</span><span class="o">&gt;</span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="p">[</span><span class="n">T</span><span class="o">&lt;</span><span class="p">]</span> <span class="nb">cmp</span>
</pre></div>
</div>
<p>The line above becomes one of the three lines below:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">T</span><span class="o">&gt;</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">E</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">value</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span><span class="p">]</span> <span class="n">T</span><span class="o">&lt;</span>
</pre></div>
</div>
<p>The definition is a little longer but, I think, more elegant and easier
to understand:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">BTree</span><span class="o">-</span><span class="n">add</span> <span class="o">==</span> <span class="p">[</span><span class="n">popop</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[[</span><span class="n">pop</span><span class="p">]</span> <span class="n">dipd</span> <span class="n">BTree</span><span class="o">-</span><span class="n">new</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[</span><span class="n">P</span> <span class="p">[</span><span class="n">T</span><span class="o">&gt;</span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="p">[</span><span class="n">T</span><span class="o">&lt;</span><span class="p">]</span> <span class="nb">cmp</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">joy.library</span> <span class="k">import</span> <span class="n">FunctionWrapper</span>
<span class="kn">from</span> <span class="nn">joy.utils.stack</span> <span class="k">import</span> <span class="n">pushback</span>
<span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="k">import</span> <span class="n">D</span>
<span class="nd">@FunctionWrapper</span>
<span class="k">def</span> <span class="nf">cmp_</span><span class="p">(</span><span class="n">stack</span><span class="p">,</span> <span class="n">expression</span><span class="p">,</span> <span class="n">dictionary</span><span class="p">):</span>
<span class="n">L</span><span class="p">,</span> <span class="p">(</span><span class="n">E</span><span class="p">,</span> <span class="p">(</span><span class="n">G</span><span class="p">,</span> <span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">stack</span><span class="p">))))</span> <span class="o">=</span> <span class="n">stack</span>
<span class="n">expression</span> <span class="o">=</span> <span class="n">pushback</span><span class="p">(</span><span class="n">G</span> <span class="k">if</span> <span class="n">a</span> <span class="o">&gt;</span> <span class="n">b</span> <span class="k">else</span> <span class="n">L</span> <span class="k">if</span> <span class="n">a</span> <span class="o">&lt;</span> <span class="n">b</span> <span class="k">else</span> <span class="n">E</span><span class="p">,</span> <span class="n">expression</span><span class="p">)</span>
<span class="k">return</span> <span class="n">stack</span><span class="p">,</span> <span class="n">expression</span><span class="p">,</span> <span class="n">dictionary</span>
<span class="n">D</span><span class="p">[</span><span class="s1">&#39;cmp&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">cmp_</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">&quot;1 0 [&#39;G&#39;] [&#39;E&#39;] [&#39;L&#39;] cmp&quot;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">&#39;G&#39;</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">&quot;1 1 [&#39;G&#39;] [&#39;E&#39;] [&#39;L&#39;] cmp&quot;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">&#39;E&#39;</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s2">&quot;0 1 [&#39;G&#39;] [&#39;E&#39;] [&#39;L&#39;] cmp&quot;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">&#39;L&#39;</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">joy.library</span> <span class="k">import</span> <span class="n">DefinitionWrapper</span>
<span class="n">DefinitionWrapper</span><span class="o">.</span><span class="n">add_definitions</span><span class="p">(</span><span class="s1">&#39;&#39;&#39;</span>
<span class="s1">P == over [popop popop first] nullary</span>
<span class="s1">T&gt; == [cons cons dipdd] cons cons cons infra</span>
<span class="s1">T&lt; == [cons cons dipd] cons cons cons infra</span>
<span class="s1">E == pop swap roll&lt; rest rest cons cons</span>
<span class="s1">BTree-add == [popop not] [[pop] dipd BTree-new] [] [P [T&gt;] [E] [T&lt;] cmp] genrec</span>
<span class="s1">&#39;&#39;&#39;</span><span class="p">,</span> <span class="n">D</span><span class="p">)</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[] 23 &quot;b&quot; BTree-add&#39;</span><span class="p">)</span> <span class="c1"># Initial</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">&#39;b&#39;</span> <span class="mi">23</span> <span class="p">[]</span> <span class="p">[]]</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[&quot;b&quot; 23 [] []] 88 &quot;c&quot; BTree-add&#39;</span><span class="p">)</span> <span class="c1"># Less than</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">&#39;b&#39;</span> <span class="mi">23</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">&#39;c&#39;</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]]</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[&quot;b&quot; 23 [] []] 88 &quot;a&quot; BTree-add&#39;</span><span class="p">)</span> <span class="c1"># Greater than</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">&#39;b&#39;</span> <span class="mi">23</span> <span class="p">[</span><span class="s1">&#39;a&#39;</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]</span> <span class="p">[]]</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[&quot;b&quot; 23 [] []] 88 &quot;b&quot; BTree-add&#39;</span><span class="p">)</span> <span class="c1"># Equal to</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">&#39;b&#39;</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[]]</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[] 23 &quot;a&quot; BTree-add 88 &quot;b&quot; BTree-add 44 &quot;c&quot; BTree-add&#39;</span><span class="p">)</span> <span class="c1"># Series.</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">&#39;a&#39;</span> <span class="mi">23</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">&#39;b&#39;</span> <span class="mi">88</span> <span class="p">[]</span> <span class="p">[</span><span class="s1">&#39;c&#39;</span> <span class="mi">44</span> <span class="p">[]</span> <span class="p">[]]]]</span>
</pre></div>
</div>
</div>
<div class="section" id="interlude-factoring-and-naming">
<h2>Interlude: Factoring and Naming<a class="headerlink" href="#interlude-factoring-and-naming" title="Permalink to this headline"></a></h2>
<p>It may seem silly, but a big part of programming in Forth (and therefore
in Joy) is the idea of small, highly-factored definitions. If you choose
names carefully the resulting definitions can take on a semantic role.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">get</span><span class="o">-</span><span class="n">node</span><span class="o">-</span><span class="n">key</span> <span class="o">==</span> <span class="n">popop</span> <span class="n">popop</span> <span class="n">first</span>
<span class="n">remove</span><span class="o">-</span><span class="n">key</span><span class="o">-</span><span class="ow">and</span><span class="o">-</span><span class="n">value</span><span class="o">-</span><span class="n">from</span><span class="o">-</span><span class="n">node</span> <span class="o">==</span> <span class="n">rest</span> <span class="n">rest</span>
<span class="n">pack</span><span class="o">-</span><span class="n">key</span><span class="o">-</span><span class="ow">and</span><span class="o">-</span><span class="n">value</span> <span class="o">==</span> <span class="n">cons</span> <span class="n">cons</span>
<span class="n">prep</span><span class="o">-</span><span class="n">new</span><span class="o">-</span><span class="n">key</span><span class="o">-</span><span class="ow">and</span><span class="o">-</span><span class="n">value</span> <span class="o">==</span> <span class="n">pop</span> <span class="n">swap</span> <span class="n">roll</span><span class="o">&lt;</span>
<span class="n">pack</span><span class="o">-</span><span class="ow">and</span><span class="o">-</span><span class="n">apply</span> <span class="o">==</span> <span class="p">[</span><span class="n">pack</span><span class="o">-</span><span class="n">key</span><span class="o">-</span><span class="ow">and</span><span class="o">-</span><span class="n">value</span><span class="p">]</span> <span class="n">swoncat</span> <span class="n">cons</span> <span class="n">pack</span><span class="o">-</span><span class="n">key</span><span class="o">-</span><span class="ow">and</span><span class="o">-</span><span class="n">value</span> <span class="n">infra</span>
<span class="n">BTree</span><span class="o">-</span><span class="n">new</span> <span class="o">==</span> <span class="n">swap</span> <span class="p">[[]</span> <span class="p">[]]</span> <span class="n">pack</span><span class="o">-</span><span class="n">key</span><span class="o">-</span><span class="ow">and</span><span class="o">-</span><span class="n">value</span>
<span class="n">P</span> <span class="o">==</span> <span class="n">over</span> <span class="p">[</span><span class="n">get</span><span class="o">-</span><span class="n">node</span><span class="o">-</span><span class="n">key</span><span class="p">]</span> <span class="n">nullary</span>
<span class="n">T</span><span class="o">&gt;</span> <span class="o">==</span> <span class="p">[</span><span class="n">dipdd</span><span class="p">]</span> <span class="n">pack</span><span class="o">-</span><span class="ow">and</span><span class="o">-</span><span class="n">apply</span>
<span class="n">T</span><span class="o">&lt;</span> <span class="o">==</span> <span class="p">[</span><span class="n">dipd</span><span class="p">]</span> <span class="n">pack</span><span class="o">-</span><span class="ow">and</span><span class="o">-</span><span class="n">apply</span>
<span class="n">E</span> <span class="o">==</span> <span class="n">prep</span><span class="o">-</span><span class="n">new</span><span class="o">-</span><span class="n">key</span><span class="o">-</span><span class="ow">and</span><span class="o">-</span><span class="n">value</span> <span class="n">remove</span><span class="o">-</span><span class="n">key</span><span class="o">-</span><span class="ow">and</span><span class="o">-</span><span class="n">value</span><span class="o">-</span><span class="n">from</span><span class="o">-</span><span class="n">node</span> <span class="n">pack</span><span class="o">-</span><span class="n">key</span><span class="o">-</span><span class="ow">and</span><span class="o">-</span><span class="n">value</span>
</pre></div>
</div>
</div>
<div class="section" id="a-version-of-btree-iter-that-does-in-order-traversal">
<h2>A Version of <code class="docutils literal notranslate"><span class="pre">BTree-iter</span></code> that does In-Order Traversal<a class="headerlink" href="#a-version-of-btree-iter-that-does-in-order-traversal" title="Permalink to this headline"></a></h2>
<p>If you look back to the <cite>non-empty case of the ``BTree-iter`</cite>
function &lt;#Node-case-%5Bkey-value-left-right%5D&gt;`__ we can design a
varient that first processes the left child, then the current node, then
the right child. This will allow us to traverse the tree in sort order.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="p">[</span><span class="n">R0</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="n">R1</span><span class="p">]</span> <span class="n">ifte</span>
</pre></div>
</div>
<p>To define <code class="docutils literal notranslate"><span class="pre">R0</span></code> and <code class="docutils literal notranslate"><span class="pre">R1</span></code> it helps to look at them as they will appear
when they run:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">R0</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="n">R1</span>
</pre></div>
</div>
<div class="section" id="process-the-left-child">
<h3>Process the left child.<a class="headerlink" href="#process-the-left-child" title="Permalink to this headline"></a></h3>
<p>Staring at this for a bit suggests <code class="docutils literal notranslate"><span class="pre">dup</span> <span class="pre">third</span></code> to start:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">R0</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="n">R1</span>
<span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">dup</span> <span class="n">third</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="n">R1</span>
<span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">left</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="n">R1</span>
</pre></div>
</div>
<p>Now maybe:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">left</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="p">[</span><span class="n">cons</span> <span class="n">dip</span><span class="p">]</span> <span class="n">dupdip</span>
<span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">left</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="n">cons</span> <span class="n">dip</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span>
<span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="n">dip</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span>
<span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span> <span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span>
</pre></div>
</div>
</div>
<div class="section" id="process-the-current-node">
<h3>Process the current node.<a class="headerlink" href="#process-the-current-node" title="Permalink to this headline"></a></h3>
<p>So far, so good. Now we need to process the current nodes values:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span> <span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="p">[[</span><span class="n">F</span><span class="p">]</span> <span class="n">dupdip</span><span class="p">]</span> <span class="n">dip</span>
<span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span> <span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">dupdip</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span>
<span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span> <span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">F</span> <span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span>
</pre></div>
</div>
<p>If <code class="docutils literal notranslate"><span class="pre">F</span></code> needs items from the stack below the left stuff it should have
<code class="docutils literal notranslate"><span class="pre">cons</span></code>d them before beginning maybe? For functions like <code class="docutils literal notranslate"><span class="pre">first</span></code> it
works fine as-is.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span> <span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">first</span> <span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span>
<span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span> <span class="n">key</span> <span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span>
</pre></div>
</div>
</div>
<div class="section" id="process-the-right-child">
<h3>Process the right child.<a class="headerlink" href="#process-the-right-child" title="Permalink to this headline"></a></h3>
<p>First ditch the rest of the node and get the right child:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span> <span class="n">key</span> <span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="p">[</span><span class="n">rest</span> <span class="n">rest</span> <span class="n">rest</span> <span class="n">first</span><span class="p">]</span> <span class="n">dip</span>
<span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span> <span class="n">key</span> <span class="n">right</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span>
</pre></div>
</div>
<p>Then, of course, we just need <code class="docutils literal notranslate"><span class="pre">i</span></code> to run <code class="docutils literal notranslate"><span class="pre">BTree-iter-order</span></code> on the
right side:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span> <span class="n">key</span> <span class="n">right</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="n">i</span>
<span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span> <span class="n">key</span> <span class="n">right</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span>
</pre></div>
</div>
</div>
<div class="section" id="defining-btree-iter-order">
<h3>Defining <code class="docutils literal notranslate"><span class="pre">BTree-iter-order</span></code><a class="headerlink" href="#defining-btree-iter-order" title="Permalink to this headline"></a></h3>
<p>The result is a little awkward:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">R1</span> <span class="o">==</span> <span class="p">[</span><span class="n">cons</span> <span class="n">dip</span><span class="p">]</span> <span class="n">dupdip</span> <span class="p">[[</span><span class="n">F</span><span class="p">]</span> <span class="n">dupdip</span><span class="p">]</span> <span class="n">dip</span> <span class="p">[</span><span class="n">rest</span> <span class="n">rest</span> <span class="n">rest</span> <span class="n">first</span><span class="p">]</span> <span class="n">dip</span> <span class="n">i</span>
</pre></div>
</div>
<p>Lets do a little semantic factoring:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">fourth</span> <span class="o">==</span> <span class="n">rest</span> <span class="n">rest</span> <span class="n">rest</span> <span class="n">first</span>
<span class="n">proc_left</span> <span class="o">==</span> <span class="p">[</span><span class="n">cons</span> <span class="n">dip</span><span class="p">]</span> <span class="n">dupdip</span>
<span class="n">proc_current</span> <span class="o">==</span> <span class="p">[[</span><span class="n">F</span><span class="p">]</span> <span class="n">dupdip</span><span class="p">]</span> <span class="n">dip</span>
<span class="n">proc_right</span> <span class="o">==</span> <span class="p">[</span><span class="n">fourth</span><span class="p">]</span> <span class="n">dip</span> <span class="n">i</span>
<span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="p">[</span><span class="n">dup</span> <span class="n">third</span><span class="p">]</span> <span class="p">[</span><span class="n">proc_left</span> <span class="n">proc_current</span> <span class="n">proc_right</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
<p>Now we can sort sequences.</p>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">&#39;BTree-iter-order == [not] [pop] [dup third] [[cons dip] dupdip [[first] dupdip] dip [rest rest rest first] dip i] genrec&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[3 9 5 2 8 6 7 8 4] to_set BTree-iter-order&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span> <span class="mi">6</span> <span class="mi">7</span> <span class="mi">8</span> <span class="mi">9</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="getting-values-by-key">
<h2>Getting values by key<a class="headerlink" href="#getting-values-by-key" title="Permalink to this headline"></a></h2>
<p>Lets derive a function that accepts a tree and a key and returns the
value associated with that key.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="n">tree</span> <span class="n">key</span> <span class="n">BTree</span><span class="o">-</span><span class="n">get</span>
<span class="o">------------------------</span>
<span class="n">value</span>
</pre></div>
</div>
<div class="section" id="the-base-case">
<h3>The base case <code class="docutils literal notranslate"><span class="pre">[]</span></code><a class="headerlink" href="#the-base-case" title="Permalink to this headline"></a></h3>
<p>As before, the stopping predicate just has to detect the empty list:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">BTree</span><span class="o">-</span><span class="n">get</span> <span class="o">==</span> <span class="p">[</span><span class="n">pop</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="p">[</span><span class="n">R0</span><span class="p">]</span> <span class="p">[</span><span class="n">R1</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
<p>But what do we do if the key isnt in the tree? In Python we might raise
a <code class="docutils literal notranslate"><span class="pre">KeyError</span></code> but Id like to avoid exceptions in Joy if possible, and
here I think its possible. (Division by zero is an example of where I
think its probably better to let Python crash Joy. Sometimes the
machinery fails and you have to “stop the line”, methinks.)</p>
<p>Lets pass the buck to the caller by making the base case a given, you
have to decide for yourself what <code class="docutils literal notranslate"><span class="pre">[E]</span></code> should be.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="n">tree</span> <span class="n">key</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="n">BTree</span><span class="o">-</span><span class="n">get</span>
<span class="o">----------------------------</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">tree</span>
<span class="n">value</span>
<span class="n">tree</span> <span class="n">key</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="n">BTree</span><span class="o">-</span><span class="n">get</span>
<span class="o">----------------------------</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">tree</span>
<span class="n">tree</span> <span class="n">key</span> <span class="n">E</span>
</pre></div>
</div>
<p>Now we define:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">BTree</span><span class="o">-</span><span class="n">get</span> <span class="o">==</span> <span class="p">[</span><span class="n">pop</span> <span class="ow">not</span><span class="p">]</span> <span class="n">swap</span> <span class="p">[</span><span class="n">R0</span><span class="p">]</span> <span class="p">[</span><span class="n">R1</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
<p>Note that this <code class="docutils literal notranslate"><span class="pre">BTree-get</span></code> creates a slightly different function than
itself and <em>that function</em> does the actual recursion. This kind of
higher-level programming is unusual in most languages but natural in
Joy.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">tree</span> <span class="n">key</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="ow">not</span><span class="p">]</span> <span class="n">swap</span> <span class="p">[</span><span class="n">R0</span><span class="p">]</span> <span class="p">[</span><span class="n">R1</span><span class="p">]</span> <span class="n">genrec</span>
<span class="n">tree</span> <span class="n">key</span> <span class="p">[</span><span class="n">pop</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="p">[</span><span class="n">R0</span><span class="p">]</span> <span class="p">[</span><span class="n">R1</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
<p>The anonymous specialized recursive function that will do the real work.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">pop</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="p">[</span><span class="n">R0</span><span class="p">]</span> <span class="p">[</span><span class="n">R1</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
</div>
<div class="section" id="id1">
<h3>Node case <code class="docutils literal notranslate"><span class="pre">[key</span> <span class="pre">value</span> <span class="pre">left</span> <span class="pre">right]</span></code><a class="headerlink" href="#id1" title="Permalink to this headline"></a></h3>
<p>Now we need to figure out <code class="docutils literal notranslate"><span class="pre">R0</span></code> and <code class="docutils literal notranslate"><span class="pre">R1</span></code>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">key</span> <span class="n">R0</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">get</span><span class="p">]</span> <span class="n">R1</span>
</pre></div>
</div>
<p>We want to compare the search key with the key in the node, and if they
are the same return the value and if they differ then recurse on one of
the child nodes. So its very similar to the above funtion, with
<code class="docutils literal notranslate"><span class="pre">[R0]</span> <span class="pre">==</span> <span class="pre">[]</span></code> and <code class="docutils literal notranslate"><span class="pre">R1</span> <span class="pre">==</span> <span class="pre">P</span> <span class="pre">[T&gt;]</span> <span class="pre">[E]</span> <span class="pre">[T&lt;]</span> <span class="pre">cmp</span></code>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">get</span><span class="p">]</span> <span class="n">P</span> <span class="p">[</span><span class="n">T</span><span class="o">&gt;</span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="p">[</span><span class="n">T</span><span class="o">&lt;</span><span class="p">]</span> <span class="nb">cmp</span>
</pre></div>
</div>
<p>So:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">get</span><span class="o">-</span><span class="n">node</span><span class="o">-</span><span class="n">key</span> <span class="o">==</span> <span class="n">pop</span> <span class="n">popop</span> <span class="n">first</span>
<span class="n">P</span> <span class="o">==</span> <span class="n">over</span> <span class="p">[</span><span class="n">get</span><span class="o">-</span><span class="n">node</span><span class="o">-</span><span class="n">key</span><span class="p">]</span> <span class="n">nullary</span>
</pre></div>
</div>
<p>The only difference is that <code class="docutils literal notranslate"><span class="pre">get-node-key</span></code> does one less <code class="docutils literal notranslate"><span class="pre">pop</span></code>
because theres no value to discard. Now we have to derive the branches:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">get</span><span class="p">]</span> <span class="n">T</span><span class="o">&gt;</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">get</span><span class="p">]</span> <span class="n">E</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">get</span><span class="p">]</span> <span class="n">T</span><span class="o">&lt;</span>
</pre></div>
</div>
<p>The cases of <code class="docutils literal notranslate"><span class="pre">T&gt;</span></code> and <code class="docutils literal notranslate"><span class="pre">T&lt;</span></code> are similar to above but instead of using
<code class="docutils literal notranslate"><span class="pre">infra</span></code> we have to discard the rest of the structure:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">get</span><span class="p">]</span> <span class="n">T</span><span class="o">&gt;</span> <span class="o">==</span> <span class="n">right</span> <span class="n">key</span> <span class="n">BTree</span><span class="o">-</span><span class="n">get</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">get</span><span class="p">]</span> <span class="n">T</span><span class="o">&lt;</span> <span class="o">==</span> <span class="n">left</span> <span class="n">key</span> <span class="n">BTree</span><span class="o">-</span><span class="n">get</span>
</pre></div>
</div>
<p>So:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">T</span><span class="o">&gt;</span> <span class="o">==</span> <span class="p">[</span><span class="n">fourth</span><span class="p">]</span> <span class="n">dipd</span> <span class="n">i</span>
<span class="n">T</span><span class="o">&lt;</span> <span class="o">==</span> <span class="p">[</span><span class="n">third</span><span class="p">]</span> <span class="n">dipd</span> <span class="n">i</span>
</pre></div>
</div>
<p>E.g.:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">get</span><span class="p">]</span> <span class="p">[</span><span class="n">fourth</span><span class="p">]</span> <span class="n">dipd</span> <span class="n">i</span>
<span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">fourth</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">get</span><span class="p">]</span> <span class="n">i</span>
<span class="n">right</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">get</span><span class="p">]</span> <span class="n">i</span>
<span class="n">right</span> <span class="n">key</span> <span class="n">BTree</span><span class="o">-</span><span class="n">get</span>
</pre></div>
</div>
<p>And:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key_n</span> <span class="n">value_n</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">key</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="n">get</span><span class="p">]</span> <span class="n">E</span> <span class="o">==</span> <span class="n">value_n</span>
<span class="n">E</span> <span class="o">==</span> <span class="n">popop</span> <span class="n">second</span>
</pre></div>
</div>
<p>So:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">fourth</span> <span class="o">==</span> <span class="n">rest</span> <span class="n">rest</span> <span class="n">rest</span> <span class="n">first</span>
<span class="n">get</span><span class="o">-</span><span class="n">node</span><span class="o">-</span><span class="n">key</span> <span class="o">==</span> <span class="n">pop</span> <span class="n">popop</span> <span class="n">first</span>
<span class="n">P</span> <span class="o">==</span> <span class="n">over</span> <span class="p">[</span><span class="n">get</span><span class="o">-</span><span class="n">node</span><span class="o">-</span><span class="n">key</span><span class="p">]</span> <span class="n">nullary</span>
<span class="n">T</span><span class="o">&gt;</span> <span class="o">==</span> <span class="p">[</span><span class="n">fourth</span><span class="p">]</span> <span class="n">dipd</span> <span class="n">i</span>
<span class="n">T</span><span class="o">&lt;</span> <span class="o">==</span> <span class="p">[</span><span class="n">third</span><span class="p">]</span> <span class="n">dipd</span> <span class="n">i</span>
<span class="n">E</span> <span class="o">==</span> <span class="n">popop</span> <span class="n">second</span>
<span class="n">BTree</span><span class="o">-</span><span class="n">get</span> <span class="o">==</span> <span class="p">[</span><span class="n">pop</span> <span class="ow">not</span><span class="p">]</span> <span class="n">swap</span> <span class="p">[]</span> <span class="p">[</span><span class="n">P</span> <span class="p">[</span><span class="n">T</span><span class="o">&gt;</span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="p">[</span><span class="n">T</span><span class="o">&lt;</span><span class="p">]</span> <span class="nb">cmp</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1"># I don&#39;t want to deal with name conflicts with the above so I&#39;m inlining everything here.</span>
<span class="c1"># The original Joy system has &quot;hide&quot; which is a meta-command which allows you to use named</span>
<span class="c1"># definitions that are only in scope for a given definition. I don&#39;t want to implement</span>
<span class="c1"># that (yet) so...</span>
<span class="n">define</span><span class="p">(</span><span class="s1">&#39;&#39;&#39;</span>
<span class="s1">BTree-get == [pop not] swap [] [</span>
<span class="s1"> over [pop popop first] nullary</span>
<span class="s1"> [[rest rest rest first] dipd i]</span>
<span class="s1"> [popop second]</span>
<span class="s1"> [[third] dipd i]</span>
<span class="s1"> cmp</span>
<span class="s1"> ] genrec</span>
<span class="s1">&#39;&#39;&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[] &quot;gary&quot; [popop &quot;err&quot;] BTree-get&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="s1">&#39;err&#39;</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[&quot;gary&quot; 23 [] []] &quot;gary&quot; [popop &quot;err&quot;] BTree-get&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">23</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;&#39;&#39;</span>
<span class="s1"> [] [[0 &#39;a&#39;] [1 &#39;b&#39;] [2 &#39;c&#39;]] [i BTree-add] step</span>
<span class="s1"> &#39;c&#39; [popop &#39;not found&#39;] BTree-get</span>
<span class="s1">&#39;&#39;&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">2</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="todo-btree-delete">
<h2>TODO: BTree-delete<a class="headerlink" href="#todo-btree-delete" title="Permalink to this headline"></a></h2>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="n">tree</span> <span class="n">key</span> <span class="p">[</span><span class="n">Er</span><span class="p">]</span> <span class="n">BTree</span><span class="o">-</span><span class="n">delete</span>
<span class="o">--------------------------------</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">tree</span>
<span class="n">tree</span>
<span class="n">tree</span> <span class="n">key</span> <span class="p">[</span><span class="n">Er</span><span class="p">]</span> <span class="n">BTree</span><span class="o">-</span><span class="n">delete</span>
<span class="o">--------------------------------</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">tree</span>
<span class="n">tree</span> <span class="n">key</span> <span class="n">Er</span>
</pre></div>
</div>
<p>So:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">BTree</span><span class="o">-</span><span class="n">Delete</span> <span class="o">==</span> <span class="p">[</span><span class="n">pop</span> <span class="ow">not</span><span class="p">]</span> <span class="n">swap</span> <span class="p">[</span><span class="n">R0</span><span class="p">]</span> <span class="p">[</span><span class="n">R1</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="p">[</span><span class="n">Er</span><span class="p">]</span> <span class="n">BTree</span><span class="o">-</span><span class="n">delete</span>
<span class="o">------------------------------------</span>
<span class="p">[</span><span class="n">pop</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">Er</span><span class="p">]</span> <span class="p">[</span><span class="n">R0</span><span class="p">]</span> <span class="p">[</span><span class="n">R1</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
<p>Now we get to figure out the recursive case:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">D</span> <span class="o">==</span> <span class="p">[</span><span class="n">pop</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">Er</span><span class="p">]</span> <span class="p">[</span><span class="n">R0</span><span class="p">]</span> <span class="p">[</span><span class="n">R1</span><span class="p">]</span> <span class="n">genrec</span>
<span class="p">[</span><span class="n">node_key</span> <span class="n">node_value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">key</span> <span class="n">R0</span> <span class="p">[</span><span class="n">D</span><span class="p">]</span> <span class="n">R1</span>
<span class="p">[</span><span class="n">node_key</span> <span class="n">node_value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">key</span> <span class="n">over</span> <span class="n">first</span> <span class="n">swap</span> <span class="n">dup</span> <span class="p">[</span><span class="n">D</span><span class="p">]</span> <span class="n">R1</span>
<span class="p">[</span><span class="n">node_key</span> <span class="n">node_value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">node_key</span> <span class="n">key</span> <span class="n">key</span> <span class="p">[</span><span class="n">D</span><span class="p">]</span> <span class="n">R1</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">node_key</span> <span class="n">node_value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">node_key</span> <span class="n">key</span> <span class="n">key</span> <span class="p">[</span><span class="n">D</span><span class="p">]</span> <span class="n">R1</span>
<span class="p">[</span><span class="n">node_key</span> <span class="n">node_value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">node_key</span> <span class="n">key</span> <span class="n">key</span> <span class="p">[</span><span class="n">D</span><span class="p">]</span> <span class="n">cons</span> <span class="n">roll</span><span class="o">&gt;</span> <span class="p">[</span><span class="n">T</span><span class="o">&gt;</span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="p">[</span><span class="n">T</span><span class="o">&lt;</span><span class="p">]</span> <span class="nb">cmp</span>
<span class="p">[</span><span class="n">node_key</span> <span class="n">node_value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">node_key</span> <span class="n">key</span> <span class="p">[</span><span class="n">key</span> <span class="n">D</span><span class="p">]</span> <span class="n">roll</span><span class="o">&gt;</span> <span class="p">[</span><span class="n">T</span><span class="o">&gt;</span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="p">[</span><span class="n">T</span><span class="o">&lt;</span><span class="p">]</span> <span class="nb">cmp</span>
<span class="p">[</span><span class="n">node_key</span> <span class="n">node_value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">key</span> <span class="n">D</span><span class="p">]</span> <span class="n">node_key</span> <span class="n">key</span> <span class="p">[</span><span class="n">T</span><span class="o">&gt;</span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="p">[</span><span class="n">T</span><span class="o">&lt;</span><span class="p">]</span> <span class="nb">cmp</span>
</pre></div>
</div>
<p>Now this:;</p>
<blockquote>
<div>[node_key node_value left right] [key D] node_key key [T&gt;] [E] [T&lt;] cmp</div></blockquote>
<p>Becomes one of these three:;</p>
<blockquote>
<div>[node_key node_value left right] [key D] T&gt;
[node_key node_value left right] [key D] E
[node_key node_value left right] [key D] T&lt;</div></blockquote>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="p">[</span><span class="n">node_key</span> <span class="n">node_value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">key</span> <span class="n">D</span><span class="p">]</span> <span class="n">T</span><span class="o">&gt;</span>
<span class="o">-------------------------------------------------</span>
<span class="p">[</span><span class="n">node_key</span> <span class="n">node_value</span> <span class="n">left</span> <span class="n">key</span> <span class="n">D</span> <span class="n">right</span><span class="p">]</span>
<span class="n">right</span> <span class="n">left</span> <span class="n">node_value</span> <span class="n">node_key</span> <span class="p">[</span><span class="n">key</span> <span class="n">D</span><span class="p">]</span> <span class="n">dipd</span>
<span class="p">[</span><span class="n">node_key</span> <span class="n">node_value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">key</span> <span class="n">D</span><span class="p">]</span> <span class="p">[</span><span class="n">dipd</span><span class="p">]</span> <span class="n">cons</span> <span class="n">infra</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">T</span><span class="o">&gt;</span> <span class="o">==</span> <span class="p">[</span><span class="n">dipd</span><span class="p">]</span> <span class="n">cons</span> <span class="n">infra</span>
<span class="n">T</span><span class="o">&lt;</span> <span class="o">==</span> <span class="p">[</span><span class="n">dipdd</span><span class="p">]</span> <span class="n">cons</span> <span class="n">infra</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">node_key</span> <span class="n">node_value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">key</span> <span class="n">D</span><span class="p">]</span> <span class="n">E</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">delete</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Return a tree with the value (and key) removed or raise KeyError if</span>
<span class="sd"> not found.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">node</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">KeyError</span><span class="p">,</span> <span class="n">key</span>
<span class="n">node_key</span><span class="p">,</span> <span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="n">lower</span><span class="p">,</span> <span class="p">(</span><span class="n">higher</span><span class="p">,</span> <span class="n">_</span><span class="p">)))</span> <span class="o">=</span> <span class="n">node</span>
<span class="k">if</span> <span class="n">key</span> <span class="o">&lt;</span> <span class="n">node_key</span><span class="p">:</span>
<span class="k">return</span> <span class="n">node_key</span><span class="p">,</span> <span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="n">delete</span><span class="p">(</span><span class="n">lower</span><span class="p">,</span> <span class="n">key</span><span class="p">),</span> <span class="p">(</span><span class="n">higher</span><span class="p">,</span> <span class="p">())))</span>
<span class="k">if</span> <span class="n">key</span> <span class="o">&gt;</span> <span class="n">node_key</span><span class="p">:</span>
<span class="k">return</span> <span class="n">node_key</span><span class="p">,</span> <span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="n">lower</span><span class="p">,</span> <span class="p">(</span><span class="n">delete</span><span class="p">(</span><span class="n">higher</span><span class="p">,</span> <span class="n">key</span><span class="p">),</span> <span class="p">())))</span>
<span class="c1"># So, key == node_key, delete this node itself.</span>
<span class="c1"># If we only have one non-empty child node return it. If both child</span>
<span class="c1"># nodes are empty return an empty node (one of the children.)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">lower</span><span class="p">:</span>
<span class="k">return</span> <span class="n">higher</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">higher</span><span class="p">:</span>
<span class="k">return</span> <span class="n">lower</span>
<span class="c1"># If both child nodes are non-empty, we find the highest node in our</span>
<span class="c1"># lower sub-tree, take its key and value to replace (delete) our own,</span>
<span class="c1"># then get rid of it by recursively calling delete() on our lower</span>
<span class="c1"># sub-node with our new key.</span>
<span class="c1"># (We could also find the lowest node in our higher sub-tree and take</span>
<span class="c1"># its key and value and delete it. I only implemented one of these</span>
<span class="c1"># two symmetrical options. Over a lot of deletions this might make</span>
<span class="c1"># the tree more unbalanced. Oh well.)</span>
<span class="n">node</span> <span class="o">=</span> <span class="n">lower</span>
<span class="k">while</span> <span class="n">node</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]:</span>
<span class="n">node</span> <span class="o">=</span> <span class="n">node</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">node</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">node</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="k">return</span> <span class="n">key</span><span class="p">,</span> <span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="n">delete</span><span class="p">(</span><span class="n">lower</span><span class="p">,</span> <span class="n">key</span><span class="p">),</span> <span class="p">(</span><span class="n">higher</span><span class="p">,</span> <span class="p">())))</span>
</pre></div>
</div>
</div>
<div class="section" id="tree-with-node-and-list-of-trees">
<h2>Tree with node and list of trees.<a class="headerlink" href="#tree-with-node-and-list-of-trees" title="Permalink to this headline"></a></h2>
<p>Once we have add, get, and delete we can see about abstracting
them.</p>
<p>Lets consider a tree structure, similar to one described <a class="reference external" href="https://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf">“Why
functional programming matters” by John
Hughes</a>,
that consists of a node value and a sequence of zero or more child
trees. (The asterisk is meant to indicate the <a class="reference external" href="https://en.wikipedia.org/wiki/Kleene_star">Kleene
star</a>.)</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">tree</span> <span class="o">=</span> <span class="p">[]</span> <span class="o">|</span> <span class="p">[</span><span class="n">node</span> <span class="p">[</span><span class="n">tree</span><span class="o">*</span><span class="p">]]</span>
</pre></div>
</div>
<div class="section" id="treestep">
<h3><code class="docutils literal notranslate"><span class="pre">treestep</span></code><a class="headerlink" href="#treestep" title="Permalink to this headline"></a></h3>
<p>In the spirit of <code class="docutils literal notranslate"><span class="pre">step</span></code> we are going to define a combinator
<code class="docutils literal notranslate"><span class="pre">treestep</span></code> which expects a tree and three additional items: a
base-case value <code class="docutils literal notranslate"><span class="pre">z</span></code>, and two quoted programs <code class="docutils literal notranslate"><span class="pre">[C]</span></code> and <code class="docutils literal notranslate"><span class="pre">[N]</span></code>.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">tree</span> <span class="n">z</span> <span class="p">[</span><span class="n">C</span><span class="p">]</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">treestep</span>
</pre></div>
</div>
<p>If the current tree node is empty then just leave <code class="docutils literal notranslate"><span class="pre">z</span></code> on the stack in
lieu:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="p">[]</span> <span class="n">z</span> <span class="p">[</span><span class="n">C</span><span class="p">]</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">treestep</span>
<span class="o">---------------------------</span>
<span class="n">z</span>
</pre></div>
</div>
<p>Otherwise, evaluate <code class="docutils literal notranslate"><span class="pre">N</span></code> on the node value, <code class="docutils literal notranslate"><span class="pre">map</span></code> the whole function
(abbreviated here as <code class="docutils literal notranslate"><span class="pre">k</span></code>) over the child trees recursively, and then
combine the result with <code class="docutils literal notranslate"><span class="pre">C</span></code>.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="p">[</span><span class="n">node</span> <span class="p">[</span><span class="n">tree</span><span class="o">*</span><span class="p">]]</span> <span class="n">z</span> <span class="p">[</span><span class="n">C</span><span class="p">]</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">treestep</span>
<span class="o">---------------------------------------</span> <span class="n">w</span><span class="o">/</span> <span class="n">K</span> <span class="o">==</span> <span class="n">z</span> <span class="p">[</span><span class="n">C</span><span class="p">]</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">treestep</span>
<span class="n">node</span> <span class="n">N</span> <span class="p">[</span><span class="n">tree</span><span class="o">*</span><span class="p">]</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="nb">map</span> <span class="n">C</span>
</pre></div>
</div>
</div>
<div class="section" id="derive-the-recursive-form">
<h3>Derive the recursive form.<a class="headerlink" href="#derive-the-recursive-form" title="Permalink to this headline"></a></h3>
<p>Since this is a recursive function, we can begin to derive it by finding
the <code class="docutils literal notranslate"><span class="pre">ifte</span></code> stage that <code class="docutils literal notranslate"><span class="pre">genrec</span></code> will produce. The predicate and
base-case functions are trivial, so we just have to derive <code class="docutils literal notranslate"><span class="pre">J</span></code>.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">K</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="n">z</span><span class="p">]</span> <span class="p">[</span><span class="n">J</span><span class="p">]</span> <span class="n">ifte</span>
</pre></div>
</div>
<p>The behavior of <code class="docutils literal notranslate"><span class="pre">J</span></code> is to accept a (non-empty) tree node and arrive at
the desired outcome.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="p">[</span><span class="n">node</span> <span class="p">[</span><span class="n">tree</span><span class="o">*</span><span class="p">]]</span> <span class="n">J</span>
<span class="o">------------------------------</span>
<span class="n">node</span> <span class="n">N</span> <span class="p">[</span><span class="n">tree</span><span class="o">*</span><span class="p">]</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="nb">map</span> <span class="n">C</span>
</pre></div>
</div>
<p>So <code class="docutils literal notranslate"><span class="pre">J</span></code> will have some form like:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span> <span class="o">==</span> <span class="o">..</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="o">..</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="o">..</span> <span class="p">[</span><span class="n">C</span><span class="p">]</span> <span class="o">..</span>
</pre></div>
</div>
<p>Lets dive in. First, unquote the node and <code class="docutils literal notranslate"><span class="pre">dip</span></code> <code class="docutils literal notranslate"><span class="pre">N</span></code>.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">node</span> <span class="p">[</span><span class="n">tree</span><span class="o">*</span><span class="p">]]</span> <span class="n">i</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">dip</span>
<span class="n">node</span> <span class="p">[</span><span class="n">tree</span><span class="o">*</span><span class="p">]</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">dip</span>
<span class="n">node</span> <span class="n">N</span> <span class="p">[</span><span class="n">tree</span><span class="o">*</span><span class="p">]</span>
</pre></div>
</div>
<p>Next, <code class="docutils literal notranslate"><span class="pre">map</span></code> <code class="docutils literal notranslate"><span class="pre">K</span></code> over teh child trees and combine with <code class="docutils literal notranslate"><span class="pre">C</span></code>.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">node</span> <span class="n">N</span> <span class="p">[</span><span class="n">tree</span><span class="o">*</span><span class="p">]</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="nb">map</span> <span class="n">C</span>
<span class="n">node</span> <span class="n">N</span> <span class="p">[</span><span class="n">tree</span><span class="o">*</span><span class="p">]</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="nb">map</span> <span class="n">C</span>
<span class="n">node</span> <span class="n">N</span> <span class="p">[</span><span class="n">K</span><span class="o">.</span><span class="n">tree</span><span class="o">*</span><span class="p">]</span> <span class="n">C</span>
</pre></div>
</div>
<p>So:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span> <span class="o">==</span> <span class="n">i</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">dip</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="nb">map</span> <span class="n">C</span>
</pre></div>
</div>
<p>Plug it in and convert to <code class="docutils literal notranslate"><span class="pre">genrec</span></code>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">K</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="n">z</span><span class="p">]</span> <span class="p">[</span><span class="n">i</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">dip</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="nb">map</span> <span class="n">C</span><span class="p">]</span> <span class="n">ifte</span>
<span class="n">K</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="n">z</span><span class="p">]</span> <span class="p">[</span><span class="n">i</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="p">[</span><span class="nb">map</span> <span class="n">C</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
</div>
<div class="section" id="extract-the-givens-to-parameterize-the-program">
<h3>Extract the givens to parameterize the program.<a class="headerlink" href="#extract-the-givens-to-parameterize-the-program" title="Permalink to this headline"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="n">z</span><span class="p">]</span> <span class="p">[</span><span class="n">i</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="p">[</span><span class="nb">map</span> <span class="n">C</span><span class="p">]</span> <span class="n">genrec</span>
<span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="n">z</span><span class="p">]</span> <span class="p">[</span><span class="n">i</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="p">[</span><span class="nb">map</span> <span class="n">C</span><span class="p">]</span> <span class="n">genrec</span>
<span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">z</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="n">swoncat</span> <span class="p">[</span><span class="n">i</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="p">[</span><span class="nb">map</span> <span class="n">C</span><span class="p">]</span> <span class="n">genrec</span>
<span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="n">z</span> <span class="n">unit</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="n">swoncat</span> <span class="p">[</span><span class="n">i</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="p">[</span><span class="nb">map</span> <span class="n">C</span><span class="p">]</span> <span class="n">genrec</span>
<span class="n">z</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="n">swap</span> <span class="n">unit</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="n">swoncat</span> <span class="p">[</span><span class="n">i</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="p">[</span><span class="nb">map</span> <span class="n">C</span><span class="p">]</span> <span class="n">genrec</span>
\ <span class="o">.........</span><span class="n">TS0</span><span class="o">............./</span>
\<span class="o">/</span>
<span class="n">z</span> <span class="n">TS0</span> <span class="p">[</span><span class="n">i</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="p">[</span><span class="nb">map</span> <span class="n">C</span><span class="p">]</span> <span class="n">genrec</span>
<span class="n">z</span> <span class="p">[</span><span class="n">i</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="p">[</span><span class="n">TS0</span><span class="p">]</span> <span class="n">dip</span> <span class="p">[</span><span class="nb">map</span> <span class="n">C</span><span class="p">]</span> <span class="n">genrec</span>
<span class="n">z</span> <span class="p">[[</span><span class="n">N</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="n">swoncat</span> <span class="p">[</span><span class="n">TS0</span><span class="p">]</span> <span class="n">dip</span> <span class="p">[</span><span class="nb">map</span> <span class="n">C</span><span class="p">]</span> <span class="n">genrec</span>
<span class="n">z</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="p">[</span><span class="n">dip</span><span class="p">]</span> <span class="n">cons</span> <span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="n">swoncat</span> <span class="p">[</span><span class="n">TS0</span><span class="p">]</span> <span class="n">dip</span> <span class="p">[</span><span class="nb">map</span> <span class="n">C</span><span class="p">]</span> <span class="n">genrec</span>
\ <span class="o">......</span><span class="n">TS1</span><span class="o">........./</span>
\<span class="o">/</span>
<span class="n">z</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">TS1</span> <span class="p">[</span><span class="n">TS0</span><span class="p">]</span> <span class="n">dip</span> <span class="p">[</span><span class="nb">map</span> <span class="n">C</span><span class="p">]</span> <span class="n">genrec</span>
<span class="n">z</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="p">[</span><span class="nb">map</span> <span class="n">C</span><span class="p">]</span> <span class="p">[</span><span class="n">TS1</span> <span class="p">[</span><span class="n">TS0</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">dip</span> <span class="n">genrec</span>
<span class="n">z</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="p">[</span><span class="n">C</span><span class="p">]</span> <span class="p">[</span><span class="nb">map</span><span class="p">]</span> <span class="n">swoncat</span> <span class="p">[</span><span class="n">TS1</span> <span class="p">[</span><span class="n">TS0</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">dip</span> <span class="n">genrec</span>
<span class="n">z</span> <span class="p">[</span><span class="n">C</span><span class="p">]</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">swap</span> <span class="p">[</span><span class="nb">map</span><span class="p">]</span> <span class="n">swoncat</span> <span class="p">[</span><span class="n">TS1</span> <span class="p">[</span><span class="n">TS0</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">dip</span> <span class="n">genrec</span>
</pre></div>
</div>
<p>The givens are all to the left so we have our definition.</p>
</div>
<div class="section" id="define-treestep">
<h3>Define <code class="docutils literal notranslate"><span class="pre">treestep</span></code><a class="headerlink" href="#define-treestep" title="Permalink to this headline"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="n">TS0</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="n">swap</span> <span class="n">unit</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="n">swoncat</span>
<span class="n">TS1</span> <span class="o">==</span> <span class="p">[</span><span class="n">dip</span><span class="p">]</span> <span class="n">cons</span> <span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="n">swoncat</span>
<span class="n">treestep</span> <span class="o">==</span> <span class="n">swap</span> <span class="p">[</span><span class="nb">map</span><span class="p">]</span> <span class="n">swoncat</span> <span class="p">[</span><span class="n">TS1</span> <span class="p">[</span><span class="n">TS0</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">dip</span> <span class="n">genrec</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">DefinitionWrapper</span><span class="o">.</span><span class="n">add_definitions</span><span class="p">(</span><span class="s1">&#39;&#39;&#39;</span>
<span class="s1"> TS0 == [not] swap unit [pop] swoncat</span>
<span class="s1"> TS1 == [dip] cons [i] swoncat</span>
<span class="s1">treestep == swap [map] swoncat [TS1 [TS0] dip] dip genrec</span>
<span class="s1">&#39;&#39;&#39;</span><span class="p">,</span> <span class="n">D</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="p">[]</span> <span class="mi">0</span> <span class="p">[</span><span class="n">C</span><span class="p">]</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">treestep</span>
<span class="o">---------------------------</span>
<span class="mi">0</span>
<span class="p">[</span><span class="n">n</span> <span class="p">[</span><span class="n">tree</span><span class="o">*</span><span class="p">]]</span> <span class="mi">0</span> <span class="p">[</span><span class="nb">sum</span> <span class="o">+</span><span class="p">]</span> <span class="p">[]</span> <span class="n">treestep</span>
<span class="o">--------------------------------------------------</span>
<span class="n">n</span> <span class="p">[</span><span class="n">tree</span><span class="o">*</span><span class="p">]</span> <span class="p">[</span><span class="mi">0</span> <span class="p">[</span><span class="nb">sum</span> <span class="o">+</span><span class="p">]</span> <span class="p">[]</span> <span class="n">treestep</span><span class="p">]</span> <span class="nb">map</span> <span class="nb">sum</span> <span class="o">+</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[] 0 [sum +] [] treestep&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">0</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[23 []] 0 [sum +] [] treestep&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">23</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[23 [[2 []] [3 []]]] 0 [sum +] [] treestep&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">28</span>
</pre></div>
</div>
</div>
<div class="section" id="a-slight-modification">
<h3>A slight modification.<a class="headerlink" href="#a-slight-modification" title="Permalink to this headline"></a></h3>
<p>Lets simplify the tree datastructure definition slightly by just
letting the children be the <code class="docutils literal notranslate"><span class="pre">rest</span></code> of the tree:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">tree</span> <span class="o">=</span> <span class="p">[]</span> <span class="o">|</span> <span class="p">[</span><span class="n">node</span> <span class="n">tree</span><span class="o">*</span><span class="p">]</span>
</pre></div>
</div>
<p>The <code class="docutils literal notranslate"><span class="pre">J</span></code> function changes slightly.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="p">[</span><span class="n">node</span> <span class="n">tree</span><span class="o">*</span><span class="p">]</span> <span class="n">J</span>
<span class="o">------------------------------</span>
<span class="n">node</span> <span class="n">N</span> <span class="p">[</span><span class="n">tree</span><span class="o">*</span><span class="p">]</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="nb">map</span> <span class="n">C</span>
<span class="p">[</span><span class="n">node</span> <span class="n">tree</span><span class="o">*</span><span class="p">]</span> <span class="n">uncons</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">dip</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="nb">map</span> <span class="n">C</span>
<span class="n">node</span> <span class="p">[</span><span class="n">tree</span><span class="o">*</span><span class="p">]</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">dip</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="nb">map</span> <span class="n">C</span>
<span class="n">node</span> <span class="n">N</span> <span class="p">[</span><span class="n">tree</span><span class="o">*</span><span class="p">]</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="nb">map</span> <span class="n">C</span>
<span class="n">node</span> <span class="n">N</span> <span class="p">[</span><span class="n">tree</span><span class="o">*</span><span class="p">]</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="nb">map</span> <span class="n">C</span>
<span class="n">node</span> <span class="n">N</span> <span class="p">[</span><span class="n">K</span><span class="o">.</span><span class="n">tree</span><span class="o">*</span><span class="p">]</span> <span class="n">C</span>
<span class="n">J</span> <span class="o">==</span> <span class="n">uncons</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">dip</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="nb">map</span> <span class="n">C</span>
<span class="n">K</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="n">z</span><span class="p">]</span> <span class="p">[</span><span class="n">uncons</span> <span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="p">[</span><span class="nb">map</span> <span class="n">C</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">&#39;TS1 == [dip] cons [uncons] swoncat&#39;</span><span class="p">)</span> <span class="c1"># We only need to redefine one word.</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[23 [2] [3]] 0 [sum +] [] treestep&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">28</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[23 [2 [8] [9]] [3] [4 []]] 0 [sum +] [] treestep&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">49</span>
</pre></div>
</div>
<p>I think these trees seem a little easier to read.</p>
</div>
<div class="section" id="redefining-our-btree-in-terms-of-this-form">
<h3>Redefining our BTree in terms of this form.<a class="headerlink" href="#redefining-our-btree-in-terms-of-this-form" title="Permalink to this headline"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">BTree</span> <span class="o">=</span> <span class="p">[]</span> <span class="o">|</span> <span class="p">[[</span><span class="n">key</span> <span class="n">value</span><span class="p">]</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span>
</pre></div>
</div>
<p>What kind of functions can we write for this with our <code class="docutils literal notranslate"><span class="pre">treestep</span></code>? The
pattern for processing a non-empty node is:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">node</span> <span class="n">N</span> <span class="p">[</span><span class="n">tree</span><span class="o">*</span><span class="p">]</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="nb">map</span> <span class="n">C</span>
</pre></div>
</div>
<p>Plugging in our BTree structure:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key</span> <span class="n">value</span><span class="p">]</span> <span class="n">N</span> <span class="p">[</span><span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="nb">map</span> <span class="n">C</span>
<span class="p">[</span><span class="n">key</span> <span class="n">value</span><span class="p">]</span> <span class="n">uncons</span> <span class="n">pop</span> <span class="p">[</span><span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="nb">map</span> <span class="n">i</span>
<span class="n">key</span> <span class="p">[</span><span class="n">value</span><span class="p">]</span> <span class="n">pop</span> <span class="p">[</span><span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="nb">map</span> <span class="n">i</span>
<span class="n">key</span> <span class="p">[</span><span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="nb">map</span> <span class="n">i</span>
<span class="n">key</span> <span class="p">[</span><span class="n">lkey</span> <span class="n">rkey</span> <span class="p">]</span> <span class="n">i</span>
<span class="n">key</span> <span class="n">lkey</span> <span class="n">rkey</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] 23 [i] [uncons pop] treestep&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">3</span> <span class="mi">23</span> <span class="mi">23</span>
</pre></div>
</div>
<p>Doesnt work because <code class="docutils literal notranslate"><span class="pre">map</span></code> extracts the <code class="docutils literal notranslate"><span class="pre">first</span></code> item of whatever its
mapped function produces. We have to return a list, rather than
depositing our results directly on the stack.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key</span> <span class="n">value</span><span class="p">]</span> <span class="n">N</span> <span class="p">[</span><span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="nb">map</span> <span class="n">C</span>
<span class="p">[</span><span class="n">key</span> <span class="n">value</span><span class="p">]</span> <span class="n">first</span> <span class="p">[</span><span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="nb">map</span> <span class="n">flatten</span> <span class="n">cons</span>
<span class="n">key</span> <span class="p">[</span><span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">K</span><span class="p">]</span> <span class="nb">map</span> <span class="n">flatten</span> <span class="n">cons</span>
<span class="n">key</span> <span class="p">[[</span><span class="n">lk</span><span class="p">]</span> <span class="p">[</span><span class="n">rk</span><span class="p">]</span> <span class="p">]</span> <span class="n">flatten</span> <span class="n">cons</span>
<span class="n">key</span> <span class="p">[</span> <span class="n">lk</span> <span class="n">rk</span> <span class="p">]</span> <span class="n">cons</span>
<span class="p">[</span><span class="n">key</span> <span class="n">lk</span> <span class="n">rk</span> <span class="p">]</span>
</pre></div>
</div>
<p>So:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[]</span> <span class="p">[</span><span class="n">flatten</span> <span class="n">cons</span><span class="p">]</span> <span class="p">[</span><span class="n">first</span><span class="p">]</span> <span class="n">treestep</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [flatten cons] [first] treestep&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">3</span> <span class="mi">2</span> <span class="mi">9</span> <span class="mi">5</span> <span class="mi">4</span> <span class="mi">8</span> <span class="mi">6</span> <span class="mi">7</span><span class="p">]</span>
</pre></div>
</div>
<p>There we go.</p>
</div>
<div class="section" id="in-order-traversal-with-treestep">
<h3>In-order traversal with <code class="docutils literal notranslate"><span class="pre">treestep</span></code>.<a class="headerlink" href="#in-order-traversal-with-treestep" title="Permalink to this headline"></a></h3>
<p>From here:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">key</span> <span class="p">[[</span><span class="n">lk</span><span class="p">]</span> <span class="p">[</span><span class="n">rk</span><span class="p">]]</span> <span class="n">C</span>
<span class="n">key</span> <span class="p">[[</span><span class="n">lk</span><span class="p">]</span> <span class="p">[</span><span class="n">rk</span><span class="p">]]</span> <span class="n">i</span>
<span class="n">key</span> <span class="p">[</span><span class="n">lk</span><span class="p">]</span> <span class="p">[</span><span class="n">rk</span><span class="p">]</span> <span class="n">roll</span><span class="o">&lt;</span>
<span class="p">[</span><span class="n">lk</span><span class="p">]</span> <span class="p">[</span><span class="n">rk</span><span class="p">]</span> <span class="n">key</span> <span class="n">swons</span> <span class="n">concat</span>
<span class="p">[</span><span class="n">lk</span><span class="p">]</span> <span class="p">[</span><span class="n">key</span> <span class="n">rk</span><span class="p">]</span> <span class="n">concat</span>
<span class="p">[</span><span class="n">lk</span> <span class="n">key</span> <span class="n">rk</span><span class="p">]</span>
</pre></div>
</div>
<p>So:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[]</span> <span class="p">[</span><span class="n">i</span> <span class="n">roll</span><span class="o">&lt;</span> <span class="n">swons</span> <span class="n">concat</span><span class="p">]</span> <span class="p">[</span><span class="n">first</span><span class="p">]</span> <span class="n">treestep</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]] [] [i roll&lt; swons concat] [uncons pop] treestep&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span> <span class="mi">6</span> <span class="mi">7</span> <span class="mi">8</span> <span class="mi">9</span><span class="p">]</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="miscellaneous-crap">
<h2>Miscellaneous Crap<a class="headerlink" href="#miscellaneous-crap" title="Permalink to this headline"></a></h2>
<div class="section" id="toy-with-it">
<h3>Toy with it.<a class="headerlink" href="#toy-with-it" title="Permalink to this headline"></a></h3>
<p>Lets reexamine:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">R0</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="n">R1</span>
<span class="o">...</span>
<span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span> <span class="n">key</span> <span class="n">value</span> <span class="n">F</span> <span class="n">right</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span>
<span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">disenstacken</span> <span class="n">swap</span>
<span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span> <span class="n">swap</span>
<span class="n">key</span> <span class="n">value</span> <span class="n">right</span> <span class="n">left</span>
<span class="n">key</span> <span class="n">value</span> <span class="n">right</span> <span class="n">left</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="p">[</span><span class="n">cons</span> <span class="n">dipdd</span><span class="p">]</span> <span class="n">dupdip</span>
<span class="n">key</span> <span class="n">value</span> <span class="n">right</span> <span class="n">left</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="n">cons</span> <span class="n">dipdd</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span>
<span class="n">key</span> <span class="n">value</span> <span class="n">right</span> <span class="p">[</span><span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="n">dipdd</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span>
<span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span> <span class="n">key</span> <span class="n">value</span> <span class="n">right</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span>
<span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span> <span class="n">key</span> <span class="n">value</span> <span class="n">right</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">dip</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span>
<span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span> <span class="n">key</span> <span class="n">value</span> <span class="n">F</span> <span class="n">right</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="n">i</span>
<span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span> <span class="n">key</span> <span class="n">value</span> <span class="n">F</span> <span class="n">right</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span>
</pre></div>
</div>
<p>So:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">R0</span> <span class="o">==</span> <span class="n">disenstacken</span> <span class="n">swap</span>
<span class="n">R1</span> <span class="o">==</span> <span class="p">[</span><span class="n">cons</span> <span class="n">dipdd</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">dupdip</span> <span class="n">i</span>
<span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">R0</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="n">R1</span>
<span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">disenstacken</span> <span class="n">swap</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="p">[</span><span class="n">cons</span> <span class="n">dipdd</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">dupdip</span> <span class="n">i</span>
<span class="n">key</span> <span class="n">value</span> <span class="n">right</span> <span class="n">left</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="p">[</span><span class="n">cons</span> <span class="n">dipdd</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">dupdip</span> <span class="n">i</span>
<span class="n">key</span> <span class="n">value</span> <span class="n">right</span> <span class="n">left</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="n">cons</span> <span class="n">dipdd</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">dip</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="n">i</span>
<span class="n">key</span> <span class="n">value</span> <span class="n">right</span> <span class="p">[</span><span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="n">dipdd</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">dip</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="n">i</span>
<span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span> <span class="n">key</span> <span class="n">value</span> <span class="n">right</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">dip</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="n">i</span>
<span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span> <span class="n">key</span> <span class="n">value</span> <span class="n">F</span> <span class="n">right</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span><span class="p">]</span> <span class="n">i</span>
<span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span> <span class="n">key</span> <span class="n">value</span> <span class="n">F</span> <span class="n">right</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span>
<span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="o">-</span><span class="n">order</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="p">[</span><span class="n">disenstacken</span> <span class="n">swap</span><span class="p">]</span> <span class="p">[[</span><span class="n">cons</span> <span class="n">dipdd</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">dupdip</span> <span class="n">i</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
</div>
<div class="section" id="refactor-cons-cons">
<h3>Refactor <code class="docutils literal notranslate"><span class="pre">cons</span> <span class="pre">cons</span></code><a class="headerlink" href="#refactor-cons-cons" title="Permalink to this headline"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cons2</span> <span class="o">==</span> <span class="n">cons</span> <span class="n">cons</span>
</pre></div>
</div>
<p>Refactoring:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">BTree</span><span class="o">-</span><span class="n">new</span> <span class="o">==</span> <span class="n">swap</span> <span class="p">[[]</span> <span class="p">[]]</span> <span class="n">cons2</span>
<span class="n">T</span> <span class="o">==</span> <span class="p">[</span><span class="n">cons2</span> <span class="n">dipdd</span><span class="p">]</span> <span class="n">cons2</span> <span class="n">cons</span> <span class="n">infra</span>
<span class="n">Te</span> <span class="o">==</span> <span class="p">[</span><span class="n">cons2</span> <span class="n">dipd</span><span class="p">]</span> <span class="n">cons2</span> <span class="n">cons</span> <span class="n">infra</span>
<span class="n">Ee</span> <span class="o">==</span> <span class="n">pop</span> <span class="n">swap</span> <span class="n">roll</span><span class="o">&lt;</span> <span class="n">rest</span> <span class="n">rest</span> <span class="n">cons2</span>
</pre></div>
</div>
<p>Its used a lot because its tied to the fact that there are two “data
items” in each node. This point to a more general factorization that
would render a combinator that could work for other geometries of trees.</p>
</div>
</div>
<div class="section" id="a-general-form-for-trees">
<h2>A General Form for Trees<a class="headerlink" href="#a-general-form-for-trees" title="Permalink to this headline"></a></h2>
<p>A general form for tree data with N children per node:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[[</span><span class="n">data</span><span class="p">]</span> <span class="p">[</span><span class="n">child0</span><span class="p">]</span> <span class="o">...</span> <span class="p">[</span><span class="n">childN</span><span class="o">-</span><span class="mi">1</span><span class="p">]]</span>
</pre></div>
</div>
<p>Suggests a general form of recursive iterator, but I have to go walk the
dogs at the mo.</p>
<p>For a given structure, you would have a structure of operator functions
and sort of merge them and run them, possibly in a different order (pre-
post- in- yknow). The <code class="docutils literal notranslate"><span class="pre">Cn</span></code> functions could all be the same and use
the <code class="docutils literal notranslate"><span class="pre">step</span></code> trick if the children nodes are all of the right kind. If
they are heterogeneous then we need a way to get the different <code class="docutils literal notranslate"><span class="pre">Cn</span></code>
into the structure in the right order. If I understand correctly, the
“Bananas…” paper shows how to do this automatically from a type
description. They present, if I have it right, a tiny machine that
accepts <a class="reference external" href="https://en.wikipedia.org/wiki/Catamorphism#General_case">some sort of algebraic data type description and returns a
function that can recusre over
it</a>, I
think.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="p">[</span><span class="n">data</span><span class="o">..</span> <span class="p">[</span><span class="n">c0</span><span class="p">]</span> <span class="p">[</span><span class="n">c1</span><span class="p">]</span> <span class="o">...</span> <span class="p">[</span><span class="n">cN</span><span class="p">]]</span> <span class="p">[</span><span class="n">F</span> <span class="n">C0</span> <span class="n">C1</span> <span class="o">...</span> <span class="n">CN</span><span class="p">]</span> <span class="n">infil</span>
<span class="o">--------------------------------------------------------</span>
<span class="n">data</span> <span class="n">F</span> <span class="p">[</span><span class="n">c0</span><span class="p">]</span> <span class="n">C0</span> <span class="p">[</span><span class="n">c1</span><span class="p">]</span> <span class="n">C1</span> <span class="o">...</span> <span class="p">[</span><span class="n">cN</span><span class="p">]</span> <span class="n">CN</span>
</pre></div>
</div>
<div class="section" id="just-make-f-a-parameter">
<h3>Just make <code class="docutils literal notranslate"><span class="pre">[F]</span></code> a parameter.<a class="headerlink" href="#just-make-f-a-parameter" title="Permalink to this headline"></a></h3>
<p>We can generalize to a sort of pure form:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span> <span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="p">[[</span><span class="n">F</span><span class="p">]]</span> <span class="p">[</span><span class="n">R1</span><span class="p">]</span> <span class="n">genrec</span>
<span class="o">==</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="p">[[</span><span class="n">F</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="n">R1</span><span class="p">]</span> <span class="n">ifte</span>
</pre></div>
</div>
<p>Putting <code class="docutils literal notranslate"><span class="pre">[F]</span></code> to the left as a given:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">unit</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="n">roll</span><span class="o">&lt;</span> <span class="p">[</span><span class="n">R1</span><span class="p">]</span> <span class="n">genrec</span>
<span class="p">[[</span><span class="n">F</span><span class="p">]]</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="n">roll</span><span class="o">&lt;</span> <span class="p">[</span><span class="n">R1</span><span class="p">]</span> <span class="n">genrec</span>
<span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="p">[[</span><span class="n">F</span><span class="p">]]</span> <span class="p">[</span><span class="n">R1</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
<p>Lets us define a parameterized form:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span> <span class="o">==</span> <span class="n">unit</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span><span class="p">]</span> <span class="n">roll</span><span class="o">&lt;</span> <span class="p">[</span><span class="n">R1</span><span class="p">]</span> <span class="n">genrec</span>
</pre></div>
</div>
<p>So in the general case of non-empty nodes:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="n">R1</span>
</pre></div>
</div>
<p>We just define <code class="docutils literal notranslate"><span class="pre">R1</span></code> to do whatever it has to to process the node. For
example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="n">R1</span>
<span class="o">...</span>
<span class="n">key</span> <span class="n">value</span> <span class="n">F</span> <span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span> <span class="n">right</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span>
<span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span> <span class="n">key</span> <span class="n">value</span> <span class="n">F</span> <span class="n">right</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span>
<span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span> <span class="n">right</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span> <span class="n">key</span> <span class="n">value</span> <span class="n">F</span>
</pre></div>
</div>
<p>Pre-, ??-, post-order traversals.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">uncons</span> <span class="n">uncons</span>
<span class="n">key</span> <span class="n">value</span> <span class="p">[</span><span class="n">left</span> <span class="n">right</span><span class="p">]</span>
</pre></div>
</div>
<p>For pre- and post-order we can use the <code class="docutils literal notranslate"><span class="pre">step</span></code> trick:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="n">step</span>
<span class="o">...</span>
<span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span> <span class="n">right</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span>
</pre></div>
</div>
<p>We worked out one scheme for ?in-order? traversal above, but maybe we
can do better?</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="p">[</span><span class="n">disenstacken</span><span class="p">]</span> <span class="n">dipd</span>
<span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">disenstacken</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span>
<span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span>
<span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="n">R1</span><span class="o">.</span><span class="mi">1</span>
</pre></div>
</div>
<p>Hmm…</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="n">tuck</span>
<span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span>
<span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="p">[</span><span class="n">disenstacken</span> <span class="p">[</span><span class="n">roll</span><span class="o">&gt;</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">dipd</span>
<span class="p">[</span><span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span><span class="p">]</span> <span class="n">disenstacken</span> <span class="p">[</span><span class="n">roll</span><span class="o">&gt;</span><span class="p">]</span> <span class="n">dip</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span>
<span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">right</span> <span class="p">[</span><span class="n">roll</span><span class="o">&gt;</span><span class="p">]</span> <span class="n">dip</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span>
<span class="n">key</span> <span class="n">value</span> <span class="n">left</span> <span class="n">roll</span><span class="o">&gt;</span> <span class="n">right</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span>
<span class="n">left</span> <span class="n">key</span> <span class="n">value</span> <span class="n">right</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span>
<span class="n">left</span> <span class="n">key</span> <span class="n">value</span> <span class="n">right</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="n">tuck</span> <span class="n">foo</span>
<span class="n">left</span> <span class="n">key</span> <span class="n">value</span> <span class="n">right</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="p">[</span><span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span><span class="p">]</span> <span class="n">foo</span>
<span class="o">...</span>
<span class="n">left</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span> <span class="n">key</span> <span class="n">value</span> <span class="n">F</span> <span class="n">right</span> <span class="n">BTree</span><span class="o">-</span><span class="nb">iter</span>
</pre></div>
</div>
<p>We could just let <code class="docutils literal notranslate"><span class="pre">[R1]</span></code> be a parameter too, for maximum flexibility.</p>
</div>
</div>
<div class="section" id="automatically-deriving-the-recursion-combinator-for-a-data-type">
<h2>Automatically deriving the recursion combinator for a data type?<a class="headerlink" href="#automatically-deriving-the-recursion-combinator-for-a-data-type" title="Permalink to this headline"></a></h2>
<p>If I understand it correctly, the “Bananas…” paper talks about a way
to build the processor function automatically from the description of
the type. I think if we came up with an elegant way for the Joy code to
express that, it would be cool. In Joypy the definitions can be circular
because lookup happens at evaluation, not parsing. E.g.:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">A</span> <span class="o">==</span> <span class="o">...</span> <span class="n">B</span> <span class="o">...</span>
<span class="n">B</span> <span class="o">==</span> <span class="o">...</span> <span class="n">A</span> <span class="o">...</span>
</pre></div>
</div>
<p>Thats fine. Circular datastructures cant be made though.</p>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h3><a href="../index.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">Treating Trees</a><ul>
<li><a class="reference internal" href="#a-function-to-traverse-a-btree">A Function to Traverse a BTree</a><ul>
<li><a class="reference internal" href="#base-case">Base case <code class="docutils literal notranslate"><span class="pre">[]</span></code></a></li>
<li><a class="reference internal" href="#node-case-key-value-left-right">Node case <code class="docutils literal notranslate"><span class="pre">[key</span> <span class="pre">value</span> <span class="pre">left</span> <span class="pre">right]</span></code></a></li>
<li><a class="reference internal" href="#processing-the-current-node">Processing the current node.</a></li>
<li><a class="reference internal" href="#recur">Recur</a></li>
<li><a class="reference internal" href="#putting-it-together">Putting it together</a></li>
<li><a class="reference internal" href="#parameterizing-the-f-per-node-processing-function">Parameterizing the <code class="docutils literal notranslate"><span class="pre">F</span></code> per-node processing function.</a></li>
</ul>
</li>
<li><a class="reference internal" href="#adding-nodes-to-the-btree">Adding Nodes to the BTree</a><ul>
<li><a class="reference internal" href="#adding-to-an-empty-node">Adding to an empty node.</a></li>
<li><a class="reference internal" href="#if-the-current-node-isn-t-empty">If the current node isnt empty.</a></li>
<li><a class="reference internal" href="#a-predicate-to-compare-keys">A predicate to compare keys.</a></li>
<li><a class="reference internal" href="#if-the-key-we-re-adding-is-greater-than-the-node-s-key">If the key were adding is greater than the nodes key.</a></li>
<li><a class="reference internal" href="#use-infra-on-k">Use <code class="docutils literal notranslate"><span class="pre">infra</span></code> on <code class="docutils literal notranslate"><span class="pre">K</span></code>.</a></li>
<li><a class="reference internal" href="#derive-t">Derive <code class="docutils literal notranslate"><span class="pre">T</span></code>.</a></li>
<li><a class="reference internal" href="#if-the-key-we-re-adding-is-less-than-the-node-s-key">If the key were adding is less than the nodes key.</a></li>
<li><a class="reference internal" href="#else-the-keys-must-be-equal">Else the keys must be equal.</a></li>
<li><a class="reference internal" href="#now-we-can-define-btree-add">Now we can define <code class="docutils literal notranslate"><span class="pre">BTree-add</span></code></a></li>
<li><a class="reference internal" href="#a-set-like-datastructure">A Set-Like Datastructure</a></li>
</ul>
</li>
<li><a class="reference internal" href="#interlude-the-cmp-combinator">Interlude: The <code class="docutils literal notranslate"><span class="pre">cmp</span></code> combinator</a></li>
<li><a class="reference internal" href="#interlude-factoring-and-naming">Interlude: Factoring and Naming</a></li>
<li><a class="reference internal" href="#a-version-of-btree-iter-that-does-in-order-traversal">A Version of <code class="docutils literal notranslate"><span class="pre">BTree-iter</span></code> that does In-Order Traversal</a><ul>
<li><a class="reference internal" href="#process-the-left-child">Process the left child.</a></li>
<li><a class="reference internal" href="#process-the-current-node">Process the current node.</a></li>
<li><a class="reference internal" href="#process-the-right-child">Process the right child.</a></li>
<li><a class="reference internal" href="#defining-btree-iter-order">Defining <code class="docutils literal notranslate"><span class="pre">BTree-iter-order</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#getting-values-by-key">Getting values by key</a><ul>
<li><a class="reference internal" href="#the-base-case">The base case <code class="docutils literal notranslate"><span class="pre">[]</span></code></a></li>
<li><a class="reference internal" href="#id1">Node case <code class="docutils literal notranslate"><span class="pre">[key</span> <span class="pre">value</span> <span class="pre">left</span> <span class="pre">right]</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#todo-btree-delete">TODO: BTree-delete</a></li>
<li><a class="reference internal" href="#tree-with-node-and-list-of-trees">Tree with node and list of trees.</a><ul>
<li><a class="reference internal" href="#treestep"><code class="docutils literal notranslate"><span class="pre">treestep</span></code></a></li>
<li><a class="reference internal" href="#derive-the-recursive-form">Derive the recursive form.</a></li>
<li><a class="reference internal" href="#extract-the-givens-to-parameterize-the-program">Extract the givens to parameterize the program.</a></li>
<li><a class="reference internal" href="#define-treestep">Define <code class="docutils literal notranslate"><span class="pre">treestep</span></code></a></li>
<li><a class="reference internal" href="#a-slight-modification">A slight modification.</a></li>
<li><a class="reference internal" href="#redefining-our-btree-in-terms-of-this-form">Redefining our BTree in terms of this form.</a></li>
<li><a class="reference internal" href="#in-order-traversal-with-treestep">In-order traversal with <code class="docutils literal notranslate"><span class="pre">treestep</span></code>.</a></li>
</ul>
</li>
<li><a class="reference internal" href="#miscellaneous-crap">Miscellaneous Crap</a><ul>
<li><a class="reference internal" href="#toy-with-it">Toy with it.</a></li>
<li><a class="reference internal" href="#refactor-cons-cons">Refactor <code class="docutils literal notranslate"><span class="pre">cons</span> <span class="pre">cons</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#a-general-form-for-trees">A General Form for Trees</a><ul>
<li><a class="reference internal" href="#just-make-f-a-parameter">Just make <code class="docutils literal notranslate"><span class="pre">[F]</span></code> a parameter.</a></li>
</ul>
</li>
<li><a class="reference internal" href="#automatically-deriving-the-recursion-combinator-for-a-data-type">Automatically deriving the recursion combinator for a data type?</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../index.html">Documentation overview</a><ul>
<li><a href="index.html">Essays about Programming in Joy</a><ul>
<li>Previous: <a href="Replacing.html" title="previous chapter">Replacing Functions in the Dictionary</a></li>
<li>Next: <a href="Newton-Raphson.html" title="next chapter">Newtons method</a></li>
</ul></li>
</ul></li>
</ul>
</div>
<div role="note" aria-label="source link">
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="../_sources/notebooks/Trees.rst.txt"
rel="nofollow">Show Source</a></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer" role="contentinfo">
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">
<img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" />
</a>
<br />
<span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">Thun Documentation</span> by <a xmlns:cc="http://creativecommons.org/ns#" href="https://joypy.osdn.io/" property="cc:attributionName" rel="cc:attributionURL">Simon Forman</a> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>.<br />Based on a work at <a xmlns:dct="http://purl.org/dc/terms/" href="https://osdn.net/projects/joypy/" rel="dct:source">https://osdn.net/projects/joypy/</a>.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.7.3.
</div>
</body>
</html>