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

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

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

Однако это не позволяет легко распознать, что (f f) равно 0, а (f (f f)) равно 1. Можно ли сделать эти числа более читабельными? Что было бы идеально, так это:

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

Пример на схеме, но я возьму ответ на любой шепелявости.


person Jason Baker    schedule 20.04.2010    source источник
comment
Это не церковные числительные. Как вы это определили, (f f) это f, поэтому (f (f f)) это (f f) это f.   -  person sepp2k    schedule 20.04.2010


Ответы (1)


Сначала давайте определим настоящие церковные числительные, обладающие желательным свойством 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 отображать их как числа, но вы можете определить функцию 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
person sepp2k    schedule 20.04.2010
comment
Спасибо за разъяснение моего представления числительных Черча. :-) - person Jason Baker; 20.04.2010