Оценка исчисления лямбда с участием церковных цифр

cs.stackexchange https://cs.stackexchange.com/questions/1259

  •  16-10-2019
  •  | 
  •  

Вопрос

Я понимаю, что Церковное число $ c_n $ выглядит как $ lambda s. lambda z. S $ (... n Times ...) $ s ; z $. Это означает не что иное, как «функция $ s $ применила $ n $ times к функции $ z $».

Возможное определение функции $ mathtt {times} $ является следующим: $ mathtt {times} = lambda m. lambda n. lambda s. М; (n ; s) $. Глядя на тело, я понимаю логику, стоящую за функцией. Однако, когда я начинаю оцениваться, я застрял. Я проиллюстрирую это примером:

$$ begin {align*} ( lambda m. lambda n. lambda s. m ; (n ; s)) ( lambda s. lambda zs ; s ; z) ( lambda s. . lambda zs ; s ; s ; z) mspace {-4em} to^*& rambda s. ( lambda s. lambda zs ; s ; z) ; (( lambda s. lambda zs ; s ; s ; z) ; s)) to^*& rambda s. ( lambda s. lambda zs ; s ; z) ; ( lambda zs ; s ; s ; z) to^*& lambda s. lambda z. ( lambda zs ; s ; s ; z) ; ( lambda zs ; s ; s ; z) ; z end {Align*} $$

Теперь в этой ситуации, если я впервые применяю $ ( lambda zs ; s ; s ; z) ; z $, я получаю желаемый результат. Однако, если я применяю $ ( lambda zs ; s ; s ; z) ; ( lambda zs ; s ; s ; z) $ сначала, как я должен, потому что заявление ассоциативно слева Я получаю неправильный результат:

$ lambda s. lambda z. ( lambda zs ; s ; s ; z) ; ( lambda zs ; s ; s ; z) ; z to lambda s. lambda z. (s ; s ; s ; ( lambda zs ; s ; s ; z)) ; ; z $

Я больше не могу это уменьшить. Что я делаю не так? Результат должен быть $ лямбда с. lambda zs ; s ; s ; s ; s ; s ; z $

Это было полезно?

Решение

Я думаю, что ваше сокращение верно (хотя я только гладил его, хотя). В конце концов, вы не можете применить $ ( lambda z. Sssz) $ к $ z $, это никогда не появляется в термин. $ lambda z. ffz $ - это $ lambda z. (ff) z $, а не $ lambda z. f (fz) $. Функции в лямбда-калькулусе принимают один аргумент; они эффективно карри: Функция с двумя аргументами реализована как функция одного аргумента, которая принимает первый аргумент и возвращает новую функцию с одним аргументом, которая берет второй аргумент и возвращает результат.

Вы совершили ту же ошибку при определении цифр церкви. Церковное число для $ n $ основана на составлении функции $ n $ times. «Функция $ s $ применяла $ n $ times к функции $ z $» $ lambda s. lambda z. s (s (… s : z)…)) $. То, что вы написали,-это функция $ S $ Applied $ N-1 $ Times к функции $ S $ и, наконец, к $ Z $, что не затрагивает меня как полезный термин.

$ 2 times 3 $, таким образом, $ ( lambda mn s. M (ns)) ( lambda s z. S (s : z)) ( lambda s z. S (s : z)))) $. Я позволю вам проверить, что это уменьшается до $ lambda s z. s (s (s (s (s (s : z)))) $.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с cs.stackexchange
scroll top