Claro, este es un ejercicio de codificación estándar.
En primer lugar, deje que cualquier función computable biyectiva, llamada función de emparejamiento. Una opción estándar esp : N2→ N
p ( n , m ) = ( n + m ) ( n + m + 1 )2+ n
Se puede demostrar que se trata de una biyección, por lo tanto, dada cualquier natural , podemos calcular tal que .n , m p ( n , m ) = kkn , mp ( n , m ) = k
Para enumerar los términos lambda, arregle cualquier enumeración para nombres de variables: .X0 0, x1, x2, ...
Luego, para cada número natural , imprima , definido recursivamente de la siguiente manera:l a m b d a ( i )yol a m b da ( i )
- si es par, dejemos que y variablej = i / 2 x jyoj = i / 2Xj
- si es impar, dejemos quej = ( i - 1 ) / 2yoj = ( i - 1 ) / 2
- si es par, deje y encuentre tal que ; calcular ; solicitud de devoluciónk = j / 2 n , m p ( n , m ) = k N = l a m b d a ( n ) , M = l a m b d a ( m ) ( N M )jk = j / 2n , mp ( n , m ) = knorte= l a m b da ( n ) , M= l a m b da ( m )( NMETRO)
- si es impar, deje y encuentre tal que ; calcular ; abstracción de retornojk = ( j - 1 ) / 2n , mp ( n , m ) = kMETRO= l a m b da ( m )( λ xnorte. METRO )
Este programa está justificado por la siguiente biyección "algebraica" que involucra el conjunto de todos los términos lambda :Λ
Λ ≃ N + ( Λ2+ N × Λ )
que se lee como "los términos lambda, sintácticamente, son la unión disjunta de 1) variables (representadas como naturales), 2) aplicaciones (hechas por dos términos lambda) y 3) abstracción (un par variable / natural + término lambda ) ".
Dado eso, aplicamos recursivamente biyecciones computables ( ) y (el estándar par / impar) para obtener el algoritmo anterior.norte2≃ NpagsN + N ≃ N
Este procedimiento es general y funcionará en casi cualquier lenguaje generado a través de una gramática libre de contexto, que proporcionará un isomorfismo similar al anterior.