я определил Чёрч ноль и некоторые другие стандартные функции на Чёрче в соответствии с определениями Википедии следующим образом:рекурсия для церковных числительных в схеме
(define n0 (λ (f x) x))
(define newtrue
(λ(m n) m))
(define newfalse
(λ(m n) n))
(define iszero
(λ(m) (m (λ(x) newfalse) newtrue)))
(define ifthenelse
(λ(a b c) (a b c)))
С их помощью я пишу цикл рекурсии как:
(((λ(r) (λ(n) (ifthenelse (iszero n) n ((r r) n))))
(λ(r) (λ(n) (ifthenelse (iszero n) n ((r r) n))))) n0)
Теперь для аргумента n0
, как указано выше, это должно возвращать n0
, не вдаваясь в рекурсию. Но это не так. Зачем?
Примечание 1: Этот цикл рекурсия отлично работает с обычными цифрами и простыми функциями:
(((λ(r) (λ(n) (if (= 0 n) n ((r r) n))))
(λ(r) (λ(n) (if (= 0 n) n ((r r) n))))) 0)
Это возвращает 0
, как это должно быть.
Примечание 2: Функции ifthenelse
, iszero
, newtrue
, newfalse
также работают нормально самостоятельно.
Можете ли вы предложить, как сделать мою работу 'ifthenelse' обычной, если? – user5284834
Правила оценки языков Lisp не полностью эквивалентны правилам бета-сокращения лямбда-исчисления, поэтому то, что вы пытаетесь сделать, невозможно, поскольку я знаю. – Renzo
Ура! Был в состоянии сделать это, используя ленивую функцию оценки схемы. – user5284834