Это должно быть довольно легко вычесть, используя как причину, так и модель замещения.
Причина:
(double double)
Это похоже на двойной, но двойной, на четыре группы. При применении с функцией эта функция будет применяться 4 раза.
(double (double double))
Это двойная четверка. Результат четырехугольника будет четырехугольным, делая его 4 * 4. При применении с функцией это будет применяться 16 раз.
(double (double (double double)))
Это удваивает предыдущий. Затем снова то же самое. 16 * 16 позволяет применить результат 256 раз.
Таким образом, (double double)
- это 2^2
, (double (double double))
- это (2^2)^2
, а (double (double (double double)))
- это ((2^2)^2)^2
или 2^8
для краткости.
Это относится к лямбда-исчислению, где мощность определяется как λb.λe.e b
или (lambda (b) (lambda (e) (e b))
. Теперь double
является церковной цифрой для 2
. Вы видите, что вы делаете ((2^2)^2)^2
?
Замена
Вот сокращенные выражения. Я иногда прыгаю шаги позже, потому что это почти то же самое, что происходит несколько раз.
((double inc) 5) ; ==>
((lambda (y) (inc (inc y))) 5) ; ==>
(inc (inc 5)) ; ==> 7
(((double double) inc) 5) ; ==>
(((lambda (y) (double (double y))) inc) 5) ; ==>
(((lambda (y) (double (double y))) inc) 5) ; ==>
((double (double inc)) 5) ; ==>
((double (lambda (y) (inc (inc y)))) 5) ; ==>
((lambda (y) ((lambda (y) (inc (inc y))) ((lambda (y) (inc (inc y))) y))) 5) ; ==>
((lambda (y) (inc (inc (inc (inc y))))) 5) ; ==>
(inc (inc (inc (inc 5)))) ; ==> 9
(((double (double double)) inc) 5) ; ==>
(((double (lambda (y) (double (double y)))) inc) 5) ; ==>
(((lambda (y) ((lambda (y) (double (double y))) ((lambda (y) (double (double y))) y))) inc) 5) ; ==>
(((lambda (y) (double (double (double (double y))))) inc) 5) ; ==>
((double (double (double (lambda (y) (inc (inc y)))))) 5) ; ==>
((double (double (lambda (y) (inc (inc (inc (inc y))))))) 5) ; ==>
(inc (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc (inc 5)))))))))))))))) ; ==> 21
Я оставлю последнее как упражнение.