Я работаю через SICP, а проблема 2.6 поставила меня в нечто затруднительное. В обращении с числами Церкви понятие кодирования нуля и 1 как произвольных функций, которые удовлетворяют определенным аксиомам, кажется, имеет смысл. Кроме того, получение прямой формулировки отдельных чисел с использованием определения нуля, и функция add-1 имеет смысл. Я не понимаю, как может быть создан оператор плюс.
До сих пор я это имел.
(define zero (lambda (f) (lambda (x) x)))
(define (add-1 n)
(lambda (f) (lambda (x) (f ((n f) x)))))
(define one (lambda (f) (lambda (x) (f x))))
(define two (lambda (f) (lambda (x) (f (f x)))))
Просматривая запись wikipedia для lambda calculus, я обнаружил, что определение плюса было PLUS: = λmnfx.m f (n f x). Используя это определение, я смог сформулировать следующую процедуру.
(define (plus n m)
(lambda (f) (lambda (x) ((m f) ((n f) x)))))
То, что я не понимаю, заключается в том, как эта процедура может быть получена напрямую, используя только информацию, предоставленную ранее полученными процедурами. Может ли кто-нибудь ответить на это в какой-то строгой доказательной форме? Интуитивно я думаю, что я понимаю, что происходит, но как однажды сказал Ричард Фейнман: "Если я не смогу его построить, я не могу этого понять..."