Обчислення лямбда не здавалося абстрактним. І я не бачу сенсу в цьому


18

Основне питання:

Що робить для нас обчислення лямбда , що ми не можемо виконати основні властивості функції та позначення, як правило, вивчені в алгебрі середньої школи?

Перш за все, що означає абстрактне в контексті обчислення лямбда? Моє розуміння слова абстрактне - це те, що відокремлено від механізму, концептуального резюме поняття.

Однак лямбда-функції, усуваючи імена функцій, запобігають певному рівню абстракції. Наприклад:

f(x) = x + 2
h(x, y) = x + 5 y

Але навіть не визначаючи механізм цих функцій, ми можемо легко говорити про їх склад. Наприклад:

1. h(x, y) . f(x) . f(x) . h(x, y) or 
2. h . f . f . h

Ми можемо включити аргументи, якщо хочемо, або можемо повністю абстрагуватися, щоб дати огляд того, що відбувається. І ми можемо швидко звести їх до однієї функції. Давайте розглянемо композицію 2. У мене можуть бути деталі для учнів, які я можу написати, залежно від мого акценту:

g = h . f . f . h
g(x, y) = h(x, y) . f(x) . f(x) . h(x, y)
g(x, y) = h . f . f . h = x + 10 y + 4

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

(λuv.u(u(uv)))(λwyx.y(wyx))x

І помножити на 5y.

(λz.y(5z))

Замість того, щоб бути абстрактним, це, здається, потрапляє в саму техніку того, що означає додавати, примножувати і т. Д. Абстракція, на мій погляд, означає більш високий рівень, а не нижчий рівень.

Крім того, я намагаюся зрозуміти, чому числення лямбда - це навіть річ. У чому перевага

(λuv.u(u(uv)))(λwyx.y(wyx))x

над

h(x) = x + 5 y

або комбіноване позначення

Hxy.x+5y

або навіть позначення Хаскелла

h x y = x + 5 * y

Знову ж таки, що робить для нас обчислення лямбда, що ми не можемо виконати властивості функції f (x) -style та позначення, з якими багато хто знайомий.


9
Смішно, що ви наводите приклад з Haskell, оскільки Haskell заснований на обчисленні лямбда. Обчислення лямбда - це не про якісь конкретні позначення. Це обчислювальна модель, рівнозначна машинам Тьюрінга, в якій "все є функцією".
Yuval Filmus

2
Так, мені кажуть, що це засноване на лямбдальному обчисленні. Питання, на яке я ще не бачив відповіді так, що має для мене сенс, це те, чому haskell заснований на обчисленні лямбда, а не просто. . . основні ознаки функцій, які я засвоїв у школі класу. Це справді суть усього цього питання.
JDG

6
Хіба "жодна мета одразу не спадає на думку" майже визначенням "абстрактного"? :-)
Девід Річербі

1
Я б не сказав, що це зневажливо. Таке лікування функцій корисно за допомогою обчислення. Але я можу бачити, як можна так трактувати мітку як середню школу. Я його відрегулюю.
JDG

6
Я сумніваюся, що ви насправді маєте офіційне визначення поняття "функція середньої школи з алгебри". Якщо у вас є якесь визначення для таких функцій, це, мабуть, теоретичний набір, який не має обчислювального значення. Частина сенсу обчислення лямбда - це розуміння такої позначення на власних термінах, і, смію це сказати, абстрагуватися від конкретних застосувань, таких як функції поліномів або обчислення.
Дерек Елкінс виїхав

Відповіді:


24

Існує багато причин, чому обчислення лямбда так важливо.

Дуже важливою причиною є те, що обчислення лямбда дозволяє нам мати модель обчислення, в якій обчислювальні функції є громадянами першого класу.

Неможливо виразити функції вищого порядку мовою алгебри середньої школи.

Візьмемо для прикладу лямбдаський вираз

λf.λг.λх.f(г(х))

Цей простий вираз показує нам, що всередині обчислення лямбда композиція функції сама є функцією. У алгебрі середньої школи це не легко виразити.

Під час обчислення лямбда дуже легко виразити, що функція поверне функцію як результат.

Ось невеликий приклад. Вираз (де я тут припускаю застосовуване обчислення лямбда з додаванням і цілими константами)

