2010-04-20 30 views
2

Je peux définir des chiffres de l'église assez facile système utilisant:Comment puis-je rendre les chiffres d'église plus lisibles en lisp?

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

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

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

L'exemple est dans le schéma, mais je prendrai une réponse dans n'importe quel lisp.

+5

Ce ne sont pas des chiffres d'église. La façon dont vous l'avez défini, '(f f)' est 'f', donc' (f (f f)) 'est' (f f) 'est' f'. – sepp2k

Répondre

9

Tout d'abord nous allons définir des chiffres réels de l'église 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)))) 

Alors zero est la représentation de l'église de 0, (succ zero) de 1, (succ (succ zero)) de 2 et ainsi de suite. Maintenant que ce ne sont que des fonctions, il n'y a aucun moyen de dire au repl de les afficher sous forme de nombres, mais vous pouvez définir une fonction cn-to-int qui convertit les nombres-églises en entiers 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 
+0

Merci d'avoir clarifié ma représentation des chiffres de l'Église. :-) –