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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top