diff --git a/docs/sphinx_docs/_build/html/notebooks/Advent of Code 2017 December 1st.html b/docs/sphinx_docs/_build/html/notebooks/Advent of Code 2017 December 1st.html deleted file mode 100644 index 065e727..0000000 --- a/docs/sphinx_docs/_build/html/notebooks/Advent of Code 2017 December 1st.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - - - - Advent of Code 2017 — Thun 0.2.0 documentation - - - - - - - - - - - - - - - - - - -
-
-
-
- -
-

Advent of Code 2017

-
-

December 1st

-

[Given] a sequence of digits (your puzzle input) and find the sum of all -digits that match the next digit in the list. The list is circular, so -the digit after the last digit is the first digit in the list.

-

For example:

-
    -
  • 1122 produces a sum of 3 (1 + 2) because the first digit (1) matches -the second digit and the third digit (2) matches the fourth digit.
  • -
  • 1111 produces 4 because each digit (all 1) matches the next.
  • -
  • 1234 produces 0 because no digit matches the next.
  • -
  • 91212129 produces 9 because the only digit that matches the next one -is the last digit, 9.
  • -
-
from notebook_preamble import J, V, define
-
-
-

I’ll assume the input is a Joy sequence of integers (as opposed to a -string or something else.)

-

We might proceed by creating a word that makes a copy of the sequence -with the first item moved to the last, and zips it with the original to -make a list of pairs, and a another word that adds (one of) each pair to -a total if the pair matches.

-
AoC2017.1 == pair_up total_matches
-
-
-

Let’s derive pair_up:

-
     [a b c] pair_up
--------------------------
-   [[a b] [b c] [c a]]
-
-
-

Straightforward (although the order of each pair is reversed, due to the -way zip works, but it doesn’t matter for this program):

-
[a b c] dup
-[a b c] [a b c] uncons swap
-[a b c] [b c] a unit concat
-[a b c] [b c a] zip
-[[b a] [c b] [a c]]
-
-
-
define('pair_up == dup uncons swap unit concat zip')
-
-
-
J('[1 2 3] pair_up')
-
-
-
[[2 1] [3 2] [1 3]]
-
-
-
J('[1 2 2 3] pair_up')
-
-
-
[[2 1] [2 2] [3 2] [1 3]]
-
-
-

Now we need to derive total_matches. It will be a step function:

-
total_matches == 0 swap [F] step
-
-
-

Where F will have the pair to work with, and it will basically be a -branch or ifte.

-
total [n m] F
-
-
-

It will probably be easier to write if we dequote the pair:

-
   total [n m] i F′
-----------------------
-     total n m F′
-
-
-

Now F′ becomes just:

-
total n m [=] [pop +] [popop] ifte
-
-
-

So:

-
F == i [=] [pop +] [popop] ifte
-
-
-

And thus:

-
total_matches == 0 swap [i [=] [pop +] [popop] ifte] step
-
-
-
define('total_matches == 0 swap [i [=] [pop +] [popop] ifte] step')
-
-
-
J('[1 2 3] pair_up total_matches')
-
-
-
0
-
-
-
J('[1 2 2 3] pair_up total_matches')
-
-
-
2
-
-
-

Now we can define our main program and evaluate it on the examples.

-
define('AoC2017.1 == pair_up total_matches')
-
-
-
J('[1 1 2 2] AoC2017.1')
-
-
-
3
-
-
-
J('[1 1 1 1] AoC2017.1')
-
-
-
4
-
-
-
J('[1 2 3 4] AoC2017.1')
-
-
-
0
-
-
-
J('[9 1 2 1 2 1 2 9] AoC2017.1')
-
-
-
9
-
-
-
J('[9 1 2 1 2 1 2 9] AoC2017.1')
-
-
-
9
-
-
-
      pair_up == dup uncons swap unit concat zip
-total_matches == 0 swap [i [=] [pop +] [popop] ifte] step
-
-    AoC2017.1 == pair_up total_matches
-
-
-

Now the paired digit is “halfway” round.

-
[a b c d] dup size 2 / [drop] [take reverse] cleave concat zip
-
-
-
J('[1 2 3 4] dup size 2 / [drop] [take reverse] cleave concat zip')
-
-
-
[[3 1] [4 2] [1 3] [2 4]]
-
-
-

I realized that each pair is repeated…

-
J('[1 2 3 4] dup size 2 / [drop] [take reverse] cleave  zip')
-
-
-
[1 2 3 4] [[1 3] [2 4]]
-
-
-
define('AoC2017.1.extra == dup size 2 / [drop] [take reverse] cleave  zip swap pop total_matches 2 *')
-
-
-
J('[1 2 1 2] AoC2017.1.extra')
-
-
-
6
-
-
-
J('[1 2 2 1] AoC2017.1.extra')
-
-
-
0
-
-
-
J('[1 2 3 4 2 5] AoC2017.1.extra')
-
-
-
4
-
-
-
-
-
-

Refactor FTW

-

With Joy a great deal of the heuristics from Forth programming carry -over nicely. For example, refactoring into small, well-scoped commands -with mnemonic names…

-
     rotate_seq == uncons swap unit concat
-        pair_up == dup rotate_seq zip
-   add_if_match == [=] [pop +] [popop] ifte
-  total_matches == [i add_if_match] step_zero
-
-      AoC2017.1 == pair_up total_matches
-
-   half_of_size == dup size 2 /
-       split_at == [drop] [take reverse] cleave
-  pair_up.extra == half_of_size split_at zip swap pop
-
-AoC2017.1.extra == pair_up.extra total_matches 2 *
-
-
-
- - -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/sphinx_docs/_build/html/notebooks/Advent of Code 2017 December 2nd.html b/docs/sphinx_docs/_build/html/notebooks/Advent of Code 2017 December 2nd.html deleted file mode 100644 index f6c201d..0000000 --- a/docs/sphinx_docs/_build/html/notebooks/Advent of Code 2017 December 2nd.html +++ /dev/null @@ -1,436 +0,0 @@ - - - - - - - - Advent of Code 2017 — Thun 0.2.0 documentation - - - - - - - - - - - - - - - - - - -
-
-
-
- -
-

Advent of Code 2017

-
-

December 2nd

-

For each row, determine the difference between the largest value and the -smallest value; the checksum is the sum of all of these differences.

-

For example, given the following spreadsheet:

-
5 1 9 5
-7 5 3
-2 4 6 8
-
-
-
    -
  • The first row’s largest and smallest values are 9 and 1, and their -difference is 8.
  • -
  • The second row’s largest and smallest values are 7 and 3, and their -difference is 4.
  • -
  • The third row’s difference is 6.
  • -
-

In this example, the spreadsheet’s checksum would be 8 + 4 + 6 = 18.

-
from notebook_preamble import J, V, define
-
-
-

I’ll assume the input is a Joy sequence of sequences of integers.

-
[[5 1 9 5]
- [7 5 3]
- [2 4 6 8]]
-
-
-

So, obviously, the initial form will be a step function:

-
AoC2017.2 == 0 swap [F +] step
-
-
-

This function F must get the max and min of a row of numbers -and subtract. We can define a helper function maxmin which does -this:

-
define('maxmin == [max] [min] cleave')
-
-
-
J('[1 2 3] maxmin')
-
-
-
3 1
-
-
-

Then F just does that then subtracts the min from the max:

-
F == maxmin -
-
-
-

So:

-
define('AoC2017.2 == [maxmin - +] step_zero')
-
-
-
J('''
-
-[[5 1 9 5]
- [7 5 3]
- [2 4 6 8]] AoC2017.2
-
-''')
-
-
-
18
-
-
-

…find the only two numbers in each row where one evenly divides the -other - that is, where the result of the division operation is a whole -number. They would like you to find those numbers on each line, divide -them, and add up each line’s result.

-

For example, given the following spreadsheet:

-
5 9 2 8
-9 4 7 3
-3 8 6 5
-
-
-
    -
  • In the first row, the only two numbers that evenly divide are 8 and -2; the result of this division is 4.
  • -
  • In the second row, the two numbers are 9 and 3; the result is 3.
  • -
  • In the third row, the result is 2.
  • -
-

In this example, the sum of the results would be 4 + 3 + 2 = 9.

-

What is the sum of each row’s result in your puzzle input?

-
J('[5 9 2 8] sort reverse')
-
-
-
[9 8 5 2]
-
-
-
J('[9 8 5 2] uncons [swap [divmod] cons] dupdip')
-
-
-
[8 5 2] [9 divmod] [8 5 2]
-
-
-
[9 8 5 2] uncons [swap [divmod] cons F] dupdip G
-  [8 5 2]            [9 divmod]      F [8 5 2] G
-
-
-
V('[8 5 2] [9 divmod] [uncons swap] dip dup [i not] dip')
-
-
-
                                      . [8 5 2] [9 divmod] [uncons swap] dip dup [i not] dip
-                              [8 5 2] . [9 divmod] [uncons swap] dip dup [i not] dip
-                   [8 5 2] [9 divmod] . [uncons swap] dip dup [i not] dip
-     [8 5 2] [9 divmod] [uncons swap] . dip dup [i not] dip
-                              [8 5 2] . uncons swap [9 divmod] dup [i not] dip
-                              8 [5 2] . swap [9 divmod] dup [i not] dip
-                              [5 2] 8 . [9 divmod] dup [i not] dip
-                   [5 2] 8 [9 divmod] . dup [i not] dip
-        [5 2] 8 [9 divmod] [9 divmod] . [i not] dip
-[5 2] 8 [9 divmod] [9 divmod] [i not] . dip
-                   [5 2] 8 [9 divmod] . i not [9 divmod]
-                              [5 2] 8 . 9 divmod not [9 divmod]
-                            [5 2] 8 9 . divmod not [9 divmod]
-                            [5 2] 1 1 . not [9 divmod]
-                        [5 2] 1 False . [9 divmod]
-             [5 2] 1 False [9 divmod] .
-
-
-
-
-

Tricky

-

Let’s think.

-

Given a sorted sequence (from highest to lowest) we want to * for -head, tail in sequence * for term in tail: * check if the head % term -== 0 * if so compute head / term and terminate loop * else continue

-
-

So we want a loop I think

-
[a b c d] True [Q] loop
-[a b c d] Q    [Q] loop
-
-
-

Q should either leave the result and False, or the rest and -True.

-
   [a b c d] Q
------------------
-    result 0
-
-   [a b c d] Q
------------------
-    [b c d] 1
-
-
-

This suggests that Q should start with:

-
[a b c d] uncons dup roll<
-[b c d] [b c d] a
-
-
-

Now we just have to pop it if we don’t need it.

-
[b c d] [b c d] a [P] [T] [cons] app2 popdd [E] primrec
-[b c d] [b c d] [a P] [a T]                 [E] primrec
-
-
-
-
w/ Q == [% not] [T] [F] primrec
-
-        [a b c d] uncons
-        a [b c d] tuck
-[b c d] a [b c d] uncons
-[b c d] a b [c d] roll>
-[b c d] [c d] a b Q
-[b c d] [c d] a b [% not] [T] [F] primrec
-
-[b c d] [c d] a b T
-[b c d] [c d] a b / roll> popop 0
-
-[b c d] [c d] a b F                   Q
-[b c d] [c d] a b pop swap uncons ... Q
-[b c d] [c d] a       swap uncons ... Q
-[b c d] a [c d]            uncons ... Q
-[b c d] a c [d]                   roll> Q
-[b c d] [d] a c Q
-
-Q == [% not] [/ roll> popop 0] [pop swap uncons roll>] primrec
-
-uncons tuck uncons roll> Q
-
-
-
J('[8 5 3 2] 9 [swap] [% not] [cons] app2 popdd')
-
-
-
[8 5 3 2] [9 swap] [9 % not]
-
-
-
-
        [a b c d] uncons
-        a [b c d] tuck
-[b c d] a [b c d] [not] [popop 1] [Q] ifte
-
-[b c d] a [] popop 1
-[b c d] 1
-
-[b c d] a [b c d] Q
-
-
-   a [...] Q
----------------
-   result 0
-
-   a [...] Q
----------------
-       1
-
-
-w/ Q == [first % not] [first / 0] [rest [not] [popop 1]] [ifte]
-
-
-
-a [b c d] [first % not] [first / 0] [rest [not] [popop 1]] [ifte]
-a [b c d]  first % not
-a b % not
-a%b not
-bool(a%b)
-
-a [b c d] [first % not] [first / 0] [rest [not] [popop 1]] [ifte]
-a [b c d]                first / 0
-a b / 0
-a/b 0
-
-a [b c d] [first % not] [first / 0] [rest [not] [popop 1]]   [ifte]
-a [b c d]                            rest [not] [popop 1] [Q] ifte
-a [c d]                                   [not] [popop 1] [Q] ifte
-a [c d]                                   [not] [popop 1] [Q] ifte
-
-a [c d] [not] [popop 1] [Q] ifte
-a [c d]  not
-
-a [] popop 1
-1
-
-a [c d] Q
-
-
-uncons tuck [first % not] [first / 0] [rest [not] [popop 1]] [ifte]
-
-
-
-
-

I finally sat down with a piece of paper and blocked it out.

-

First, I made a function G that expects a number and a sequence of -candidates and return the result or zero:

-
   n [...] G
----------------
-    result
-
-   n [...] G
----------------
-       0
-
-
-

It’s a recursive function that conditionally executes the recursive part -of its recursive branch

-
[Pg] [E] [R1 [Pi] [T]] [ifte] genrec
-
-
-

The recursive branch is the else-part of the inner ifte:

-
G == [Pg] [E] [R1 [Pi] [T]]   [ifte] genrec
-  == [Pg] [E] [R1 [Pi] [T] [G] ifte] ifte
-
-
-

But this is in hindsight. Going forward I derived:

-
G == [first % not]
-     [first /]
-     [rest [not] [popop 0]]
-     [ifte] genrec
-
-
-

The predicate detects if the n can be evenly divided by the -first item in the list. If so, the then-part returns the result. -Otherwise, we have:

-
n [m ...] rest [not] [popop 0] [G] ifte
-n [...]        [not] [popop 0] [G] ifte
-
-
-

This ifte guards against empty sequences and returns zero in that -case, otherwise it executes G.

-
define('G == [first % not] [first /] [rest [not] [popop 0]] [ifte] genrec')
-
-
-

Now we need a word that uses G on each (head, tail) pair of a -sequence until it finds a (non-zero) result. It’s going to be designed -to work on a stack that has some candidate n, a sequence of possible -divisors, and a result that is zero to signal to continue (a non-zero -value implies that it is the discovered result):

-
   n [...] p find-result
----------------------------
-          result
-
-
-

It applies G using nullary because if it fails with one -candidate it needs the list to get the next one (the list is otherwise -consumed by G.)

-
find-result == [0 >] [roll> popop] [roll< popop uncons [G] nullary] primrec
-
-n [...] p [0 >] [roll> popop] [roll< popop uncons [G] nullary] primrec
-
-
-

The base-case is trivial, return the (non-zero) result. The recursive -branch…

-
n [...] p roll< popop uncons [G] nullary find-result
-[...] p n       popop uncons [G] nullary find-result
-[...]                 uncons [G] nullary find-result
-m [..]                       [G] nullary find-result
-m [..] p                                 find-result
-
-
-

The puzzle states that the input is well-formed, meaning that we can -expect a result before the row sequence empties and so do not need to -guard the uncons.

-
define('find-result == [0 >] [roll> popop] [roll< popop uncons [G] nullary] primrec')
-
-
-
J('[11 9 8 7 3 2] 0 tuck find-result')
-
-
-
3.0
-
-
-

In order to get the thing started, we need to sort the list in -descending order, then prime the find-result function with a dummy -candidate value and zero (“continue”) flag.

-
define('prep-row == sort reverse 0 tuck')
-
-
-

Now we can define our program.

-
define('AoC20017.2.extra == [prep-row find-result +] step_zero')
-
-
-
J('''
-
-[[5 9 2 8]
- [9 4 7 3]
- [3 8 6 5]] AoC20017.2.extra
-
-''')
-
-
-
9.0
-
-
-
-
-
- - -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/sphinx_docs/_build/html/notebooks/Advent of Code 2017 December 3rd.html b/docs/sphinx_docs/_build/html/notebooks/Advent of Code 2017 December 3rd.html deleted file mode 100644 index 3cf675b..0000000 --- a/docs/sphinx_docs/_build/html/notebooks/Advent of Code 2017 December 3rd.html +++ /dev/null @@ -1,787 +0,0 @@ - - - - - - - - Advent of Code 2017 — Thun 0.2.0 documentation - - - - - - - - - - - - - - - - - - -
-
-
-
- -
-

Advent of Code 2017

-
-

December 3rd

-

You come across an experimental new kind of memory stored on an infinite -two-dimensional grid.

-

Each square on the grid is allocated in a spiral pattern starting at a -location marked 1 and then counting up while spiraling outward. For -example, the first few squares are allocated like this:

-
17  16  15  14  13
-18   5   4   3  12
-19   6   1   2  11
-20   7   8   9  10
-21  22  23---> ...
-
-
-

While this is very space-efficient (no squares are skipped), requested -data must be carried back to square 1 (the location of the only access -port for this memory system) by programs that can only move up, down, -left, or right. They always take the shortest path: the Manhattan -Distance between the location of the data and square 1.

-

For example:

-
    -
  • Data from square 1 is carried 0 steps, since it’s at the access port.
  • -
  • Data from square 12 is carried 3 steps, such as: down, left, left.
  • -
  • Data from square 23 is carried only 2 steps: up twice.
  • -
  • Data from square 1024 must be carried 31 steps.
  • -
-

How many steps are required to carry the data from the square identified -in your puzzle input all the way to the access port?

-
-

Analysis

-

I freely admit that I worked out the program I wanted to write using -graph paper and some Python doodles. There’s no point in trying to write -a Joy program until I’m sure I understand the problem well enough.

-

The first thing I did was to write a column of numbers from 1 to n (32 -as it happens) and next to them the desired output number, to look for -patterns directly:

-
1  0
-2  1
-3  2
-4  1
-5  2
-6  1
-7  2
-8  1
-9  2
-10 3
-11 2
-12 3
-13 4
-14 3
-15 2
-16 3
-17 4
-18 3
-19 2
-20 3
-21 4
-22 3
-23 2
-24 3
-25 4
-26 5
-27 4
-28 3
-29 4
-30 5
-31 6
-32 5
-
-
-

There are four groups repeating for a given “rank”, then the pattern -enlarges and four groups repeat again, etc.

-
        1 2
-      3 2 3 4
-    5 4 3 4 5 6
-  7 6 5 4 5 6 7 8
-9 8 7 6 5 6 7 8 9 10
-
-
-

Four of this pyramid interlock to tile the plane extending from the -initial “1” square.

-
   2   3   |    4  5   |    6  7   |    8  9
-10 11 12 13|14 15 16 17|18 19 20 21|22 23 24 25
-
-
-

And so on.

-

We can figure out the pattern for a row of the pyramid at a given “rank” -\(k\):

-

\(2k - 1, 2k - 2, ..., k, k + 1, k + 2, ..., 2k\)

-

or

-

\(k + (k - 1), k + (k - 2), ..., k, k + 1, k + 2, ..., k + k\)

-

This shows that the series consists at each place of \(k\) plus some -number that begins at \(k - 1\), decreases to zero, then increases -to \(k\). Each row has \(2k\) members.

-

Let’s figure out how, given an index into a row, we can calculate the -value there. The index will be from 0 to \(k - 1\).

-

Let’s look at an example, with \(k = 4\):

-
0 1 2 3 4 5 6 7
-7 6 5 4 5 6 7 8
-
-
-
k = 4
-
-
-

Subtract \(k\) from the index and take the absolute value:

-
for n in range(2 * k):
-    print abs(n - k),
-
-
-
4 3 2 1 0 1 2 3
-
-
-

Not quite. Subtract \(k - 1\) from the index and take the absolute -value:

-
for n in range(2 * k):
-    print abs(n - (k - 1)),
-
-
-
3 2 1 0 1 2 3 4
-
-
-

Great, now add \(k\)

-
for n in range(2 * k):
-    print abs(n - (k - 1)) + k,
-
-
-
7 6 5 4 5 6 7 8
-
-
-

So to write a function that can give us the value of a row at a given -index:

-
def row_value(k, i):
-    i %= (2 * k)  # wrap the index at the row boundary.
-    return abs(i - (k - 1)) + k
-
-
-
k = 5
-for i in range(2 * k):
-    print row_value(k, i),
-
-
-
9 8 7 6 5 6 7 8 9 10
-
-
-

(I’m leaving out details of how I figured this all out and just giving -the relevent bits. It took a little while to zero in of the aspects of -the pattern that were important for the task.)

-
-
-

Finding the rank and offset of a number.

-

Now that we can compute the desired output value for a given rank and -the offset (index) into that rank, we need to determine how to find the -rank and offset of a number.

-

The rank is easy to find by iteratively stripping off the amount already -covered by previous ranks until you find the one that brackets the -target number. Because each row is \(2k\) places and there are -\(4\) per rank each rank contains \(8k\) places. Counting the -initial square we have:

-

\(corner_k = 1 + \sum_{n=1}^k 8n\)

-

I’m not mathematically sophisticated enough to turn this directly into a -formula (but Sympy is, see below.) I’m going to write a simple Python -function to iterate and search:

-
def rank_and_offset(n):
-    assert n >= 2  # Guard the domain.
-    n -= 2  # Subtract two,
-            # one for the initial square,
-            # and one because we are counting from 1 instead of 0.
-    k = 1
-    while True:
-        m = 8 * k  # The number of places total in this rank, 4(2k).
-        if n < m:
-            return k, n % (2 * k)
-        n -= m  # Remove this rank's worth.
-        k += 1
-
-
-
for n in range(2, 51):
-    print n, rank_and_offset(n)
-
-
-
2 (1, 0)
-3 (1, 1)
-4 (1, 0)
-5 (1, 1)
-6 (1, 0)
-7 (1, 1)
-8 (1, 0)
-9 (1, 1)
-10 (2, 0)
-11 (2, 1)
-12 (2, 2)
-13 (2, 3)
-14 (2, 0)
-15 (2, 1)
-16 (2, 2)
-17 (2, 3)
-18 (2, 0)
-19 (2, 1)
-20 (2, 2)
-21 (2, 3)
-22 (2, 0)
-23 (2, 1)
-24 (2, 2)
-25 (2, 3)
-26 (3, 0)
-27 (3, 1)
-28 (3, 2)
-29 (3, 3)
-30 (3, 4)
-31 (3, 5)
-32 (3, 0)
-33 (3, 1)
-34 (3, 2)
-35 (3, 3)
-36 (3, 4)
-37 (3, 5)
-38 (3, 0)
-39 (3, 1)
-40 (3, 2)
-41 (3, 3)
-42 (3, 4)
-43 (3, 5)
-44 (3, 0)
-45 (3, 1)
-46 (3, 2)
-47 (3, 3)
-48 (3, 4)
-49 (3, 5)
-50 (4, 0)
-
-
-
for n in range(2, 51):
-    k, i = rank_and_offset(n)
-    print n, row_value(k, i)
-
-
-
2 1
-3 2
-4 1
-5 2
-6 1
-7 2
-8 1
-9 2
-10 3
-11 2
-12 3
-13 4
-14 3
-15 2
-16 3
-17 4
-18 3
-19 2
-20 3
-21 4
-22 3
-23 2
-24 3
-25 4
-26 5
-27 4
-28 3
-29 4
-30 5
-31 6
-32 5
-33 4
-34 3
-35 4
-36 5
-37 6
-38 5
-39 4
-40 3
-41 4
-42 5
-43 6
-44 5
-45 4
-46 3
-47 4
-48 5
-49 6
-50 7
-
-
-
-
-

Putting it all together

-
def row_value(k, i):
-    return abs(i - (k - 1)) + k
-
-
-def rank_and_offset(n):
-    n -= 2  # Subtract two,
-            # one for the initial square,
-            # and one because we are counting from 1 instead of 0.
-    k = 1
-    while True:
-        m = 8 * k  # The number of places total in this rank, 4(2k).
-        if n < m:
-            return k, n % (2 * k)
-        n -= m  # Remove this rank's worth.
-        k += 1
-
-
-def aoc20173(n):
-    if n <= 1:
-        return 0
-    k, i = rank_and_offset(n)
-    return row_value(k, i)
-
-
-
aoc20173(23)
-
-
-
2
-
-
-
aoc20173(23000)
-
-
-
105
-
-
-
aoc20173(23000000000000)
-
-
-
4572225
-
-
-
-
-
-
-

Sympy to the Rescue

-

Using e.g. Sympy we can find the rank directly by solving for the roots -of an equation. For large numbers this will (eventually) be faster than -iterating as rank_and_offset() does.

-
from sympy import floor, lambdify, solve, symbols
-from sympy import init_printing
-init_printing()
-
-
-
k = symbols('k')
-
-
-

Since

-

\(1 + 2 + 3 + ... + N = \frac{N(N + 1)}{2}\)

-

and

-

\(\sum_{n=1}^k 8n = 8(\sum_{n=1}^k n) = 8\frac{k(k + 1)}{2}\)

-

We want:

-
E = 2 + 8 * k * (k + 1) / 2  # For the reason for adding 2 see above.
-
-E
-
-
-
-\[4 k \left(k + 1\right) + 2\]
-

We can write a function to solve for \(k\) given some \(n\)

-
def rank_of(n):
-    return floor(max(solve(E - n, k))) + 1
-
-
-

First solve() for \(E - n = 0\) which has two solutions (because -the equation is quadratic so it has two roots) and since we only care -about the larger one we use max() to select it. It will generally -not be a nice integer (unless \(n\) is the number of an end-corner -of a rank) so we take the floor() and add 1 to get the integer rank -of \(n\). (Taking the ceiling() gives off-by-one errors on the -rank boundaries. I don’t know why. I’m basically like a monkey doing -math here.) =-D

-

It gives correct answers:

-
for n in (9, 10, 25, 26, 49, 50):
-    print n, rank_of(n)
-
-
-
9 1
-10 2
-25 2
-26 3
-49 3
-50 4
-
-
-

And it runs much faster (at least for large numbers):

-
%time rank_of(23000000000000)  # Compare runtime with rank_and_offset()!
-
-
-
CPU times: user 68 ms, sys: 8 ms, total: 76 ms
-Wall time: 73.8 ms
-
-
-
-\[2397916\]
-
%time rank_and_offset(23000000000000)
-
-
-
CPU times: user 308 ms, sys: 0 ns, total: 308 ms
-Wall time: 306 ms
-
-
-
-\[\left ( 2397916, \quad 223606\right )\]
-

After finding the rank you would still have to find the actual value of -the rank’s first corner and subtract it (plus 2) from the number and -compute the offset as above and then the final output, but this overhead -is partially shared by the other method, and overshadowed by the time it -(the other iterative method) would take for really big inputs.

-

The fun thing to do here would be to graph the actual runtime of both -methods against each other to find the trade-off point.

-

Sympy is a symbolic math library, and it supports symbolic -manipulation of equations. I can put in \(y\) (instead of a value) -and ask it to solve for \(k\).

-
y = symbols('y')
-
-
-
g, f = solve(E - y, k)
-
-
-

The equation is quadratic so there are two roots, we are interested in -the greater one…

-
g
-
-
-
-\[- \frac{1}{2} \sqrt{y - 1} - \frac{1}{2}\]
-
f
-
-
-
-\[\frac{1}{2} \sqrt{y - 1} - \frac{1}{2}\]
-

Now we can take the floor(), add 1, and lambdify() the equation -to get a Python function that calculates the rank directly.

-
floor(f) + 1
-
-
-
-\[\lfloor{\frac{1}{2} \sqrt{y - 1} - \frac{1}{2}}\rfloor + 1\]
-
F = lambdify(y, floor(f) + 1)
-
-
-
for n in (9, 10, 25, 26, 49, 50):
-    print n, int(F(n))
-
-
-
9 1
-10 2
-25 2
-26 3
-49 3
-50 4
-
-
-

It’s pretty fast.

-
%time int(F(23000000000000))  # The clear winner.
-
-
-
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
-Wall time: 11.9 µs
-
-
-
-\[2397916\]
-

Knowing the equation we could write our own function manually, but the -speed is no better.

-
from math import floor as mfloor, sqrt
-
-def mrank_of(n):
-    return int(mfloor(sqrt(23000000000000 - 1) / 2 - 0.5) + 1)
-
-
-
%time mrank_of(23000000000000)
-
-
-
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
-Wall time: 12.9 µs
-
-
-
-\[2397916\]
-

Now that we have a fast way to get the rank, we still need to use it to -compute the offset into a pyramid row.

-
def offset_of(n, k):
-    return (n - 2 + 4 * k * (k - 1)) % (2 * k)
-
-
-

(Note the sneaky way the sign changes from \(k(k + 1)\) to -\(k(k - 1)\). This is because we want to subract the -\((k - 1)\)th rank’s total places (its own and those of lesser -rank) from our \(n\) of rank \(k\). Substituting \(k - 1\) -for \(k\) in \(k(k + 1)\) gives \((k - 1)(k - 1 + 1)\), -which of course simplifies to \(k(k - 1)\).)

-
offset_of(23000000000000, 2397916)
-
-
-
-\[223606\]
-

So, we can compute the rank, then the offset, then the row value.

-
def rank_of(n):
-    return int(mfloor(sqrt(n - 1) / 2 - 0.5) + 1)
-
-
-def offset_of(n, k):
-    return (n - 2 + 4 * k * (k - 1)) % (2 * k)
-
-
-def row_value(k, i):
-    return abs(i - (k - 1)) + k
-
-
-def aoc20173(n):
-    k = rank_of(n)
-    i = offset_of(n, k)
-    return row_value(k, i)
-
-
-
aoc20173(23)
-
-
-
-\[2\]
-
aoc20173(23000)
-
-
-
-\[105\]
-
aoc20173(23000000000000)
-
-
-
-\[4572225\]
-
%time aoc20173(23000000000000000000000000)  # Fast for large values.
-
-
-
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
-Wall time: 20 µs
-
-
-
-\[2690062495969\]
-
-
-

A Joy Version

-

At this point I feel confident that I can implement a concise version of -this code in Joy. ;-)

-
from notebook_preamble import J, V, define
-
-
-
   n rank_of
----------------
-      k
-
-
-

The translation is straightforward.

-
int(floor(sqrt(n - 1) / 2 - 0.5) + 1)
-
-rank_of == -- sqrt 2 / 0.5 - floor ++
-
-
-
define('rank_of == -- sqrt 2 / 0.5 - floor ++')
-
-
-
   n k offset_of
--------------------
-         i
-
-(n - 2 + 4 * k * (k - 1)) % (2 * k)
-
-
-

A little tricky…

-
n k dup 2 *
-n k k 2 *
-n k k*2 [Q] dip %
-n k Q k*2 %
-
-n k dup --
-n k k --
-n k k-1 4 * * 2 + -
-n k*k-1*4     2 + -
-n k*k-1*4+2       -
-n-k*k-1*4+2
-
-n-k*k-1*4+2 k*2 %
-n-k*k-1*4+2%k*2
-
-
-

Ergo:

-
offset_of == dup 2 * [dup -- 4 * * 2 + -] dip %
-
-
-
define('offset_of == dup 2 * [dup -- 4 * * 2 + -] dip %')
-
-
-
   k i row_value
--------------------
-        n
-
-abs(i - (k - 1)) + k
-
-k i over -- - abs +
-k i k    -- - abs +
-k i k-1     - abs +
-k i-k-1       abs +
-k |i-k-1|         +
-k+|i-k-1|
-
-
-
define('row_value == over -- - abs +')
-
-
-
   n aoc2017.3
------------------
-        m
-
-n dup rank_of
-n k [offset_of] dupdip
-n k offset_of k
-i             k swap row_value
-k i row_value
-m
-
-
-
define('aoc2017.3 == dup rank_of [offset_of] dupdip swap row_value')
-
-
-
J('23 aoc2017.3')
-
-
-
2
-
-
-
J('23000 aoc2017.3')
-
-
-
105
-
-
-
V('23000000000000 aoc2017.3')
-
-
-
                                                    . 23000000000000 aoc2017.3
