Come posso fare numeri Chiesa più leggibile in Lisp?
-
28-09-2019 - |
Domanda
posso definire numeri chiesa abbastanza facile utilizzando schema:
> (define f (lambda (x) x))
> (f f) ;0
#<procedure:f>
> (f (f f)) ;1
#<procedure:f>
Tuttavia, questo non lo rende molto facile da riconoscere che (f f)
è 0 e (f (f f)) è 1. C'è un modo che io possa fare questi numeri più leggibile? Quale sarebbe l'ideale è questa:
> (f f)
0
> (f (f f))
1
L'esempio è in programma, ma mi prendo una risposta in qualsiasi Lisp.
Soluzione
Per prima cosa definiamo numeri reali della chiesa che hanno la proprietà auspicabile che 0 != 1
:
(define zero (lambda (f x) x))
(define (succ cn) (lambda (f x) (f (cn f x))))
Quindi zero
è la rappresentazione chiesa di 0, (succ zero)
di 1, (succ (succ zero))
di 2 e così via.
Ora, poiché questi sono solo le funzioni, non v'è alcun modo per dire al repl di visualizzarli come numeri, ma è possibile definire una funzione cn-to-int che converte chiesa-numeri di interi che possono poi essere visualizzati normalmente:
> (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