Question

Je peux définir des chiffres de l'église en utilisant assez facile schéma:

> (define f (lambda (x) x))
> (f f) ;0
#<procedure:f>
> (f (f f)) ;1
#<procedure:f>

Cependant, cela ne permet pas de reconnaître très facile que (f f) est 0 et (f (f f)) est 1. Est-il possible que je puisse rendre ces chiffres plus lisibles? Ce qui serait idéal est le suivant:

> (f f)
0
> (f (f f))
1

L'exemple est dans le schéma, mais je vais prendre une réponse dans une Lisp.

Était-ce utile?

La solution

Tout d'abord nous allons définir les chiffres de l'église réels qui ont la propriété souhaitable que 0 != 1:

(define zero (lambda (f x) x))
(define (succ cn) (lambda (f x) (f (cn f x))))

zero est la représentation de l'église de 0, (succ zero) de 1, (succ (succ zero)) de 2 et ainsi de suite.

Maintenant, puisque ce sont des fonctions seulement, il n'y a aucun moyen de dire le rempl pour les afficher sous forme de nombres, mais vous pouvez définir une fonction cn-à-int qui convertit les chiffres-église à ints qui peuvent ensuite être affichés normalement:

> (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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top