-                                     23000000000000 . aoc2017.3
-                                     23000000000000 . dup rank_of [offset_of] dupdip swap row_value
-                      23000000000000 23000000000000 . rank_of [offset_of] dupdip swap row_value
-                      23000000000000 23000000000000 . -- sqrt 2 / 0.5 - floor ++ [offset_of] dupdip swap row_value
-                      23000000000000 22999999999999 . sqrt 2 / 0.5 - floor ++ [offset_of] dupdip swap row_value
-                   23000000000000 4795831.523312615 . 2 / 0.5 - floor ++ [offset_of] dupdip swap row_value
-                 23000000000000 4795831.523312615 2 . / 0.5 - floor ++ [offset_of] dupdip swap row_value
-                  23000000000000 2397915.7616563076 . 0.5 - floor ++ [offset_of] dupdip swap row_value
-              23000000000000 2397915.7616563076 0.5 . - floor ++ [offset_of] dupdip swap row_value
-                  23000000000000 2397915.2616563076 . floor ++ [offset_of] dupdip swap row_value
-                             23000000000000 2397915 . ++ [offset_of] dupdip swap row_value
-                             23000000000000 2397916 . [offset_of] dupdip swap row_value
-                 23000000000000 2397916 [offset_of] . dupdip swap row_value
-                             23000000000000 2397916 . offset_of 2397916 swap row_value
-                             23000000000000 2397916 . dup 2 * [dup -- 4 * * 2 + -] dip % 2397916 swap row_value
-                     23000000000000 2397916 2397916 . 2 * [dup -- 4 * * 2 + -] dip % 2397916 swap row_value
-                   23000000000000 2397916 2397916 2 . * [dup -- 4 * * 2 + -] dip % 2397916 swap row_value
-                     23000000000000 2397916 4795832 . [dup -- 4 * * 2 + -] dip % 2397916 swap row_value
-23000000000000 2397916 4795832 [dup -- 4 * * 2 + -] . dip % 2397916 swap row_value
-                             23000000000000 2397916 . dup -- 4 * * 2 + - 4795832 % 2397916 swap row_value
-                     23000000000000 2397916 2397916 . -- 4 * * 2 + - 4795832 % 2397916 swap row_value
-                     23000000000000 2397916 2397915 . 4 * * 2 + - 4795832 % 2397916 swap row_value
-                   23000000000000 2397916 2397915 4 . * * 2 + - 4795832 % 2397916 swap row_value
-                     23000000000000 2397916 9591660 . * 2 + - 4795832 % 2397916 swap row_value
-                      23000000000000 22999994980560 . 2 + - 4795832 % 2397916 swap row_value
-                    23000000000000 22999994980560 2 . + - 4795832 % 2397916 swap row_value
-                      23000000000000 22999994980562 . - 4795832 % 2397916 swap row_value
-                                            5019438 . 4795832 % 2397916 swap row_value
-                                    5019438 4795832 . % 2397916 swap row_value
-                                             223606 . 2397916 swap row_value
-                                     223606 2397916 . swap row_value
-                                     2397916 223606 . row_value
-                                     2397916 223606 . over -- - abs +
-                             2397916 223606 2397916 . -- - abs +
-                             2397916 223606 2397915 . - abs +
-                                   2397916 -2174309 . abs +
-                                    2397916 2174309 . +
-                                            4572225 .
-
-
-
  rank_of == -- sqrt 2 / 0.5 - floor ++
-offset_of == dup 2 * [dup -- 4 * * 2 + -] dip %
-row_value == over -- - abs +
-
-aoc2017.3 == dup rank_of [offset_of] dupdip swap row_value
-
-
-
- - -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/sphinx_docs/_build/html/notebooks/Advent of Code 2017 December 4th.html b/docs/sphinx_docs/_build/html/notebooks/Advent of Code 2017 December 4th.html deleted file mode 100644 index cbc30b7..0000000 --- a/docs/sphinx_docs/_build/html/notebooks/Advent of Code 2017 December 4th.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - Advent of Code 2017 — Thun 0.2.0 documentation - - - - - - - - - - - - - - - - - - -
-
-
-
- -
-

Advent of Code 2017

-
-

December 4th

-

To ensure security, a valid passphrase must contain no duplicate words.

-

For example:

-
    -
  • aa bb cc dd ee is valid.
  • -
  • aa bb cc dd aa is not valid - the word aa appears more than once.
  • -
  • aa bb cc dd aaa is valid - aa and aaa count as different words.
  • -
-

The system’s full passphrase list is available as your puzzle input. How -many passphrases are valid?

-
from notebook_preamble import J, V, define
-
-
-

I’ll assume the input is a Joy sequence of sequences of integers.

-
[[5 1 9 5]
- [7 5 4 3]
- [2 4 6 8]]
-
-
-

So, obviously, the initial form will be a step function:

-
AoC2017.4 == 0 swap [F +] step
-
-
-
F == [size] [unique size] cleave =
-
-
-

The step_zero combinator includes the 0 swap that would normally -open one of these definitions:

-
J('[step_zero] help')
-
-
-
0 roll> step
-
-
-
AoC2017.4 == [F +] step_zero
-
-
-
define('AoC2017.4 == [[size] [unique size] cleave = +] step_zero')
-
-
-
J('''
-
-[[5 1 9 5]
- [7 5 4 3]
- [2 4 6 8]] AoC2017.4
-
-''')
-
-
-
2
-
-
-
-
- - -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/sphinx_docs/_build/html/notebooks/Advent of Code 2017 December 5th.html b/docs/sphinx_docs/_build/html/notebooks/Advent of Code 2017 December 5th.html deleted file mode 100644 index b43719e..0000000 --- a/docs/sphinx_docs/_build/html/notebooks/Advent of Code 2017 December 5th.html +++ /dev/null @@ -1,368 +0,0 @@ - - - - - - - - Advent of Code 2017 — Thun 0.2.0 documentation - - - - - - - - - - - - - - - - - - -
-
-
-
- -
-

Advent of Code 2017

-
-

December 5th

-

…a list of the offsets for each jump. Jumps are relative: -1 moves to -the previous instruction, and 2 skips the next one. Start at the first -instruction in the list. The goal is to follow the jumps until one leads -outside the list.

-

In addition, these instructions are a little strange; after each jump, -the offset of that instruction increases by 1. So, if you come across an -offset of 3, you would move three instructions forward, but change it to -a 4 for the next time it is encountered.

-

For example, consider the following list of jump offsets:

-
0
-3
-0
-1
--3
-
-
-

Positive jumps (“forward”) move downward; negative jumps move upward. -For legibility in this example, these offset values will be written all -on one line, with the current instruction marked in parentheses. The -following steps would be taken before an exit is found:

-
    -
    1. -
    2. 3 0 1 -3 - before we have taken any steps.
    3. -
    -
  • -
    1. -
    2. 3 0 1 -3 - jump with offset 0 (that is, don’t jump at all). -Fortunately, the instruction is then incremented to 1.
    3. -
    -
  • -
  • 2 (3) 0 1 -3 - step forward because of the instruction we just -modified. The first instruction is incremented again, now to 2.
  • -
  • 2 4 0 1 (-3) - jump all the way to the end; leave a 4 behind.
  • -
  • 2 (4) 0 1 -2 - go back to where we just were; increment -3 to -2.
  • -
  • 2 5 0 1 -2 - jump 4 steps forward, escaping the maze.
  • -
-

In this example, the exit is reached in 5 steps.

-

How many steps does it take to reach the exit?

-
-
-

Breakdown

-

For now, I’m going to assume a starting state with the size of the -sequence pre-computed. We need it to define the exit condition and it is -a trivial preamble to generate it. We then need and index and a -step-count, which are both initially zero. Then we have the sequence -itself, and some recursive function F that does the work.

-
   size index step-count [...] F
------------------------------------
-            step-count
-
-F == [P] [T] [R1] [R2] genrec
-
-
-

Later on I was thinking about it and the Forth heuristic came to mind, -to wit: four things on the stack are kind of much. Immediately I -realized that the size properly belongs in the predicate of F! D’oh!

-
   index step-count [...] F
-------------------------------
-         step-count
-
-
-

So, let’s start by nailing down the predicate:

-
F == [P] [T] [R1]   [R2] genrec
-  == [P] [T] [R1 [F] R2] ifte
-
-0 0 [0 3 0 1 -3] popop 5 >=
-
-P == popop 5 >=
-
-
-

Now we need the else-part:

-
index step-count [0 3 0 1 -3] roll< popop
-
-E == roll< popop
-
-
-

Last but not least, the recursive branch

-
0 0 [0 3 0 1 -3] R1 [F] R2
-
-
-

The R1 function has a big job:

-
R1 == get the value at index
-      increment the value at the index
-      add the value gotten to the index
-      increment the step count
-
-
-

The only tricky thing there is incrementing an integer in the sequence. -Joy sequences are not particularly good for random access. We could -encode the list of jump offsets in a big integer and use math to do the -processing for a good speed-up, but it still wouldn’t beat the -performance of e.g. a mutable array. This is just one of those places -where “plain vanilla” Joypy doesn’t shine (in default performance. The -legendary Sufficiently-Smart Compiler would of course rewrite this -function to use an array “under the hood”.)

-

In the meantime, I’m going to write a primitive function that just does -what we need.

-
from notebook_preamble import D, J, V, define
-from joy.library import SimpleFunctionWrapper
-from joy.utils.stack import list_to_stack
-
-
-@SimpleFunctionWrapper
-def incr_at(stack):
-    '''Given a index and a sequence of integers, increment the integer at the index.
-
-    E.g.:
-
-       3 [0 1 2 3 4 5] incr_at
-    -----------------------------
-         [0 1 2 4 4 5]
-
-    '''
-    sequence, (i, stack) = stack
-    mem = []
-    while i >= 0:
-        term, sequence = sequence
-        mem.append(term)
-        i -= 1
-    mem[-1] += 1
-    return list_to_stack(mem, sequence), stack
-
-
-D['incr_at'] = incr_at
-
-
-
J('3 [0 1 2 3 4 5] incr_at')
-
-
-
[0 1 2 4 4 5]
-
-
-
-

get the value at index

-
3 0 [0 1 2 3 4] [roll< at] nullary
-3 0 [0 1 2 n 4] n
-
-
-
-
-

increment the value at the index

-
3 0 [0 1 2 n 4] n [Q] dip
-3 0 [0 1 2 n 4] Q n
-3 0 [0 1 2 n 4] [popd incr_at] unary n
-3 0 [0 1 2 n+1 4] n
-
-
-
-
-

add the value gotten to the index

-
3 0 [0 1 2 n+1 4] n [+] cons dipd
-3 0 [0 1 2 n+1 4] [n +]      dipd
-3 n + 0 [0 1 2 n+1 4]
-3+n   0 [0 1 2 n+1 4]
-
-
-
-
-

increment the step count

-
3+n 0 [0 1 2 n+1 4] [++] dip
-3+n 1 [0 1 2 n+1 4]
-
-
-
-
-

All together now…

-
get_value == [roll< at] nullary
-incr_value == [[popd incr_at] unary] dip
-add_value == [+] cons dipd
-incr_step_count == [++] dip
-
-R1 == get_value incr_value add_value incr_step_count
-
-F == [P] [T] [R1] primrec
-
-F == [popop !size! >=] [roll< pop] [get_value incr_value add_value incr_step_count] primrec
-
-
-
from joy.library import DefinitionWrapper
-
-
-DefinitionWrapper.add_definitions('''
-
-      get_value == [roll< at] nullary
-     incr_value == [[popd incr_at] unary] dip
-      add_value == [+] cons dipd
-incr_step_count == [++] dip
-
-     AoC2017.5.0 == get_value incr_value add_value incr_step_count
-
-''', D)
-
-
-
define('F == [popop 5 >=] [roll< popop] [AoC2017.5.0] primrec')
-
-
-
J('0 0 [0 3 0 1 -3] F')
-
-
-
5
-
-
-
-
-

Preamble for setting up predicate, index, and step-count

-

We want to go from this to this:

-
   [...] AoC2017.5.preamble
-------------------------------
-    0 0 [...] [popop n >=]
-
-
-

Where n is the size of the sequence.

-

The first part is obviously 0 0 roll<, then dup size:

-
[...] 0 0 roll< dup size
-0 0 [...] n
-
-
-

Then:

-
0 0 [...] n [>=] cons [popop] swoncat
-
-
-

So:

-
init-index-and-step-count == 0 0 roll<
-prepare-predicate == dup size [>=] cons [popop] swoncat
-
-AoC2017.5.preamble == init-index-and-step-count prepare-predicate
-
-
-
DefinitionWrapper.add_definitions('''
-
-init-index-and-step-count == 0 0 roll<
-        prepare-predicate == dup size [>=] cons [popop] swoncat
-
-       AoC2017.5.preamble == init-index-and-step-count prepare-predicate
-
-                AoC2017.5 == AoC2017.5.preamble [roll< popop] [AoC2017.5.0] primrec
-
-''', D)
-
-
-
J('[0 3 0 1 -3] AoC2017.5')
-
-
-
5
-
-
-
                AoC2017.5 == AoC2017.5.preamble [roll< popop] [AoC2017.5.0] primrec
-
-              AoC2017.5.0 == get_value incr_value add_value incr_step_count
-       AoC2017.5.preamble == init-index-and-step-count prepare-predicate
-
-                get_value == [roll< at] nullary
-               incr_value == [[popd incr_at] unary] dip
-                add_value == [+] cons dipd
-          incr_step_count == [++] dip
-
-init-index-and-step-count == 0 0 roll<
-        prepare-predicate == dup size [>=] cons [popop] swoncat
-
-
-

This is by far the largest program I have yet written in Joy. Even with -the incr_at function it is still a bear. There may be an arrangement -of the parameters that would permit more elegant definitions, but it -still wouldn’t be as efficient as something written in assembly, C, or -even Python.

-
-
-
- - -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/sphinx_docs/_build/html/notebooks/Advent of Code 2017 December 6th.html b/docs/sphinx_docs/_build/html/notebooks/Advent of Code 2017 December 6th.html deleted file mode 100644 index 2de39c8..0000000 --- a/docs/sphinx_docs/_build/html/notebooks/Advent of Code 2017 December 6th.html +++ /dev/null @@ -1,323 +0,0 @@ - - - - - - - - Advent of Code 2017 — Thun 0.2.0 documentation - - - - - - - - - - - - - - - - - - -
-
-
-
- -
-

Advent of Code 2017

-
-

December 6th

-
[0 2 7 0] dup max
-
-
-
from notebook_preamble import D, J, V, define
-
-
-
J('[0 2 7 0] dup max')
-
-
-
[0 2 7 0] 7
-
-
-
from joy.library import SimpleFunctionWrapper
-from joy.utils.stack import list_to_stack
-
-
-@SimpleFunctionWrapper
-def index_of(stack):
-    '''Given a sequence and a item, return the index of the item, or -1 if not found.
-
-    E.g.:
-
-       [a b c] a index_of
-    ------------------------
-               0
-
-       [a b c] d index_of
-    ------------------------
-            -1
-
-    '''
-    item, (sequence, stack) = stack
-    i = 0
-    while sequence:
-        term, sequence = sequence
-        if term == item:
-            break
-        i += 1
-    else:
-        i = -1
-    return i, stack
-
-
-D['index_of'] = index_of
-
-
-
J('[0 2 7 0] 7 index_of')
-
-
-
2
-
-
-
J('[0 2 7 0] 23 index_of')
-
-
-
-1
-
-
-

Starting at index distribute count “blocks” to the “banks” in -the sequence.

-
[...] count index distribute
-----------------------------
-           [...]
-
-
-

This seems like it would be a PITA to implement in Joypy…

-
from joy.utils.stack import iter_stack, list_to_stack
-
-
-@SimpleFunctionWrapper
-def distribute(stack):
-    '''Starting at index+1 distribute count "blocks" to the "banks" in the sequence.
-
-    [...] count index distribute
-    ----------------------------
-               [...]
-
-    '''
-    index, (count, (sequence, stack)) = stack
-    assert count >= 0
-    cheat = list(iter_stack(sequence))
-    n = len(cheat)
-    assert index < n
-    cheat[index] = 0
-    while count:
-        index += 1
-        index %= n
-        cheat[index] += 1
-        count -= 1
-    return list_to_stack(cheat), stack
-
-
-D['distribute'] = distribute
-
-
-
J('[0 2 7 0] dup max [index_of] nullary distribute')
-
-
-
[2 4 1 2]
-
-
-
J('[2 4 1 2] dup max [index_of] nullary distribute')
-
-
-
[3 1 2 3]
-
-
-
J('[3 1 2 3] dup max [index_of] nullary distribute')
-
-
-
[0 2 3 4]
-
-
-
J('[0 2 3 4] dup max [index_of] nullary distribute')
-
-
-
[1 3 4 1]
-
-
-
J('[1 3 4 1] dup max [index_of] nullary distribute')
-
-
-
[2 4 1 2]
-
-
-
-

Recalling “Generator Programs”

-
[a F] x
-[a F] a F
-
-[a F] a swap [C] dip rest cons
-a   [a F]    [C] dip rest cons
-a C [a F]            rest cons
-a C   [F]                 cons
-
-w/ C == dup G
-
-a dup G [F] cons
-a a   G [F] cons
-
-w/ G == dup max [index_of] nullary distribute
-
-
-
define('direco == dip rest cons')
-
-
-
define('G == [direco] cons [swap] swoncat cons')
-
-
-
define('make_distributor == [dup dup max [index_of] nullary distribute] G')
-
-
-
J('[0 2 7 0] make_distributor 6 [x] times pop')
-
-
-
[0 2 7 0] [2 4 1 2] [3 1 2 3] [0 2 3 4] [1 3 4 1] [2 4 1 2]
-
-
-
-
-

A function to drive a generator and count how many states before a repeat.

-

First draft:

-
[] [GEN] x [pop index_of 0 >=] [pop size --] [[swons] dip x] primrec
-
-
-

(?)

-
[]       [GEN] x [pop index_of 0 >=] [pop size --] [[swons] dip x] primrec
-[] [...] [GEN]   [pop index_of 0 >=] [pop size --] [[swons] dip x] primrec
-[] [...] [GEN]    pop index_of 0 >=
-[] [...]              index_of 0 >=
-                            -1 0 >=
-                             False
-
-
-

Base case

-
[] [...] [GEN] [pop index_of 0 >=] [pop size --] [[swons] dip x] primrec
-[] [...] [GEN]                      pop size --
-[] [...]                                size --
-[] [...]                                size --
-
-
-

A mistake, popop and no need for --

-
[] [...] [GEN] popop size
-[]                   size
-n
-
-
-

Recursive case

-
[] [...] [GEN] [pop index_of 0 >=] [popop size] [[swons] dip x] primrec
-[] [...] [GEN]                                   [swons] dip x  F
-[] [...] swons [GEN]                                         x  F
-[[...]]        [GEN]                                         x  F
-[[...]] [...]  [GEN]                                            F
-
-[[...]] [...] [GEN] F
-
-
-

What have we learned?

-
F == [pop index_of 0 >=] [popop size] [[swons] dip x] primrec
-
-
-
define('count_states == [] swap x [pop index_of 0 >=] [popop size] [[swons] dip x] primrec')
-
-
-
define('AoC2017.6 == make_distributor count_states')
-
-
-
J('[0 2 7 0] AoC2017.6')
-
-
-
5
-
-
-
J('[1 1 1] AoC2017.6')
-
-
-
4
-
-
-
J('[8 0 0 0 0 0] AoC2017.6')
-
-
-
15
-
-
-
-
-
- - -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/sphinx_docs/_build/html/notebooks/Generator Programs.html b/docs/sphinx_docs/_build/html/notebooks/Generator Programs.html deleted file mode 100644 index 690e8c4..0000000 --- a/docs/sphinx_docs/_build/html/notebooks/Generator Programs.html +++ /dev/null @@ -1,569 +0,0 @@ - - - - - - - - Using x to Generate Values — Thun 0.2.0 documentation - - - - - - - - - - - - - - - - - - - - -
-
-
-
- -
-

Using x to Generate Values

-

Cf. jp-reprod.html

-
from notebook_preamble import J, V, define
-
-
-

Consider the x combinator:

-
x == dup i
-
-
-

We can apply it to a quoted program consisting of some value a and -some function B:

-
[a B] x
-[a B] a B
-
-
-

Let B function swap the a with the quote and run some -function C on it to generate a new value b:

-
B == swap [C] dip
-
-[a B] a B
-[a B] a swap [C] dip
-a [a B]      [C] dip
-a C [a B]
-b [a B]
-
-
-

Now discard the quoted a with rest then cons b:

-
b [a B] rest cons
-b [B]        cons
-[b B]
-
-
-

Altogether, this is the definition of B:

-
B == swap [C] dip rest cons
-
-
-

We can make a generator for the Natural numbers (0, 1, 2, …) by using -0 for a and [dup ++] for [C]:

-
[0 swap [dup ++] dip rest cons]
-
-
-

Let’s try it:

-
V('[0 swap [dup ++] dip rest cons] x')
-
-
-
                                           . [0 swap [dup ++] dip rest cons] x
-           [0 swap [dup ++] dip rest cons] . x
-           [0 swap [dup ++] dip rest cons] . 0 swap [dup ++] dip rest cons
-         [0 swap [dup ++] dip rest cons] 0 . swap [dup ++] dip rest cons
-         0 [0 swap [dup ++] dip rest cons] . [dup ++] dip rest cons
-0 [0 swap [dup ++] dip rest cons] [dup ++] . dip rest cons
-                                         0 . dup ++ [0 swap [dup ++] dip rest cons] rest cons
-                                       0 0 . ++ [0 swap [dup ++] dip rest cons] rest cons
-                                       0 1 . [0 swap [dup ++] dip rest cons] rest cons
-       0 1 [0 swap [dup ++] dip rest cons] . rest cons
-         0 1 [swap [dup ++] dip rest cons] . cons
-         0 [1 swap [dup ++] dip rest cons] .
-
-
-

After one application of x the quoted program contains 1 and -0 is below it on the stack.

-
J('[0 swap [dup ++] dip rest cons] x x x x x pop')
-
-
-
0 1 2 3 4
-
-
-
-

direco

-
define('direco == dip rest cons')
-
-
-
V('[0 swap [dup ++] direco] x')
-
-
-
                                    . [0 swap [dup ++] direco] x
-           [0 swap [dup ++] direco] . x
-           [0 swap [dup ++] direco] . 0 swap [dup ++] direco
-         [0 swap [dup ++] direco] 0 . swap [dup ++] direco
-         0 [0 swap [dup ++] direco] . [dup ++] direco
-0 [0 swap [dup ++] direco] [dup ++] . direco
-0 [0 swap [dup ++] direco] [dup ++] . dip rest cons
-                                  0 . dup ++ [0 swap [dup ++] direco] rest cons
-                                0 0 . ++ [0 swap [dup ++] direco] rest cons
-                                0 1 . [0 swap [dup ++] direco] rest cons
-       0 1 [0 swap [dup ++] direco] . rest cons
-         0 1 [swap [dup ++] direco] . cons
-         0 [1 swap [dup ++] direco] .
-
-
-
-
-

Making Generators

-

We want to define a function that accepts a and [C] and builds -our quoted program:

-
         a [C] G
--------------------------
-   [a swap [C] direco]
-
-
-

Working in reverse:

-
[a swap   [C] direco] cons
-a [swap   [C] direco] concat
-a [swap] [[C] direco] swap
-a [[C] direco] [swap]
-a [C] [direco] cons [swap]
-
-
-

Reading from the bottom up:

-
G == [direco] cons [swap] swap concat cons
-G == [direco] cons [swap] swoncat cons
-
-
-
define('G == [direco] cons [swap] swoncat cons')
-
-
-

Let’s try it out:

-
J('0 [dup ++] G')
-
-
-
[0 swap [dup ++] direco]
-
-
-
J('0 [dup ++] G x x x pop')
-
-
-
0 1 2
-
-
-
-

Powers of 2

-
J('1 [dup 1 <<] G x x x x x x x x x pop')
-
-
-
1 2 4 8 16 32 64 128 256
-
-
-
-
-

[x] times

-

If we have one of these quoted programs we can drive it using times -with the x combinator.

-
J('23 [dup ++] G 5 [x] times')
-
-
-
23 24 25 26 27 [28 swap [dup ++] direco]
-
-
-
-
-
-

Generating Multiples of Three and Five

-

Look at the treatment of the Project Euler Problem One in Developing a -Program.ipynb and you’ll see that -we might be interested in generating an endless cycle of:

-
3 2 1 3 1 2 3
-
-
-

To do this we want to encode the numbers as pairs of bits in a single -int:

-
    3  2  1  3  1  2  3
-0b 11 10 01 11 01 10 11 == 14811
-
-
-

And pick them off by masking with 3 (binary 11) and then shifting the -int right two bits.

-
define('PE1.1 == dup [3 &] dip 2 >>')
-
-
-
V('14811 PE1.1')
-
-
-
                  . 14811 PE1.1
-            14811 . PE1.1
-            14811 . dup [3 &] dip 2 >>
-      14811 14811 . [3 &] dip 2 >>
-14811 14811 [3 &] . dip 2 >>
-            14811 . 3 & 14811 2 >>
-          14811 3 . & 14811 2 >>
-                3 . 14811 2 >>
-          3 14811 . 2 >>
-        3 14811 2 . >>
-           3 3702 .
-
-
-

If we plug 14811 and [PE1.1] into our generator form…

-
J('14811 [PE1.1] G')
-
-
-
[14811 swap [PE1.1] direco]
-
-
-

…we get a generator that works for seven cycles before it reaches -zero:

-
J('[14811 swap [PE1.1] direco] 7 [x] times')
-
-
-
3 2 1 3 1 2 3 [0 swap [PE1.1] direco]
-
-
-
-

Reset at Zero

-

We need a function that checks if the int has reached zero and resets it -if so.

-
define('PE1.1.check == dup [pop 14811] [] branch')
-
-
-
J('14811 [PE1.1.check PE1.1] G')
-
-
-
[14811 swap [PE1.1.check PE1.1] direco]
-
-
-
J('[14811 swap [PE1.1.check PE1.1] direco] 21 [x] times')
-
-
-
3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 [0 swap [PE1.1.check PE1.1] direco]
-
-
-

(It would be more efficient to reset the int every seven cycles but -that’s a little beyond the scope of this article. This solution does -extra work, but not much, and we’re not using it “in production” as they -say.)

-
-
-

Run 466 times

-

In the PE1 problem we are asked to sum all the multiples of three and -five less than 1000. It’s worked out that we need to use all seven -numbers sixty-six times and then four more.

-
J('7 66 * 4 +')
-
-
-
466
-
-
-

If we drive our generator 466 times and sum the stack we get 999.

-
J('[14811 swap [PE1.1.check PE1.1] direco] 466 [x] times')
-
-
-
3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 1 2 3 3 2 1 3 [57 swap [PE1.1.check PE1.1] direco]
-
-
-
J('[14811 swap [PE1.1.check PE1.1] direco] 466 [x] times pop enstacken sum')
-
-
-
999
-
-
-
-
-
-

Project Euler Problem One

-
define('PE1.2 == + dup [+] dip')
-
-
-

Now we can add PE1.2 to the quoted program given to G.

-
J('0 0 0 [PE1.1.check PE1.1] G 466 [x [PE1.2] dip] times popop')
-
-
-
233168
-
-
-
-
-

A generator for the Fibonacci Sequence.

-

Consider:

-
[b a F] x
-[b a F] b a F
-
-
-

The obvious first thing to do is just add b and a:

-
[b a F] b a +
-[b a F] b+a
-
-
-

From here we want to arrive at:

-
b [b+a b F]
-
-
-

Let’s start with swons:

-
[b a F] b+a swons
-[b+a b a F]
-
-
-

Considering this quote as a stack:

-
F a b b+a
-
-
-

We want to get it to:

-
F b b+a b
-
-
-

So:

-
F a b b+a popdd over
-F b b+a b
-
-
-

And therefore:

-
[b+a b a F] [popdd over] infra
-[b b+a b F]
-
-
-

But we can just use cons to carry b+a into the quote:

-
[b a F] b+a [popdd over] cons infra
-[b a F] [b+a popdd over]      infra
-[b b+a b F]
-
-
-

Lastly:

-
[b b+a b F] uncons
-b [b+a b F]
-
-
-

Putting it all together:

-
F == + [popdd over] cons infra uncons
-fib_gen == [1 1 F]
-
-
-
define('fib == + [popdd over] cons infra uncons')
-
-
-
define('fib_gen == [1 1 fib]')
-
-
-
J('fib_gen 10 [x] times')
-
-
-
1 2 3 5 8 13 21 34 55 89 [144 89 fib]
-
-
-
-
-

Project Euler Problem Two

-
By considering the terms in the Fibonacci sequence whose values do not exceed four million,
-find the sum of the even-valued terms.
-
-
-

Now that we have a generator for the Fibonacci sequence, we need a -function that adds a term in the sequence to a sum if it is even, and -pops it otherwise.

-
define('PE2.1 == dup 2 % [+] [pop] branch')
-
-
-

And a predicate function that detects when the terms in the series -“exceed four million”.

-
define('>4M == 4000000 >')
-
-
-

Now it’s straightforward to define PE2 as a recursive function that -generates terms in the Fibonacci sequence until they exceed four million -and sums the even ones.

-
define('PE2 == 0 fib_gen x [pop >4M] [popop] [[PE2.1] dip x] primrec')
-
-
-
J('PE2')
-
-
-
4613732
-
-
-

Here’s the collected program definitions:

-
fib == + swons [popdd over] infra uncons
-fib_gen == [1 1 fib]
-
-even == dup 2 %
->4M == 4000000 >
-
-PE2.1 == even [+] [pop] branch
-PE2 == 0 fib_gen x [pop >4M] [popop] [[PE2.1] dip x] primrec
-
-
-
-

Even-valued Fibonacci Terms

-

Using o for odd and e for even:

-
o + o = e
-e + e = e
-o + e = o
-
-
-

So the Fibonacci sequence considered in terms of just parity would be:

-
o o e o o e o o e o o e o o e o o e
-1 1 2 3 5 8 . . .
-
-
-

Every third term is even.

-
J('[1 0 fib] x x x')  # To start the sequence with 1 1 2 3 instead of 1 2 3.
-
-
-
1 1 2 [3 2 fib]
-
-
-

Drive the generator three times and popop the two odd terms.

-
J('[1 0 fib] x x x [popop] dipd')
-
-
-
2 [3 2 fib]
-
-
-
define('PE2.2 == x x x [popop] dipd')
-
-
-
J('[1 0 fib] 10 [PE2.2] times')
-
-
-
2 8 34 144 610 2584 10946 46368 196418 832040 [1346269 832040 fib]
-
-
-

Replace x with our new driver function PE2.2 and start our -fib generator at 1 0.

-
J('0 [1 0 fib] PE2.2 [pop >4M] [popop] [[PE2.1] dip PE2.2] primrec')
-
-
-
4613732
-
-
-
-
-
-

How to compile these?

-

You would probably start with a special version of G, and perhaps -modifications to the default x?

-
-
-

An Interesting Variation

-
define('codireco == cons dip rest cons')
-
-
-
V('[0 [dup ++] codireco] x')
-
-
-
                                 . [0 [dup ++] codireco] x
-           [0 [dup ++] codireco] . x
-           [0 [dup ++] codireco] . 0 [dup ++] codireco
-         [0 [dup ++] codireco] 0 . [dup ++] codireco
-[0 [dup ++] codireco] 0 [dup ++] . codireco
-[0 [dup ++] codireco] 0 [dup ++] . cons dip rest cons
-[0 [dup ++] codireco] [0 dup ++] . dip rest cons
-                                 . 0 dup ++ [0 [dup ++] codireco] rest cons
-                               0 . dup ++ [0 [dup ++] codireco] rest cons
-                             0 0 . ++ [0 [dup ++] codireco] rest cons
-                             0 1 . [0 [dup ++] codireco] rest cons
-       0 1 [0 [dup ++] codireco] . rest cons
-         0 1 [[dup ++] codireco] . cons
-         0 [1 [dup ++] codireco] .
-
-
-
define('G == [codireco] cons cons')
-
-
-
J('230 [dup ++] G 5 [x] times pop')
-
-
-
230 231 232 233 234
-
-
-
-
- - -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/sphinx_docs/_build/html/notebooks/Hylo-, Ana-, Cata-, and Para-morphisms - Recursion Combinators.html b/docs/sphinx_docs/_build/html/notebooks/Hylo-, Ana-, Cata-, and Para-morphisms - Recursion Combinators.html deleted file mode 100644 index b82e285..0000000 --- a/docs/sphinx_docs/_build/html/notebooks/Hylo-, Ana-, Cata-, and Para-morphisms - Recursion Combinators.html +++ /dev/null @@ -1,2561 +0,0 @@ - - - - - - - - Hylomorphism — Thun 0.2.0 documentation - - - - - - - - - - - - - - - - - - -
-
-
-
- -

Cf. “Bananas, Lenses, & Barbed -Wire”

-
-

Hylomorphism

-

A -hylomorphism -H :: A -> B converts a value of type A into a value of type B by -means of:

-
    -
  • A generator G :: A -> (A, B)
  • -
  • A combiner F :: (B, B) -> B
  • -
  • A predicate P :: A -> Bool to detect the base case
  • -
  • A base case value c :: B
  • -
  • Recursive calls (zero or more); it has a “call stack in the form of a -cons list”.
  • -
-

It may be helpful to see this function implemented in imperative Python -code.

-
def hylomorphism(c, F, P, G):
-    '''Return a hylomorphism function H.'''
-
-    def H(a):
-        if P(a):
-            result = c
-        else:
-            b, aa = G(a)
-            result = F(b, H(aa))
-        return result
-
-    return H
-
-
-
-

Finding Triangular Numbers

-

As a concrete example let’s use a function that, given a positive -integer, returns the sum of all positive integers less than that one. -(In this case the types A and B are both int.) ### With range() -and sum()

-
r = range(10)
-r
-
-
-
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
-
-
sum(r)
-
-
-
45
-
-
-
range_sum = lambda n: sum(range(n))
-range_sum(10)
-
-
-
45
-
-
-
-
-

As a hylomorphism

