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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top