(λf.λг.λх.f((г(х)))(λх.х+2)

зменшиться до

λг.λх.г(х)+2

Зауважте також, що в межах обчислення лямбда функції є виразами, а не визначеннями форми . Це звільняє нас від необхідності називати функції та розрізняти синтаксичну категорію виразів та синтаксичну категорію визначень.f(х)=е

Крім того, коли стає неможливо (або просто помітно громіздко) виражати функції вищого порядку, виникатимуть також проблеми з присвоєнням типів виразам.

Функціональний склад має поліморфний тип

α.β.γ.(βγ)((αβ)γ)

в системі типу Хіндлі-Мілнера.

Дуже сильною продажною точкою обчислення лямбда є точне поняття введеного лямбда-числення . Системи різних типів для функціональних мов програмування, такі як Haskell та сімейство ML, базуються на системах типів для лямбда-обчислень, і ці системи типів забезпечують міцні гарантії у вигляді математичних теорем:

Якщо програма добре набрана і e зменшена до залишкового e ' , то e ' також буде добре набрана.eeee

І якщо добре введено, то певні помилки e не матимуть.ee

Докази в вигляді програм листування особливо примітна. Ізоморфізм Керрі-Говарда (див., Наприклад, https://www.rocq.inria.fr/semdoc/Presentations/20150217_PierreMariePedrot.pdf ) показує, що існує дуже точне відповідність між просто введеним читанням лямбда та інтуїтивної логікою пропозиції: кожному типу відповідає логічній формулі ф T . Доказ ϕ T відповідає лямбда-терміну з типом T , а бета-скорочення цього терміна відповідає виконанню зрізання в доказуванні.TϕTϕTT

Я закликаю тих, хто вважає, що алгебра середньої школи є гарною альтернативою лямбда-числення, щоб розробити виклад поліморфно типової алгебри середньої школи разом з відповідним поняттям ізоморфізму Кері-Говарда. Якщо ви навіть можете розробити інтерактивного помічника доказів на основі алгебри середньої школи, який би дозволив нам довести багато теорем, які були формалізовані за допомогою асистентів доказів на основі обчислення лямбда, таких як Кок та Ізабель, це було б ще краще. Тоді я б почав використовувати алгебру середньої школи, і так, я впевнений, би багато інших зі мною.


Це чудове пояснення. Корисно почути, що функції вищого порядку (як композиція) та набір тексту краще представлені в обчисленні лямбда, є обнадійливим, тим більше, що це полегшує докази та підтверджуваний код. Я не бачу наслідків того, що ви згадали, і чому традиційне позначення є неадекватним (наприклад, про те, що не потрібен синтаксис окремого визначення f (x) = e), проте корисно, щоб ви назвали деякі з цих причин і це дає уявлення про те, які області покращуються за рахунок лямбдального числення.
JDG

Звичайно, можна ввести місцеві визначення форми, але вони вже можуть бути виражені в синтаксисі лямбдального числення як ( λ x . e ) e . Обчислення лямбда дозволяє нам виражати функції, не називаючи їх, так само, як можна (в алгебрі середньої школи!) Говорити про число 4, не називаючи їх якоюсь змінною. дозволятих=е'ве(λх.е)е'4
Ганс Гюттель

5

Коли функції вперше описані молоддю, вони по суті ідентифікуються з графіками (графіками) або, можливо, з формулами; саме так історичні функції розумілися до появи формалістичних течій у математиці. В даний час функції, як описано в перший рік обчислення, є речові функції, тобто, функції від до R .RR

Функції в лямбдальному обчисленні набагато загальніші. Точне визначення залежить від того, чи введено чи введено лямбда-числення. У чистому нетиповому обчисленні лямбда все є функцією. Це набагато загальніше, ніж реальні функції числення.

Навіть процедурні мови інколи використовують ідеї обчислення лямбда. Функція сортування в C приймає в якості параметра порівняльну функцію , яку вона використовує для порівняння елементів. Обчислення лямбда йде набагато далі - функції не тільки приймають функції як входи, але й можуть виводити їх.

Обчислення лямбда - це модель обчислювальної еквівалентної потужності машинам Тьюрінга. Це повна система для себе. Чистий лямбда-числення не має "5" або "+" як примітивних термінів - їх можна визначити всередині числення, як і "5" і "+" - не примітиви теорії множин. (Практичні мови програмування реалізовують природні числа на самому рівні з метою ефективності.)

Я підозрюю, що однією з причин того, що вас не вражає лямбда-числення, є те, що його ідеї так сильно пронизали дискурс програмування, що він більше не виглядає новаторським.


"Я підозрюю, що одна з причин того, що вас не вражає лямбда-числення". Терін полягає в питанні, яке я задаю: Що робить для нас обчислення лямбда? Іншими словами, коли ми не використовуємо лямбдальне обчислення, що відбувається. Коли ми використовуємо обчислення лямбда, що ми отримуємо? Якщо обчислення лямбда вперше думали люди, що робити, якщо функції можуть самі створювати функції, то це вражає? Серед моїх початкових програм python було зроблено текст, що містить функції, які я згодом оцінив, подібно до делегування завдання прийняття рішень пральникові. Здається, очевидним?
JDG

це було до того, як я багато чого знав. Мені просто здалося, що код дратує вводити знову і знову, і програмування повинно допомогти мені автоматично генерувати функціональність, включаючи самі функції.
JDG

2
Python підтримує функціональне програмування. Перші мови програмування не зробили. Якби ви програмували в FORTRAN, ви б не створили програми з текстом, що містять функції, які ви згодом оцінили. Навіть не помічаючи цього, ви скористалися можливостями, наданими ідеями з обчислення лямбда.
Yuval Filmus

2
Евал зародився в LISP , на який сильно вплинуло числення лямбда. Щось подібне неможливо в FORTRAN, C, COBOL та багатьох інших мовах програмування.
Yuval Filmus

Так, python підтримує функціональне програмування --- але я не впевнений, що його здатність eval () надихнула λCalc --- ви не λCalc думати: я хочу автоматично генерувати код, який я можу оцінити пізніше. Це як би сказати λCalc потрібно думати: "Я скажу Міранді, щоб вона найкраще оцінила, як управляти своїм відділом" --- іншими словами, отримуючи функцію для створення власних функцій. Вам не потрібно λCalc думати про делегування завдань високого рівня. Якщо ви хочете поговорити про черпання натхнення з λCalc, то більш доречним буде вказівка ​​на функції лямбда, розуміння тощо
JDG

4

x2xx2

λx.x2x2

ff(x)=x2f

Використання лямбда-виразів у мовах програмування має аналогічну перевагу; ви можете написати те, що функція виконує саме там, де це потрібно, а не потрібно визначати зовсім нову функцію в іншому місці вашої програми.

Ви навіть можете бачити лямбда-абстракцію, неявну математиці; наприклад, учням викладається лише навчання про похідніddxx2ddxx2


θ:VV

θ(v)(f)=f(v)

Багато людей вважають це позначення подвійної оцінки заплутаним та / або неспокійним, а також це рекурсивне використання точкового визначення функції. Версія абстракції лямбда

θ=λv.λf.f(v)

не має такої проблеми.


Нарешті, існує теорема про абстрактну нісенітницю, що "просто набране лямбда-числення" - це в основному те саме, що і "декартова закрита категорія" - так що якщо ви коли-небудь захочете зробити розрахунок у декартовій закритій категорії, це, мабуть, хороша ідея просто набрали обчислення лямбда, щоб зробити це.


Я повертаюся до цього питання і вважаю цю відповідь чудовою. Дякую. Відповіді тут взагалі справді цікаві.
JDG

4

Я скажу попереду, що я не фахівець з цієї теми, але я просто витратив трохи часу на її вивчення, і одна з найчарівніших речей для мене в будь-якій темі - це історія, що стоїть за нею. Тож мені розуміння трохи історії, що стоїть за обчисленням лямбда, допомагає пояснити, чому це корисно.

Короткий підсумок полягає в тому, що на початку 1900-х років після того, як теорія множин почала зніматися, а математика була переосмислена на основі множин, деякі математики помітили, що хоча визначення теорії множин дозволяє стверджувати, що певна структура існує, вони не розповідають вам, як побудувати його та обчислити. Тож множинно-теоретичні визначення неконструктивні . Математики почали цікавитись, чи існує спосіб розробити конструктивні визначення, які виходять за рамки доведення того, що щось є і натомість довести, як це є .

З Вікіпедії :

У математиці конструктивне доведення - це метод доказування, який демонструє існування математичного об’єкта шляхом створення або надання методу створення об'єкта. Це на відміну від неконструктивного доказу (також відомого як доказ існування або чистої теореми існування), який доводить існування певного виду об'єкта без надання прикладу.

Тоді було показано, що обчислення лямбда та машина Тьюрінга можуть представляти будь-яку обчислювальну функцію і, таким чином, є рівнозначною.

В теорії будь-яка математична функція або поняття може бути закодована у формі обчислення лямбда та обчислена. Це означає, що обчислення лямбда може бути абсолютно окремою основою для математики, хоча і, очевидно, надзвичайно виснажливою.

Обчислення лямбда не "корисне" в тому сенсі, що ви не збираєтеся писати код за допомогою нього, але це є основою для денотаційної семантики, яка використовується для опису програм та їх динамічних ефектів. Це використовується в обговоренні коректності програми та смислового значення. Це також, очевидно, сильно вплинуло на розвиток функціональних мов програмування, які черпають всю свою концепцію виконання з обчислення лямбда.

Сподіваюся, що це допомагає.

Редагувати, щоб додати: Мене щойно вказували на цей документ, що показує взаємозв'язок між топологією, лямбдальним численням і фізикою. Коротко подумавши над цим, я натрапив на це фантастичне твердження:

Хоча машину Тьюрінга можна розглядати як ідеалізовану, спрощену модель апаратного забезпечення комп'ютера , обчислення лямбда більше нагадує просту модель програмного забезпечення . ... Поетично числення лямбда описує всесвіт, де все є програмою, і все є даними: програми - це дані .

Справа в тому, що обчислення лямбда - це ідеалізована модель обчислення програмного забезпечення, і як така не пов'язана з конкретною реалізацією в будь-якій мові програмування. Він моделює чисті обчислення .


Детальніше про історію: Коротка історія λ-числення в Стенфордській енциклопедії філософії. У них більше записів, ніж можна обробити за все життя.
Девід Тонхофер


3

Обчислення лямбда не розраховане на мову програмування. Дійсно, він був створений у 1930-х роках, десятиліттями, перш ніж у нас навіть були програмовані комп’ютери. Швидше, вона була створена як формальна модель для вивчення обчислень, сама. Якщо ви розчаровані в тому, як легко він виражає код або математичні функції, це тому, що це не для чого.


1
"десятиліттями, перш ніж ми навіть мали програмовані комп'ютери" - неправильно. Програмований комп’ютер існував і раніше (якщо можливо, не універсальний), а перші універсальні комп'ютери були побудовані протягом 1930-х років.
Рафаель

-2

Обчислення лямбда існує для створення анонімних (також лямбда) функцій. Якщо ви не позбавитесь від імен функцій, то простір імен може захаращуватись, а також доступні імена функцій. Це особливо важливо при роботі з так званими "функціями вищого порядку", які повертають функції (або функціональні вказівники) з зрозумілих причин.

По суті, лямбда-функції еквівалентні локально зміненим змінним. Функціональне програмування без лямбда-функцій аналогічне процедурному програмуванню без будь-яких локальних змінних, тобто жахлива ідея.

"чому обчислення лямбда - це навіть річ", математики люблять надмірність. обчислення лямбда рідко використовується в математиці, оскільки, як ви виявили, позначення не дуже корисні.

"Якщо ви навіть можете розробити інтерактивного помічника доказу на основі алгебри середньої школи, який би дозволив нам довести багато теорем, які були формалізовані за допомогою асистентів доказів на основі обчислення лямбда, таких як Кок та Ізабел, це було б ще краще. потім почніть використовувати алгебру середньої школи, і так, я впевнений, було б багато інших зі мною ". Ви чули про метамату? Жодне лямбда-числення, яке там бере участь, не може довести багато теорем coq / isabelle


Окрім деяких думок, що пропонує ця відповідь?
Рафаель

@Рафаель Дезінформація. Більшість цієї відповіді навіть не має сенсу. Імен не бракує. "Функції лямбда" не є еквівалентними змінним локально; це навіть не має сенсу. Я припускаю, що це покликане посилатися let, але, хоча letможна кодувати анонімними функціями, ви явно не можете піти іншим шляхом. Функціональне програмування не вимагає "лямбда-функцій", наприклад, Backus ' FP або Sisal .
Дерек Елкінс пішов

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