-
G = lambda n: (n - 1, n - 1)
-F = lambda a, b: a + b
-P = lambda n: n <= 1
-
-H = hylomorphism(0, F, P, G)
-
-
-
H(10)
-
-
-
45
-
-
-

If you were to run the above code in a debugger and check out the call -stack you would find that the variable b in each call to H() is -storing the intermediate values as H() recurses. This is what was -meant by “call stack in the form of a cons list”.

-
-
-

Joy Preamble

-
from notebook_preamble import D, DefinitionWrapper, J, V, define
-
-
-
-

Hylomorphism in Joy

-

We can define a combinator hylomorphism that will make a -hylomorphism combinator H from constituent parts.

-
H == c [F] [P] [G] hylomorphism
-
-
-

The function H is recursive, so we start with ifte and set the -else-part to some function J that will contain a quoted copy of -H. (The then-part just discards the leftover a and replaces it -with the base case value c.)

-
H == [P] [pop c] [J] ifte
-
-
-

The else-part J gets just the argument a on the stack.

-
a J
-a G              The first thing to do is use the generator G
-aa b             which produces b and a new aa
-aa b [H] dip     we recur with H on the new aa
-aa H b F         and run F on the result.
-
-
-

This gives us a definition for J.

-
J == G [H] dip F
-
-
-

Plug it in and convert to genrec.

-
H == [P] [pop c] [G [H] dip F] ifte
-H == [P] [pop c] [G]   [dip F] genrec
-
-
-

This is the form of a hylomorphism in Joy, which nicely illustrates that -it is a simple specialization of the general recursion combinator.

-
H == [P] [pop c] [G] [dip F] genrec
-
-
-
-
-

Derivation of hylomorphism

-

Now we just need to derive a definition that builds the genrec -arguments out of the pieces given to the hylomorphism combinator.

-
H == [P] [pop c]              [G]                  [dip F] genrec
-     [P] [c]    [pop] swoncat [G]        [F] [dip] swoncat genrec
-     [P] c unit [pop] swoncat [G]        [F] [dip] swoncat genrec
-     [P] c [G] [F] [unit [pop] swoncat] dipd [dip] swoncat genrec
-
-
-

Working in reverse: - Use swoncat twice to decouple [c] and -[F]. - Use unit to dequote c. - Use dipd to untangle -[unit [pop] swoncat] from the givens.

-

At this point all of the arguments (givens) to the hylomorphism are to -the left so we have a definition for hylomorphism:

-
hylomorphism == [unit [pop] swoncat] dipd [dip] swoncat genrec
-
-
-

The order of parameters is different than the one we started with but -that hardly matters, you can rearrange them or just supply them in the -expected order.

-
[P] c [G] [F] hylomorphism == H
-
-
-
define('hylomorphism == [unit [pop] swoncat] dipd [dip] swoncat genrec')
-
-
-

Demonstrate summing a range of integers from 0 to n-1.

-
    -
  • [P] is [0 <=]
  • -
  • c is 0
  • -
  • [G] is [1 - dup]
  • -
  • [F] is [+]
  • -
-

So to sum the positive integers less than five we can do this.

-
V('5 [0 <=] 0 [1 - dup] [+] hylomorphism')
-
-
-
                                                                               . 5 [0 <=] 0 [1 - dup] [+] hylomorphism
-                                                                             5 . [0 <=] 0 [1 - dup] [+] hylomorphism
-                                                                      5 [0 <=] . 0 [1 - dup] [+] hylomorphism
-                                                                    5 [0 <=] 0 . [1 - dup] [+] hylomorphism
-                                                          5 [0 <=] 0 [1 - dup] . [+] hylomorphism
-                                                      5 [0 <=] 0 [1 - dup] [+] . hylomorphism
-                                                      5 [0 <=] 0 [1 - dup] [+] . [unit [pop] swoncat] dipd [dip] swoncat genrec
-                                 5 [0 <=] 0 [1 - dup] [+] [unit [pop] swoncat] . dipd [dip] swoncat genrec
-                                                                    5 [0 <=] 0 . unit [pop] swoncat [1 - dup] [+] [dip] swoncat genrec
-                                                                    5 [0 <=] 0 . [] cons [pop] swoncat [1 - dup] [+] [dip] swoncat genrec
-                                                                 5 [0 <=] 0 [] . cons [pop] swoncat [1 - dup] [+] [dip] swoncat genrec
-                                                                  5 [0 <=] [0] . [pop] swoncat [1 - dup] [+] [dip] swoncat genrec
-                                                            5 [0 <=] [0] [pop] . swoncat [1 - dup] [+] [dip] swoncat genrec
-                                                            5 [0 <=] [0] [pop] . swap concat [1 - dup] [+] [dip] swoncat genrec
-                                                            5 [0 <=] [pop] [0] . concat [1 - dup] [+] [dip] swoncat genrec
-                                                              5 [0 <=] [pop 0] . [1 - dup] [+] [dip] swoncat genrec
-                                                    5 [0 <=] [pop 0] [1 - dup] . [+] [dip] swoncat genrec
-                                                5 [0 <=] [pop 0] [1 - dup] [+] . [dip] swoncat genrec
-                                          5 [0 <=] [pop 0] [1 - dup] [+] [dip] . swoncat genrec
-                                          5 [0 <=] [pop 0] [1 - dup] [+] [dip] . swap concat genrec
-                                          5 [0 <=] [pop 0] [1 - dup] [dip] [+] . concat genrec
-                                            5 [0 <=] [pop 0] [1 - dup] [dip +] . genrec
-    5 [0 <=] [pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . ifte
-5 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [5] [0 <=] . infra first choice i
-                                                                             5 . 0 <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 5] swaack first choice i
-                                                                           5 0 . <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 5] swaack first choice i
-                                                                         False . [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 5] swaack first choice i
-   False [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 5] . swaack first choice i
-   5 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [False] . first choice i
-     5 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] False . choice i
-                   5 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . i
-                                                                             5 . 1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +
-                                                                           5 1 . - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +
-                                                                             4 . dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +
-                                                                           4 4 . [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +
-                                 4 4 [[0 <=] [pop 0] [1 - dup] [dip +] genrec] . dip +
-                                                                             4 . [0 <=] [pop 0] [1 - dup] [dip +] genrec 4 +
-                                                                      4 [0 <=] . [pop 0] [1 - dup] [dip +] genrec 4 +
-                                                              4 [0 <=] [pop 0] . [1 - dup] [dip +] genrec 4 +
-                                                    4 [0 <=] [pop 0] [1 - dup] . [dip +] genrec 4 +
-                                            4 [0 <=] [pop 0] [1 - dup] [dip +] . genrec 4 +
-    4 [0 <=] [pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . ifte 4 +
-4 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [4] [0 <=] . infra first choice i 4 +
-                                                                             4 . 0 <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 4] swaack first choice i 4 +
-                                                                           4 0 . <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 4] swaack first choice i 4 +
-                                                                         False . [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 4] swaack first choice i 4 +
-   False [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 4] . swaack first choice i 4 +
-   4 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [False] . first choice i 4 +
-     4 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] False . choice i 4 +
-                   4 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . i 4 +
-                                                                             4 . 1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 4 +
-                                                                           4 1 . - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 4 +
-                                                                             3 . dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 4 +
-                                                                           3 3 . [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 4 +
-                                 3 3 [[0 <=] [pop 0] [1 - dup] [dip +] genrec] . dip + 4 +
-                                                                             3 . [0 <=] [pop 0] [1 - dup] [dip +] genrec 3 + 4 +
-                                                                      3 [0 <=] . [pop 0] [1 - dup] [dip +] genrec 3 + 4 +
-                                                              3 [0 <=] [pop 0] . [1 - dup] [dip +] genrec 3 + 4 +
-                                                    3 [0 <=] [pop 0] [1 - dup] . [dip +] genrec 3 + 4 +
-                                            3 [0 <=] [pop 0] [1 - dup] [dip +] . genrec 3 + 4 +
-    3 [0 <=] [pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . ifte 3 + 4 +
-3 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [3] [0 <=] . infra first choice i 3 + 4 +
-                                                                             3 . 0 <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 3] swaack first choice i 3 + 4 +
-                                                                           3 0 . <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 3] swaack first choice i 3 + 4 +
-                                                                         False . [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 3] swaack first choice i 3 + 4 +
-   False [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 3] . swaack first choice i 3 + 4 +
-   3 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [False] . first choice i 3 + 4 +
-     3 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] False . choice i 3 + 4 +
-                   3 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . i 3 + 4 +
-                                                                             3 . 1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 3 + 4 +
-                                                                           3 1 . - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 3 + 4 +
-                                                                             2 . dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 3 + 4 +
-                                                                           2 2 . [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 3 + 4 +
-                                 2 2 [[0 <=] [pop 0] [1 - dup] [dip +] genrec] . dip + 3 + 4 +
-                                                                             2 . [0 <=] [pop 0] [1 - dup] [dip +] genrec 2 + 3 + 4 +
-                                                                      2 [0 <=] . [pop 0] [1 - dup] [dip +] genrec 2 + 3 + 4 +
-                                                              2 [0 <=] [pop 0] . [1 - dup] [dip +] genrec 2 + 3 + 4 +
-                                                    2 [0 <=] [pop 0] [1 - dup] . [dip +] genrec 2 + 3 + 4 +
-                                            2 [0 <=] [pop 0] [1 - dup] [dip +] . genrec 2 + 3 + 4 +
-    2 [0 <=] [pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . ifte 2 + 3 + 4 +
-2 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [2] [0 <=] . infra first choice i 2 + 3 + 4 +
-                                                                             2 . 0 <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 2] swaack first choice i 2 + 3 + 4 +
-                                                                           2 0 . <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 2] swaack first choice i 2 + 3 + 4 +
-                                                                         False . [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 2] swaack first choice i 2 + 3 + 4 +
-   False [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 2] . swaack first choice i 2 + 3 + 4 +
-   2 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [False] . first choice i 2 + 3 + 4 +
-     2 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] False . choice i 2 + 3 + 4 +
-                   2 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . i 2 + 3 + 4 +
-                                                                             2 . 1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 2 + 3 + 4 +
-                                                                           2 1 . - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 2 + 3 + 4 +
-                                                                             1 . dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 2 + 3 + 4 +
-                                                                           1 1 . [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 2 + 3 + 4 +
-                                 1 1 [[0 <=] [pop 0] [1 - dup] [dip +] genrec] . dip + 2 + 3 + 4 +
-                                                                             1 . [0 <=] [pop 0] [1 - dup] [dip +] genrec 1 + 2 + 3 + 4 +
-                                                                      1 [0 <=] . [pop 0] [1 - dup] [dip +] genrec 1 + 2 + 3 + 4 +
-                                                              1 [0 <=] [pop 0] . [1 - dup] [dip +] genrec 1 + 2 + 3 + 4 +
-                                                    1 [0 <=] [pop 0] [1 - dup] . [dip +] genrec 1 + 2 + 3 + 4 +
-                                            1 [0 <=] [pop 0] [1 - dup] [dip +] . genrec 1 + 2 + 3 + 4 +
-    1 [0 <=] [pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . ifte 1 + 2 + 3 + 4 +
-1 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [1] [0 <=] . infra first choice i 1 + 2 + 3 + 4 +
-                                                                             1 . 0 <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 1] swaack first choice i 1 + 2 + 3 + 4 +
-                                                                           1 0 . <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 1] swaack first choice i 1 + 2 + 3 + 4 +
-                                                                         False . [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 1] swaack first choice i 1 + 2 + 3 + 4 +
-   False [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 1] . swaack first choice i 1 + 2 + 3 + 4 +
-   1 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [False] . first choice i 1 + 2 + 3 + 4 +
-     1 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] False . choice i 1 + 2 + 3 + 4 +
-                   1 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . i 1 + 2 + 3 + 4 +
-                                                                             1 . 1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 1 + 2 + 3 + 4 +
-                                                                           1 1 . - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 1 + 2 + 3 + 4 +
-                                                                             0 . dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 1 + 2 + 3 + 4 +
-                                                                           0 0 . [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 1 + 2 + 3 + 4 +
-                                 0 0 [[0 <=] [pop 0] [1 - dup] [dip +] genrec] . dip + 1 + 2 + 3 + 4 +
-                                                                             0 . [0 <=] [pop 0] [1 - dup] [dip +] genrec 0 + 1 + 2 + 3 + 4 +
-                                                                      0 [0 <=] . [pop 0] [1 - dup] [dip +] genrec 0 + 1 + 2 + 3 + 4 +
-                                                              0 [0 <=] [pop 0] . [1 - dup] [dip +] genrec 0 + 1 + 2 + 3 + 4 +
-                                                    0 [0 <=] [pop 0] [1 - dup] . [dip +] genrec 0 + 1 + 2 + 3 + 4 +
-                                            0 [0 <=] [pop 0] [1 - dup] [dip +] . genrec 0 + 1 + 2 + 3 + 4 +
-    0 [0 <=] [pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . ifte 0 + 1 + 2 + 3 + 4 +
-0 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [0] [0 <=] . infra first choice i 0 + 1 + 2 + 3 + 4 +
-                                                                             0 . 0 <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 0] swaack first choice i 0 + 1 + 2 + 3 + 4 +
-                                                                           0 0 . <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 0] swaack first choice i 0 + 1 + 2 + 3 + 4 +
-                                                                          True . [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 0] swaack first choice i 0 + 1 + 2 + 3 + 4 +
-    True [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 0] . swaack first choice i 0 + 1 + 2 + 3 + 4 +
-    0 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [True] . first choice i 0 + 1 + 2 + 3 + 4 +
-      0 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] True . choice i 0 + 1 + 2 + 3 + 4 +
-                                                                     0 [pop 0] . i 0 + 1 + 2 + 3 + 4 +
-                                                                             0 . pop 0 0 + 1 + 2 + 3 + 4 +
-                                                                               . 0 0 + 1 + 2 + 3 + 4 +
-                                                                             0 . 0 + 1 + 2 + 3 + 4 +
-                                                                           0 0 . + 1 + 2 + 3 + 4 +
-                                                                             0 . 1 + 2 + 3 + 4 +
-                                                                           0 1 . + 2 + 3 + 4 +
-                                                                             1 . 2 + 3 + 4 +
-                                                                           1 2 . + 3 + 4 +
-                                                                             3 . 3 + 4 +
-                                                                           3 3 . + 4 +
-                                                                             6 . 4 +
-                                                                           6 4 . +
-                                                                            10 .
-
-
-
-
-
-
-

Anamorphism

-

An anamorphism can be defined as a hylomorphism that uses [] for -c and swons for F.

-
[P] [G] anamorphism == [P] [] [G] [swons] hylomorphism == A
-
-
-

This allows us to define an anamorphism combinator in terms of the -hylomorphism combinator.

-
[] swap [swons] hylomorphism == anamorphism
-
-
-

Partial evaluation gives us a “pre-cooked” form.

-
[P] [G] . anamorphism
-[P] [G] . [] swap [swons] hylomorphism
-[P] [G] [] . swap [swons] hylomorphism
-[P] [] [G] . [swons] hylomorphism
-[P] [] [G] [swons] . hylomorphism
-[P] [] [G] [swons] . [unit [pop] swoncat] dipd [dip] swoncat genrec
-[P] [] [G] [swons] [unit [pop] swoncat] . dipd [dip] swoncat genrec
-[P] [] . unit [pop] swoncat [G] [swons] [dip] swoncat genrec
-[P] [[]] [pop] . swoncat [G] [swons] [dip] swoncat genrec
-[P] [pop []] [G] [swons] [dip] . swoncat genrec
-
-[P] [pop []] [G] [dip swons] genrec
-
-
-

(We could also have just substituted for c and F in the -definition of H.)

-
H == [P] [pop c ] [G] [dip F    ] genrec
-A == [P] [pop []] [G] [dip swons] genrec
-
-
-

The partial evaluation is overkill in this case but it serves as a -reminder that this sort of program specialization can, in many cases, be -carried out automatically.)

-

Untangle [G] from [pop []] using swap.

-
[P] [G] [pop []] swap [dip swons] genrec
-
-
-

All of the arguments to anamorphism are to the left, so we have a -definition for it.

-
anamorphism == [pop []] swap [dip swons] genrec
-
-
-

An example of an anamorphism is the range function.

-
range == [0 <=] [1 - dup] anamorphism
-
-
-
-
-

Catamorphism

-

A catamorphism can be defined as a hylomorphism that uses -[uncons swap] for [G] and [[] =] for the predicate [P].

-
c [F] catamorphism == [[] =] c [uncons swap] [F] hylomorphism == C
-
-
-

This allows us to define a catamorphism combinator in terms of the -hylomorphism combinator.

-
[[] =] roll> [uncons swap] swap hylomorphism == catamorphism
-
-
-

Partial evaluation doesn’t help much.

-
c [F] . catamorphism
-c [F] . [[] =] roll> [uncons swap] swap hylomorphism
-c [F] [[] =] . roll> [uncons swap] swap hylomorphism
-[[] =] c [F] [uncons swap] . swap hylomorphism
-[[] =] c [uncons swap] [F] . hylomorphism
-[[] =] c [uncons swap] [F] [unit [pop] swoncat] . dipd [dip] swoncat genrec
-[[] =] c . unit [pop] swoncat [uncons swap] [F] [dip] swoncat genrec
-[[] =] [c] [pop] . swoncat [uncons swap] [F] [dip] swoncat genrec
-[[] =] [pop c] [uncons swap] [F] [dip] . swoncat genrec
-[[] =] [pop c] [uncons swap] [dip F] genrec
-
-
-

Because the arguments to catamorphism have to be prepared (unlike the -arguments to anamorphism, which only need to be rearranged slightly) -there isn’t much point to “pre-cooking” the definition.

-
catamorphism == [[] =] roll> [uncons swap] swap hylomorphism
-
-
-

An example of a catamorphism is the sum function.

-
sum == 0 [+] catamorphism
-
-
-
-

“Fusion Law” for catas (UNFINISHED!!!)

-

I’m not sure exactly how to translate the “Fusion Law” for catamorphisms -into Joy.

-

I know that a map composed with a cata can be expressed as a new -cata:

-
[F] map b [B] cata == b [F B] cata
-
-
-

But this isn’t the one described in “Bananas…”. That’s more like:

-

A cata composed with some function can be expressed as some other cata:

-
b [B] catamorphism F == c [C] catamorphism
-
-
-

Given:

-
b F == c
-
-...
-
-B F == [F] dip C
-
-...
-
-b[B]cata F == c[C]cata
-
-F(B(head, tail)) == C(head, F(tail))
-
-1 [2 3] B F         1 [2 3] F C
-
-
-b F == c
-B F == F C
-
-b [B] catamorphism F == c [C] catamorphism
-b [B] catamorphism F == b F [C] catamorphism
-
-...
-
-
-

Or maybe,

-
[F] map b [B] cata == c [C] cata     ???
-
-[F] map b [B] cata == b [F B] cata    I think this is generally true, unless F consumes stack items
-                                        instead of just transforming TOS.  Of course, there's always [F] unary.
-b [F] unary [[F] unary B] cata
-
-[10 *] map 0 swap [+] step == 0 swap [10 * +] step
-
-
-

For example:

-
F == 10 *
-b == 0
-B == +
-c == 0
-C == F +
-
-b F    == c
-0 10 * == 0
-
-B F    == [F]    dip C
-+ 10 * == [10 *] dip F +
-+ 10 * == [10 *] dip 10 * +
-
-n m + 10 * == 10(n+m)
-
-n m [10 *] dip 10 * +
-n 10 * m 10 * +
-10n m 10 * +
-10n 10m +
-10n+10m
-
-10n+10m = 10(n+m)
-
-
-

Ergo:

-
0 [+] catamorphism 10 * == 0 [10 * +] catamorphism
-
-
-
-

The step combinator will usually be better to use than catamorphism.

-
sum == 0 swap [+] step
-sum == 0 [+] catamorphism
-
-
-
-
-
-
-

anamorphism catamorphism == hylomorphism

-

Here is (part of) the payoff.

-

An anamorphism followed by (composed with) a catamorphism is a -hylomorphism, with the advantage that the hylomorphism does not create -the intermediate list structure. The values are stored in either the -call stack, for those implementations that use one, or in the pending -expression (“continuation”) for the Joypy interpreter. They still have -to be somewhere, converting from an anamorphism and catamorphism to a -hylomorphism just prevents using additional storage and doing additional -processing.

-
    range == [0 <=] [1 - dup] anamorphism
-      sum == 0 [+] catamorphism
-
-range sum == [0 <=] [1 - dup] anamorphism 0 [+] catamorphism
-          == [0 <=] 0 [1 - dup] [+] hylomorphism
-
-
-

We can let the hylomorphism combinator build range_sum for us or -just substitute ourselves.

-
        H == [P]    [pop c] [G]       [dip F] genrec
-range_sum == [0 <=] [pop 0] [1 - dup] [dip +] genrec
-
-
-
defs = '''
-anamorphism == [pop []] swap [dip swons] genrec
-hylomorphism == [unit [pop] swoncat] dipd [dip] swoncat genrec
-catamorphism == [[] =] roll> [uncons swap] swap hylomorphism
-range == [0 <=] [1 - dup] anamorphism
-sum == 0 [+] catamorphism
-range_sum == [0 <=] 0 [1 - dup] [+] hylomorphism
-'''
-
-DefinitionWrapper.add_definitions(defs, D)
-
-
-
J('10 range')
-
-
-
[9 8 7 6 5 4 3 2 1 0]
-
-
-
J('[9 8 7 6 5 4 3 2 1 0] sum')
-
-
-
45
-
-
-
V('10 range sum')
-
-
-
                                                                                                                               . 10 range sum
