Как я могу сделать церковные цифры более человеческими читаемыми в Лисске?
-
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 и так далее.
Сейчас, поскольку это просто функции, нет способа рассказать 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
Не связан с StackOverflow