LISPで教会の数字をより人間の読みやすくするにはどうすればよいですか?
-
28-09-2019 - |
質問
スキームを使用して、教会の数字をかなり簡単に定義できます。
> (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
例はスキームにありますが、どんなLISPでも答えを出します。
解決
まず、望ましい特性を持つ本物の教会数字を定義しましょう 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に数値として表示するように指示する方法はありませんが、教会数を普通に表示できる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
所属していません StackOverflow