-                                                                                                                            10 . range sum
-                                                                                                                            10 . [0 <=] [1 - dup] anamorphism sum
-                                                                                                                     10 [0 <=] . [1 - dup] anamorphism sum
-                                                                                                           10 [0 <=] [1 - dup] . anamorphism sum
-                                                                                                           10 [0 <=] [1 - dup] . [pop []] swap [dip swons] genrec sum
-                                                                                                  10 [0 <=] [1 - dup] [pop []] . swap [dip swons] genrec sum
-                                                                                                  10 [0 <=] [pop []] [1 - dup] . [dip swons] genrec sum
-                                                                                      10 [0 <=] [pop []] [1 - dup] [dip swons] . genrec sum
-                                         10 [0 <=] [pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] . ifte sum
-                                    10 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] [10] [0 <=] . infra first choice i sum
-                                                                                                                            10 . 0 <= [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 10] swaack first choice i sum
-                                                                                                                          10 0 . <= [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 10] swaack first choice i sum
-                                                                                                                         False . [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 10] swaack first choice i sum
-                                        False [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 10] . swaack first choice i sum
-                                        10 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] [False] . first choice i sum
-                                          10 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] False . choice i sum
-                                                         10 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] . i sum
-                                                                                                                            10 . 1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons sum
-                                                                                                                          10 1 . - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons sum
-                                                                                                                             9 . dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons sum
-                                                                                                                           9 9 . [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons sum
-                                                                            9 9 [[0 <=] [pop []] [1 - dup] [dip swons] genrec] . dip swons sum
-                                                                                                                             9 . [0 <=] [pop []] [1 - dup] [dip swons] genrec 9 swons sum
-                                                                                                                      9 [0 <=] . [pop []] [1 - dup] [dip swons] genrec 9 swons sum
-                                                                                                             9 [0 <=] [pop []] . [1 - dup] [dip swons] genrec 9 swons sum
-                                                                                                   9 [0 <=] [pop []] [1 - dup] . [dip swons] genrec 9 swons sum
-                                                                                       9 [0 <=] [pop []] [1 - dup] [dip swons] . genrec 9 swons sum
-                                          9 [0 <=] [pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] . ifte 9 swons sum
-                                      9 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] [9] [0 <=] . infra first choice i 9 swons sum
-                                                                                                                             9 . 0 <= [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 9] swaack first choice i 9 swons sum
-                                                                                                                           9 0 . <= [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 9] swaack first choice i 9 swons sum
-                                                                                                                         False . [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 9] swaack first choice i 9 swons sum
-                                         False [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 9] . swaack first choice i 9 swons sum
-                                         9 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] [False] . first choice i 9 swons sum
-                                           9 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] False . choice i 9 swons sum
-                                                          9 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] . i 9 swons sum
-                                                                                                                             9 . 1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 9 swons sum
-                                                                                                                           9 1 . - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 9 swons sum
-                                                                                                                             8 . dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 9 swons sum
-                                                                                                                           8 8 . [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 9 swons sum
-                                                                            8 8 [[0 <=] [pop []] [1 - dup] [dip swons] genrec] . dip swons 9 swons sum
-                                                                                                                             8 . [0 <=] [pop []] [1 - dup] [dip swons] genrec 8 swons 9 swons sum
-                                                                                                                      8 [0 <=] . [pop []] [1 - dup] [dip swons] genrec 8 swons 9 swons sum
-                                                                                                             8 [0 <=] [pop []] . [1 - dup] [dip swons] genrec 8 swons 9 swons sum
-                                                                                                   8 [0 <=] [pop []] [1 - dup] . [dip swons] genrec 8 swons 9 swons sum
-                                                                                       8 [0 <=] [pop []] [1 - dup] [dip swons] . genrec 8 swons 9 swons sum
-                                          8 [0 <=] [pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] . ifte 8 swons 9 swons sum
-                                      8 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] [8] [0 <=] . infra first choice i 8 swons 9 swons sum
-                                                                                                                             8 . 0 <= [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 8] swaack first choice i 8 swons 9 swons sum
-                                                                                                                           8 0 . <= [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 8] swaack first choice i 8 swons 9 swons sum
-                                                                                                                         False . [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 8] swaack first choice i 8 swons 9 swons sum
-                                         False [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 8] . swaack first choice i 8 swons 9 swons sum
-                                         8 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] [False] . first choice i 8 swons 9 swons sum
-                                           8 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] False . choice i 8 swons 9 swons sum
-                                                          8 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] . i 8 swons 9 swons sum
-                                                                                                                             8 . 1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 8 swons 9 swons sum
-                                                                                                                           8 1 . - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 8 swons 9 swons sum
-                                                                                                                             7 . dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 8 swons 9 swons sum
-                                                                                                                           7 7 . [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 8 swons 9 swons sum
-                                                                            7 7 [[0 <=] [pop []] [1 - dup] [dip swons] genrec] . dip swons 8 swons 9 swons sum
-                                                                                                                             7 . [0 <=] [pop []] [1 - dup] [dip swons] genrec 7 swons 8 swons 9 swons sum
-                                                                                                                      7 [0 <=] . [pop []] [1 - dup] [dip swons] genrec 7 swons 8 swons 9 swons sum
-                                                                                                             7 [0 <=] [pop []] . [1 - dup] [dip swons] genrec 7 swons 8 swons 9 swons sum
-                                                                                                   7 [0 <=] [pop []] [1 - dup] . [dip swons] genrec 7 swons 8 swons 9 swons sum
-                                                                                       7 [0 <=] [pop []] [1 - dup] [dip swons] . genrec 7 swons 8 swons 9 swons sum
-                                          7 [0 <=] [pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] . ifte 7 swons 8 swons 9 swons sum
-                                      7 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] [7] [0 <=] . infra first choice i 7 swons 8 swons 9 swons sum
-                                                                                                                             7 . 0 <= [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 7] swaack first choice i 7 swons 8 swons 9 swons sum
-                                                                                                                           7 0 . <= [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 7] swaack first choice i 7 swons 8 swons 9 swons sum
-                                                                                                                         False . [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 7] swaack first choice i 7 swons 8 swons 9 swons sum
-                                         False [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 7] . swaack first choice i 7 swons 8 swons 9 swons sum
-                                         7 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] [False] . first choice i 7 swons 8 swons 9 swons sum
-                                           7 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] False . choice i 7 swons 8 swons 9 swons sum
-                                                          7 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] . i 7 swons 8 swons 9 swons sum
-                                                                                                                             7 . 1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 7 swons 8 swons 9 swons sum
-                                                                                                                           7 1 . - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 7 swons 8 swons 9 swons sum
-                                                                                                                             6 . dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 7 swons 8 swons 9 swons sum
-                                                                                                                           6 6 . [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 7 swons 8 swons 9 swons sum
-                                                                            6 6 [[0 <=] [pop []] [1 - dup] [dip swons] genrec] . dip swons 7 swons 8 swons 9 swons sum
-                                                                                                                             6 . [0 <=] [pop []] [1 - dup] [dip swons] genrec 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                      6 [0 <=] . [pop []] [1 - dup] [dip swons] genrec 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                             6 [0 <=] [pop []] . [1 - dup] [dip swons] genrec 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                   6 [0 <=] [pop []] [1 - dup] . [dip swons] genrec 6 swons 7 swons 8 swons 9 swons sum
-                                                                                       6 [0 <=] [pop []] [1 - dup] [dip swons] . genrec 6 swons 7 swons 8 swons 9 swons sum
-                                          6 [0 <=] [pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] . ifte 6 swons 7 swons 8 swons 9 swons sum
-                                      6 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] [6] [0 <=] . infra first choice i 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             6 . 0 <= [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 6] swaack first choice i 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                           6 0 . <= [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 6] swaack first choice i 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                         False . [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 6] swaack first choice i 6 swons 7 swons 8 swons 9 swons sum
-                                         False [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 6] . swaack first choice i 6 swons 7 swons 8 swons 9 swons sum
-                                         6 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] [False] . first choice i 6 swons 7 swons 8 swons 9 swons sum
-                                           6 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] False . choice i 6 swons 7 swons 8 swons 9 swons sum
-                                                          6 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] . i 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             6 . 1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                           6 1 . - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             5 . dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                           5 5 . [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                            5 5 [[0 <=] [pop []] [1 - dup] [dip swons] genrec] . dip swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             5 . [0 <=] [pop []] [1 - dup] [dip swons] genrec 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                      5 [0 <=] . [pop []] [1 - dup] [dip swons] genrec 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                             5 [0 <=] [pop []] . [1 - dup] [dip swons] genrec 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                   5 [0 <=] [pop []] [1 - dup] . [dip swons] genrec 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                       5 [0 <=] [pop []] [1 - dup] [dip swons] . genrec 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                          5 [0 <=] [pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] . ifte 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                      5 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] [5] [0 <=] . infra first choice i 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             5 . 0 <= [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 5] swaack first choice i 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                           5 0 . <= [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 5] swaack first choice i 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                         False . [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 5] swaack first choice i 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                         False [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 5] . swaack first choice i 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                         5 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] [False] . first choice i 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                           5 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] False . choice i 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                          5 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] . i 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             5 . 1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                           5 1 . - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             4 . dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                           4 4 . [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                            4 4 [[0 <=] [pop []] [1 - dup] [dip swons] genrec] . dip swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             4 . [0 <=] [pop []] [1 - dup] [dip swons] genrec 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                      4 [0 <=] . [pop []] [1 - dup] [dip swons] genrec 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                             4 [0 <=] [pop []] . [1 - dup] [dip swons] genrec 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                   4 [0 <=] [pop []] [1 - dup] . [dip swons] genrec 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                       4 [0 <=] [pop []] [1 - dup] [dip swons] . genrec 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                          4 [0 <=] [pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] . ifte 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                      4 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] [4] [0 <=] . infra first choice i 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             4 . 0 <= [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 4] swaack first choice i 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                           4 0 . <= [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 4] swaack first choice i 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                         False . [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 4] swaack first choice i 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                         False [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 4] . swaack first choice i 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                         4 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] [False] . first choice i 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                           4 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] False . choice i 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                          4 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] . i 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             4 . 1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                           4 1 . - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             3 . dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                           3 3 . [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                            3 3 [[0 <=] [pop []] [1 - dup] [dip swons] genrec] . dip swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             3 . [0 <=] [pop []] [1 - dup] [dip swons] genrec 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                      3 [0 <=] . [pop []] [1 - dup] [dip swons] genrec 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                             3 [0 <=] [pop []] . [1 - dup] [dip swons] genrec 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                   3 [0 <=] [pop []] [1 - dup] . [dip swons] genrec 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                       3 [0 <=] [pop []] [1 - dup] [dip swons] . genrec 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                          3 [0 <=] [pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] . ifte 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                      3 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] [3] [0 <=] . infra first choice i 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             3 . 0 <= [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 3] swaack first choice i 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                           3 0 . <= [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 3] swaack first choice i 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                         False . [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 3] swaack first choice i 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                         False [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 3] . swaack first choice i 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                         3 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] [False] . first choice i 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                           3 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] False . choice i 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                          3 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] . i 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             3 . 1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                           3 1 . - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             2 . dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                           2 2 . [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                            2 2 [[0 <=] [pop []] [1 - dup] [dip swons] genrec] . dip swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             2 . [0 <=] [pop []] [1 - dup] [dip swons] genrec 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                      2 [0 <=] . [pop []] [1 - dup] [dip swons] genrec 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                             2 [0 <=] [pop []] . [1 - dup] [dip swons] genrec 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                   2 [0 <=] [pop []] [1 - dup] . [dip swons] genrec 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                       2 [0 <=] [pop []] [1 - dup] [dip swons] . genrec 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                          2 [0 <=] [pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] . ifte 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                      2 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] [2] [0 <=] . infra first choice i 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             2 . 0 <= [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 2] swaack first choice i 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                           2 0 . <= [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 2] swaack first choice i 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                         False . [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 2] swaack first choice i 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                         False [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 2] . swaack first choice i 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                         2 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] [False] . first choice i 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                           2 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] False . choice i 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                          2 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] . i 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             2 . 1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                           2 1 . - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             1 . dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                           1 1 . [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                            1 1 [[0 <=] [pop []] [1 - dup] [dip swons] genrec] . dip swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             1 . [0 <=] [pop []] [1 - dup] [dip swons] genrec 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                      1 [0 <=] . [pop []] [1 - dup] [dip swons] genrec 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                             1 [0 <=] [pop []] . [1 - dup] [dip swons] genrec 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                   1 [0 <=] [pop []] [1 - dup] . [dip swons] genrec 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                       1 [0 <=] [pop []] [1 - dup] [dip swons] . genrec 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                          1 [0 <=] [pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] . ifte 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                      1 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] [1] [0 <=] . infra first choice i 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             1 . 0 <= [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 1] swaack first choice i 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                           1 0 . <= [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 1] swaack first choice i 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                         False . [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 1] swaack first choice i 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                         False [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 1] . swaack first choice i 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                         1 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] [False] . first choice i 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                           1 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] False . choice i 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                          1 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] . i 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             1 . 1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                           1 1 . - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             0 . dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                           0 0 . [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                            0 0 [[0 <=] [pop []] [1 - dup] [dip swons] genrec] . dip swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             0 . [0 <=] [pop []] [1 - dup] [dip swons] genrec 0 swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                      0 [0 <=] . [pop []] [1 - dup] [dip swons] genrec 0 swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                             0 [0 <=] [pop []] . [1 - dup] [dip swons] genrec 0 swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                   0 [0 <=] [pop []] [1 - dup] . [dip swons] genrec 0 swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                       0 [0 <=] [pop []] [1 - dup] [dip swons] . genrec 0 swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                          0 [0 <=] [pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] . ifte 0 swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                      0 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] [0] [0 <=] . infra first choice i 0 swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             0 . 0 <= [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 0] swaack first choice i 0 swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                           0 0 . <= [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 0] swaack first choice i 0 swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                          True . [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 0] swaack first choice i 0 swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                          True [[pop []] [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] 0] . swaack first choice i 0 swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                          0 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] [True] . first choice i 0 swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                            0 [1 - dup [[0 <=] [pop []] [1 - dup] [dip swons] genrec] dip swons] [pop []] True . choice i 0 swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                    0 [pop []] . i 0 swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                             0 . pop [] 0 swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                               . [] 0 swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                            [] . 0 swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                          [] 0 . swons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                          [] 0 . swap cons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                          0 [] . cons 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                           [0] . 1 swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                         [0] 1 . swons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                         [0] 1 . swap cons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                         1 [0] . cons 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                         [1 0] . 2 swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                       [1 0] 2 . swons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                       [1 0] 2 . swap cons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                       2 [1 0] . cons 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                       [2 1 0] . 3 swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                     [2 1 0] 3 . swons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                     [2 1 0] 3 . swap cons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                     3 [2 1 0] . cons 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                     [3 2 1 0] . 4 swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                   [3 2 1 0] 4 . swons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                   [3 2 1 0] 4 . swap cons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                   4 [3 2 1 0] . cons 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                   [4 3 2 1 0] . 5 swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                 [4 3 2 1 0] 5 . swons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                 [4 3 2 1 0] 5 . swap cons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                 5 [4 3 2 1 0] . cons 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                                 [5 4 3 2 1 0] . 6 swons 7 swons 8 swons 9 swons sum
-                                                                                                               [5 4 3 2 1 0] 6 . swons 7 swons 8 swons 9 swons sum
-                                                                                                               [5 4 3 2 1 0] 6 . swap cons 7 swons 8 swons 9 swons sum
-                                                                                                               6 [5 4 3 2 1 0] . cons 7 swons 8 swons 9 swons sum
-                                                                                                               [6 5 4 3 2 1 0] . 7 swons 8 swons 9 swons sum
-                                                                                                             [6 5 4 3 2 1 0] 7 . swons 8 swons 9 swons sum
-                                                                                                             [6 5 4 3 2 1 0] 7 . swap cons 8 swons 9 swons sum
-                                                                                                             7 [6 5 4 3 2 1 0] . cons 8 swons 9 swons sum
-                                                                                                             [7 6 5 4 3 2 1 0] . 8 swons 9 swons sum
-                                                                                                           [7 6 5 4 3 2 1 0] 8 . swons 9 swons sum
-                                                                                                           [7 6 5 4 3 2 1 0] 8 . swap cons 9 swons sum
-                                                                                                           8 [7 6 5 4 3 2 1 0] . cons 9 swons sum
-                                                                                                           [8 7 6 5 4 3 2 1 0] . 9 swons sum
-                                                                                                         [8 7 6 5 4 3 2 1 0] 9 . swons sum
-                                                                                                         [8 7 6 5 4 3 2 1 0] 9 . swap cons sum
-                                                                                                         9 [8 7 6 5 4 3 2 1 0] . cons sum
-                                                                                                         [9 8 7 6 5 4 3 2 1 0] . sum
-                                                                                                         [9 8 7 6 5 4 3 2 1 0] . 0 [+] catamorphism
-                                                                                                       [9 8 7 6 5 4 3 2 1 0] 0 . [+] catamorphism
-                                                                                                   [9 8 7 6 5 4 3 2 1 0] 0 [+] . catamorphism
-                                                                                                   [9 8 7 6 5 4 3 2 1 0] 0 [+] . [[] =] roll> [uncons swap] swap hylomorphism
-                                                                                            [9 8 7 6 5 4 3 2 1 0] 0 [+] [[] =] . roll> [uncons swap] swap hylomorphism
-                                                                                            [9 8 7 6 5 4 3 2 1 0] [[] =] 0 [+] . [uncons swap] swap hylomorphism
-                                                                              [9 8 7 6 5 4 3 2 1 0] [[] =] 0 [+] [uncons swap] . swap hylomorphism
-                                                                              [9 8 7 6 5 4 3 2 1 0] [[] =] 0 [uncons swap] [+] . hylomorphism
-                                                                              [9 8 7 6 5 4 3 2 1 0] [[] =] 0 [uncons swap] [+] . [unit [pop] swoncat] dipd [dip] swoncat genrec
-                                                         [9 8 7 6 5 4 3 2 1 0] [[] =] 0 [uncons swap] [+] [unit [pop] swoncat] . dipd [dip] swoncat genrec
-                                                                                                [9 8 7 6 5 4 3 2 1 0] [[] =] 0 . unit [pop] swoncat [uncons swap] [+] [dip] swoncat genrec
-                                                                                                [9 8 7 6 5 4 3 2 1 0] [[] =] 0 . [] cons [pop] swoncat [uncons swap] [+] [dip] swoncat genrec
-                                                                                             [9 8 7 6 5 4 3 2 1 0] [[] =] 0 [] . cons [pop] swoncat [uncons swap] [+] [dip] swoncat genrec
-                                                                                              [9 8 7 6 5 4 3 2 1 0] [[] =] [0] . [pop] swoncat [uncons swap] [+] [dip] swoncat genrec
-                                                                                        [9 8 7 6 5 4 3 2 1 0] [[] =] [0] [pop] . swoncat [uncons swap] [+] [dip] swoncat genrec
-                                                                                        [9 8 7 6 5 4 3 2 1 0] [[] =] [0] [pop] . swap concat [uncons swap] [+] [dip] swoncat genrec
-                                                                                        [9 8 7 6 5 4 3 2 1 0] [[] =] [pop] [0] . concat [uncons swap] [+] [dip] swoncat genrec
-                                                                                          [9 8 7 6 5 4 3 2 1 0] [[] =] [pop 0] . [uncons swap] [+] [dip] swoncat genrec
-                                                                            [9 8 7 6 5 4 3 2 1 0] [[] =] [pop 0] [uncons swap] . [+] [dip] swoncat genrec
-                                                                        [9 8 7 6 5 4 3 2 1 0] [[] =] [pop 0] [uncons swap] [+] . [dip] swoncat genrec
-                                                                  [9 8 7 6 5 4 3 2 1 0] [[] =] [pop 0] [uncons swap] [+] [dip] . swoncat genrec
-                                                                  [9 8 7 6 5 4 3 2 1 0] [[] =] [pop 0] [uncons swap] [+] [dip] . swap concat genrec
-                                                                  [9 8 7 6 5 4 3 2 1 0] [[] =] [pop 0] [uncons swap] [dip] [+] . concat genrec
-                                                                    [9 8 7 6 5 4 3 2 1 0] [[] =] [pop 0] [uncons swap] [dip +] . genrec
-                        [9 8 7 6 5 4 3 2 1 0] [[] =] [pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . ifte
-[9 8 7 6 5 4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [[9 8 7 6 5 4 3 2 1 0]] [[] =] . infra first choice i
-                                                                                                         [9 8 7 6 5 4 3 2 1 0] . [] = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [9 8 7 6 5 4 3 2 1 0]] swaack first choice i
-                                                                                                      [9 8 7 6 5 4 3 2 1 0] [] . = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [9 8 7 6 5 4 3 2 1 0]] swaack first choice i
-                                                                                                                         False . [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [9 8 7 6 5 4 3 2 1 0]] swaack first choice i
-                       False [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [9 8 7 6 5 4 3 2 1 0]] . swaack first choice i
-                       [9 8 7 6 5 4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [False] . first choice i
-                         [9 8 7 6 5 4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] False . choice i
-                                       [9 8 7 6 5 4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . i
-                                                                                                         [9 8 7 6 5 4 3 2 1 0] . uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +
-                                                                                                         9 [8 7 6 5 4 3 2 1 0] . swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +
-                                                                                                         [8 7 6 5 4 3 2 1 0] 9 . [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +
-                                                           [8 7 6 5 4 3 2 1 0] 9 [[[] =] [pop 0] [uncons swap] [dip +] genrec] . dip +
-                                                                                                           [8 7 6 5 4 3 2 1 0] . [[] =] [pop 0] [uncons swap] [dip +] genrec 9 +
-                                                                                                    [8 7 6 5 4 3 2 1 0] [[] =] . [pop 0] [uncons swap] [dip +] genrec 9 +
-                                                                                            [8 7 6 5 4 3 2 1 0] [[] =] [pop 0] . [uncons swap] [dip +] genrec 9 +
-                                                                              [8 7 6 5 4 3 2 1 0] [[] =] [pop 0] [uncons swap] . [dip +] genrec 9 +
-                                                                      [8 7 6 5 4 3 2 1 0] [[] =] [pop 0] [uncons swap] [dip +] . genrec 9 +
-                          [8 7 6 5 4 3 2 1 0] [[] =] [pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . ifte 9 +
-    [8 7 6 5 4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [[8 7 6 5 4 3 2 1 0]] [[] =] . infra first choice i 9 +
-                                                                                                           [8 7 6 5 4 3 2 1 0] . [] = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [8 7 6 5 4 3 2 1 0]] swaack first choice i 9 +
-                                                                                                        [8 7 6 5 4 3 2 1 0] [] . = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [8 7 6 5 4 3 2 1 0]] swaack first choice i 9 +
-                                                                                                                         False . [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [8 7 6 5 4 3 2 1 0]] swaack first choice i 9 +
-                         False [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [8 7 6 5 4 3 2 1 0]] . swaack first choice i 9 +
-                         [8 7 6 5 4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [False] . first choice i 9 +
-                           [8 7 6 5 4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] False . choice i 9 +
-                                         [8 7 6 5 4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . i 9 +
-                                                                                                           [8 7 6 5 4 3 2 1 0] . uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 9 +
-                                                                                                           8 [7 6 5 4 3 2 1 0] . swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 9 +
-                                                                                                           [7 6 5 4 3 2 1 0] 8 . [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 9 +
-                                                             [7 6 5 4 3 2 1 0] 8 [[[] =] [pop 0] [uncons swap] [dip +] genrec] . dip + 9 +
-                                                                                                             [7 6 5 4 3 2 1 0] . [[] =] [pop 0] [uncons swap] [dip +] genrec 8 + 9 +
-                                                                                                      [7 6 5 4 3 2 1 0] [[] =] . [pop 0] [uncons swap] [dip +] genrec 8 + 9 +
-                                                                                              [7 6 5 4 3 2 1 0] [[] =] [pop 0] . [uncons swap] [dip +] genrec 8 + 9 +
-                                                                                [7 6 5 4 3 2 1 0] [[] =] [pop 0] [uncons swap] . [dip +] genrec 8 + 9 +
-                                                                        [7 6 5 4 3 2 1 0] [[] =] [pop 0] [uncons swap] [dip +] . genrec 8 + 9 +
-                            [7 6 5 4 3 2 1 0] [[] =] [pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . ifte 8 + 9 +
-        [7 6 5 4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [[7 6 5 4 3 2 1 0]] [[] =] . infra first choice i 8 + 9 +
-                                                                                                             [7 6 5 4 3 2 1 0] . [] = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [7 6 5 4 3 2 1 0]] swaack first choice i 8 + 9 +
-                                                                                                          [7 6 5 4 3 2 1 0] [] . = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [7 6 5 4 3 2 1 0]] swaack first choice i 8 + 9 +
-                                                                                                                         False . [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [7 6 5 4 3 2 1 0]] swaack first choice i 8 + 9 +
-                           False [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [7 6 5 4 3 2 1 0]] . swaack first choice i 8 + 9 +
-                           [7 6 5 4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [False] . first choice i 8 + 9 +
-                             [7 6 5 4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] False . choice i 8 + 9 +
-                                           [7 6 5 4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . i 8 + 9 +
-                                                                                                             [7 6 5 4 3 2 1 0] . uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 8 + 9 +
-                                                                                                             7 [6 5 4 3 2 1 0] . swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 8 + 9 +
-                                                                                                             [6 5 4 3 2 1 0] 7 . [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 8 + 9 +
-                                                               [6 5 4 3 2 1 0] 7 [[[] =] [pop 0] [uncons swap] [dip +] genrec] . dip + 8 + 9 +
-                                                                                                               [6 5 4 3 2 1 0] . [[] =] [pop 0] [uncons swap] [dip +] genrec 7 + 8 + 9 +
-                                                                                                        [6 5 4 3 2 1 0] [[] =] . [pop 0] [uncons swap] [dip +] genrec 7 + 8 + 9 +
-                                                                                                [6 5 4 3 2 1 0] [[] =] [pop 0] . [uncons swap] [dip +] genrec 7 + 8 + 9 +
-                                                                                  [6 5 4 3 2 1 0] [[] =] [pop 0] [uncons swap] . [dip +] genrec 7 + 8 + 9 +
-                                                                          [6 5 4 3 2 1 0] [[] =] [pop 0] [uncons swap] [dip +] . genrec 7 + 8 + 9 +
-                              [6 5 4 3 2 1 0] [[] =] [pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . ifte 7 + 8 + 9 +
-            [6 5 4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [[6 5 4 3 2 1 0]] [[] =] . infra first choice i 7 + 8 + 9 +
-                                                                                                               [6 5 4 3 2 1 0] . [] = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [6 5 4 3 2 1 0]] swaack first choice i 7 + 8 + 9 +
-                                                                                                            [6 5 4 3 2 1 0] [] . = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [6 5 4 3 2 1 0]] swaack first choice i 7 + 8 + 9 +
-                                                                                                                         False . [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [6 5 4 3 2 1 0]] swaack first choice i 7 + 8 + 9 +
-                             False [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [6 5 4 3 2 1 0]] . swaack first choice i 7 + 8 + 9 +
-                             [6 5 4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [False] . first choice i 7 + 8 + 9 +
-                               [6 5 4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] False . choice i 7 + 8 + 9 +
-                                             [6 5 4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . i 7 + 8 + 9 +
-                                                                                                               [6 5 4 3 2 1 0] . uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 7 + 8 + 9 +
-                                                                                                               6 [5 4 3 2 1 0] . swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 7 + 8 + 9 +
-                                                                                                               [5 4 3 2 1 0] 6 . [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 7 + 8 + 9 +
-                                                                 [5 4 3 2 1 0] 6 [[[] =] [pop 0] [uncons swap] [dip +] genrec] . dip + 7 + 8 + 9 +
-                                                                                                                 [5 4 3 2 1 0] . [[] =] [pop 0] [uncons swap] [dip +] genrec 6 + 7 + 8 + 9 +
-                                                                                                          [5 4 3 2 1 0] [[] =] . [pop 0] [uncons swap] [dip +] genrec 6 + 7 + 8 + 9 +
-                                                                                                  [5 4 3 2 1 0] [[] =] [pop 0] . [uncons swap] [dip +] genrec 6 + 7 + 8 + 9 +
-                                                                                    [5 4 3 2 1 0] [[] =] [pop 0] [uncons swap] . [dip +] genrec 6 + 7 + 8 + 9 +
-                                                                            [5 4 3 2 1 0] [[] =] [pop 0] [uncons swap] [dip +] . genrec 6 + 7 + 8 + 9 +
-                                [5 4 3 2 1 0] [[] =] [pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . ifte 6 + 7 + 8 + 9 +
-                [5 4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [[5 4 3 2 1 0]] [[] =] . infra first choice i 6 + 7 + 8 + 9 +
-                                                                                                                 [5 4 3 2 1 0] . [] = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [5 4 3 2 1 0]] swaack first choice i 6 + 7 + 8 + 9 +
-                                                                                                              [5 4 3 2 1 0] [] . = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [5 4 3 2 1 0]] swaack first choice i 6 + 7 + 8 + 9 +
-                                                                                                                         False . [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [5 4 3 2 1 0]] swaack first choice i 6 + 7 + 8 + 9 +
-                               False [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [5 4 3 2 1 0]] . swaack first choice i 6 + 7 + 8 + 9 +
-                               [5 4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [False] . first choice i 6 + 7 + 8 + 9 +
-                                 [5 4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] False . choice i 6 + 7 + 8 + 9 +
-                                               [5 4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . i 6 + 7 + 8 + 9 +
-                                                                                                                 [5 4 3 2 1 0] . uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 6 + 7 + 8 + 9 +
-                                                                                                                 5 [4 3 2 1 0] . swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 6 + 7 + 8 + 9 +
-                                                                                                                 [4 3 2 1 0] 5 . [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 6 + 7 + 8 + 9 +
-                                                                   [4 3 2 1 0] 5 [[[] =] [pop 0] [uncons swap] [dip +] genrec] . dip + 6 + 7 + 8 + 9 +
-                                                                                                                   [4 3 2 1 0] . [[] =] [pop 0] [uncons swap] [dip +] genrec 5 + 6 + 7 + 8 + 9 +
-                                                                                                            [4 3 2 1 0] [[] =] . [pop 0] [uncons swap] [dip +] genrec 5 + 6 + 7 + 8 + 9 +
-                                                                                                    [4 3 2 1 0] [[] =] [pop 0] . [uncons swap] [dip +] genrec 5 + 6 + 7 + 8 + 9 +
-                                                                                      [4 3 2 1 0] [[] =] [pop 0] [uncons swap] . [dip +] genrec 5 + 6 + 7 + 8 + 9 +
-                                                                              [4 3 2 1 0] [[] =] [pop 0] [uncons swap] [dip +] . genrec 5 + 6 + 7 + 8 + 9 +
-                                  [4 3 2 1 0] [[] =] [pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . ifte 5 + 6 + 7 + 8 + 9 +
-                    [4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [[4 3 2 1 0]] [[] =] . infra first choice i 5 + 6 + 7 + 8 + 9 +
-                                                                                                                   [4 3 2 1 0] . [] = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [4 3 2 1 0]] swaack first choice i 5 + 6 + 7 + 8 + 9 +
-                                                                                                                [4 3 2 1 0] [] . = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [4 3 2 1 0]] swaack first choice i 5 + 6 + 7 + 8 + 9 +
-                                                                                                                         False . [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [4 3 2 1 0]] swaack first choice i 5 + 6 + 7 + 8 + 9 +
-                                 False [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [4 3 2 1 0]] . swaack first choice i 5 + 6 + 7 + 8 + 9 +
-                                 [4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [False] . first choice i 5 + 6 + 7 + 8 + 9 +
-                                   [4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] False . choice i 5 + 6 + 7 + 8 + 9 +
-                                                 [4 3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . i 5 + 6 + 7 + 8 + 9 +
-                                                                                                                   [4 3 2 1 0] . uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                   4 [3 2 1 0] . swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                   [3 2 1 0] 4 . [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 5 + 6 + 7 + 8 + 9 +
-                                                                     [3 2 1 0] 4 [[[] =] [pop 0] [uncons swap] [dip +] genrec] . dip + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                     [3 2 1 0] . [[] =] [pop 0] [uncons swap] [dip +] genrec 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                              [3 2 1 0] [[] =] . [pop 0] [uncons swap] [dip +] genrec 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                      [3 2 1 0] [[] =] [pop 0] . [uncons swap] [dip +] genrec 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                        [3 2 1 0] [[] =] [pop 0] [uncons swap] . [dip +] genrec 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                [3 2 1 0] [[] =] [pop 0] [uncons swap] [dip +] . genrec 4 + 5 + 6 + 7 + 8 + 9 +
-                                    [3 2 1 0] [[] =] [pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . ifte 4 + 5 + 6 + 7 + 8 + 9 +
-                        [3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [[3 2 1 0]] [[] =] . infra first choice i 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                     [3 2 1 0] . [] = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [3 2 1 0]] swaack first choice i 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                  [3 2 1 0] [] . = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [3 2 1 0]] swaack first choice i 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                         False . [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [3 2 1 0]] swaack first choice i 4 + 5 + 6 + 7 + 8 + 9 +
-                                   False [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [3 2 1 0]] . swaack first choice i 4 + 5 + 6 + 7 + 8 + 9 +
-                                   [3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [False] . first choice i 4 + 5 + 6 + 7 + 8 + 9 +
-                                     [3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] False . choice i 4 + 5 + 6 + 7 + 8 + 9 +
-                                                   [3 2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . i 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                     [3 2 1 0] . uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                     3 [2 1 0] . swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                     [2 1 0] 3 . [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                       [2 1 0] 3 [[[] =] [pop 0] [uncons swap] [dip +] genrec] . dip + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                       [2 1 0] . [[] =] [pop 0] [uncons swap] [dip +] genrec 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                [2 1 0] [[] =] . [pop 0] [uncons swap] [dip +] genrec 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                        [2 1 0] [[] =] [pop 0] . [uncons swap] [dip +] genrec 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                          [2 1 0] [[] =] [pop 0] [uncons swap] . [dip +] genrec 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                  [2 1 0] [[] =] [pop 0] [uncons swap] [dip +] . genrec 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                      [2 1 0] [[] =] [pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . ifte 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                            [2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [[2 1 0]] [[] =] . infra first choice i 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                       [2 1 0] . [] = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [2 1 0]] swaack first choice i 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                    [2 1 0] [] . = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [2 1 0]] swaack first choice i 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                         False . [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [2 1 0]] swaack first choice i 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                     False [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [2 1 0]] . swaack first choice i 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                     [2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [False] . first choice i 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                       [2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] False . choice i 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                     [2 1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . i 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                       [2 1 0] . uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                       2 [1 0] . swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                       [1 0] 2 . [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                         [1 0] 2 [[[] =] [pop 0] [uncons swap] [dip +] genrec] . dip + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                         [1 0] . [[] =] [pop 0] [uncons swap] [dip +] genrec 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                  [1 0] [[] =] . [pop 0] [uncons swap] [dip +] genrec 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                          [1 0] [[] =] [pop 0] . [uncons swap] [dip +] genrec 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                            [1 0] [[] =] [pop 0] [uncons swap] . [dip +] genrec 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                    [1 0] [[] =] [pop 0] [uncons swap] [dip +] . genrec 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                        [1 0] [[] =] [pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . ifte 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                [1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [[1 0]] [[] =] . infra first choice i 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                         [1 0] . [] = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [1 0]] swaack first choice i 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                      [1 0] [] . = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [1 0]] swaack first choice i 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                         False . [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [1 0]] swaack first choice i 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                       False [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [1 0]] . swaack first choice i 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                       [1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [False] . first choice i 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                         [1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] False . choice i 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                       [1 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . i 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                         [1 0] . uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                         1 [0] . swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                         [0] 1 . [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                           [0] 1 [[[] =] [pop 0] [uncons swap] [dip +] genrec] . dip + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                           [0] . [[] =] [pop 0] [uncons swap] [dip +] genrec 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                    [0] [[] =] . [pop 0] [uncons swap] [dip +] genrec 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                            [0] [[] =] [pop 0] . [uncons swap] [dip +] genrec 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                              [0] [[] =] [pop 0] [uncons swap] . [dip +] genrec 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                      [0] [[] =] [pop 0] [uncons swap] [dip +] . genrec 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                          [0] [[] =] [pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . ifte 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                    [0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [[0]] [[] =] . infra first choice i 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                           [0] . [] = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [0]] swaack first choice i 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                        [0] [] . = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [0]] swaack first choice i 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                         False . [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [0]] swaack first choice i 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                         False [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [0]] . swaack first choice i 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                         [0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [False] . first choice i 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                           [0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] False . choice i 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                         [0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . i 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                           [0] . uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                          0 [] . swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                          [] 0 . [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                            [] 0 [[[] =] [pop 0] [uncons swap] [dip +] genrec] . dip + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                            [] . [[] =] [pop 0] [uncons swap] [dip +] genrec 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                     [] [[] =] . [pop 0] [uncons swap] [dip +] genrec 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                             [] [[] =] [pop 0] . [uncons swap] [dip +] genrec 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                               [] [[] =] [pop 0] [uncons swap] . [dip +] genrec 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                       [] [[] =] [pop 0] [uncons swap] [dip +] . genrec 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                           [] [[] =] [pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . ifte 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                      [] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [[]] [[] =] . infra first choice i 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                            [] . [] = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] []] swaack first choice i 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                         [] [] . = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] []] swaack first choice i 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                          True . [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] []] swaack first choice i 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                           True [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] []] . swaack first choice i 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                           [] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [True] . first choice i 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                             [] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] True . choice i 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                    [] [pop 0] . i 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                            [] . pop 0 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                               . 0 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                             0 . 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                           0 0 . + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                             0 . 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                           0 1 . + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                             1 . 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                           1 2 . + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                             3 . 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                           3 3 . + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                             6 . 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                           6 4 . + 5 + 6 + 7 + 8 + 9 +
-                                                                                                                            10 . 5 + 6 + 7 + 8 + 9 +
-                                                                                                                          10 5 . + 6 + 7 + 8 + 9 +
-                                                                                                                            15 . 6 + 7 + 8 + 9 +
-                                                                                                                          15 6 . + 7 + 8 + 9 +
-                                                                                                                            21 . 7 + 8 + 9 +
-                                                                                                                          21 7 . + 8 + 9 +
-                                                                                                                            28 . 8 + 9 +
-                                                                                                                          28 8 . + 9 +
-                                                                                                                            36 . 9 +
-                                                                                                                          36 9 . +
-                                                                                                                            45 .
-
-
-
V('10 range_sum')
-
-
-
                                                                                 . 10 range_sum
-                                                                              10 . range_sum
-                                                                              10 . [0 <=] 0 [1 - dup] [+] hylomorphism
-                                                                       10 [0 <=] . 0 [1 - dup] [+] hylomorphism
-                                                                     10 [0 <=] 0 . [1 - dup] [+] hylomorphism
-                                                           10 [0 <=] 0 [1 - dup] . [+] hylomorphism
-                                                       10 [0 <=] 0 [1 - dup] [+] . hylomorphism
-                                                       10 [0 <=] 0 [1 - dup] [+] . [unit [pop] swoncat] dipd [dip] swoncat genrec
-                                  10 [0 <=] 0 [1 - dup] [+] [unit [pop] swoncat] . dipd [dip] swoncat genrec
-                                                                     10 [0 <=] 0 . unit [pop] swoncat [1 - dup] [+] [dip] swoncat genrec
-                                                                     10 [0 <=] 0 . [] cons [pop] swoncat [1 - dup] [+] [dip] swoncat genrec
-                                                                  10 [0 <=] 0 [] . cons [pop] swoncat [1 - dup] [+] [dip] swoncat genrec
-                                                                   10 [0 <=] [0] . [pop] swoncat [1 - dup] [+] [dip] swoncat genrec
-                                                             10 [0 <=] [0] [pop] . swoncat [1 - dup] [+] [dip] swoncat genrec
-                                                             10 [0 <=] [0] [pop] . swap concat [1 - dup] [+] [dip] swoncat genrec
-                                                             10 [0 <=] [pop] [0] . concat [1 - dup] [+] [dip] swoncat genrec
-                                                               10 [0 <=] [pop 0] . [1 - dup] [+] [dip] swoncat genrec
-                                                     10 [0 <=] [pop 0] [1 - dup] . [+] [dip] swoncat genrec
-                                                 10 [0 <=] [pop 0] [1 - dup] [+] . [dip] swoncat genrec
-                                           10 [0 <=] [pop 0] [1 - dup] [+] [dip] . swoncat genrec
-                                           10 [0 <=] [pop 0] [1 - dup] [+] [dip] . swap concat genrec
-                                           10 [0 <=] [pop 0] [1 - dup] [dip] [+] . concat genrec
-                                             10 [0 <=] [pop 0] [1 - dup] [dip +] . genrec
-     10 [0 <=] [pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . ifte
-10 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [10] [0 <=] . infra first choice i
-                                                                              10 . 0 <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 10] swaack first choice i
-                                                                            10 0 . <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 10] swaack first choice i
-                                                                           False . [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 10] swaack first choice i
-    False [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 10] . swaack first choice i
-    10 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [False] . first choice i
-      10 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] False . choice i
-                    10 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . i
-                                                                              10 . 1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +
-                                                                            10 1 . - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +
-                                                                               9 . dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +
-                                                                             9 9 . [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +
-                                   9 9 [[0 <=] [pop 0] [1 - dup] [dip +] genrec] . dip +
-                                                                               9 . [0 <=] [pop 0] [1 - dup] [dip +] genrec 9 +
-                                                                        9 [0 <=] . [pop 0] [1 - dup] [dip +] genrec 9 +
-                                                                9 [0 <=] [pop 0] . [1 - dup] [dip +] genrec 9 +
-                                                      9 [0 <=] [pop 0] [1 - dup] . [dip +] genrec 9 +
-                                              9 [0 <=] [pop 0] [1 - dup] [dip +] . genrec 9 +
-      9 [0 <=] [pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . ifte 9 +
-  9 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [9] [0 <=] . infra first choice i 9 +
-                                                                               9 . 0 <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 9] swaack first choice i 9 +
-                                                                             9 0 . <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 9] swaack first choice i 9 +
-                                                                           False . [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 9] swaack first choice i 9 +
-     False [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 9] . swaack first choice i 9 +
-     9 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [False] . first choice i 9 +
-       9 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] False . choice i 9 +
-                     9 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . i 9 +
-                                                                               9 . 1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 9 +
-                                                                             9 1 . - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 9 +
-                                                                               8 . dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 9 +
-                                                                             8 8 . [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 9 +
-                                   8 8 [[0 <=] [pop 0] [1 - dup] [dip +] genrec] . dip + 9 +
-                                                                               8 . [0 <=] [pop 0] [1 - dup] [dip +] genrec 8 + 9 +
-                                                                        8 [0 <=] . [pop 0] [1 - dup] [dip +] genrec 8 + 9 +
-                                                                8 [0 <=] [pop 0] . [1 - dup] [dip +] genrec 8 + 9 +
-                                                      8 [0 <=] [pop 0] [1 - dup] . [dip +] genrec 8 + 9 +
-                                              8 [0 <=] [pop 0] [1 - dup] [dip +] . genrec 8 + 9 +
-      8 [0 <=] [pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . ifte 8 + 9 +
-  8 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [8] [0 <=] . infra first choice i 8 + 9 +
-                                                                               8 . 0 <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 8] swaack first choice i 8 + 9 +
-                                                                             8 0 . <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 8] swaack first choice i 8 + 9 +
-                                                                           False . [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 8] swaack first choice i 8 + 9 +
-     False [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 8] . swaack first choice i 8 + 9 +
-     8 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [False] . first choice i 8 + 9 +
-       8 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] False . choice i 8 + 9 +
-                     8 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . i 8 + 9 +
-                                                                               8 . 1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 8 + 9 +
-                                                                             8 1 . - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 8 + 9 +
-                                                                               7 . dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 8 + 9 +
-                                                                             7 7 . [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 8 + 9 +
-                                   7 7 [[0 <=] [pop 0] [1 - dup] [dip +] genrec] . dip + 8 + 9 +
-                                                                               7 . [0 <=] [pop 0] [1 - dup] [dip +] genrec 7 + 8 + 9 +
-                                                                        7 [0 <=] . [pop 0] [1 - dup] [dip +] genrec 7 + 8 + 9 +
-                                                                7 [0 <=] [pop 0] . [1 - dup] [dip +] genrec 7 + 8 + 9 +
-                                                      7 [0 <=] [pop 0] [1 - dup] . [dip +] genrec 7 + 8 + 9 +
-                                              7 [0 <=] [pop 0] [1 - dup] [dip +] . genrec 7 + 8 + 9 +
-      7 [0 <=] [pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . ifte 7 + 8 + 9 +
-  7 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [7] [0 <=] . infra first choice i 7 + 8 + 9 +
-                                                                               7 . 0 <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 7] swaack first choice i 7 + 8 + 9 +
-                                                                             7 0 . <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 7] swaack first choice i 7 + 8 + 9 +
-                                                                           False . [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 7] swaack first choice i 7 + 8 + 9 +
-     False [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 7] . swaack first choice i 7 + 8 + 9 +
-     7 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [False] . first choice i 7 + 8 + 9 +
-       7 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] False . choice i 7 + 8 + 9 +
-                     7 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . i 7 + 8 + 9 +
-                                                                               7 . 1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 7 + 8 + 9 +
-                                                                             7 1 . - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 7 + 8 + 9 +
-                                                                               6 . dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 7 + 8 + 9 +
-                                                                             6 6 . [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 7 + 8 + 9 +
-                                   6 6 [[0 <=] [pop 0] [1 - dup] [dip +] genrec] . dip + 7 + 8 + 9 +
-                                                                               6 . [0 <=] [pop 0] [1 - dup] [dip +] genrec 6 + 7 + 8 + 9 +
-                                                                        6 [0 <=] . [pop 0] [1 - dup] [dip +] genrec 6 + 7 + 8 + 9 +
-                                                                6 [0 <=] [pop 0] . [1 - dup] [dip +] genrec 6 + 7 + 8 + 9 +
-                                                      6 [0 <=] [pop 0] [1 - dup] . [dip +] genrec 6 + 7 + 8 + 9 +
-                                              6 [0 <=] [pop 0] [1 - dup] [dip +] . genrec 6 + 7 + 8 + 9 +
-      6 [0 <=] [pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . ifte 6 + 7 + 8 + 9 +
-  6 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [6] [0 <=] . infra first choice i 6 + 7 + 8 + 9 +
-                                                                               6 . 0 <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 6] swaack first choice i 6 + 7 + 8 + 9 +
-                                                                             6 0 . <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 6] swaack first choice i 6 + 7 + 8 + 9 +
-                                                                           False . [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 6] swaack first choice i 6 + 7 + 8 + 9 +
-     False [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 6] . swaack first choice i 6 + 7 + 8 + 9 +
-     6 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [False] . first choice i 6 + 7 + 8 + 9 +
-       6 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] False . choice i 6 + 7 + 8 + 9 +
-                     6 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . i 6 + 7 + 8 + 9 +
-                                                                               6 . 1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 6 + 7 + 8 + 9 +
-                                                                             6 1 . - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 6 + 7 + 8 + 9 +
-                                                                               5 . dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 6 + 7 + 8 + 9 +
-                                                                             5 5 . [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 6 + 7 + 8 + 9 +
-                                   5 5 [[0 <=] [pop 0] [1 - dup] [dip +] genrec] . dip + 6 + 7 + 8 + 9 +
-                                                                               5 . [0 <=] [pop 0] [1 - dup] [dip +] genrec 5 + 6 + 7 + 8 + 9 +
-                                                                        5 [0 <=] . [pop 0] [1 - dup] [dip +] genrec 5 + 6 + 7 + 8 + 9 +
-                                                                5 [0 <=] [pop 0] . [1 - dup] [dip +] genrec 5 + 6 + 7 + 8 + 9 +
-                                                      5 [0 <=] [pop 0] [1 - dup] . [dip +] genrec 5 + 6 + 7 + 8 + 9 +
-                                              5 [0 <=] [pop 0] [1 - dup] [dip +] . genrec 5 + 6 + 7 + 8 + 9 +
-      5 [0 <=] [pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . ifte 5 + 6 + 7 + 8 + 9 +
-  5 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [5] [0 <=] . infra first choice i 5 + 6 + 7 + 8 + 9 +
-                                                                               5 . 0 <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 5] swaack first choice i 5 + 6 + 7 + 8 + 9 +
-                                                                             5 0 . <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 5] swaack first choice i 5 + 6 + 7 + 8 + 9 +
-                                                                           False . [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 5] swaack first choice i 5 + 6 + 7 + 8 + 9 +
-     False [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 5] . swaack first choice i 5 + 6 + 7 + 8 + 9 +
-     5 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [False] . first choice i 5 + 6 + 7 + 8 + 9 +
-       5 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] False . choice i 5 + 6 + 7 + 8 + 9 +
-                     5 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . i 5 + 6 + 7 + 8 + 9 +
-                                                                               5 . 1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 5 + 6 + 7 + 8 + 9 +
-                                                                             5 1 . - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 5 + 6 + 7 + 8 + 9 +
-                                                                               4 . dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 5 + 6 + 7 + 8 + 9 +
-                                                                             4 4 . [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 5 + 6 + 7 + 8 + 9 +
-                                   4 4 [[0 <=] [pop 0] [1 - dup] [dip +] genrec] . dip + 5 + 6 + 7 + 8 + 9 +
-                                                                               4 . [0 <=] [pop 0] [1 - dup] [dip +] genrec 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                        4 [0 <=] . [pop 0] [1 - dup] [dip +] genrec 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                4 [0 <=] [pop 0] . [1 - dup] [dip +] genrec 4 + 5 + 6 + 7 + 8 + 9 +
-                                                      4 [0 <=] [pop 0] [1 - dup] . [dip +] genrec 4 + 5 + 6 + 7 + 8 + 9 +
-                                              4 [0 <=] [pop 0] [1 - dup] [dip +] . genrec 4 + 5 + 6 + 7 + 8 + 9 +
-      4 [0 <=] [pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . ifte 4 + 5 + 6 + 7 + 8 + 9 +
-  4 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [4] [0 <=] . infra first choice i 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               4 . 0 <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 4] swaack first choice i 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                             4 0 . <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 4] swaack first choice i 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                           False . [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 4] swaack first choice i 4 + 5 + 6 + 7 + 8 + 9 +
-     False [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 4] . swaack first choice i 4 + 5 + 6 + 7 + 8 + 9 +
-     4 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [False] . first choice i 4 + 5 + 6 + 7 + 8 + 9 +
-       4 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] False . choice i 4 + 5 + 6 + 7 + 8 + 9 +
-                     4 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . i 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               4 . 1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                             4 1 . - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               3 . dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                             3 3 . [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 4 + 5 + 6 + 7 + 8 + 9 +
-                                   3 3 [[0 <=] [pop 0] [1 - dup] [dip +] genrec] . dip + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               3 . [0 <=] [pop 0] [1 - dup] [dip +] genrec 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                        3 [0 <=] . [pop 0] [1 - dup] [dip +] genrec 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                3 [0 <=] [pop 0] . [1 - dup] [dip +] genrec 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                      3 [0 <=] [pop 0] [1 - dup] . [dip +] genrec 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                              3 [0 <=] [pop 0] [1 - dup] [dip +] . genrec 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-      3 [0 <=] [pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . ifte 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-  3 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [3] [0 <=] . infra first choice i 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               3 . 0 <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 3] swaack first choice i 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                             3 0 . <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 3] swaack first choice i 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                           False . [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 3] swaack first choice i 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-     False [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 3] . swaack first choice i 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-     3 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [False] . first choice i 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-       3 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] False . choice i 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                     3 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . i 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               3 . 1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                             3 1 . - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               2 . dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                             2 2 . [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                   2 2 [[0 <=] [pop 0] [1 - dup] [dip +] genrec] . dip + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               2 . [0 <=] [pop 0] [1 - dup] [dip +] genrec 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                        2 [0 <=] . [pop 0] [1 - dup] [dip +] genrec 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                2 [0 <=] [pop 0] . [1 - dup] [dip +] genrec 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                      2 [0 <=] [pop 0] [1 - dup] . [dip +] genrec 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                              2 [0 <=] [pop 0] [1 - dup] [dip +] . genrec 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-      2 [0 <=] [pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . ifte 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-  2 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [2] [0 <=] . infra first choice i 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               2 . 0 <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 2] swaack first choice i 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                             2 0 . <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 2] swaack first choice i 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                           False . [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 2] swaack first choice i 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-     False [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 2] . swaack first choice i 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-     2 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [False] . first choice i 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-       2 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] False . choice i 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                     2 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . i 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               2 . 1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                             2 1 . - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               1 . dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                             1 1 . [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                   1 1 [[0 <=] [pop 0] [1 - dup] [dip +] genrec] . dip + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               1 . [0 <=] [pop 0] [1 - dup] [dip +] genrec 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                        1 [0 <=] . [pop 0] [1 - dup] [dip +] genrec 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                1 [0 <=] [pop 0] . [1 - dup] [dip +] genrec 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                      1 [0 <=] [pop 0] [1 - dup] . [dip +] genrec 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                              1 [0 <=] [pop 0] [1 - dup] [dip +] . genrec 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-      1 [0 <=] [pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . ifte 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-  1 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [1] [0 <=] . infra first choice i 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               1 . 0 <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 1] swaack first choice i 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                             1 0 . <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 1] swaack first choice i 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                           False . [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 1] swaack first choice i 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-     False [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 1] . swaack first choice i 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-     1 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [False] . first choice i 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-       1 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] False . choice i 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                     1 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . i 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               1 . 1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                             1 1 . - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               0 . dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                             0 0 . [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                   0 0 [[0 <=] [pop 0] [1 - dup] [dip +] genrec] . dip + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               0 . [0 <=] [pop 0] [1 - dup] [dip +] genrec 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                        0 [0 <=] . [pop 0] [1 - dup] [dip +] genrec 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                0 [0 <=] [pop 0] . [1 - dup] [dip +] genrec 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                      0 [0 <=] [pop 0] [1 - dup] . [dip +] genrec 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                              0 [0 <=] [pop 0] [1 - dup] [dip +] . genrec 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-      0 [0 <=] [pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] . ifte 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-  0 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [0] [0 <=] . infra first choice i 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               0 . 0 <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 0] swaack first choice i 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                             0 0 . <= [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 0] swaack first choice i 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                            True . [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 0] swaack first choice i 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-      True [[pop 0] [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] 0] . swaack first choice i 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-      0 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] [True] . first choice i 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-        0 [1 - dup [[0 <=] [pop 0] [1 - dup] [dip +] genrec] dip +] [pop 0] True . choice i 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                       0 [pop 0] . i 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               0 . pop 0 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                                 . 0 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               0 . 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                             0 0 . + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               0 . 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                             0 1 . + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               1 . 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                             1 2 . + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               3 . 3 + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                             3 3 . + 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                               6 . 4 + 5 + 6 + 7 + 8 + 9 +
-                                                                             6 4 . + 5 + 6 + 7 + 8 + 9 +
-                                                                              10 . 5 + 6 + 7 + 8 + 9 +
-                                                                            10 5 . + 6 + 7 + 8 + 9 +
-                                                                              15 . 6 + 7 + 8 + 9 +
-                                                                            15 6 . + 7 + 8 + 9 +
-                                                                              21 . 7 + 8 + 9 +
-                                                                            21 7 . + 8 + 9 +
-                                                                              28 . 8 + 9 +
-                                                                            28 8 . + 9 +
-                                                                              36 . 9 +
-                                                                            36 9 . +
-                                                                              45 .
-
-
-
-
-

Factorial Function and Paramorphisms

-

A paramorphism P :: B -> A is a recursion combinator that uses -dup on intermediate values.

-
n swap [P] [pop] [[F] dupdip G] primrec
-
-
-

With - n :: A is the “identity” for F (like 1 for -multiplication, 0 for addition) - F :: (A, B) -> A - G :: B -> B -generates the next B value. - and lastly P :: B -> Bool detects -the end of the series.

-

For Factorial function (types A and B are both integer):

-
n == 1
-F == *
-G == --
-P == 1 <=
-
-
-
define('factorial == 1 swap [1 <=] [pop] [[*] dupdip --] primrec')
-
-
-

Try it with input 3 (omitting evaluation of predicate):

-
3 1 swap [1 <=] [pop] [[*] dupdip --] primrec
-1 3      [1 <=] [pop] [[*] dupdip --] primrec
-
-1 3 [*] dupdip --
-1 3  * 3      --
-3      3      --
-3      2
-
-3 2 [*] dupdip --
-3 2  *  2      --
-6       2      --
-6       1
-
-6 1 [1 <=] [pop] [[*] dupdip --] primrec
-
-6 1 pop
-6
-
-
-
J('3 factorial')
-
-
-
6
-
-
-
-

Derive paramorphism from the form above.

-
n swap [P] [pop] [[F] dupdip G] primrec
-
-n swap [P]       [pop]     [[F] dupdip G]                  primrec
-n [P] [swap] dip [pop]     [[F] dupdip G]                  primrec
-n [P] [[F] dupdip G]                [[swap] dip [pop]] dip primrec
-n [P] [F] [dupdip G]           cons [[swap] dip [pop]] dip primrec
-n [P] [F] [G] [dupdip] swoncat cons [[swap] dip [pop]] dip primrec
-
-paramorphism == [dupdip] swoncat cons [[swap] dip [pop]] dip primrec
-
-
-
define('paramorphism == [dupdip] swoncat cons [[swap] dip [pop]] dip primrec')
-define('factorial == 1 [1 <=] [*] [--] paramorphism')
-
-
-
J('3 factorial')
-
-
-
6
-
-
-
-
-
-

tails

-

An example of a paramorphism for lists given in the “Bananas…” -paper -is tails which returns the list of “tails” of a list.

-
[1 2 3] tails == [[] [3] [2 3]]
-
-
-

Using paramorphism we would write:

-
n == []
-F == rest swons
-G == rest
-P == not
-
-tails == [] [not] [rest swons] [rest] paramorphism
-
-
-
define('tails == [] [not] [rest swons] [rest] paramorphism')
-
-
-
J('[1 2 3] tails')
-
-
-
[[] [3] [2 3]]
-
-
-
J('25 range tails [popop] infra [sum] map')
-
-
-
[1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 210 231 253 276]
-
-
-
J('25 range [range_sum] map')
-
-
-
[276 253 231 210 190 171 153 136 120 105 91 78 66 55 45 36 28 21 15 10 6 3 1 0 0]
-
-
-
-

Factoring rest

-

Right before the recursion begins we have:

-
[] [1 2 3] [not] [pop] [[rest swons] dupdip rest] primrec
-
-
-

But we might prefer to factor rest in the quote:

-
[] [1 2 3] [not] [pop] [rest [swons] dupdip] primrec
-
-
-

There’s no way to do that with the paramorphism combinator as -defined. We would have to write and use a slightly different recursion -combinator that accepted an additional “preprocessor” function [H] -and built:

-
n swap [P] [pop] [H [F] dupdip G] primrec
-
-
-

Or just write it out manually. This is yet another place where the -sufficiently smart compiler will one day automatically refactor the -code. We could write a paramorphism combinator that checked [F] -and [G] for common prefix and extracted it.

-
-
-
-

Patterns of Recursion

-

Our story so far…

-
    -
  • A combiner F :: (B, B) -> B
  • -
  • A predicate P :: A -> Bool to detect the base case
  • -
  • A base case value c :: B
  • -
-
-

Hylo- Ana-, Cata-

-
w/ G :: A -> (A, B)
-
-H == [P   ] [pop c ] [G          ] [dip F    ] genrec
-A == [P   ] [pop []] [G          ] [dip swons] genrec
-C == [[] =] [pop c ] [uncons swap] [dip F    ] genrec
-
-
-
-
-

Para-, ?-, ?-

-
w/ G :: B -> B
-
-P == c  swap [P   ] [pop] [[F    ] dupdip G          ] primrec
-? == [] swap [P   ] [pop] [[swons] dupdip G          ] primrec
-? == c  swap [[] =] [pop] [[F    ] dupdip uncons swap] primrec
-
-
-
-
-
-

Four Generalizations

-

There are at least four kinds of recursive combinator, depending on two -choices. The first choice is whether the combiner function should be -evaluated during the recursion or pushed into the pending expression to -be “collapsed” at the end. The second choice is whether the combiner -needs to operate on the current value of the datastructure or the -generator’s output.

-
H ==        [P] [pop c] [G             ] [dip F] genrec
-H == c swap [P] [pop]   [G [F]    dip  ] [i]     genrec
-H ==        [P] [pop c] [  [G] dupdip  ] [dip F] genrec
-H == c swap [P] [pop]   [  [F] dupdip G] [i]     genrec
-
-
-

Consider:

-
... a G [H] dip F                w/ a G == a' b
-... c a G [F] dip H                 a G == b  a'
-... a [G] dupdip [H] dip F          a G == a'
-... c a [F] dupdip G H              a G == a'
-
-
-
-

1

-
H == [P] [pop c] [G] [dip F] genrec
-
-
-

Iterate n times.

-
... a [P] [pop c] [G] [dip F] genrec
-... a  G [H] dip F
-... a' b [H] dip F
-... a' H b F
-... a'  G [H] dip F b F
-... a'' b [H] dip F b F
-... a'' H b F b F
-... a''  G [H] dip F b F b F
-... a''' b [H] dip F b F b F
-... a''' H b F b F b F
-... a''' pop c b F b F b F
-... c b F b F b F
-
-
-

This form builds up a continuation that contains the intermediate -results along with the pending combiner functions. When the base case is -reached the last term is replaced by the identity value c and the -continuation “collapses” into the final result.

-
-
-

2

-

When you can start with the identity value c on the stack and the -combiner can operate as you go, using the intermediate results -immediately rather than queuing them up, use this form. An important -difference is that the generator function must return its results in the -reverse order.

-
H == c swap [P] [pop] [G [F] dip] primrec
-
-... c a G [F] dip H
-... c b a' [F] dip H
-... c b F a' H
-... c b F a' G [F] dip H
-... c b F b a'' [F] dip H
-... c b F b F a'' H
-... c b F b F a'' G [F] dip H
-... c b F b F b a''' [F] dip H
-... c b F b F b F a''' H
-... c b F b F b F a''' pop
-... c b F b F b F
-
-
-

The end line here is the same as for above, but only because we didn’t -evaluate F when it normally would have been.

-
-
-

3

-

If the combiner and the generator both need to work on the current value -then dup must be used at some point, and the generator must produce -one item instead of two (the b is instead the duplicate of a.)

-
H == [P] [pop c] [[G] dupdip] [dip F] genrec
-
-... a [G] dupdip [H] dip F
-... a  G a       [H] dip F
-... a'   a       [H] dip F
-... a' H a F
-... a' [G] dupdip [H] dip F a F
-... a'  G  a'     [H] dip F a F
-... a''    a'     [H] dip F a F
-... a'' H  a' F a F
-... a'' [G] dupdip [H] dip F a' F a F
-... a''  G  a''    [H] dip F a' F a F
-... a'''    a''    [H] dip F a' F a F
-... a''' H  a'' F a' F a F
-... a''' pop c  a'' F a' F a F
-...          c  a'' F a' F a F
-
-
-
-
-

4

-

And, last but not least, if you can combine as you go, starting with c, -and the combiner needs to work on the current item this is the form:

-
W == c swap [P] [pop] [[F] dupdip G] primrec
-
-... a c swap [P] [pop] [[F] dupdip G] primrec
-... c a [P] [pop] [[F] dupdip G] primrec
-... c a [F] dupdip G W
-... c a  F a G W
-... c a  F a'  W
-... c a  F a'  [F] dupdip G W
-... c a  F a'   F  a'     G W
-... c a  F a'   F  a''      W
-... c a  F a'   F  a''      [F] dupdip G W
-... c a  F a'   F  a''       F  a''    G W
-... c a  F a'   F  a''       F  a'''     W
-... c a  F a'   F  a''       F  a'''     pop
-... c a  F a'   F  a''       F
-
-
-

Each of the four variations above can be specialized to ana- and -catamorphic forms.

-
def WTFmorphism(c, F, P, G):
-    '''Return a hylomorphism function H.'''
-
-    def H(a, d=c):
-        if P(a):
-            result = d
-        else:
-            a, b = G(a)
-            result = H(a, F(d, b))
-        return result
-
-    return H
-
-
-
F = lambda a, b: a + b
-P = lambda n: n <= 1
-G = lambda n: (n - 1, n - 1)
-
-wtf = WTFmorphism(0, F, P, G)
-
-print wtf(5)
-
-
-
10
-
-
-
H == [P   ] [pop c ] [G          ] [dip F    ] genrec
-
-
-
DefinitionWrapper.add_definitions('''
-P == 1 <=
-Ga == -- dup
-Gb == --
-c == 0
-F == +
-''', D)
-
-
-
V('[1 2 3] [[] =] [pop []] [uncons swap] [dip swons] genrec')
-
-
-
                                                                                                             . [1 2 3] [[] =] [pop []] [uncons swap] [dip swons] genrec
-                                                                                                     [1 2 3] . [[] =] [pop []] [uncons swap] [dip swons] genrec
-                                                                                              [1 2 3] [[] =] . [pop []] [uncons swap] [dip swons] genrec
-                                                                                     [1 2 3] [[] =] [pop []] . [uncons swap] [dip swons] genrec
-                                                                       [1 2 3] [[] =] [pop []] [uncons swap] . [dip swons] genrec
-                                                           [1 2 3] [[] =] [pop []] [uncons swap] [dip swons] . genrec
-          [1 2 3] [[] =] [pop []] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] . ifte
-[1 2 3] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [pop []] [[1 2 3]] [[] =] . infra first choice i
-                                                                                                     [1 2 3] . [] = [[pop []] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [1 2 3]] swaack first choice i
-                                                                                                  [1 2 3] [] . = [[pop []] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [1 2 3]] swaack first choice i
-                                                                                                       False . [[pop []] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [1 2 3]] swaack first choice i
-         False [[pop []] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [1 2 3]] . swaack first choice i
-         [1 2 3] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [pop []] [False] . first choice i
-           [1 2 3] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [pop []] False . choice i
-                          [1 2 3] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] . i
-                                                                                                     [1 2 3] . uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons
-                                                                                                     1 [2 3] . swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons
-                                                                                                     [2 3] 1 . [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons
-                                                  [2 3] 1 [[[] =] [pop []] [uncons swap] [dip swons] genrec] . dip swons
-                                                                                                       [2 3] . [[] =] [pop []] [uncons swap] [dip swons] genrec 1 swons
-                                                                                                [2 3] [[] =] . [pop []] [uncons swap] [dip swons] genrec 1 swons
-                                                                                       [2 3] [[] =] [pop []] . [uncons swap] [dip swons] genrec 1 swons
-                                                                         [2 3] [[] =] [pop []] [uncons swap] . [dip swons] genrec 1 swons
-                                                             [2 3] [[] =] [pop []] [uncons swap] [dip swons] . genrec 1 swons
-            [2 3] [[] =] [pop []] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] . ifte 1 swons
-    [2 3] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [pop []] [[2 3]] [[] =] . infra first choice i 1 swons
-                                                                                                       [2 3] . [] = [[pop []] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [2 3]] swaack first choice i 1 swons
-                                                                                                    [2 3] [] . = [[pop []] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [2 3]] swaack first choice i 1 swons
-                                                                                                       False . [[pop []] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [2 3]] swaack first choice i 1 swons
-           False [[pop []] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [2 3]] . swaack first choice i 1 swons
-           [2 3] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [pop []] [False] . first choice i 1 swons
-             [2 3] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [pop []] False . choice i 1 swons
-                            [2 3] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] . i 1 swons
-                                                                                                       [2 3] . uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons 1 swons
-                                                                                                       2 [3] . swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons 1 swons
-                                                                                                       [3] 2 . [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons 1 swons
-                                                    [3] 2 [[[] =] [pop []] [uncons swap] [dip swons] genrec] . dip swons 1 swons
-                                                                                                         [3] . [[] =] [pop []] [uncons swap] [dip swons] genrec 2 swons 1 swons
-                                                                                                  [3] [[] =] . [pop []] [uncons swap] [dip swons] genrec 2 swons 1 swons
-                                                                                         [3] [[] =] [pop []] . [uncons swap] [dip swons] genrec 2 swons 1 swons
-                                                                           [3] [[] =] [pop []] [uncons swap] . [dip swons] genrec 2 swons 1 swons
-                                                               [3] [[] =] [pop []] [uncons swap] [dip swons] . genrec 2 swons 1 swons
-              [3] [[] =] [pop []] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] . ifte 2 swons 1 swons
-        [3] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [pop []] [[3]] [[] =] . infra first choice i 2 swons 1 swons
-                                                                                                         [3] . [] = [[pop []] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [3]] swaack first choice i 2 swons 1 swons
-                                                                                                      [3] [] . = [[pop []] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [3]] swaack first choice i 2 swons 1 swons
-                                                                                                       False . [[pop []] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [3]] swaack first choice i 2 swons 1 swons
-             False [[pop []] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [3]] . swaack first choice i 2 swons 1 swons
-             [3] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [pop []] [False] . first choice i 2 swons 1 swons
-               [3] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [pop []] False . choice i 2 swons 1 swons
-                              [3] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] . i 2 swons 1 swons
-                                                                                                         [3] . uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons 2 swons 1 swons
-                                                                                                        3 [] . swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons 2 swons 1 swons
-                                                                                                        [] 3 . [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons 2 swons 1 swons
-                                                     [] 3 [[[] =] [pop []] [uncons swap] [dip swons] genrec] . dip swons 2 swons 1 swons
-                                                                                                          [] . [[] =] [pop []] [uncons swap] [dip swons] genrec 3 swons 2 swons 1 swons
-                                                                                                   [] [[] =] . [pop []] [uncons swap] [dip swons] genrec 3 swons 2 swons 1 swons
-                                                                                          [] [[] =] [pop []] . [uncons swap] [dip swons] genrec 3 swons 2 swons 1 swons
-                                                                            [] [[] =] [pop []] [uncons swap] . [dip swons] genrec 3 swons 2 swons 1 swons
-                                                                [] [[] =] [pop []] [uncons swap] [dip swons] . genrec 3 swons 2 swons 1 swons
-               [] [[] =] [pop []] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] . ifte 3 swons 2 swons 1 swons
-          [] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [pop []] [[]] [[] =] . infra first choice i 3 swons 2 swons 1 swons
-                                                                                                          [] . [] = [[pop []] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] []] swaack first choice i 3 swons 2 swons 1 swons
-                                                                                                       [] [] . = [[pop []] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] []] swaack first choice i 3 swons 2 swons 1 swons
-                                                                                                        True . [[pop []] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] []] swaack first choice i 3 swons 2 swons 1 swons
-               True [[pop []] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] []] . swaack first choice i 3 swons 2 swons 1 swons
-               [] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [pop []] [True] . first choice i 3 swons 2 swons 1 swons
-                 [] [uncons swap [[[] =] [pop []] [uncons swap] [dip swons] genrec] dip swons] [pop []] True . choice i 3 swons 2 swons 1 swons
-                                                                                                 [] [pop []] . i 3 swons 2 swons 1 swons
-                                                                                                          [] . pop [] 3 swons 2 swons 1 swons
-                                                                                                             . [] 3 swons 2 swons 1 swons
-                                                                                                          [] . 3 swons 2 swons 1 swons
-                                                                                                        [] 3 . swons 2 swons 1 swons
-                                                                                                        [] 3 . swap cons 2 swons 1 swons
-                                                                                                        3 [] . cons 2 swons 1 swons
-                                                                                                         [3] . 2 swons 1 swons
-                                                                                                       [3] 2 . swons 1 swons
-                                                                                                       [3] 2 . swap cons 1 swons
-                                                                                                       2 [3] . cons 1 swons
-                                                                                                       [2 3] . 1 swons
-                                                                                                     [2 3] 1 . swons
-                                                                                                     [2 3] 1 . swap cons
-                                                                                                     1 [2 3] . cons
-                                                                                                     [1 2 3] .
-
-
-
V('3 [P] [pop c] [Ga] [dip F] genrec')
-
-
-
                                                               . 3 [P] [pop c] [Ga] [dip F] genrec
-                                                             3 . [P] [pop c] [Ga] [dip F] genrec
-                                                         3 [P] . [pop c] [Ga] [dip F] genrec
-                                                 3 [P] [pop c] . [Ga] [dip F] genrec
-                                            3 [P] [pop c] [Ga] . [dip F] genrec
-                                    3 [P] [pop c] [Ga] [dip F] . genrec
-    3 [P] [pop c] [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] . ifte
-3 [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] [pop c] [3] [P] . infra first choice i
-                                                             3 . P [[pop c] [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] 3] swaack first choice i
-                                                             3 . 1 <= [[pop c] [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] 3] swaack first choice i
-                                                           3 1 . <= [[pop c] [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] 3] swaack first choice i
-                                                         False . [[pop c] [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] 3] swaack first choice i
-False [[pop c] [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] 3] . swaack first choice i
-3 [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] [pop c] [False] . first choice i
-  3 [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] [pop c] False . choice i
-                3 [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] . i
-                                                             3 . Ga [[P] [pop c] [Ga] [dip F] genrec] dip F
-                                                             3 . -- dup [[P] [pop c] [Ga] [dip F] genrec] dip F
-                                                             2 . dup [[P] [pop c] [Ga] [dip F] genrec] dip F
-                                                           2 2 . [[P] [pop c] [Ga] [dip F] genrec] dip F
-                         2 2 [[P] [pop c] [Ga] [dip F] genrec] . dip F
-                                                             2 . [P] [pop c] [Ga] [dip F] genrec 2 F
-                                                         2 [P] . [pop c] [Ga] [dip F] genrec 2 F
-                                                 2 [P] [pop c] . [Ga] [dip F] genrec 2 F
-                                            2 [P] [pop c] [Ga] . [dip F] genrec 2 F
-                                    2 [P] [pop c] [Ga] [dip F] . genrec 2 F
-    2 [P] [pop c] [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] . ifte 2 F
-2 [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] [pop c] [2] [P] . infra first choice i 2 F
-                                                             2 . P [[pop c] [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] 2] swaack first choice i 2 F
-                                                             2 . 1 <= [[pop c] [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] 2] swaack first choice i 2 F
-                                                           2 1 . <= [[pop c] [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] 2] swaack first choice i 2 F
-                                                         False . [[pop c] [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] 2] swaack first choice i 2 F
-False [[pop c] [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] 2] . swaack first choice i 2 F
-2 [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] [pop c] [False] . first choice i 2 F
-  2 [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] [pop c] False . choice i 2 F
-                2 [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] . i 2 F
-                                                             2 . Ga [[P] [pop c] [Ga] [dip F] genrec] dip F 2 F
-                                                             2 . -- dup [[P] [pop c] [Ga] [dip F] genrec] dip F 2 F
-                                                             1 . dup [[P] [pop c] [Ga] [dip F] genrec] dip F 2 F
-                                                           1 1 . [[P] [pop c] [Ga] [dip F] genrec] dip F 2 F
-                         1 1 [[P] [pop c] [Ga] [dip F] genrec] . dip F 2 F
-                                                             1 . [P] [pop c] [Ga] [dip F] genrec 1 F 2 F
-                                                         1 [P] . [pop c] [Ga] [dip F] genrec 1 F 2 F
-                                                 1 [P] [pop c] . [Ga] [dip F] genrec 1 F 2 F
-                                            1 [P] [pop c] [Ga] . [dip F] genrec 1 F 2 F
-                                    1 [P] [pop c] [Ga] [dip F] . genrec 1 F 2 F
-    1 [P] [pop c] [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] . ifte 1 F 2 F
-1 [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] [pop c] [1] [P] . infra first choice i 1 F 2 F
-                                                             1 . P [[pop c] [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] 1] swaack first choice i 1 F 2 F
-                                                             1 . 1 <= [[pop c] [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] 1] swaack first choice i 1 F 2 F
-                                                           1 1 . <= [[pop c] [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] 1] swaack first choice i 1 F 2 F
-                                                          True . [[pop c] [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] 1] swaack first choice i 1 F 2 F
- True [[pop c] [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] 1] . swaack first choice i 1 F 2 F
- 1 [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] [pop c] [True] . first choice i 1 F 2 F
-   1 [Ga [[P] [pop c] [Ga] [dip F] genrec] dip F] [pop c] True . choice i 1 F 2 F
-                                                     1 [pop c] . i 1 F 2 F
-                                                             1 . pop c 1 F 2 F
-                                                               . c 1 F 2 F
-                                                               . 0 1 F 2 F
-                                                             0 . 1 F 2 F
-                                                           0 1 . F 2 F
-                                                           0 1 . + 2 F
-                                                             1 . 2 F
-                                                           1 2 . F
-                                                           1 2 . +
-                                                             3 .
-
-
-
V('3 [P] [pop []] [Ga] [dip swons] genrec')
-
-
-
                                                                         . 3 [P] [pop []] [Ga] [dip swons] genrec
-                                                                       3 . [P] [pop []] [Ga] [dip swons] genrec
-                                                                   3 [P] . [pop []] [Ga] [dip swons] genrec
-                                                          3 [P] [pop []] . [Ga] [dip swons] genrec
-                                                     3 [P] [pop []] [Ga] . [dip swons] genrec
-                                         3 [P] [pop []] [Ga] [dip swons] . genrec
-    3 [P] [pop []] [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] . ifte
-3 [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] [pop []] [3] [P] . infra first choice i
-                                                                       3 . P [[pop []] [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] 3] swaack first choice i
-                                                                       3 . 1 <= [[pop []] [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] 3] swaack first choice i
-                                                                     3 1 . <= [[pop []] [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] 3] swaack first choice i
-                                                                   False . [[pop []] [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] 3] swaack first choice i
-False [[pop []] [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] 3] . swaack first choice i
-3 [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] [pop []] [False] . first choice i
-  3 [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] [pop []] False . choice i
-                 3 [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] . i
-                                                                       3 . Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons
-                                                                       3 . -- dup [[P] [pop []] [Ga] [dip swons] genrec] dip swons
-                                                                       2 . dup [[P] [pop []] [Ga] [dip swons] genrec] dip swons
-                                                                     2 2 . [[P] [pop []] [Ga] [dip swons] genrec] dip swons
-                              2 2 [[P] [pop []] [Ga] [dip swons] genrec] . dip swons
-                                                                       2 . [P] [pop []] [Ga] [dip swons] genrec 2 swons
-                                                                   2 [P] . [pop []] [Ga] [dip swons] genrec 2 swons
-                                                          2 [P] [pop []] . [Ga] [dip swons] genrec 2 swons
-                                                     2 [P] [pop []] [Ga] . [dip swons] genrec 2 swons
-                                         2 [P] [pop []] [Ga] [dip swons] . genrec 2 swons
-    2 [P] [pop []] [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] . ifte 2 swons
-2 [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] [pop []] [2] [P] . infra first choice i 2 swons
-                                                                       2 . P [[pop []] [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] 2] swaack first choice i 2 swons
-                                                                       2 . 1 <= [[pop []] [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] 2] swaack first choice i 2 swons
-                                                                     2 1 . <= [[pop []] [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] 2] swaack first choice i 2 swons
-                                                                   False . [[pop []] [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] 2] swaack first choice i 2 swons
-False [[pop []] [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] 2] . swaack first choice i 2 swons
-2 [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] [pop []] [False] . first choice i 2 swons
-  2 [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] [pop []] False . choice i 2 swons
-                 2 [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] . i 2 swons
-                                                                       2 . Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons 2 swons
-                                                                       2 . -- dup [[P] [pop []] [Ga] [dip swons] genrec] dip swons 2 swons
-                                                                       1 . dup [[P] [pop []] [Ga] [dip swons] genrec] dip swons 2 swons
-                                                                     1 1 . [[P] [pop []] [Ga] [dip swons] genrec] dip swons 2 swons
-                              1 1 [[P] [pop []] [Ga] [dip swons] genrec] . dip swons 2 swons
-                                                                       1 . [P] [pop []] [Ga] [dip swons] genrec 1 swons 2 swons
-                                                                   1 [P] . [pop []] [Ga] [dip swons] genrec 1 swons 2 swons
-                                                          1 [P] [pop []] . [Ga] [dip swons] genrec 1 swons 2 swons
-                                                     1 [P] [pop []] [Ga] . [dip swons] genrec 1 swons 2 swons
-                                         1 [P] [pop []] [Ga] [dip swons] . genrec 1 swons 2 swons
-    1 [P] [pop []] [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] . ifte 1 swons 2 swons
-1 [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] [pop []] [1] [P] . infra first choice i 1 swons 2 swons
-                                                                       1 . P [[pop []] [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] 1] swaack first choice i 1 swons 2 swons
-                                                                       1 . 1 <= [[pop []] [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] 1] swaack first choice i 1 swons 2 swons
-                                                                     1 1 . <= [[pop []] [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] 1] swaack first choice i 1 swons 2 swons
-                                                                    True . [[pop []] [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] 1] swaack first choice i 1 swons 2 swons
- True [[pop []] [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] 1] . swaack first choice i 1 swons 2 swons
- 1 [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] [pop []] [True] . first choice i 1 swons 2 swons
-   1 [Ga [[P] [pop []] [Ga] [dip swons] genrec] dip swons] [pop []] True . choice i 1 swons 2 swons
-                                                              1 [pop []] . i 1 swons 2 swons
-                                                                       1 . pop [] 1 swons 2 swons
-                                                                         . [] 1 swons 2 swons
-                                                                      [] . 1 swons 2 swons
-                                                                    [] 1 . swons 2 swons
-                                                                    [] 1 . swap cons 2 swons
-                                                                    1 [] . cons 2 swons
-                                                                     [1] . 2 swons
-                                                                   [1] 2 . swons
-                                                                   [1] 2 . swap cons
-                                                                   2 [1] . cons
-                                                                   [2 1] .
-
-
-
V('[2 1] [[] =] [pop c ] [uncons swap] [dip F] genrec')
-
-
-
                                                                                               . [2 1] [[] =] [pop c] [uncons swap] [dip F] genrec
-                                                                                         [2 1] . [[] =] [pop c] [uncons swap] [dip F] genrec
-                                                                                  [2 1] [[] =] . [pop c] [uncons swap] [dip F] genrec
-                                                                          [2 1] [[] =] [pop c] . [uncons swap] [dip F] genrec
-                                                            [2 1] [[] =] [pop c] [uncons swap] . [dip F] genrec
-                                                    [2 1] [[] =] [pop c] [uncons swap] [dip F] . genrec
-        [2 1] [[] =] [pop c] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] . ifte
-[2 1] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] [pop c] [[2 1]] [[] =] . infra first choice i
-                                                                                         [2 1] . [] = [[pop c] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] [2 1]] swaack first choice i
-                                                                                      [2 1] [] . = [[pop c] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] [2 1]] swaack first choice i
-                                                                                         False . [[pop c] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] [2 1]] swaack first choice i
-       False [[pop c] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] [2 1]] . swaack first choice i
-       [2 1] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] [pop c] [False] . first choice i
-         [2 1] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] [pop c] False . choice i
-                       [2 1] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] . i
-                                                                                         [2 1] . uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F
-                                                                                         2 [1] . swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F
-                                                                                         [1] 2 . [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F
-                                           [1] 2 [[[] =] [pop c] [uncons swap] [dip F] genrec] . dip F
-                                                                                           [1] . [[] =] [pop c] [uncons swap] [dip F] genrec 2 F
-                                                                                    [1] [[] =] . [pop c] [uncons swap] [dip F] genrec 2 F
-                                                                            [1] [[] =] [pop c] . [uncons swap] [dip F] genrec 2 F
-                                                              [1] [[] =] [pop c] [uncons swap] . [dip F] genrec 2 F
-                                                      [1] [[] =] [pop c] [uncons swap] [dip F] . genrec 2 F
-          [1] [[] =] [pop c] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] . ifte 2 F
-    [1] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] [pop c] [[1]] [[] =] . infra first choice i 2 F
-                                                                                           [1] . [] = [[pop c] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] [1]] swaack first choice i 2 F
-                                                                                        [1] [] . = [[pop c] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] [1]] swaack first choice i 2 F
-                                                                                         False . [[pop c] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] [1]] swaack first choice i 2 F
-         False [[pop c] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] [1]] . swaack first choice i 2 F
-         [1] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] [pop c] [False] . first choice i 2 F
-           [1] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] [pop c] False . choice i 2 F
-                         [1] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] . i 2 F
-                                                                                           [1] . uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F 2 F
-                                                                                          1 [] . swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F 2 F
-                                                                                          [] 1 . [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F 2 F
-                                            [] 1 [[[] =] [pop c] [uncons swap] [dip F] genrec] . dip F 2 F
-                                                                                            [] . [[] =] [pop c] [uncons swap] [dip F] genrec 1 F 2 F
-                                                                                     [] [[] =] . [pop c] [uncons swap] [dip F] genrec 1 F 2 F
-                                                                             [] [[] =] [pop c] . [uncons swap] [dip F] genrec 1 F 2 F
-                                                               [] [[] =] [pop c] [uncons swap] . [dip F] genrec 1 F 2 F
-                                                       [] [[] =] [pop c] [uncons swap] [dip F] . genrec 1 F 2 F
-           [] [[] =] [pop c] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] . ifte 1 F 2 F
-      [] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] [pop c] [[]] [[] =] . infra first choice i 1 F 2 F
-                                                                                            [] . [] = [[pop c] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] []] swaack first choice i 1 F 2 F
-                                                                                         [] [] . = [[pop c] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] []] swaack first choice i 1 F 2 F
-                                                                                          True . [[pop c] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] []] swaack first choice i 1 F 2 F
-           True [[pop c] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] []] . swaack first choice i 1 F 2 F
-           [] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] [pop c] [True] . first choice i 1 F 2 F
-             [] [uncons swap [[[] =] [pop c] [uncons swap] [dip F] genrec] dip F] [pop c] True . choice i 1 F 2 F
-                                                                                    [] [pop c] . i 1 F 2 F
-                                                                                            [] . pop c 1 F 2 F
-                                                                                               . c 1 F 2 F
-                                                                                               . 0 1 F 2 F
-                                                                                             0 . 1 F 2 F
-                                                                                           0 1 . F 2 F
-                                                                                           0 1 . + 2 F
-                                                                                             1 . 2 F
-                                                                                           1 2 . F
-                                                                                           1 2 . +
-                                                                                             3 .
-
-
-
-

