2

スキームを使用して、教会の数字をかなり簡単に定義できます。

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

ただし、これでは、 が 0 で (f (ff)) が 1 であることを簡単に認識できません(f f)。これらの数字を読みやすくする方法はありますか? 理想的なのは次のとおりです。

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

例はスキームにありますが、私は任意のリスプで答えます。

4

1 に答える 1

9

まず、次の望ましい特性を持つ実際の教会の数字を定義しましょう0 != 1

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

0、1、2などのzero教会表現も同様です。(succ zero)(succ (succ zero))

これらは単なる関数であるため、repl に数値として表示するように指示する方法はありませんが、教会の数値を int に変換する関数 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
于 2010-04-20T14:45:55.530 に答える