¶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