Appendix - Fun with Symbols

-
|[ (c, F), (G, P) ]| == (|c, F|) • [(G, P)]
-
-
-

“Bananas, Lenses, & Barbed -Wire”

-
(|...|)  [(...)]  [<...>]
-
-
-

I think they are having slightly too much fun with the symbols.

-

“Too much is always better than not enough.”

-
-
-
-
-

Tree with node and list of trees.

-
tree = [] | [node [tree*]]
-
-
-
-

treestep

-
tree z [C] [N] treestep
-
-
-   [] z [C] [N] treestep
----------------------------
-      z
-
-
-   [node [tree*]] z [C] [N] treestep
---------------------------------------- w/ K == z [C] [N] treestep
-       node N [tree*] [K] map C
-
-
-
-
-

Derive the recursive form.

-
K == [not] [pop z] [J] ifte
-
-
-       [node [tree*]] J
-------------------------------
-   node N [tree*] [K] map C
-
-
-J == .. [N] .. [K] .. [C] ..
-
-[node [tree*]] uncons [N] dip
-node [[tree*]]        [N] dip
-node N [[tree*]]
-
-node N [[tree*]] i [K] map
-node N  [tree*]    [K] map
-node N  [K.tree*]
-
-J == uncons [N] dip i [K] map [C] i
-
-K == [not] [pop z] [uncons [N] dip i [K] map [C] i] ifte
-K == [not] [pop z] [uncons [N] dip i]   [map [C] i] genrec
-
-
-
-
-

