Se si intende la codifica binaria basata su indici De Bruijn discussi in Wikipedia, in realtà è piuttosto semplice. È necessario prima eseguire la codifica De Bruijn, che significa sostituire le variabili con numeri naturali che indicano il numero di leganti λ tra la variabile e il suo raccoglitore λ. In questa notazione,
λa.λb.λc.(a ((b c) d))
diventa
λλλ 3 ((2 1) d)
dove d è un numero naturale> = 4. Dal momento che non è legato nell'espressione, non possiamo veramente dire quale numero dovrebbe essere.
Poi la codifica stessa, definito ricorsivamente come
enc(λM) = 00 + enc(M)
enc(MN) = 01 + enc(M) + enc(N)
enc(i) = 1*i + 0
dove +
indica concatenazione di stringhe e * mezzi di ripetizione. Sistematicamente l'applicazione di questo, otteniamo
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)
e come si può vedere, le parentesi aperte sono codificati come 01
mentre le parentesi stretti non sono necessari in questa codifica.
fonte
2013-08-03 16:34:13
Risposta straordinaria, grazie. Quindi le parentesi non sono necessarie perché 01 significa già applicazione binaria. Solo una domanda, è ottimale? Perché quel modo di codificare i numeri sembra uno spreco. – MaiaVictor
@Viclib: hai ragione, questo sta usando una rappresentazione numerica unaria (segni di riconoscimento) e una codifica binaria può essere migliore per formule complesse. Sarà più difficile da definire, però, e non ho intenzione di provarlo ora - è necessario assicurarsi che non entri in collisione con le stringhe di bit che rappresentano λ e l'applicazione. –