dcreager.net

The two-element normal concatenative basis

Kerby suggests cake and k as the most “elegant” 2-element basis in a normal (i.e., non-substructural) concatenative language.

The Theory of Concatenative Combinators » An Elegant Base

[B] [A] cake ≜ [[B] A] [A [B]]
[B] [A] k    ≜ A

Here are the translations of each natural basis instruction into the 2-element basis:

[B] [A] cat ≜ [B] [A] [[i] cake k i] cake [] k cake [] k
                  ^^^^^^^^^^^^^^^^^^^^^^^
            = [B] [[A] [i] cake k i] [[i] cake k i [A]] [] k cake [] k
                                     ^^^^^^^^^^^^^^^^^^^^^^^
            = [B] [[A] [i] cake k i] cake [] k
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^
            = [[B] [A] [i] cake k i] [[A] [i] cake k i [B]] [] k
                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
            = [[B] [A] [i] cake k i]
                   ^^^^^^^^^^^^
            = [[B] [[A] i] [i [A]] k i]
                   ^^^^^^^^^^^^^^^^^
            = [[B] i [A] i]
               ^^^^^
            = [B [A] i]
                 ^^^^^
            = [B A]
[A] drop ≜ [A] [] k
           ^^^^^^^^
         =
[A] dup ≜ [A] [] cake cake k cake k
          ^^^^^^^^^^^
        = [[A]] [[A]] cake k cake k
          ^^^^^^^^^^^^^^^^
        = [[[A]] [A]] [[A] [[A]]] k cake k
          ^^^^^^^^^^^^^^^^^^^^^^^^^
        = [A] [[A]] cake k
          ^^^^^^^^^^^^^^
        = [[A] [A]] [[A] [A]] k
          ^^^^^^^^^^^^^^^^^^^^^
        = [A] [A]
[A] i ≜ [A] [[]] cake k k
        ^^^^^^^^^^^^^
      = [[A] []] [[] [A]] k k
        ^^^^^^^^^^^^^^^^^^^
      = [] [A] k
        ^^^^^^^^
      = A
[B] [A] swap ≜ [B] [A] [] cake [cake] k k
                   ^^^^^^^^^^^
             = [B] [[A]] [[A]] [cake] k k
                         ^^^^^^^^^^^^^^
             = [B] [[A]] cake k
               ^^^^^^^^^^^^^^
             = [[B] [A]] [[A] [B]] k
               ^^^^^^^^^^^^^^^^^^^^^
             = [A] [B]
[A] unit ≜ [A] [] cake [] k
           ^^^^^^^^^^^
         = [[A]] [[A]] [] k
                 ^^^^^^^^^^
         = [[A]]