Extract the givens to parameterize the program.

-
[not] [pop z]                   [uncons [N] dip unquote] [map [C] i] genrec
-[not] [z]         [pop] swoncat [uncons [N] dip unquote] [map [C] i] genrec
-[not]  z     unit [pop] swoncat [uncons [N] dip unquote] [map [C] i] genrec
-z [not] swap unit [pop] swoncat [uncons [N] dip unquote] [map [C] i] genrec
-  \............TS0............/
-z TS0 [uncons [N] dip unquote]                      [map [C] i] genrec
-z [uncons [N] dip unquote]                [TS0] dip [map [C] i] genrec
-z [[N] dip unquote]      [uncons] swoncat [TS0] dip [map [C] i] genrec
-z [N] [dip unquote] cons [uncons] swoncat [TS0] dip [map [C] i] genrec
-      \...........TS1.................../
-z [N] TS1 [TS0] dip [map [C] i]                       genrec
-z [N]               [map [C] i]            [TS1 [TS0] dip] dip      genrec
-z [N]               [map  C   ]            [TS1 [TS0] dip] dip      genrec
-z [N]                    [C] [map] swoncat [TS1 [TS0] dip] dip genrec
-z [C] [N] swap               [map] swoncat [TS1 [TS0] dip] dip genrec
-
-
-
     TS0 == [not] swap unit [pop] swoncat
-     TS1 == [dip i] cons [uncons] swoncat
-treestep == swap [map] swoncat [TS1 [TS0] dip] dip genrec
-
-
-
   [] 0 [C] [N] treestep
----------------------------
-      0
-
-
-      [n [tree*]] 0 [sum +] [] treestep
-   --------------------------------------------------
-       n [tree*] [0 [sum +] [] treestep] map sum +
-
-
-
DefinitionWrapper.add_definitions('''
-
-     TS0 == [not] swap unit [pop] swoncat
-     TS1 == [dip i] cons [uncons] swoncat
-treestep == swap [map] swoncat [TS1 [TS0] dip] dip genrec
-
-''', D)
-
-
-
V('[] 0 [sum +] [] treestep')
-
-
-
                                                                                                       . [] 0 [sum +] [] treestep
-                                                                                                    [] . 0 [sum +] [] treestep
-                                                                                                  [] 0 . [sum +] [] treestep
-                                                                                          [] 0 [sum +] . [] treestep
-                                                                                       [] 0 [sum +] [] . treestep
-                                                                                       [] 0 [sum +] [] . swap [map] swoncat [TS1 [TS0] dip] dip genrec
-                                                                                       [] 0 [] [sum +] . [map] swoncat [TS1 [TS0] dip] dip genrec
-                                                                                 [] 0 [] [sum +] [map] . swoncat [TS1 [TS0] dip] dip genrec
-                                                                                 [] 0 [] [sum +] [map] . swap concat [TS1 [TS0] dip] dip genrec
-                                                                                 [] 0 [] [map] [sum +] . concat [TS1 [TS0] dip] dip genrec
-                                                                                   [] 0 [] [map sum +] . [TS1 [TS0] dip] dip genrec
-                                                                   [] 0 [] [map sum +] [TS1 [TS0] dip] . dip genrec
-                                                                                               [] 0 [] . TS1 [TS0] dip [map sum +] genrec
-                                                                                               [] 0 [] . [dip i] cons [uncons] swoncat [TS0] dip [map sum +] genrec
-                                                                                       [] 0 [] [dip i] . cons [uncons] swoncat [TS0] dip [map sum +] genrec
-                                                                                       [] 0 [[] dip i] . [uncons] swoncat [TS0] dip [map sum +] genrec
-                                                                              [] 0 [[] dip i] [uncons] . swoncat [TS0] dip [map sum +] genrec
-                                                                              [] 0 [[] dip i] [uncons] . swap concat [TS0] dip [map sum +] genrec
-                                                                              [] 0 [uncons] [[] dip i] . concat [TS0] dip [map sum +] genrec
-                                                                                [] 0 [uncons [] dip i] . [TS0] dip [map sum +] genrec
-                                                                          [] 0 [uncons [] dip i] [TS0] . dip [map sum +] genrec
-                                                                                                  [] 0 . TS0 [uncons [] dip i] [map sum +] genrec
-                                                                                                  [] 0 . [not] swap unit [pop] swoncat [uncons [] dip i] [map sum +] genrec
-                                                                                            [] 0 [not] . swap unit [pop] swoncat [uncons [] dip i] [map sum +] genrec
-                                                                                            [] [not] 0 . unit [pop] swoncat [uncons [] dip i] [map sum +] genrec
-                                                                                            [] [not] 0 . [] cons [pop] swoncat [uncons [] dip i] [map sum +] genrec
-                                                                                         [] [not] 0 [] . cons [pop] swoncat [uncons [] dip i] [map sum +] genrec
-                                                                                          [] [not] [0] . [pop] swoncat [uncons [] dip i] [map sum +] genrec
-                                                                                    [] [not] [0] [pop] . swoncat [uncons [] dip i] [map sum +] genrec
-                                                                                    [] [not] [0] [pop] . swap concat [uncons [] dip i] [map sum +] genrec
-                                                                                    [] [not] [pop] [0] . concat [uncons [] dip i] [map sum +] genrec
-                                                                                      [] [not] [pop 0] . [uncons [] dip i] [map sum +] genrec
-                                                                    [] [not] [pop 0] [uncons [] dip i] . [map sum +] genrec
-                                                        [] [not] [pop 0] [uncons [] dip i] [map sum +] . genrec
-     [] [not] [pop 0] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] . ifte
-[] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [pop 0] [[]] [not] . infra first choice i
-                                                                                                    [] . not [[pop 0] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] []] swaack first choice i
-                                                                                                  True . [[pop 0] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] []] swaack first choice i
-    True [[pop 0] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] []] . swaack first choice i
-    [] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [pop 0] [True] . first choice i
-      [] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [pop 0] True . choice i
-                                                                                            [] [pop 0] . i
-                                                                                                    [] . pop 0
-                                                                                                       . 0
-                                                                                                     0 .
-
-
-
V('[23 []] 0 [sum +] [] treestep')
-
-
-
                                                                                                                 . [23 []] 0 [sum +] [] treestep
-                                                                                                         [23 []] . 0 [sum +] [] treestep
-                                                                                                       [23 []] 0 . [sum +] [] treestep
-                                                                                               [23 []] 0 [sum +] . [] treestep
-                                                                                            [23 []] 0 [sum +] [] . treestep
-                                                                                            [23 []] 0 [sum +] [] . swap [map] swoncat [TS1 [TS0] dip] dip genrec
-                                                                                            [23 []] 0 [] [sum +] . [map] swoncat [TS1 [TS0] dip] dip genrec
-                                                                                      [23 []] 0 [] [sum +] [map] . swoncat [TS1 [TS0] dip] dip genrec
-                                                                                      [23 []] 0 [] [sum +] [map] . swap concat [TS1 [TS0] dip] dip genrec
-                                                                                      [23 []] 0 [] [map] [sum +] . concat [TS1 [TS0] dip] dip genrec
-                                                                                        [23 []] 0 [] [map sum +] . [TS1 [TS0] dip] dip genrec
-                                                                        [23 []] 0 [] [map sum +] [TS1 [TS0] dip] . dip genrec
-                                                                                                    [23 []] 0 [] . TS1 [TS0] dip [map sum +] genrec
-                                                                                                    [23 []] 0 [] . [dip i] cons [uncons] swoncat [TS0] dip [map sum +] genrec
-                                                                                            [23 []] 0 [] [dip i] . cons [uncons] swoncat [TS0] dip [map sum +] genrec
-                                                                                            [23 []] 0 [[] dip i] . [uncons] swoncat [TS0] dip [map sum +] genrec
-                                                                                   [23 []] 0 [[] dip i] [uncons] . swoncat [TS0] dip [map sum +] genrec
-                                                                                   [23 []] 0 [[] dip i] [uncons] . swap concat [TS0] dip [map sum +] genrec
-                                                                                   [23 []] 0 [uncons] [[] dip i] . concat [TS0] dip [map sum +] genrec
-                                                                                     [23 []] 0 [uncons [] dip i] . [TS0] dip [map sum +] genrec
-                                                                               [23 []] 0 [uncons [] dip i] [TS0] . dip [map sum +] genrec
-                                                                                                       [23 []] 0 . TS0 [uncons [] dip i] [map sum +] genrec
-                                                                                                       [23 []] 0 . [not] swap unit [pop] swoncat [uncons [] dip i] [map sum +] genrec
-                                                                                                 [23 []] 0 [not] . swap unit [pop] swoncat [uncons [] dip i] [map sum +] genrec
-                                                                                                 [23 []] [not] 0 . unit [pop] swoncat [uncons [] dip i] [map sum +] genrec
-                                                                                                 [23 []] [not] 0 . [] cons [pop] swoncat [uncons [] dip i] [map sum +] genrec
-                                                                                              [23 []] [not] 0 [] . cons [pop] swoncat [uncons [] dip i] [map sum +] genrec
-                                                                                               [23 []] [not] [0] . [pop] swoncat [uncons [] dip i] [map sum +] genrec
-                                                                                         [23 []] [not] [0] [pop] . swoncat [uncons [] dip i] [map sum +] genrec
-                                                                                         [23 []] [not] [0] [pop] . swap concat [uncons [] dip i] [map sum +] genrec
-                                                                                         [23 []] [not] [pop] [0] . concat [uncons [] dip i] [map sum +] genrec
-                                                                                           [23 []] [not] [pop 0] . [uncons [] dip i] [map sum +] genrec
-                                                                         [23 []] [not] [pop 0] [uncons [] dip i] . [map sum +] genrec
-                                                             [23 []] [not] [pop 0] [uncons [] dip i] [map sum +] . genrec
-          [23 []] [not] [pop 0] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] . ifte
-[23 []] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [pop 0] [[23 []]] [not] . infra first choice i
-                                                                                                         [23 []] . not [[pop 0] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [23 []]] swaack first choice i
-                                                                                                           False . [[pop 0] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [23 []]] swaack first choice i
-        False [[pop 0] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [23 []]] . swaack first choice i
-        [23 []] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [pop 0] [False] . first choice i
-          [23 []] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [pop 0] False . choice i
-                        [23 []] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] . i
-                                                                                                         [23 []] . uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +
-                                                                                                         23 [[]] . [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +
-                                                                                                      23 [[]] [] . dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +
-                                                                                                              23 . [[]] i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +
-                                                                                                         23 [[]] . i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +
-                                                                                                              23 . [] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +
-                                                                                                           23 [] . [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +
-                                                      23 [] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] . map sum +
-                                                                                                           23 [] . sum +
-                                                                                                           23 [] . 0 [+] catamorphism +
-                                                                                                         23 [] 0 . [+] catamorphism +
-                                                                                                     23 [] 0 [+] . catamorphism +
-                                                                                                     23 [] 0 [+] . [[] =] roll> [uncons swap] swap hylomorphism +
-                                                                                              23 [] 0 [+] [[] =] . roll> [uncons swap] swap hylomorphism +
-                                                                                              23 [] [[] =] 0 [+] . [uncons swap] swap hylomorphism +
-                                                                                23 [] [[] =] 0 [+] [uncons swap] . swap hylomorphism +
-                                                                                23 [] [[] =] 0 [uncons swap] [+] . hylomorphism +
-                                                                                23 [] [[] =] 0 [uncons swap] [+] . [unit [pop] swoncat] dipd [dip] swoncat genrec +
-                                                           23 [] [[] =] 0 [uncons swap] [+] [unit [pop] swoncat] . dipd [dip] swoncat genrec +
-                                                                                                  23 [] [[] =] 0 . unit [pop] swoncat [uncons swap] [+] [dip] swoncat genrec +
-                                                                                                  23 [] [[] =] 0 . [] cons [pop] swoncat [uncons swap] [+] [dip] swoncat genrec +
-                                                                                               23 [] [[] =] 0 [] . cons [pop] swoncat [uncons swap] [+] [dip] swoncat genrec +
-                                                                                                23 [] [[] =] [0] . [pop] swoncat [uncons swap] [+] [dip] swoncat genrec +
-                                                                                          23 [] [[] =] [0] [pop] . swoncat [uncons swap] [+] [dip] swoncat genrec +
-                                                                                          23 [] [[] =] [0] [pop] . swap concat [uncons swap] [+] [dip] swoncat genrec +
-                                                                                          23 [] [[] =] [pop] [0] . concat [uncons swap] [+] [dip] swoncat genrec +
-                                                                                            23 [] [[] =] [pop 0] . [uncons swap] [+] [dip] swoncat genrec +
-                                                                              23 [] [[] =] [pop 0] [uncons swap] . [+] [dip] swoncat genrec +
-                                                                          23 [] [[] =] [pop 0] [uncons swap] [+] . [dip] swoncat genrec +
-                                                                    23 [] [[] =] [pop 0] [uncons swap] [+] [dip] . swoncat genrec +
-                                                                    23 [] [[] =] [pop 0] [uncons swap] [+] [dip] . swap concat genrec +
-                                                                    23 [] [[] =] [pop 0] [uncons swap] [dip] [+] . concat genrec +
-                                                                      23 [] [[] =] [pop 0] [uncons swap] [dip +] . genrec +
-                          23 [] [[] =] [pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . ifte +
-                  23 [] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [[] 23] [[] =] . infra first choice i +
-                                                                                                           23 [] . [] = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [] 23] swaack first choice i +
-                                                                                                        23 [] [] . = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [] 23] swaack first choice i +
-                                                                                                         23 True . [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [] 23] swaack first choice i +
-                       23 True [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [] 23] . swaack first choice i +
-                       23 [] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [True 23] . first choice i +
-                            23 [] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] True . choice i +
-                                                                                                   23 [] [pop 0] . i +
-                                                                                                           23 [] . pop 0 +
-                                                                                                              23 . 0 +
-                                                                                                            23 0 . +
-                                                                                                              23 .
-
-
-
V('[23 [[2 []] [3 []]]] 0 [sum +] [] treestep')
-
-
-
                                                                                                                                                                  . [23 [[2 []] [3 []]]] 0 [sum +] [] treestep
