Comment puis-je faire Église plus humaine chiffres lisibles à Lisp?
-
28-09-2019 - |
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.
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