2010-04-20 29 views
2

我可以定義教堂數字相當容易使用方案:如何讓教堂的數字在lisp中更具人性化?

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

然而,這並不能使它很容易認識到(f f)是0和(f(FF))爲1。有沒有一種方式,我可以讓這些數字更具可讀性?什麼是理想的是這樣的:

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

的例子是在計劃,但我會採取任何口齒不清的回答。

+5

那些不是教會的數字。你定義它的方式是'(f f)'是'f',所以'(f(f f))'是'(f f)'是'f'。 – sepp2k 2010-04-20 14:24:56

回答

9

首先讓我們來定義它具有理想的屬性,0 != 1真正教會數字:

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

所以zero爲0教會表示,1 (succ zero),2 (succ (succ zero))等。

現在,因爲這些只是函數,沒有辦法告訴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

謝謝你澄清我對教會數字的表示。 :-) – 2010-04-20 14:53:30