Как двоичное лямбда-исчисление кодирует скобки?

Как BLC кодирует скобки? Например, как бы это:

λa.λb.λc.(a ((b c) d))

быть закодированным в BLC?

Примечание: статья Википедии не очень полезна, поскольку она использует незнакомую нотацию и предоставляет только один простой пример, который не включает скобки, и очень сложный пример, который трудно проанализировать. Документ аналогичен в этом отношении.

1 ответов


если вы имеете в виду двоичную кодировку, основанную на индексах De Bruijn, обсуждаемых в Википедии, это на самом деле довольно просто. Сначала вам нужно сделать кодировку De Bruijn, что означает замену переменных натуральными числами, обозначающими количество λ-связующих между переменной и ее λ-связующим. В этой записи,

λa.λb.λc.(a ((b c) d))

становится

λλλ 3 ((2 1) d)

здесь d некоторое натуральное число >=4. Поскольку он не связан в выражении, мы не можем сказать, что номер должен быть.

тогда сама кодировка, определенная рекурсивно как

enc(λM) = 00 + enc(M)
enc(MN) = 01 + enc(M) + enc(N)
enc(i) = 1*i + 0

здесь + обозначает конкатенацию строк и * означает повторение. Систематически применяя это, мы получаем

  enc(λλλ 3 ((2 1) d))
= 00 + enc(λλ 3 ((2 1) d))
= 00 + 00 + enc(λ 3 ((2 1) d))
= 00 + 00 + 00 + enc(3 ((2 1) d))
= 00 + 00 + 00 + 01 + enc(3) + enc((2 1) d)
= 00 + 00 + 00 + 01 + enc(3) + 01 + enc(2 1) + enc(d)
= 00 + 00 + 00 + 01 + enc(3) + 01 + 01 + enc(2) + enc(1) + enc(d)
= 000000011110010111010 + enc(d)

и, как вы можете видеть, открытые круглые скобки кодируются как 01 пока близкие parens не необходимы в этом зашифровании.