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


10

Я розумію, що церковна цифра виглядає як (... n разів ...) . Це означає не що інше, як "функція застосована разів до функції ". λ s . λ z . s scnλs.λz.ss n zszsnz

Можливе визначення функції таке: . Дивлячись на тіло, я розумію логіку функції. Однак, коли я починаю оцінювати, я застрягаю. Я проілюструю це прикладом:t i m e s = λ m . λ n . λ s . мtimestimes=λm.λn.λs.m(ns)

(λm.λn.λs.m(ns))(λs.λz.ssz)(λs.λz.sssz)λs.(λs.λz.ssz)((λs.λz.sssz)s))λs.(λs.λz.ssz)(λz.sssz)λs.λz.(λz.sssz)(λz.sssz)z

Тепер у цій ситуації, якщо я вперше застосую , я дістанусь до бажаного результату. Однак якщо я застосую перше, як слід, тому що програма асоціативна зліва, я отримую неправильний результат:( λ z . s(λz.sssz)z(λz.sssz)(λz.sssz)

λs.λz.(λz.sssz)(λz.sssz)zλs.λz.(sss(λz.sssz))z

Я більше не можу цього зменшити. Що я роблю неправильно? Результат повинен бутиλs.λz.ssssssz


Церковні цифри у вашому початковому терміні неправильні. 2 представлено , не . λ s . λ z . s s zλs.λz.s(sz)λs.λz.ssz
Удай Редді

Відповіді:


7

Я думаю, що ваше зменшення є правильним (однак я лише привернув увагу). Зрештою, ви не можете застосувати до , це ніколи не з’являється в терміні. є , не . Функції лямбда-числення приймають єдиний аргумент; вони фактично викриваються : двоаргументаційна функція реалізована як функція з одним аргументом, яка приймає перший аргумент і повертає нову функцію з одним аргументом, яка приймає другий аргумент і повертає результат.z λ z . f f z λ z . ( f f ) z λ z . f ( f z )(λz.sssz)zλz.ffzλz.(ff)zλz.f(fz)

Ви зробили таку ж помилку, визначаючи церковні цифри. Церковна цифра для заснована на складанні функції разів. “Функція застосовується разів до функції ” . Те, що ви написали, - це функція застосована разів до функції і нарешті до , що не вважає мене корисним терміном.n s n z λ s . λ z . s ( s ( snnsnzs n - 1 s zλs.λz.s(s(sz)))sn1sz

( λ m n s . M ( n s ) ) ( λ s z . S ( s2×3 таким чином . Я дозволю вам перевірити, чи він зменшується до .λ s z . s ( s ( s ( s ( s ( s)(λmns.m(ns))(λsz.s(sz))(λsz.s(s(sz)))λsz.s(s(s(s(s(sz)))))


Що стосується вашого абзацу, ви маєте рацію, і я про це знав. Мене просто вразило, що застосування правильно асоціативного результату дало правильний результат. Що стосується другого абзацу: ви праві. Використання жодних брекетів не було для мене помилковим, знову ж таки через ліву асоціативність програми. Я зараз знову все зменшу і побачу, чи мою відсутність брекетів спричинила моя помилка!
codd

Це було. Ви зазначаєте, що моє позначення передбачає неправильний порядок застосування рішення, що вирішило проблему! Приймаючи вашу відповідь.
codd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.