-                                                                                                                                             [23 [[2 []] [3 []]]] . 0 [sum +] [] treestep
-                                                                                                                                           [23 [[2 []] [3 []]]] 0 . [sum +] [] treestep
-                                                                                                                                   [23 [[2 []] [3 []]]] 0 [sum +] . [] treestep
-                                                                                                                                [23 [[2 []] [3 []]]] 0 [sum +] [] . treestep
-                                                                                                                                [23 [[2 []] [3 []]]] 0 [sum +] [] . swap [map] swoncat [TS1 [TS0] dip] dip genrec
-                                                                                                                                [23 [[2 []] [3 []]]] 0 [] [sum +] . [map] swoncat [TS1 [TS0] dip] dip genrec
-                                                                                                                          [23 [[2 []] [3 []]]] 0 [] [sum +] [map] . swoncat [TS1 [TS0] dip] dip genrec
-                                                                                                                          [23 [[2 []] [3 []]]] 0 [] [sum +] [map] . swap concat [TS1 [TS0] dip] dip genrec
-                                                                                                                          [23 [[2 []] [3 []]]] 0 [] [map] [sum +] . concat [TS1 [TS0] dip] dip genrec
-                                                                                                                            [23 [[2 []] [3 []]]] 0 [] [map sum +] . [TS1 [TS0] dip] dip genrec
-                                                                                                            [23 [[2 []] [3 []]]] 0 [] [map sum +] [TS1 [TS0] dip] . dip genrec
-                                                                                                                                        [23 [[2 []] [3 []]]] 0 [] . TS1 [TS0] dip [map sum +] genrec
-                                                                                                                                        [23 [[2 []] [3 []]]] 0 [] . [dip i] cons [uncons] swoncat [TS0] dip [map sum +] genrec
-                                                                                                                                [23 [[2 []] [3 []]]] 0 [] [dip i] . cons [uncons] swoncat [TS0] dip [map sum +] genrec
-                                                                                                                                [23 [[2 []] [3 []]]] 0 [[] dip i] . [uncons] swoncat [TS0] dip [map sum +] genrec
-                                                                                                                       [23 [[2 []] [3 []]]] 0 [[] dip i] [uncons] . swoncat [TS0] dip [map sum +] genrec
-                                                                                                                       [23 [[2 []] [3 []]]] 0 [[] dip i] [uncons] . swap concat [TS0] dip [map sum +] genrec
-                                                                                                                       [23 [[2 []] [3 []]]] 0 [uncons] [[] dip i] . concat [TS0] dip [map sum +] genrec
-                                                                                                                         [23 [[2 []] [3 []]]] 0 [uncons [] dip i] . [TS0] dip [map sum +] genrec
-                                                                                                                   [23 [[2 []] [3 []]]] 0 [uncons [] dip i] [TS0] . dip [map sum +] genrec
-                                                                                                                                           [23 [[2 []] [3 []]]] 0 . TS0 [uncons [] dip i] [map sum +] genrec
-                                                                                                                                           [23 [[2 []] [3 []]]] 0 . [not] swap unit [pop] swoncat [uncons [] dip i] [map sum +] genrec
-                                                                                                                                     [23 [[2 []] [3 []]]] 0 [not] . swap unit [pop] swoncat [uncons [] dip i] [map sum +] genrec
-                                                                                                                                     [23 [[2 []] [3 []]]] [not] 0 . unit [pop] swoncat [uncons [] dip i] [map sum +] genrec
-                                                                                                                                     [23 [[2 []] [3 []]]] [not] 0 . [] cons [pop] swoncat [uncons [] dip i] [map sum +] genrec
-                                                                                                                                  [23 [[2 []] [3 []]]] [not] 0 [] . cons [pop] swoncat [uncons [] dip i] [map sum +] genrec
-                                                                                                                                   [23 [[2 []] [3 []]]] [not] [0] . [pop] swoncat [uncons [] dip i] [map sum +] genrec
-                                                                                                                             [23 [[2 []] [3 []]]] [not] [0] [pop] . swoncat [uncons [] dip i] [map sum +] genrec
-                                                                                                                             [23 [[2 []] [3 []]]] [not] [0] [pop] . swap concat [uncons [] dip i] [map sum +] genrec
-                                                                                                                             [23 [[2 []] [3 []]]] [not] [pop] [0] . concat [uncons [] dip i] [map sum +] genrec
-                                                                                                                               [23 [[2 []] [3 []]]] [not] [pop 0] . [uncons [] dip i] [map sum +] genrec
-                                                                                                             [23 [[2 []] [3 []]]] [not] [pop 0] [uncons [] dip i] . [map sum +] genrec
-                                                                                                 [23 [[2 []] [3 []]]] [not] [pop 0] [uncons [] dip i] [map sum +] . genrec
-                                              [23 [[2 []] [3 []]]] [not] [pop 0] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] . ifte
-                       [23 [[2 []] [3 []]]] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [pop 0] [[23 [[2 []] [3 []]]]] [not] . infra first choice i
-                                                                                                                                             [23 [[2 []] [3 []]]] . not [[pop 0] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [23 [[2 []] [3 []]]]] swaack first choice i
-                                                                                                                                                            False . [[pop 0] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [23 [[2 []] [3 []]]]] swaack first choice i
-                                            False [[pop 0] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [23 [[2 []] [3 []]]]] . swaack first choice i
-                                            [23 [[2 []] [3 []]]] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [pop 0] [False] . first choice i
-                                              [23 [[2 []] [3 []]]] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [pop 0] False . choice i
-                                                            [23 [[2 []] [3 []]]] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] . i
-                                                                                                                                             [23 [[2 []] [3 []]]] . uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +
-                                                                                                                                             23 [[[2 []] [3 []]]] . [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +
-                                                                                                                                          23 [[[2 []] [3 []]]] [] . dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +
-                                                                                                                                                               23 . [[[2 []] [3 []]]] i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +
-                                                                                                                                             23 [[[2 []] [3 []]]] . i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +
-                                                                                                                                                               23 . [[2 []] [3 []]] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +
-                                                                                                                                               23 [[2 []] [3 []]] . [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +
-                                                                                          23 [[2 []] [3 []]] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] . map sum +
-23 [] [[[3 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first] . infra sum +
-                                                                                                                                                                  . [[3 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                      [[3 []] 23] . [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                 [[3 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] . infra first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                        23 [3 []] . [not] [pop 0] [uncons [] dip i] [map sum +] genrec [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                  23 [3 []] [not] . [pop 0] [uncons [] dip i] [map sum +] genrec [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                          23 [3 []] [not] [pop 0] . [uncons [] dip i] [map sum +] genrec [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                        23 [3 []] [not] [pop 0] [uncons [] dip i] . [map sum +] genrec [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                            23 [3 []] [not] [pop 0] [uncons [] dip i] [map sum +] . genrec [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                         23 [3 []] [not] [pop 0] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] . ifte [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                             23 [3 []] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [pop 0] [[3 []] 23] [not] . infra first choice i [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                        23 [3 []] . not [[pop 0] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [3 []] 23] swaack first choice i [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                         23 False . [[pop 0] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [3 []] 23] swaack first choice i [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                    23 False [[pop 0] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [3 []] 23] . swaack first choice i [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                    23 [3 []] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [pop 0] [False 23] . first choice i [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                         23 [3 []] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [pop 0] False . choice i [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                       23 [3 []] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] . i [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                        23 [3 []] . uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                        23 3 [[]] . [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                     23 3 [[]] [] . dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                             23 3 . [[]] i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                        23 3 [[]] . i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                             23 3 . [] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                          23 3 [] . [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                     23 3 [] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] . map sum + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                          23 3 [] . sum + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                          23 3 [] . 0 [+] catamorphism + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                        23 3 [] 0 . [+] catamorphism + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                    23 3 [] 0 [+] . catamorphism + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                    23 3 [] 0 [+] . [[] =] roll> [uncons swap] swap hylomorphism + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                             23 3 [] 0 [+] [[] =] . roll> [uncons swap] swap hylomorphism + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                             23 3 [] [[] =] 0 [+] . [uncons swap] swap hylomorphism + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                               23 3 [] [[] =] 0 [+] [uncons swap] . swap hylomorphism + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                               23 3 [] [[] =] 0 [uncons swap] [+] . hylomorphism + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                               23 3 [] [[] =] 0 [uncons swap] [+] . [unit [pop] swoncat] dipd [dip] swoncat genrec + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                          23 3 [] [[] =] 0 [uncons swap] [+] [unit [pop] swoncat] . dipd [dip] swoncat genrec + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                 23 3 [] [[] =] 0 . unit [pop] swoncat [uncons swap] [+] [dip] swoncat genrec + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                 23 3 [] [[] =] 0 . [] cons [pop] swoncat [uncons swap] [+] [dip] swoncat genrec + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                              23 3 [] [[] =] 0 [] . cons [pop] swoncat [uncons swap] [+] [dip] swoncat genrec + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                               23 3 [] [[] =] [0] . [pop] swoncat [uncons swap] [+] [dip] swoncat genrec + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                         23 3 [] [[] =] [0] [pop] . swoncat [uncons swap] [+] [dip] swoncat genrec + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                         23 3 [] [[] =] [0] [pop] . swap concat [uncons swap] [+] [dip] swoncat genrec + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                         23 3 [] [[] =] [pop] [0] . concat [uncons swap] [+] [dip] swoncat genrec + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                           23 3 [] [[] =] [pop 0] . [uncons swap] [+] [dip] swoncat genrec + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                             23 3 [] [[] =] [pop 0] [uncons swap] . [+] [dip] swoncat genrec + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                         23 3 [] [[] =] [pop 0] [uncons swap] [+] . [dip] swoncat genrec + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                   23 3 [] [[] =] [pop 0] [uncons swap] [+] [dip] . swoncat genrec + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                   23 3 [] [[] =] [pop 0] [uncons swap] [+] [dip] . swap concat genrec + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                   23 3 [] [[] =] [pop 0] [uncons swap] [dip] [+] . concat genrec + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                     23 3 [] [[] =] [pop 0] [uncons swap] [dip +] . genrec + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                         23 3 [] [[] =] [pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . ifte + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                               23 3 [] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [[] 3 23] [[] =] . infra first choice i + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                          23 3 [] . [] = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [] 3 23] swaack first choice i + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                       23 3 [] [] . = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [] 3 23] swaack first choice i + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                        23 3 True . [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [] 3 23] swaack first choice i + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                    23 3 True [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [] 3 23] . swaack first choice i + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                    23 3 [] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [True 3 23] . first choice i + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                           23 3 [] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] True . choice i + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                  23 3 [] [pop 0] . i + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                          23 3 [] . pop 0 + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                             23 3 . 0 + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                           23 3 0 . + [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                             23 3 . [] swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                          23 3 [] . swaack first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                           [3 23] . first [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                                3 . [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                                                                                    3 [[2 []] 23] . [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] infra first [23] swaack sum +
-                                                                                               3 [[2 []] 23] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] . infra first [23] swaack sum +
-                                                                                                                                                        23 [2 []] . [not] [pop 0] [uncons [] dip i] [map sum +] genrec [3] swaack first [23] swaack sum +
-                                                                                                                                                  23 [2 []] [not] . [pop 0] [uncons [] dip i] [map sum +] genrec [3] swaack first [23] swaack sum +
-                                                                                                                                          23 [2 []] [not] [pop 0] . [uncons [] dip i] [map sum +] genrec [3] swaack first [23] swaack sum +
-                                                                                                                        23 [2 []] [not] [pop 0] [uncons [] dip i] . [map sum +] genrec [3] swaack first [23] swaack sum +
-                                                                                                            23 [2 []] [not] [pop 0] [uncons [] dip i] [map sum +] . genrec [3] swaack first [23] swaack sum +
-                                                         23 [2 []] [not] [pop 0] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] . ifte [3] swaack first [23] swaack sum +
-                                             23 [2 []] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [pop 0] [[2 []] 23] [not] . infra first choice i [3] swaack first [23] swaack sum +
-                                                                                                                                                        23 [2 []] . not [[pop 0] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [2 []] 23] swaack first choice i [3] swaack first [23] swaack sum +
-                                                                                                                                                         23 False . [[pop 0] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [2 []] 23] swaack first choice i [3] swaack first [23] swaack sum +
-                                                    23 False [[pop 0] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [2 []] 23] . swaack first choice i [3] swaack first [23] swaack sum +
-                                                    23 [2 []] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [pop 0] [False 23] . first choice i [3] swaack first [23] swaack sum +
-                                                         23 [2 []] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] [pop 0] False . choice i [3] swaack first [23] swaack sum +
-                                                                       23 [2 []] [uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum +] . i [3] swaack first [23] swaack sum +
-                                                                                                                                                        23 [2 []] . uncons [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum + [3] swaack first [23] swaack sum +
-                                                                                                                                                        23 2 [[]] . [] dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum + [3] swaack first [23] swaack sum +
-                                                                                                                                                     23 2 [[]] [] . dip i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum + [3] swaack first [23] swaack sum +
-                                                                                                                                                             23 2 . [[]] i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum + [3] swaack first [23] swaack sum +
-                                                                                                                                                        23 2 [[]] . i [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum + [3] swaack first [23] swaack sum +
-                                                                                                                                                             23 2 . [] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum + [3] swaack first [23] swaack sum +
-                                                                                                                                                          23 2 [] . [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] map sum + [3] swaack first [23] swaack sum +
-                                                                                                     23 2 [] [[not] [pop 0] [uncons [] dip i] [map sum +] genrec] . map sum + [3] swaack first [23] swaack sum +
-                                                                                                                                                          23 2 [] . sum + [3] swaack first [23] swaack sum +
-                                                                                                                                                          23 2 [] . 0 [+] catamorphism + [3] swaack first [23] swaack sum +
-                                                                                                                                                        23 2 [] 0 . [+] catamorphism + [3] swaack first [23] swaack sum +
-                                                                                                                                                    23 2 [] 0 [+] . catamorphism + [3] swaack first [23] swaack sum +
-                                                                                                                                                    23 2 [] 0 [+] . [[] =] roll> [uncons swap] swap hylomorphism + [3] swaack first [23] swaack sum +
-                                                                                                                                             23 2 [] 0 [+] [[] =] . roll> [uncons swap] swap hylomorphism + [3] swaack first [23] swaack sum +
-                                                                                                                                             23 2 [] [[] =] 0 [+] . [uncons swap] swap hylomorphism + [3] swaack first [23] swaack sum +
-                                                                                                                               23 2 [] [[] =] 0 [+] [uncons swap] . swap hylomorphism + [3] swaack first [23] swaack sum +
-                                                                                                                               23 2 [] [[] =] 0 [uncons swap] [+] . hylomorphism + [3] swaack first [23] swaack sum +
-                                                                                                                               23 2 [] [[] =] 0 [uncons swap] [+] . [unit [pop] swoncat] dipd [dip] swoncat genrec + [3] swaack first [23] swaack sum +
-                                                                                                          23 2 [] [[] =] 0 [uncons swap] [+] [unit [pop] swoncat] . dipd [dip] swoncat genrec + [3] swaack first [23] swaack sum +
-                                                                                                                                                 23 2 [] [[] =] 0 . unit [pop] swoncat [uncons swap] [+] [dip] swoncat genrec + [3] swaack first [23] swaack sum +
-                                                                                                                                                 23 2 [] [[] =] 0 . [] cons [pop] swoncat [uncons swap] [+] [dip] swoncat genrec + [3] swaack first [23] swaack sum +
-                                                                                                                                              23 2 [] [[] =] 0 [] . cons [pop] swoncat [uncons swap] [+] [dip] swoncat genrec + [3] swaack first [23] swaack sum +
-                                                                                                                                               23 2 [] [[] =] [0] . [pop] swoncat [uncons swap] [+] [dip] swoncat genrec + [3] swaack first [23] swaack sum +
-                                                                                                                                         23 2 [] [[] =] [0] [pop] . swoncat [uncons swap] [+] [dip] swoncat genrec + [3] swaack first [23] swaack sum +
-                                                                                                                                         23 2 [] [[] =] [0] [pop] . swap concat [uncons swap] [+] [dip] swoncat genrec + [3] swaack first [23] swaack sum +
-                                                                                                                                         23 2 [] [[] =] [pop] [0] . concat [uncons swap] [+] [dip] swoncat genrec + [3] swaack first [23] swaack sum +
-                                                                                                                                           23 2 [] [[] =] [pop 0] . [uncons swap] [+] [dip] swoncat genrec + [3] swaack first [23] swaack sum +
-                                                                                                                             23 2 [] [[] =] [pop 0] [uncons swap] . [+] [dip] swoncat genrec + [3] swaack first [23] swaack sum +
-                                                                                                                         23 2 [] [[] =] [pop 0] [uncons swap] [+] . [dip] swoncat genrec + [3] swaack first [23] swaack sum +
-                                                                                                                   23 2 [] [[] =] [pop 0] [uncons swap] [+] [dip] . swoncat genrec + [3] swaack first [23] swaack sum +
-                                                                                                                   23 2 [] [[] =] [pop 0] [uncons swap] [+] [dip] . swap concat genrec + [3] swaack first [23] swaack sum +
-                                                                                                                   23 2 [] [[] =] [pop 0] [uncons swap] [dip] [+] . concat genrec + [3] swaack first [23] swaack sum +
-                                                                                                                     23 2 [] [[] =] [pop 0] [uncons swap] [dip +] . genrec + [3] swaack first [23] swaack sum +
-                                                                         23 2 [] [[] =] [pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . ifte + [3] swaack first [23] swaack sum +
-                                                               23 2 [] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [[] 2 23] [[] =] . infra first choice i + [3] swaack first [23] swaack sum +
-                                                                                                                                                          23 2 [] . [] = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [] 2 23] swaack first choice i + [3] swaack first [23] swaack sum +
-                                                                                                                                                       23 2 [] [] . = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [] 2 23] swaack first choice i + [3] swaack first [23] swaack sum +
-                                                                                                                                                        23 2 True . [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [] 2 23] swaack first choice i + [3] swaack first [23] swaack sum +
-                                                                    23 2 True [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [] 2 23] . swaack first choice i + [3] swaack first [23] swaack sum +
-                                                                    23 2 [] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [True 2 23] . first choice i + [3] swaack first [23] swaack sum +
-                                                                           23 2 [] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] True . choice i + [3] swaack first [23] swaack sum +
-                                                                                                                                                  23 2 [] [pop 0] . i + [3] swaack first [23] swaack sum +
-                                                                                                                                                          23 2 [] . pop 0 + [3] swaack first [23] swaack sum +
-                                                                                                                                                             23 2 . 0 + [3] swaack first [23] swaack sum +
-                                                                                                                                                           23 2 0 . + [3] swaack first [23] swaack sum +
-                                                                                                                                                             23 2 . [3] swaack first [23] swaack sum +
-                                                                                                                                                         23 2 [3] . swaack first [23] swaack sum +
-                                                                                                                                                         3 [2 23] . first [23] swaack sum +
-                                                                                                                                                              3 2 . [23] swaack sum +
-                                                                                                                                                         3 2 [23] . swaack sum +
-                                                                                                                                                         23 [2 3] . sum +
-                                                                                                                                                         23 [2 3] . 0 [+] catamorphism +
-                                                                                                                                                       23 [2 3] 0 . [+] catamorphism +
-                                                                                                                                                   23 [2 3] 0 [+] . catamorphism +
-                                                                                                                                                   23 [2 3] 0 [+] . [[] =] roll> [uncons swap] swap hylomorphism +
-                                                                                                                                            23 [2 3] 0 [+] [[] =] . roll> [uncons swap] swap hylomorphism +
-                                                                                                                                            23 [2 3] [[] =] 0 [+] . [uncons swap] swap hylomorphism +
-                                                                                                                              23 [2 3] [[] =] 0 [+] [uncons swap] . swap hylomorphism +
-                                                                                                                              23 [2 3] [[] =] 0 [uncons swap] [+] . hylomorphism +
-                                                                                                                              23 [2 3] [[] =] 0 [uncons swap] [+] . [unit [pop] swoncat] dipd [dip] swoncat genrec +
-                                                                                                         23 [2 3] [[] =] 0 [uncons swap] [+] [unit [pop] swoncat] . dipd [dip] swoncat genrec +
-                                                                                                                                                23 [2 3] [[] =] 0 . unit [pop] swoncat [uncons swap] [+] [dip] swoncat genrec +
-                                                                                                                                                23 [2 3] [[] =] 0 . [] cons [pop] swoncat [uncons swap] [+] [dip] swoncat genrec +
-                                                                                                                                             23 [2 3] [[] =] 0 [] . cons [pop] swoncat [uncons swap] [+] [dip] swoncat genrec +
-                                                                                                                                              23 [2 3] [[] =] [0] . [pop] swoncat [uncons swap] [+] [dip] swoncat genrec +
-                                                                                                                                        23 [2 3] [[] =] [0] [pop] . swoncat [uncons swap] [+] [dip] swoncat genrec +
-                                                                                                                                        23 [2 3] [[] =] [0] [pop] . swap concat [uncons swap] [+] [dip] swoncat genrec +
-                                                                                                                                        23 [2 3] [[] =] [pop] [0] . concat [uncons swap] [+] [dip] swoncat genrec +
-                                                                                                                                          23 [2 3] [[] =] [pop 0] . [uncons swap] [+] [dip] swoncat genrec +
-                                                                                                                            23 [2 3] [[] =] [pop 0] [uncons swap] . [+] [dip] swoncat genrec +
-                                                                                                                        23 [2 3] [[] =] [pop 0] [uncons swap] [+] . [dip] swoncat genrec +
-                                                                                                                  23 [2 3] [[] =] [pop 0] [uncons swap] [+] [dip] . swoncat genrec +
-                                                                                                                  23 [2 3] [[] =] [pop 0] [uncons swap] [+] [dip] . swap concat genrec +
-                                                                                                                  23 [2 3] [[] =] [pop 0] [uncons swap] [dip] [+] . concat genrec +
-                                                                                                                    23 [2 3] [[] =] [pop 0] [uncons swap] [dip +] . genrec +
-                                                                        23 [2 3] [[] =] [pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . ifte +
-                                                             23 [2 3] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [[2 3] 23] [[] =] . infra first choice i +
-                                                                                                                                                         23 [2 3] . [] = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [2 3] 23] swaack first choice i +
-                                                                                                                                                      23 [2 3] [] . = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [2 3] 23] swaack first choice i +
-                                                                                                                                                         23 False . [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [2 3] 23] swaack first choice i +
-                                                                    23 False [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [2 3] 23] . swaack first choice i +
-                                                                    23 [2 3] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [False 23] . first choice i +
-                                                                         23 [2 3] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] False . choice i +
-                                                                                       23 [2 3] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . i +
-                                                                                                                                                         23 [2 3] . uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + +
-                                                                                                                                                         23 2 [3] . swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + +
-                                                                                                                                                         23 [3] 2 . [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + +
-                                                                                                           23 [3] 2 [[[] =] [pop 0] [uncons swap] [dip +] genrec] . dip + +
-                                                                                                                                                           23 [3] . [[] =] [pop 0] [uncons swap] [dip +] genrec 2 + +
-                                                                                                                                                    23 [3] [[] =] . [pop 0] [uncons swap] [dip +] genrec 2 + +
-                                                                                                                                            23 [3] [[] =] [pop 0] . [uncons swap] [dip +] genrec 2 + +
-                                                                                                                              23 [3] [[] =] [pop 0] [uncons swap] . [dip +] genrec 2 + +
-                                                                                                                      23 [3] [[] =] [pop 0] [uncons swap] [dip +] . genrec 2 + +
-                                                                          23 [3] [[] =] [pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . ifte 2 + +
-                                                                 23 [3] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [[3] 23] [[] =] . infra first choice i 2 + +
-                                                                                                                                                           23 [3] . [] = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [3] 23] swaack first choice i 2 + +
-                                                                                                                                                        23 [3] [] . = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [3] 23] swaack first choice i 2 + +
-                                                                                                                                                         23 False . [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [3] 23] swaack first choice i 2 + +
-                                                                      23 False [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [3] 23] . swaack first choice i 2 + +
-                                                                      23 [3] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [False 23] . first choice i 2 + +
-                                                                           23 [3] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] False . choice i 2 + +
-                                                                                         23 [3] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . i 2 + +
-                                                                                                                                                           23 [3] . uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 2 + +
-                                                                                                                                                          23 3 [] . swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 2 + +
-                                                                                                                                                          23 [] 3 . [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip + 2 + +
-                                                                                                            23 [] 3 [[[] =] [pop 0] [uncons swap] [dip +] genrec] . dip + 2 + +
-                                                                                                                                                            23 [] . [[] =] [pop 0] [uncons swap] [dip +] genrec 3 + 2 + +
-                                                                                                                                                     23 [] [[] =] . [pop 0] [uncons swap] [dip +] genrec 3 + 2 + +
-                                                                                                                                             23 [] [[] =] [pop 0] . [uncons swap] [dip +] genrec 3 + 2 + +
-                                                                                                                               23 [] [[] =] [pop 0] [uncons swap] . [dip +] genrec 3 + 2 + +
-                                                                                                                       23 [] [[] =] [pop 0] [uncons swap] [dip +] . genrec 3 + 2 + +
-                                                                           23 [] [[] =] [pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] . ifte 3 + 2 + +
-                                                                   23 [] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [[] 23] [[] =] . infra first choice i 3 + 2 + +
-                                                                                                                                                            23 [] . [] = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [] 23] swaack first choice i 3 + 2 + +
-                                                                                                                                                         23 [] [] . = [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [] 23] swaack first choice i 3 + 2 + +
-                                                                                                                                                          23 True . [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [] 23] swaack first choice i 3 + 2 + +
-                                                                        23 True [[pop 0] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [] 23] . swaack first choice i 3 + 2 + +
-                                                                        23 [] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] [True 23] . first choice i 3 + 2 + +
-                                                                             23 [] [uncons swap [[[] =] [pop 0] [uncons swap] [dip +] genrec] dip +] [pop 0] True . choice i 3 + 2 + +
-                                                                                                                                                    23 [] [pop 0] . i 3 + 2 + +
-                                                                                                                                                            23 [] . pop 0 3 + 2 + +
-                                                                                                                                                               23 . 0 3 + 2 + +
-                                                                                                                                                             23 0 . 3 + 2 + +
-                                                                                                                                                           23 0 3 . + 2 + +
-                                                                                                                                                             23 3 . 2 + +
-                                                                                                                                                           23 3 2 . + +
-                                                                                                                                                             23 5 . +
-                                                                                                                                                               28 .
-
-
-
J('[23 [[2 [[23 [[2 []] [3 []]]][23 [[2 []] [3 []]]]]] [3 [[23 [[2 []] [3 []]]][23 [[2 []] [3 []]]]]]]] 0 [sum +] [] treestep')
-
-
-
140
-
-
-
J('[] [] [unit cons] [23 +] treestep')
-
-
-
[]
-
-
-
J('[23 []] [] [unit cons] [23 +] treestep')
-
-
-
[46 []]
-
-
-
J('[23 [[2 []] [3 []]]] [] [unit cons] [23 +] treestep')
-
-
-
[46 [[25 []] [26 []]]]
-
-
-
define('treemap == [] [unit cons] roll< treestep')
-
-
-
J('[23 [[2 []] [3 []]]] [23 +] treemap')
-
-
-
[46 [[25 []] [26 []]]]
-
-
-
-
- - -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/sphinx_docs/_build/html/notebooks/Trees.html b/docs/sphinx_docs/_build/html/notebooks/Trees.html deleted file mode 100644 index c56bb80..0000000 --- a/docs/sphinx_docs/_build/html/notebooks/Trees.html +++ /dev/null @@ -1,1614 +0,0 @@ - - - - - - - - Treating Trees — Thun 0.2.0 documentation - - - - - - - - - - - - - - - - - - - - -
-
-
-
- -
-

Treating Trees

-

Although any expression in Joy can be considered to describe a -tree with the quotes -as compound nodes and the non-quote values as leaf nodes, in this page I -want to talk about ordered binary -trees and how to -make and use them.

-

The basic structure, in a crude type -notation, is:

-
BTree :: [] | [key value BTree BTree]
-
-
-

That says that a BTree is either the empty quote [] or a quote with -four items: a key, a value, and two BTrees representing the left and -right branches of the tree.

-
-

A Function to Traverse a BTree

-

Let’s take a crack at writing a function that can recursively iterate or -traverse these trees.

-
-

Base case []

-

The stopping predicate just has to detect the empty list:

-
BTree-iter == [not] [E] [R0] [R1] genrec
-
-
-

And since there’s nothing at this node, we just pop it:

-
BTree-iter == [not] [pop] [R0] [R1] genrec
-
-
-
-
-

Node case [key value left right]

-

Now we need to figure out R0 and R1:

-
BTree-iter == [not] [pop] [R0]            [R1] genrec
-           == [not] [pop] [R0 [BTree-iter] R1] ifte
-
-
-

Let’s look at it in situ:

-
[key value left right] R0 [BTree-iter] R1
-
-
-
-
-

Processing the current node.

-

R0 is almost certainly going to use dup to make a copy of the -node and then dip on some function to process the copy with it:

-
[key value left right] [F] dupdip                 [BTree-iter] R1
-[key value left right]  F  [key value left right] [BTree-iter] R1
-
-
-

For example, if we’re getting all the keys F would be first:

-
R0 == [first] dupdip
-
-[key value left right] [first] dupdip                 [BTree-iter] R1
-[key value left right]  first  [key value left right] [BTree-iter] R1
-key                            [key value left right] [BTree-iter] R1
-
-
-
-
-

Recur

-

Now R1 needs to apply [BTree-iter] to left and right. If -we drop the key and value from the node using rest twice we are left -with an interesting situation:

-
key [key value left right] [BTree-iter] R1
-key [key value left right] [BTree-iter] [rest rest] dip
-key [key value left right] rest rest [BTree-iter]
-key [left right] [BTree-iter]
-
-
-

Hmm, will step do?

-
key [left right] [BTree-iter] step
-key left BTree-iter [right] [BTree-iter] step
-key left-keys [right] [BTree-iter] step
-key left-keys right BTree-iter
-key left-keys right-keys
-
-
-

So:

-
R1 == [rest rest] dip step
-
-
-
-
-

Putting it together

-

We have:

-
BTree-iter == [not] [pop] [[F] dupdip] [[rest rest] dip step] genrec
-
-
-

When I was reading this over I realized rest rest could go in -R0:

-
BTree-iter == [not] [pop] [[F] dupdip rest rest] [step] genrec
-
-
-

(And [step] genrec is such a cool and suggestive combinator!)

-
-
-

Parameterizing the F per-node processing function.

-
[F] BTree-iter == [not] [pop] [[F] dupdip rest rest] [step] genrec
-
-
-

Working backward:

-
[not] [pop] [[F] dupdip rest rest]            [step] genrec
-[not] [pop] [F]       [dupdip rest rest] cons [step] genrec
-[F] [not] [pop] roll< [dupdip rest rest] cons [step] genrec
-
-
-

Ergo:

-
BTree-iter == [not] [pop] roll< [dupdip rest rest] cons [step] genrec
-
-
-
from notebook_preamble import J, V, define
-
-
-
define('BTree-iter == [not] [pop] roll< [dupdip rest rest] cons [step] genrec')
-
-
-
J('[] [23] BTree-iter')  #  It doesn't matter what F is as it won't be used.
-
-
-
(nothing)
-
-
-
J('["tommy" 23 [] []] [first] BTree-iter')
-
-
-
'tommy'
-
-
-
J('["tommy" 23 ["richard" 48 [] []] ["jenny" 18 [] []]] [first] BTree-iter')
-
-
-
'tommy' 'richard' 'jenny'
-
-
-
J('["tommy" 23 ["richard" 48 [] []] ["jenny" 18 [] []]] [second] BTree-iter')
-
-
-
23 48 18
-
-
-
-
-
-

Adding Nodes to the BTree

-

Let’s consider adding nodes to a BTree structure.

-
BTree value key BTree-add == BTree
-
-
-
-

Adding to an empty node.

-

If the current node is [] then you just return -[key value [] []]:

-
BTree-add == [popop not] [[pop] dipd BTree-new] [R0] [R1] genrec
-
-
-

Where BTree-new is:

-
value key BTree-new == [key value [] []]
-
-value key swap [[] []] cons cons
-key value      [[] []] cons cons
-key      [value [] []]      cons
-     [key value [] []]
-
-BTree-new == swap [[] []] cons cons
-
-
-
define('BTree-new == swap [[] []] cons cons')
-
-
-
V('"v" "k" BTree-new')
-
-
-
                . 'v' 'k' BTree-new
-            'v' . 'k' BTree-new
-        'v' 'k' . BTree-new
-        'v' 'k' . swap [[] []] cons cons
-        'k' 'v' . [[] []] cons cons
-'k' 'v' [[] []] . cons cons
-'k' ['v' [] []] . cons
-['k' 'v' [] []] .
-
-
-

(As an implementation detail, the [[] []] literal used in the -definition of BTree-new will be reused to supply the constant tail -for all new nodes produced by it. This is one of those cases where you -get amortized storage “for free” by using persistent -datastructures. -Because the tail, which is ((), ((), ())) in Python, is immutable -and embedded in the definition body for BTree-new, all new nodes can -reuse it as their own tail without fear that some other code somewhere -will change it.)

-
-
-

If the current node isn’t empty.

-

We now have to derive R0 and R1, consider:

-
[key_n value_n left right] value key R0 [BTree-add] R1
-
-
-

In this case, there are three possibilites: the key can be greater or -less than or equal to the node’s key. In two of those cases we will need -to apply a copy of BTree-add, so R0 is pretty much out of the -picture.

-
[R0] == []
-
-
-
-
-

A predicate to compare keys.

-

The first thing we need to do is compare the the key we’re adding to see -if it is greater than the node key and branch accordingly, although -in this case it’s easier to write a destructive predicate and then use -ifte to apply it nullary:

-
[key_n value_n left right] value key [BTree-add] R1
-[key_n value_n left right] value key [BTree-add] [P >] [T] [E] ifte
-
-[key_n value_n left right] value key [BTree-add] P                   >
-[key_n value_n left right] value key [BTree-add] pop roll> pop first >
-[key_n value_n left right] value key                 roll> pop first >
-key [key_n value_n left right] value                 roll> pop first >
-key key_n                                                            >
-Boolean
-
-P > == pop roll> pop first >
-P < == pop roll> pop first <
-P   == pop roll> pop first
-
-
-
define('P == pop roll> pop first')
-
-
-
V('["k" "v" [] []] "vv" "kk" [0] P >')
-
-
-
                              . ['k' 'v' [] []] 'vv' 'kk' [0] P >
-              ['k' 'v' [] []] . 'vv' 'kk' [0] P >
-         ['k' 'v' [] []] 'vv' . 'kk' [0] P >
-    ['k' 'v' [] []] 'vv' 'kk' . [0] P >
-['k' 'v' [] []] 'vv' 'kk' [0] . P >
-['k' 'v' [] []] 'vv' 'kk' [0] . pop roll> pop first >
-    ['k' 'v' [] []] 'vv' 'kk' . roll> pop first >
-    'kk' ['k' 'v' [] []] 'vv' . pop first >
-         'kk' ['k' 'v' [] []] . first >
-                     'kk' 'k' . >
-                         True .
-
-
-
-
-

If the key we’re adding is greater than the node’s key.

-

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:

-
[key_n value_n left right] value key [BTree-add] T == [key_n value_n left (BTree-add key value right)]
-
-
-
-
-

Use infra on K.

-

So how do we do this? We know we’re going to want to use infra on -some function K that has the key and value to work with, as well as -the quoted copy of BTree-add to apply somehow:

-
right left value_n key_n value key [BTree-add] K
-    ...
-right value key BTree-add left value_n key_n
-
-
-

Pretty easy:

-
right left value_n key_n value key [BTree-add] cons cons dipdd
-right left value_n key_n [value key BTree-add]           dipdd
-right value key BTree-add left value_n key_n
-
-
-

So:

-
K == cons cons dipdd
-
-
-

And:

-
[key_n value_n left right] [value key [BTree-add] K] infra
-
-
-
-
-

Derive T.

-

So now we’re at getting from this to this:

-
[key_n value_n left right]  value key [BTree-add] T
-    ...
-[key_n value_n left right] [value key [BTree-add] K] infra
-
-
-

And so T is just:

-
value key [BTree-add] T == [value key [BTree-add] K]                infra
-                      T == [                      K] cons cons cons infra
-
-
-
define('K == cons cons dipdd')
-define('T == [K] cons cons cons infra')
-
-
-
V('"r" "l" "v" "k" "vv" "kk" [0] K')
-
-
-
                              . 'r' 'l' 'v' 'k' 'vv' 'kk' [0] K
-                          'r' . 'l' 'v' 'k' 'vv' 'kk' [0] K
-                      'r' 'l' . 'v' 'k' 'vv' 'kk' [0] K
-                  'r' 'l' 'v' . 'k' 'vv' 'kk' [0] K
-              'r' 'l' 'v' 'k' . 'vv' 'kk' [0] K
-         'r' 'l' 'v' 'k' 'vv' . 'kk' [0] K
-    'r' 'l' 'v' 'k' 'vv' 'kk' . [0] K
-'r' 'l' 'v' 'k' 'vv' 'kk' [0] . K
-'r' 'l' 'v' 'k' 'vv' 'kk' [0] . cons cons dipdd
-'r' 'l' 'v' 'k' 'vv' ['kk' 0] . cons dipdd
-'r' 'l' 'v' 'k' ['vv' 'kk' 0] . dipdd
-                          'r' . 'vv' 'kk' 0 'l' 'v' 'k'
-                     'r' 'vv' . 'kk' 0 'l' 'v' 'k'
-                'r' 'vv' 'kk' . 0 'l' 'v' 'k'
-              'r' 'vv' 'kk' 0 . 'l' 'v' 'k'
-          'r' 'vv' 'kk' 0 'l' . 'v' 'k'
-      'r' 'vv' 'kk' 0 'l' 'v' . 'k'
-  'r' 'vv' 'kk' 0 'l' 'v' 'k' .
-
-
-
V('["k" "v" "l" "r"] "vv" "kk" [0] T')
-
-
-
                                    . ['k' 'v' 'l' 'r'] 'vv' 'kk' [0] T
-                  ['k' 'v' 'l' 'r'] . 'vv' 'kk' [0] T
-             ['k' 'v' 'l' 'r'] 'vv' . 'kk' [0] T
-        ['k' 'v' 'l' 'r'] 'vv' 'kk' . [0] T
-    ['k' 'v' 'l' 'r'] 'vv' 'kk' [0] . T
-    ['k' 'v' 'l' 'r'] 'vv' 'kk' [0] . [K] cons cons cons infra
-['k' 'v' 'l' 'r'] 'vv' 'kk' [0] [K] . cons cons cons infra
-['k' 'v' 'l' 'r'] 'vv' 'kk' [[0] K] . cons cons infra
-['k' 'v' 'l' 'r'] 'vv' ['kk' [0] K] . cons infra
-['k' 'v' 'l' 'r'] ['vv' 'kk' [0] K] . infra
-                    'r' 'l' 'v' 'k' . 'vv' 'kk' [0] K [] swaack
-               'r' 'l' 'v' 'k' 'vv' . 'kk' [0] K [] swaack
-          'r' 'l' 'v' 'k' 'vv' 'kk' . [0] K [] swaack
-      'r' 'l' 'v' 'k' 'vv' 'kk' [0] . K [] swaack
-      'r' 'l' 'v' 'k' 'vv' 'kk' [0] . cons cons dipdd [] swaack
-      'r' 'l' 'v' 'k' 'vv' ['kk' 0] . cons dipdd [] swaack
-      'r' 'l' 'v' 'k' ['vv' 'kk' 0] . dipdd [] swaack
-                                'r' . 'vv' 'kk' 0 'l' 'v' 'k' [] swaack
-                           'r' 'vv' . 'kk' 0 'l' 'v' 'k' [] swaack
-                      'r' 'vv' 'kk' . 0 'l' 'v' 'k' [] swaack
-                    'r' 'vv' 'kk' 0 . 'l' 'v' 'k' [] swaack
-                'r' 'vv' 'kk' 0 'l' . 'v' 'k' [] swaack
-            'r' 'vv' 'kk' 0 'l' 'v' . 'k' [] swaack
-        'r' 'vv' 'kk' 0 'l' 'v' 'k' . [] swaack
-     'r' 'vv' 'kk' 0 'l' 'v' 'k' [] . swaack
-      ['k' 'v' 'l' 0 'kk' 'vv' 'r'] .
-
-
-
-
-

If the key we’re adding is less than the node’s key.

-

This is very very similar to the above:

-
[key_n value_n left right] value key [BTree-add] E
-[key_n value_n left right] value key [BTree-add] [P <] [Te] [Ee] ifte
-
-
-

In this case Te works that same as T but on the left child tree -instead of the right, so the only difference is that it must use -dipd instead of dipdd:

-
Te == [cons cons dipd] cons cons cons infra
-
-
-

This suggests an alternate factorization:

-
ccons == cons cons
-T == [ccons dipdd] ccons cons infra
-Te == [ccons dipd] ccons cons infra
-
-
-

But whatever.

-
define('Te == [cons cons dipd] cons cons cons infra')
-
-
-
V('["k" "v" "l" "r"] "vv" "kk" [0] Te')
-
-
-
                                                 . ['k' 'v' 'l' 'r'] 'vv' 'kk' [0] Te
-                               ['k' 'v' 'l' 'r'] . 'vv' 'kk' [0] Te
-                          ['k' 'v' 'l' 'r'] 'vv' . 'kk' [0] Te
-                     ['k' 'v' 'l' 'r'] 'vv' 'kk' . [0] Te
-                 ['k' 'v' 'l' 'r'] 'vv' 'kk' [0] . Te
-                 ['k' 'v' 'l' 'r'] 'vv' 'kk' [0] . [cons cons dipd] cons cons cons infra
-['k' 'v' 'l' 'r'] 'vv' 'kk' [0] [cons cons dipd] . cons cons cons infra
-['k' 'v' 'l' 'r'] 'vv' 'kk' [[0] cons cons dipd] . cons cons infra
-['k' 'v' 'l' 'r'] 'vv' ['kk' [0] cons cons dipd] . cons infra
-['k' 'v' 'l' 'r'] ['vv' 'kk' [0] cons cons dipd] . infra
-                                 'r' 'l' 'v' 'k' . 'vv' 'kk' [0] cons cons dipd [] swaack
-                            'r' 'l' 'v' 'k' 'vv' . 'kk' [0] cons cons dipd [] swaack
-                       'r' 'l' 'v' 'k' 'vv' 'kk' . [0] cons cons dipd [] swaack
-                   'r' 'l' 'v' 'k' 'vv' 'kk' [0] . cons cons dipd [] swaack
-                   'r' 'l' 'v' 'k' 'vv' ['kk' 0] . cons dipd [] swaack
-                   'r' 'l' 'v' 'k' ['vv' 'kk' 0] . dipd [] swaack
-                                         'r' 'l' . 'vv' 'kk' 0 'v' 'k' [] swaack
-                                    'r' 'l' 'vv' . 'kk' 0 'v' 'k' [] swaack
-                               'r' 'l' 'vv' 'kk' . 0 'v' 'k' [] swaack
-                             'r' 'l' 'vv' 'kk' 0 . 'v' 'k' [] swaack
-                         'r' 'l' 'vv' 'kk' 0 'v' . 'k' [] swaack
-                     'r' 'l' 'vv' 'kk' 0 'v' 'k' . [] swaack
-                  'r' 'l' 'vv' 'kk' 0 'v' 'k' [] . swaack
-                   ['k' 'v' 0 'kk' 'vv' 'l' 'r'] .
-
-
-
-
-

Else the keys must be equal.

-

This means we must find:

-
[key_n value_n left right] value key [BTree-add] Ee
-    ...
-[key value left right]
-
-
-

This is another easy one:

-
Ee == pop swap roll< rest rest cons cons
-
-[key_n value_n left right] value key [BTree-add] pop swap roll< rest rest cons cons
-[key_n value_n left right] value key                 swap roll< rest rest cons cons
-[key_n value_n left right] key value                      roll< rest rest cons cons
-key value [key_n value_n left right]                            rest rest cons cons
-key value [              left right]                                      cons cons
-          [key   value   left right]
-
-
-
define('Ee == pop swap roll< rest rest cons cons')
-
-
-
V('["k" "v" "l" "r"] "vv" "k" [0] Ee')
-
-
-
                               . ['k' 'v' 'l' 'r'] 'vv' 'k' [0] Ee
-             ['k' 'v' 'l' 'r'] . 'vv' 'k' [0] Ee
-        ['k' 'v' 'l' 'r'] 'vv' . 'k' [0] Ee
-    ['k' 'v' 'l' 'r'] 'vv' 'k' . [0] Ee
-['k' 'v' 'l' 'r'] 'vv' 'k' [0] . Ee
-['k' 'v' 'l' 'r'] 'vv' 'k' [0] . pop swap roll< rest rest cons cons
-    ['k' 'v' 'l' 'r'] 'vv' 'k' . swap roll< rest rest cons cons
-    ['k' 'v' 'l' 'r'] 'k' 'vv' . roll< rest rest cons cons
-    'k' 'vv' ['k' 'v' 'l' 'r'] . rest rest cons cons
-        'k' 'vv' ['v' 'l' 'r'] . rest cons cons
-            'k' 'vv' ['l' 'r'] . cons cons
-            'k' ['vv' 'l' 'r'] . cons
-            ['k' 'vv' 'l' 'r'] .
-
-
-
define('E == [P <] [Te] [Ee] ifte')
-
-
-
-
-

Now we can define BTree-add

-
BTree-add == [popop not] [[pop] dipd BTree-new] [] [[P >] [T] [E] ifte] genrec
-
-
-

Putting it all together:

-
BTree-new == swap [[] []] cons cons
-P == pop roll> pop first
-T == [cons cons dipdd] cons cons cons infra
-Te == [cons cons dipd] cons cons cons infra
-Ee == pop swap roll< rest rest cons cons
-E == [P <] [Te] [Ee] ifte
-
-BTree-add == [popop not] [[pop] dipd BTree-new] [] [[P >] [T] [E] ifte] genrec
-
-
-
define('BTree-add == [popop not] [[pop] dipd BTree-new] [] [[P >] [T] [E] ifte] genrec')
-
-
-
J('[] 23 "b" BTree-add')  # Initial
-
-
-
['b' 23 [] []]
-
-
-
J('["b" 23 [] []] 88 "c" BTree-add')  # Less than
-
-
-
['b' 23 [] ['c' 88 [] []]]
-
-
-
J('["b" 23 [] []] 88 "a" BTree-add')  # Greater than
-
-
-
['b' 23 ['a' 88 [] []] []]
-
-
-
J('["b" 23 [] []] 88 "b" BTree-add')  # Equal to
-
-
-
['b' 88 [] []]
-
-
-
J('[] 23 "a" BTree-add 88 "b" BTree-add 44 "c" BTree-add')  # Series.
-
-
-
['a' 23 [] ['b' 88 [] ['c' 44 [] []]]]
-
-
-
-
-

A Set-Like Datastructure

-

We can use this to make a set-like datastructure by just setting values -to e.g. 0 and ignoring them. It’s set-like in that duplicate items added -to it will only occur once within it, and we can query it in -:math:`O(log_2 N) <https://en.wikipedia.org/wiki/Binary_search_tree#cite_note-2>`__ -time.

-
J('[] [3 9 5 2 8 6 7 8 4] [0 swap BTree-add] step')
-
-
-
[3 0 [2 0 [] []] [9 0 [5 0 [4 0 [] []] [8 0 [6 0 [] [7 0 [] []]] []]] []]]
-
-
-
define('to_set == [] swap [0 swap BTree-add] step')
-
-
-
J('[3 9 5 2 8 6 7 8 4] to_set')
-
-
-
[3 0 [2 0 [] []] [9 0 [5 0 [4 0 [] []] [8 0 [6 0 [] [7 0 [] []]] []]] []]]
-
-
-

And with that we can write a little program to remove duplicate items -from a list.

-
define('unique == [to_set [first] BTree-iter] cons run')
-
-
-
J('[3 9 3 5 2 9 8 8 8 6 2 7 8 4 3] unique')  # Filter duplicate items.
-
-
-
[7 6 8 4 5 9 2 3]
-
-
-
-
-
-

Interlude: The cmp combinator

-

Instead of all this mucking about with nested ifte let’s just go -whole hog and define cmp 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:

-
   a b [G] [E] [L] cmp
-------------------------- a > b
-        G
-
-   a b [G] [E] [L] cmp
-------------------------- a = b
-            E
-
-   a b [G] [E] [L] cmp
-------------------------- a < b
-                L
-
-
-

We need a new non-destructive predicate P:

-
[key_n value_n left right] value key [BTree-add] P
-[key_n value_n left right] value key [BTree-add] over [Q] nullary
-[key_n value_n left right] value key [BTree-add] key  [Q] nullary
-[key_n value_n left right] value key [BTree-add] key   Q
-[key_n value_n left right] value key [BTree-add] key   popop popop first
-[key_n value_n left right] value key                         popop first
-[key_n value_n left right]                                         first
- key_n
-[key_n value_n left right] value key [BTree-add] key  [Q] nullary
-[key_n value_n left right] value key [BTree-add] key key_n
-
-P == over [popop popop first] nullary
-
-
-

Here are the definitions again, pruned and renamed in some cases:

-
BTree-new == swap [[] []] cons cons
-P == over [popop popop first] nullary
-T> == [cons cons dipdd] cons cons cons infra
-T< == [cons cons dipd] cons cons cons infra
-E == pop swap roll< rest rest cons cons
-
-
-

Using cmp to simplify our code above at -``R1` <#If-the-current-node-isn’t-empty.>`__:

-
[key_n value_n left right] value key [BTree-add] R1
-[key_n value_n left right] value key [BTree-add] P [T>] [E] [T<] cmp
-
-
-

The line above becomes one of the three lines below:

-
[key_n value_n left right] value key [BTree-add] T>
-[key_n value_n left right] value key [BTree-add] E
-[key_n value_n left right] value key [BTree-add] T<
-
-
-

The definition is a little longer but, I think, more elegant and easier -to understand:

-
BTree-add == [popop not] [[pop] dipd BTree-new] [] [P [T>] [E] [T<] cmp] genrec
-
-
-
from joy.library import FunctionWrapper
-from joy.utils.stack import pushback
-from notebook_preamble import D
-
-
-@FunctionWrapper
-def cmp_(stack, expression, dictionary):
-    L, (E, (G, (b, (a, stack)))) = stack
-    expression = pushback(G if a > b else L if a < b else E, expression)
-    return stack, expression, dictionary
-
-
-D['cmp'] = cmp_
-
-
-
J("1 0 ['G'] ['E'] ['L'] cmp")
-
-
-
'G'
-
-
-
J("1 1 ['G'] ['E'] ['L'] cmp")
-
-
-
'E'
-
-
-
J("0 1 ['G'] ['E'] ['L'] cmp")
-
-
-
'L'
-
-
-
from joy.library import DefinitionWrapper
-
-
-DefinitionWrapper.add_definitions('''
-
-P == over [popop popop first] nullary
-T> == [cons cons dipdd] cons cons cons infra
-T< == [cons cons dipd] cons cons cons infra
-E == pop swap roll< rest rest cons cons
-
-BTree-add == [popop not] [[pop] dipd BTree-new] [] [P [T>] [E] [T<] cmp] genrec
-
-''', D)
-
-
-
J('[] 23 "b" BTree-add')  # Initial
-
-
-
['b' 23 [] []]
-
-
-
J('["b" 23 [] []] 88 "c" BTree-add')  # Less than
-
-
-
['b' 23 [] ['c' 88 [] []]]
-
-
-
J('["b" 23 [] []] 88 "a" BTree-add')  # Greater than
-
-
-
['b' 23 ['a' 88 [] []] []]
-
-
-
J('["b" 23 [] []] 88 "b" BTree-add')  # Equal to
-
-
-
['b' 88 [] []]
-
-
-
J('[] 23 "a" BTree-add 88 "b" BTree-add 44 "c" BTree-add')  # Series.
-
-
-
['a' 23 [] ['b' 88 [] ['c' 44 [] []]]]
-
-
-
-
-

Interlude: Factoring and Naming

-

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.

-
get-node-key == popop popop first
-remove-key-and-value-from-node == rest rest
-pack-key-and-value == cons cons
-prep-new-key-and-value == pop swap roll<
-pack-and-apply == [pack-key-and-value] swoncat cons pack-key-and-value infra
-
-BTree-new == swap [[] []] pack-key-and-value
-P == over [get-node-key] nullary
-T> == [dipdd] pack-and-apply
-T< == [dipd] pack-and-apply
-E == prep-new-key-and-value remove-key-and-value-from-node pack-key-and-value
-
-
-
-
-

A Version of BTree-iter that does In-Order Traversal

-

If you look back to the non-empty case of the ``BTree-iter` -function <#Node-case-%5Bkey-value-left-right%5D>`__ 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.

-
BTree-iter-order == [not] [pop] [R0 [BTree-iter] R1] ifte
-
-
-

To define R0 and R1 it helps to look at them as they will appear -when they run:

-
[key value left right] R0 [BTree-iter-order] R1
-
-
-
-

Process the left child.

-

Staring at this for a bit suggests dup third to start:

-
[key value left right] R0        [BTree-iter-order] R1
-[key value left right] dup third [BTree-iter-order] R1
-[key value left right] left      [BTree-iter-order] R1
-
-
-

Now maybe:

-
[key value left right] left [BTree-iter-order] [cons dip] dupdip
-[key value left right] left [BTree-iter-order] cons dip [BTree-iter-order]
-[key value left right] [left BTree-iter-order]      dip [BTree-iter-order]
-left BTree-iter-order [key value left right]            [BTree-iter-order]
-
-
-
-
-

Process the current node.

-

So far, so good. Now we need to process the current node’s values:

-
left BTree-iter-order [key value left right] [BTree-iter-order] [[F] dupdip] dip
-left BTree-iter-order [key value left right] [F] dupdip [BTree-iter-order]
-left BTree-iter-order [key value left right] F [key value left right] [BTree-iter-order]
-
-
-

If F needs items from the stack below the left stuff it should have -cons’d them before beginning maybe? For functions like first it -works fine as-is.

-
left BTree-iter-order [key value left right] first [key value left right] [BTree-iter-order]
-left BTree-iter-order key [key value left right] [BTree-iter-order]
-
-
-
-
-

Process the right child.

-

First ditch the rest of the node and get the right child:

-
left BTree-iter-order key [key value left right] [BTree-iter-order] [rest rest rest first] dip
-left BTree-iter-order key right [BTree-iter-order]
-
-
-

Then, of course, we just need i to run BTree-iter-order on the -right side:

-
left BTree-iter-order key right [BTree-iter-order] i
-left BTree-iter-order key right BTree-iter-order
-
-
-
-
-

Defining BTree-iter-order

-

The result is a little awkward:

-
R1 == [cons dip] dupdip [[F] dupdip] dip [rest rest rest first] dip i
-
-
-

Let’s do a little semantic factoring:

-
fourth == rest rest rest first
-
-proc_left == [cons dip] dupdip
-proc_current == [[F] dupdip] dip
-proc_right == [fourth] dip i
-
-BTree-iter-order == [not] [pop] [dup third] [proc_left proc_current proc_right] genrec
-
-
-

Now we can sort sequences.

-
define('BTree-iter-order == [not] [pop] [dup third] [[cons dip] dupdip [[first] dupdip] dip [rest rest rest first] dip i] genrec')
-
-
-
J('[3 9 5 2 8 6 7 8 4] to_set BTree-iter-order')
-
-
-
2 3 4 5 6 7 8 9
-
-
-
-
-
-

Getting values by key

-

Let’s derive a function that accepts a tree and a key and returns the -value associated with that key.

-
   tree key BTree-get
-------------------------
-        value
-
-
-
-

The base case []

-

As before, the stopping predicate just has to detect the empty list:

-
BTree-get == [pop not] [E] [R0] [R1] genrec
-
-
-

But what do we do if the key isn’t in the tree? In Python we might raise -a KeyError but I’d like to avoid exceptions in Joy if possible, and -here I think it’s possible. (Division by zero is an example of where I -think it’s probably better to let Python crash Joy. Sometimes the -machinery fails and you have to “stop the line”, methinks.)

-

Let’s pass the buck to the caller by making the base case a given, you -have to decide for yourself what [E] should be.

-
   tree key [E] BTree-get
----------------------------- key in tree
-           value
-
-   tree key [E] BTree-get
----------------------------- key not in tree
-         tree key E
-
-
-

Now we define:

-
BTree-get == [pop not] swap [R0] [R1] genrec
-
-
-

Note that this BTree-get creates a slightly different function than -itself and that function does the actual recursion. This kind of -higher-level programming is unusual in most languages but natural in -Joy.

-
tree key [E] [pop not] swap [R0] [R1] genrec
-tree key [pop not] [E] [R0] [R1] genrec
-
-
-

The anonymous specialized recursive function that will do the real work.

-
[pop not] [E] [R0] [R1] genrec
-
-
-
-
-

Node case [key value left right]

-

Now we need to figure out R0 and R1:

-
[key value left right] key R0 [BTree-get] R1
-
-
-

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 it’s very similar to the above funtion, with -[R0] == [] and R1 == P [T>] [E] [T<] cmp:

-
[key value left right] key [BTree-get] P [T>] [E] [T<] cmp
-
-
-

So:

-
get-node-key == pop popop first
-P == over [get-node-key] nullary
-
-
-

The only difference is that get-node-key does one less pop -because there’s no value to discard. Now we have to derive the branches:

-
[key_n value_n left right] key [BTree-get] T>
-[key_n value_n left right] key [BTree-get] E
-[key_n value_n left right] key [BTree-get] T<
-
-
-

The cases of T> and T< are similar to above but instead of using -infra we have to discard the rest of the structure:

-
[key_n value_n left right] key [BTree-get] T> == right key BTree-get
-[key_n value_n left right] key [BTree-get] T< == left key BTree-get
-
-
-

So:

-
T> == [fourth] dipd i
-T< == [third] dipd i
-
-
-

E.g.:

-
[key_n value_n left right]        key [BTree-get] [fourth] dipd i
-[key_n value_n left right] fourth key [BTree-get]               i
-                    right         key [BTree-get]               i
-                    right         key  BTree-get
-
-
-

And:

-
[key_n value_n left right] key [BTree-get] E == value_n
-
-E == popop second
-
-
-

So:

-
fourth == rest rest rest first
-get-node-key == pop popop first
-P == over [get-node-key] nullary
-T> == [fourth] dipd i
-T< == [third] dipd i
-E == popop second
-
-BTree-get == [pop not] swap [] [P [T>] [E] [T<] cmp] genrec
-
-
-
# I don't want to deal with name conflicts with the above so I'm inlining everything here.
-# The original Joy system has "hide" which is a meta-command which allows you to use named
-# definitions that are only in scope for a given definition.  I don't want to implement
-# that (yet) so...
-
-
-define('''
-BTree-get == [pop not] swap [] [
-  over [pop popop first] nullary
-  [[rest rest rest first] dipd i]
-  [popop second]
-  [[third] dipd i]
-  cmp
-  ] genrec
-''')
-
-
-
J('[] "gary" [popop "err"] BTree-get')
-
-
-
'err'
-
-
-
J('["gary" 23 [] []] "gary" [popop "err"] BTree-get')
-
-
-
23
-
-
-
J('''
-
-    [] [[0 'a'] [1 'b'] [2 'c']] [i BTree-add] step
-
-    'c' [popop 'not found'] BTree-get
-
-''')
-
-
-
2
-
-
-
-
-
-

TODO: BTree-delete

-
   tree key [Er] BTree-delete
--------------------------------- key in tree
-       tree
-
-   tree key [Er] BTree-delete
--------------------------------- key not in tree
-         tree key Er
-
-
-

So:

-
BTree-Delete == [pop not] swap [R0] [R1] genrec
-
-
-
             [Er] BTree-delete
-------------------------------------
-   [pop not] [Er] [R0] [R1] genrec
-
-
-

Now we get to figure out the recursive case:

-
D == [pop not] [Er] [R0] [R1] genrec
-
-[node_key node_value left right] key R0                  [D] R1
-[node_key node_value left right] key over first swap dup [D] R1
-[node_key node_value left right] node_key key key        [D] R1
-
-
-
[node_key node_value left right] node_key key key [D] R1
-[node_key node_value left right] node_key key key [D] cons roll> [T>] [E] [T<] cmp
-[node_key node_value left right] node_key key [key D]      roll> [T>] [E] [T<] cmp
-[node_key node_value left right] [key D] node_key key            [T>] [E] [T<] cmp
-
-
-

Now this:;

-
-
[node_key node_value left right] [key D] node_key key [T>] [E] [T<] cmp
-

Becomes one of these three:;

-
-
[node_key node_value left right] [key D] T> -[node_key node_value left right] [key D] E -[node_key node_value left right] [key D] T<
-
   [node_key node_value left right] [key D] T>
--------------------------------------------------
-   [node_key node_value left key D right]
-
-
-right left node_value node_key [key D] dipd
-
-[node_key node_value left right] [key D] [dipd] cons infra
-
-
-
T> == [dipd] cons infra
-T< == [dipdd] cons infra
-
-
-
[node_key node_value left right] [key D] E
-
-
-
def delete(node, key):
-  '''
-  Return a tree with the value (and key) removed or raise KeyError if
-  not found.
-  '''
-  if not node:
-    raise KeyError, key
-
-  node_key, (value, (lower, (higher, _))) = node
-
-  if key < node_key:
-    return node_key, (value, (delete(lower, key), (higher, ())))
-
-  if key > node_key:
-    return node_key, (value, (lower, (delete(higher, key), ())))
-
-  # So, key == node_key, delete this node itself.
-
-  # If we only have one non-empty child node return it.  If both child
-  # nodes are empty return an empty node (one of the children.)
-  if not lower:
-    return higher
-  if not higher:
-    return lower
-
-  # If both child nodes are non-empty, we find the highest node in our
-  # lower sub-tree, take its key and value to replace (delete) our own,
-  # then get rid of it by recursively calling delete() on our lower
-  # sub-node with our new key.
-  # (We could also find the lowest node in our higher sub-tree and take
-  # its key and value and delete it. I only implemented one of these
-  # two symmetrical options. Over a lot of deletions this might make
-  # the tree more unbalanced.  Oh well.)
-  node = lower
-  while node[1][1][1][0]:
-    node = node[1][1][1][0]
-  key, value = node[0], node[1][0]
-
-  return key, (value, (delete(lower, key), (higher, ())))
-
-
-
-
-

Tree with node and list of trees.

-

Once we have add, get, and delete we can see about abstracting -them.

-

Let’s consider a tree structure, similar to one described “Why -functional programming matters” by John -Hughes, -that consists of a node value and a sequence of zero or more child -trees. (The asterisk is meant to indicate the Kleene -star.)

-
tree = [] | [node [tree*]]
-
-
-
-

treestep

-

In the spirit of step we are going to define a combinator -treestep which expects a tree and three additional items: a -base-case value z, and two quoted programs [C] and [N].

-
tree z [C] [N] treestep
-
-
-

If the current tree node is empty then just leave z on the stack in -lieu:

-
   [] z [C] [N] treestep
----------------------------
-      z
-
-
-

Otherwise, evaluate N on the node value, map the whole function -(abbreviated here as k) over the child trees recursively, and then -combine the result with C.

-
   [node [tree*]] z [C] [N] treestep
---------------------------------------- w/ K == z [C] [N] treestep
-       node N [tree*] [K] map C
-
-
-
-
-

Derive the recursive form.

-

Since this is a recursive function, we can begin to derive it by finding -the ifte stage that genrec will produce. The predicate and -base-case functions are trivial, so we just have to derive J.

-
K == [not] [pop z] [J] ifte
-
-
-

The behavior of J is to accept a (non-empty) tree node and arrive at -the desired outcome.

-
       [node [tree*]] J
-------------------------------
-   node N [tree*] [K] map C
-
-
-

So J will have some form like:

-
J == .. [N] .. [K] .. [C] ..
-
-
-

Let’s dive in. First, unquote the node and dip N.

-
[node [tree*]] i [N] dip
- node [tree*]    [N] dip
-node N [tree*]
-
-
-

Next, map K over teh child trees and combine with C.

-
node N [tree*] [K] map C
-node N [tree*] [K] map C
-node N [K.tree*]       C
-
-
-

So:

-
J == i [N] dip [K] map C
-
-
-

Plug it in and convert to genrec:

-
K == [not] [pop z] [i [N] dip [K] map C] ifte
-K == [not] [pop z] [i [N] dip]   [map C] genrec
-
-
-
-
-

Extract the givens to parameterize the program.

-
[not] [pop z] [i [N] dip]   [map C] genrec
-
-[not] [pop z]                   [i [N] dip] [map C] genrec
-[not] [z]         [pop] swoncat [i [N] dip] [map C] genrec
-[not]  z     unit [pop] swoncat [i [N] dip] [map C] genrec
-z [not] swap unit [pop] swoncat [i [N] dip] [map C] genrec
-  \  .........TS0............./
-   \/
-z TS0 [i [N] dip]                       [map C] genrec
-z     [i [N] dip]             [TS0] dip [map C] genrec
-z       [[N] dip] [i] swoncat [TS0] dip [map C] genrec
-z  [N] [dip] cons [i] swoncat [TS0] dip [map C] genrec
-       \  ......TS1........./
-        \/
-z [N] TS1 [TS0] dip [map C]                      genrec
-z [N]               [map C]  [TS1 [TS0] dip] dip genrec
-z [N] [C]      [map] swoncat [TS1 [TS0] dip] dip genrec
-z [C] [N] swap [map] swoncat [TS1 [TS0] dip] dip genrec
-
-
-

The givens are all to the left so we have our definition.

-
-
-

Define treestep

-
     TS0 == [not] swap unit [pop] swoncat
-     TS1 == [dip] cons [i] swoncat
-treestep == swap [map] swoncat [TS1 [TS0] dip] dip genrec
-
-
-
DefinitionWrapper.add_definitions('''
-
-     TS0 == [not] swap unit [pop] swoncat
-     TS1 == [dip] cons [i] swoncat
-treestep == swap [map] swoncat [TS1 [TS0] dip] dip genrec
-
-''', D)
-
-
-
   [] 0 [C] [N] treestep
----------------------------
-      0
-
-
-      [n [tree*]] 0 [sum +] [] treestep
-   --------------------------------------------------
-       n [tree*] [0 [sum +] [] treestep] map sum +
-
-
-
J('[] 0 [sum +] [] treestep')
-
-
-
0
-
-
-
J('[23 []] 0 [sum +] [] treestep')
-
-
-
23
-
-
-
J('[23 [[2 []] [3 []]]] 0 [sum +] [] treestep')
-
-
-
28
-
-
-
-
-

A slight modification.

-

Let’s simplify the tree datastructure definition slightly by just -letting the children be the rest of the tree:

-
tree = [] | [node tree*]
-
-
-

The J function changes slightly.

-
        [node tree*] J
-------------------------------
-   node N [tree*] [K] map C
-
-
-[node tree*] uncons [N] dip [K] map C
-node [tree*]        [N] dip [K] map C
-node N [tree*]              [K] map C
-node N [tree*]              [K] map C
-node N [K.tree*]                    C
-
-J == uncons [N] dip [K] map C
-
-K == [not] [pop z] [uncons [N] dip] [map C] genrec
-
-
-
define('TS1 == [dip] cons [uncons] swoncat')  # We only need to redefine one word.
-
-
-
J('[23 [2] [3]] 0 [sum +] [] treestep')
-
-
-
28
-
-
-
J('[23 [2 [8] [9]] [3] [4 []]] 0 [sum +] [] treestep')
-
-
-
49
-
-
-

I think these trees seem a little easier to read.

-
-
-

Redefining our BTree in terms of this form.

-
BTree = [] | [[key value] left right]
-
-
-

What kind of functions can we write for this with our treestep? The -pattern for processing a non-empty node is:

-
node N [tree*] [K] map C
-
-
-

Plugging in our BTree structure:

-
[key value] N [left right] [K] map C
-
-
-[key value] uncons pop [left right] [K] map i
-key [value]        pop [left right] [K] map i
-key                    [left right] [K] map i
-key                    [lkey rkey ]         i
-key                     lkey rkey
-
-
-
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]]   23 [i] [uncons pop] treestep')
-
-
-
3 23 23
-
-
-

Doesn’t work because map extracts the first item of whatever its -mapped function produces. We have to return a list, rather than -depositing our results directly on the stack.

-
[key value] N     [left right] [K] map C
-
-[key value] first [left right] [K] map flatten cons
-key               [left right] [K] map flatten cons
-key               [[lk] [rk] ]         flatten cons
-key               [ lk   rk  ]                 cons
-                  [key  lk   rk  ]
-
-
-

So:

-
[] [flatten cons] [first] treestep
-
-
-
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]]   [] [flatten cons] [first] treestep')
-
-
-
[3 2 9 5 4 8 6 7]
-
-
-

There we go.

-
-
-

In-order traversal with treestep.

-

From here:

-
key [[lk] [rk]] C
-key [[lk] [rk]] i
-key  [lk] [rk] roll<
-[lk] [rk] key swons concat
-[lk] [key rk]       concat
-[lk   key rk]
-
-
-

So:

-
[] [i roll< swons concat] [first] treestep
-
-
-
J('[[3 0] [[2 0] [] []] [[9 0] [[5 0] [[4 0] [] []] [[8 0] [[6 0] [] [[7 0] [] []]] []]] []]]   [] [i roll< swons concat] [uncons pop] treestep')
-
-
-
[2 3 4 5 6 7 8 9]
-
-
-
-
-
-

Miscellaneous Crap

-
-

Toy with it.

-

Let’s reexamine:

-
[key value left right] R0 [BTree-iter-order] R1
-    ...
-left BTree-iter-order key value F right BTree-iter-order
-
-
-[key value left right] disenstacken swap
- key value left right               swap
- key value right left
-
-key value right left [BTree-iter-order] [cons dipdd] dupdip
-key value right left [BTree-iter-order] cons dipdd [BTree-iter-order]
-key value right [left BTree-iter-order]      dipdd [BTree-iter-order]
-left BTree-iter-order key value right              [BTree-iter-order]
-
-left BTree-iter-order key value   right [F] dip [BTree-iter-order]
-left BTree-iter-order key value F right         [BTree-iter-order] i
-left BTree-iter-order key value F right          BTree-iter-order
-
-
-

So:

-
R0 == disenstacken swap
-R1 == [cons dipdd [F] dip] dupdip i
-
-[key value left right] R0                [BTree-iter-order] R1
-[key value left right] disenstacken swap [BTree-iter-order] [cons dipdd [F] dip] dupdip i
- key value right left                    [BTree-iter-order] [cons dipdd [F] dip] dupdip i
-
- key value right left [BTree-iter-order] cons dipdd [F] dip [BTree-iter-order] i
- key value right [left BTree-iter-order]      dipdd [F] dip [BTree-iter-order] i
- left BTree-iter-order key value   right            [F] dip [BTree-iter-order] i
- left BTree-iter-order key value F right                    [BTree-iter-order] i
- left BTree-iter-order key value F right                     BTree-iter-order
-
-
-BTree-iter-order == [not] [pop] [disenstacken swap] [[cons dipdd [F] dip] dupdip i] genrec
-
-
-
-
-

Refactor cons cons

-
cons2 == cons cons
-
-
-

Refactoring:

-
BTree-new == swap [[] []] cons2
-T == [cons2 dipdd] cons2 cons infra
-Te == [cons2 dipd] cons2 cons infra
-Ee == pop swap roll< rest rest cons2
-
-
-

It’s used a lot because it’s 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.

-
-
-
-

A General Form for Trees

-

A general form for tree data with N children per node:

-
[[data] [child0] ... [childN-1]]
-
-
-

Suggests a general form of recursive iterator, but I have to go walk the -dogs at the mo’.

-

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- y’know). The Cn functions could all be the same and use -the step trick if the children nodes are all of the right kind. If -they are heterogeneous then we need a way to get the different Cn -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 some sort of algebraic data type description and returns a -function that can recusre over -it, I -think.

-
   [data.. [c0] [c1] ... [cN]] [F C0 C1 ... CN] infil
---------------------------------------------------------
-   data F [c0] C0 [c1] C1 ... [cN] CN
-
-
-
-

Just make [F] a parameter.

-

We can generalize to a sort of pure form:

-
BTree-iter == [not] [pop] [[F]]            [R1] genrec
-           == [not] [pop] [[F] [BTree-iter] R1] ifte
-
-
-

Putting [F] to the left as a given:

-
 [F] unit [not] [pop] roll< [R1] genrec
-[[F]]     [not] [pop] roll< [R1] genrec
-          [not] [pop] [[F]] [R1] genrec
-
-
-

Let’s us define a parameterized form:

-
BTree-iter == unit [not] [pop] roll< [R1] genrec
-
-
-

So in the general case of non-empty nodes:

-
[key value left right] [F] [BTree-iter] R1
-
-
-

We just define R1 to do whatever it has to to process the node. For -example:

-
[key value left right] [F] [BTree-iter] R1
-    ...
-key value F   left BTree-iter   right BTree-iter
-left BTree-iter   key value F   right BTree-iter
-left BTree-iter   right BTree-iter   key value F
-
-
-

Pre-, ??-, post-order traversals.

-
[key value  left right] uncons uncons
- key value [left right]
-
-
-

For pre- and post-order we can use the step trick:

-
[left right] [BTree-iter] step
-    ...
-left BTree-iter right BTree-iter
-
-
-

We worked out one scheme for ?in-order? traversal above, but maybe we -can do better?

-
[key value left right]              [F] [BTree-iter] [disenstacken] dipd
-[key value left right] disenstacken [F] [BTree-iter]
- key value left right               [F] [BTree-iter]
-
-key value left right [F] [BTree-iter] R1.1
-
-
-

Hmm…

-
key value left right              [F] [BTree-iter] tuck
-key value left right [BTree-iter] [F] [BTree-iter]
-
-
-[key value left right]                          [F] [BTree-iter] [disenstacken [roll>] dip] dipd
-[key value left right] disenstacken [roll>] dip [F] [BTree-iter]
- key value left right               [roll>] dip [F] [BTree-iter]
- key value left roll> right                     [F] [BTree-iter]
- left key value right                           [F] [BTree-iter]
-
-left            key value   right              [F] [BTree-iter] tuck foo
-left            key value   right [BTree-iter] [F] [BTree-iter] foo
-    ...
-left BTree-iter key value F right  BTree-iter
-
-
-

We could just let [R1] be a parameter too, for maximum flexibility.

-
-
-
-

Automatically deriving the recursion combinator for a data type?

-

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.:

-
A == ... B ...
-B == ... A ...
-
-
-

That’s fine. Circular datastructures can’t be made though.

-
-
- - -
-
-
- -
-
- - - - \ No newline at end of file