dcreager.net

Reduction semantics for CC

Starting with the natural basis:

[B] [A] cat  ≜ [B A]
    [A] drop ≜
    [A] dup  ≜ [A] [A]
    [A] i    ≜ A
[B] [A] swap ≜ [A] [B]
    [A] unit ≜ [[A]]

The natural normal concatenative basis

Some examples using reduction instead of stacks:

[B] [A] cons ≜ [B] [A] [unit] swap unit cat i cat
                   ^^^^^^^^^^^^^^^
             = [B] [unit] [A] unit cat i cat
                          ^^^^^^^^
             = [B] [unit] [[A]] cat i cat
                   ^^^^^^^^^^^^^^^^
             = [B] [unit [A]] i cat
                   ^^^^^^^^^^^^
             = [B] unit [A] cat
               ^^^^^^^^
             = [[B]] [A] cat
               ^^^^^^^^^^^^^
             = [[B] A]
[B] [A] cons ≜ [B] [A] swap unit swap cat
               ^^^^^^^^^^^^
             = [A] [B] unit swap cat
                   ^^^^^^^^
             = [A] [[B]] swap cat
               ^^^^^^^^^^^^^^
             = [[B]] [A] cat
               ^^^^^^^^^^^^^
             = [[B] A]
[B] [A] k ≜ [B] [A] swap drop i
            ^^^^^^^^^^^^
          = [A] [B] drop i
                ^^^^^^^^
          = [A] i
            ^^^^^
          = A
false ≜ [drop]
true  ≜ [swap drop]
or    ≜ dup i

false true or ≜ [drop] [swap drop] dup i
                       ^^^^^^^^^^^^^^^
              = [drop] [swap drop] [swap drop] i
                                   ^^^^^^^^^^^^^
              = [drop] [swap drop] swap drop
                ^^^^^^^^^^^^^^^^^^^^^^^
              = [swap drop] [drop] drop
                            ^^^^^^^^^^^
              = [swap drop]
              = true

false false or ≜ [drop] [drop] dup i
                        ^^^^^^^^^^
               = [drop] [drop] [drop] i
                               ^^^^^^^^
               = [drop] [drop] drop
                        ^^^^^^^^^^^
               = [drop]
               = false

All of these have a single sequence of reductions that is possible, because they do not require reducing anything nested in a quotation. Here's an example from Kerby that does have multiple reduction paths:

[B] [A] cat ≜ [B] [A] [[i] dip i] cons cons
                  ^^^^^^^^^^^^^^^^^^^^
            = [B] [[A] [i] dip i] cons
              ^^^^^^^^^^^^^^^^^^^^^^^^
            = [[B] [A] [i] dip i]
                   ^^^^^^^^^^^
            = [[B] i [A] i]
               ^^^^^
            = [B [A] i]
                 ^^^^^
            = [B A]

Church numerals

Aiming for

[B] [A] ℕ₀ == B
[B] [A] ℕ₁ == [B] A
[B] [A] ℕ₂ == [[B] A] A
[B] [A] ℕ₃ == [[[B] A] A] A
           …

Definitions

[B] [A] ℕ₀ ≜ [B] [A] drop i
                 ^^^^^^^^
           = [B] i
             ^^^^^
           = B
[B] [A] ℕ₁ ≜ [B] [A] i
                 ^^^^^
           = [B] A
[ℕ] succ ≜ [ℕ] [ℕ₁] +
         = [ℕ] [i] [cons b] cons s
               ^^^^^^^^^^^^^^^^^
         = [ℕ] [[i] cons b] s
[B] [A] ℕ₂ ≜ [B] [A] [ℕ₁] succ
           = [B] [A] [i] [[i] cons b] s
                 ^^^^^^^^^^^^^^^^^^^^^^
           = [B] [[A] i] [A] [i] cons b
                         ^^^^^^^^^^^^
           = [B] [[A] i] [[A] i] b
             ^^^^^^^^^^^^^^^^^^^^^
           = [[B] [A] i] [A] i
                         ^^^^^
           = [[B] [A] i] A
                  ^^^^^
           = [[B] A] A