2010-04-20 4 views
2

можно определить Чёрч довольно легко с помощью схема:Как я могу сделать число в церкви более читаемым человеком в lisp?

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

Однако это не делает его очень легко распознать, что (f f) является 0 и (е (Н)) равен 1. Есть ли способ, что Я могу сделать эти цифры более удобочитаемыми? Что было бы идеальным:

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

Пример приведен в схеме, но я отвечу на любой вопрос.

+5

Это не церковные цифры. То, как вы его определили, '(f f)' is 'f', поэтому' (f (f f)) 'is' (f f) 'is' f'. – sepp2k

ответ

9

Прежде всего, давайте определим реальные церковные цифры, которые имеют желательное свойство, что 0 != 1:

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

Так zero является церковь представление 0, (succ zero) от 1, (succ (succ zero)) 2 и так далее.

Теперь, поскольку эти функции являются просто функциями, нельзя сказать, что repl отображает их как числа, но вы можете определить функцию cn-to-int, которая преобразует число символов в ячейки, которое затем может отображаться нормально:

> (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

Благодарим вас за разъяснение моего представления церковных цифр. :-) –