Как я могу сделать церковные цифры более человеческими читаемыми в Лисске?

StackOverflow https://stackoverflow.com/questions/2675566

Вопрос

Я могу определить церковные цифры справедливо легко использовать схему:

> (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 и так далее.

Сейчас, поскольку это просто функции, нет способа рассказать The ReP, чтобы отобразить их в виде номеров, но вы можете определить функцию Cn-to-int, которая преобразует церковные цифры для 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top