¿Cómo puedo hacer números legibles Iglesia más humana en Lisp?
-
28-09-2019 - |
Pregunta
Puedo definir los números de la iglesia bastante fácil de usar esquema:
> (define f (lambda (x) x))
> (f f) ;0
#<procedure:f>
> (f (f f)) ;1
#<procedure:f>
Sin embargo, esto no hace que sea muy fácil de reconocer que (f f)
es 0 y (f (f f)): 1. ¿Hay una manera que puedo hacer que estos números más legible? Lo que sería ideal es la siguiente:
> (f f)
0
> (f (f f))
1
El ejemplo es en el esquema, pero me quedo con una respuesta en cualquier Lisp.
Solución
En primer lugar vamos a definir los números reales de la iglesia que tienen la propiedad deseable que 0 != 1
:
(define zero (lambda (f x) x))
(define (succ cn) (lambda (f x) (f (cn f x))))
Así zero
es la representación de la iglesia de 0, (succ zero)
de 1, (succ (succ zero))
de 2 y así sucesivamente.
Ahora ya que son funciones sólo, no hay manera de saber de la réplica para mostrarlos como números, pero se puede definir una función-cn-a int que convierte la iglesia-números de enteros que luego se pueden mostrar con normalidad:
> (define (cn-to-int cn) (cn (lambda (x) (+ x 1)) 0))
> (cn-to-int zero)
0
> (cn-to-int (succ zero))
1
> (cn-to-int (succ (succ zero)))
2