Чому для обчислення лямбда важливо, щоб функції були анонімними?


19

Я дивився лекцію Джима Вейріха під назвою « Пригоди у функціональному програмуванні ». У цій лекції він вводить концепцію Y-комбінаторів, яка по суті знаходить фіксовану точку для функцій вищого порядку.

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

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

n(x,y)=x+y

не може носити ім'я ' ', воно повинно бути визначено анонімно:n

(x,y)x+y

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


4
Це зовсім не важливо. Ви можете призначити змінної і тоді ви вказали ім'я функції. n(x,t)x+yn
Yuval Filmus

@YuvalFilmus так, ви можете прив’язати ім'я до функції. Я думаю, що справжнє питання, головоломка, полягає в тому, чому (в обчисленні лямбда) не може функція називати себе таким іменем? Для чого нам потрібна така техніка, як оператор Y, щоб виконувати рекурсивні функції? Я сподіваюся, що моя відповідь нижче допоможе.
Джеррі101

1
@ Jerry101 Історична причина відсутності самозастосування полягає в тому, що -calculus мав бути основою математики, а здатність самостійно застосовувати робить такий фундамент негайно непослідовним. Тож ця очевидна нездатність (яку ми тепер знаємо, можна обійти) - особливість дизайну -calculus. λλλ
Мартін Бергер

@MartinBerger, будь ласка, скажіть більше. Невідповідність причини в моїй відповіді? Або з іншої причини?
Джеррі101

1
@ Jerry101 Невідповідний в тому сенсі, що можна довести 0 = 1 в такому фундаменті математики. Після Кліні і Россер показав неспроможність чисто, Нетипізовані -ісчісленія, то просто-типізованих -ісчісленія був розроблений в якості альтернативи , яка не дозволяє нам визначити фікс-точкові combintors , такі як . Але якщо додати рекурсію до просто набраного -calculus, вона знову стає непослідовною, оскільки кожен тип населений програмою, що не закінчується. λ Y λλλYλ
Мартін Бергер

Відповіді:


24

Основна теорема щодо цього питання пояснюється британським математиком з кінця 16 століття під назвою Вільямом Шекспіром . Його найвідоміший документ на цю тему під назвою « Ромео і Джульєтта » був опублікований у 1597 році, хоча дослідницька робота проводилася на кілька років раніше, надихаючи таких попередників, як Артур Брук та Вільям Пейтер.

Його головний результат, зазначений у акті II. Сцена II - відома теорема :

Що в імені? те, що ми називаємо трояндою
Будь-яке інше ім’я пахло б як солодке;

Цю теорему можна інтуїтивно зрозуміти як "імена не сприяють змісту".

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

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

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

Цей головний результат Шекспіра також показує, що наука тоді відходила від магії та релігії, де істота чи сенс можуть мати справжнє ім'я .

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

Примітка .
Це питання було порушено американською логікою 20 століття Гертрудою Штейн . Однак її колеги-математики все ще розмірковують про точні технічні наслідки її основної теореми :

Роза - троянда - троянда - троянда.

опублікований у 1913 р. у короткому повідомленні під назвою «Священна Емілія».


3
Додаткове зауваження: В останні десятиліття "троянда" (в галузі інформатики) здебільшого була замінена на "foobar" (та його частини) як канонічний приклад для імені, яке так само добре, як і будь-яке інше. Цю перевагу, очевидно, запровадили американські залізничні інженери.
FrankW

Однак, канонічні назви часто використовуваних понять важливі для ефективної комунікації.
Рафаель

1
@ Рапхаель погодився, але я б сказав про це в категорії повсякденного життя. І як ми знаємо межі того, що є насправді канонічним? Тим не менш, я часто відчуваю стурбованість, коли бачу студентів, які приймають усі термінології, позначення та визначення (або навіть те, як викладені деякі теореми) за дану Богом незмінну істину. Навіть тут, на SE, студенти задають питання, не розуміючи, що ми можемо не знати їх позначень чи визначень, які вони використовують у класі. Магія справжніх імен не вмирає легко.
бабу

10

λλπνx.Pπ

λλλ

letf=MinN(λf.N)Mλ


1
Я думаю, що ОП хотіла можливості називати функції, а не забороняти анонімні. Сказавши це, я думаю, що будь-яка вимога λ-обчислення щодо необхідності анонімних функцій відображатиметься також на таких мовах, як Lisp / Scheme або ML. У випадку з Lisp / Scheme, метациркулярність оцінювачів повинна дозволяти створювати нові імена за необхідності, хоча я не впевнений, що хотів би цього зробити в офіційній системі. Використання необмеженої кількості функцій не обов'язково є проблемою, коли рекурсія дозволяє локальне повторно використовувати вже використані імена.
бабу

λλ

Чи повинен читати останній рядок (лямбда f. N) M?
Джо Персона

@JoethePerson Так, добре помічений. Виправлено. Спасибі.
Мартін Бергер

4

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

Ви можете думати про лямбда-числення, як мову мовлення. Хтось у лекції про складання може сказати: "Немає об'єктно-орієнтованих дерев спадкування мовою асемблера". Тоді ви можете придумати розумний спосіб впровадження дерев спадкування, але це не в цьому. Справа в тому, що дерева успадкування не потрібні на самому базовому рівні того, як програмується фізичний комп'ютер.

У обчисленні лямбда справа в тому, що для опису алгоритму на самому базовому рівні не потрібно імен.


4

Мені тут подобаються 3 відповіді - особливо це стосується Шекспіренського аналізу @ babou - але вони не проливають світла на те, що я вважаю сутністю питання.

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

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

(У чистому Lisp прив'язка до назви функції> не входить в тіло функції функції. Щоб функція називала себе своїм ім'ям, функція повинна посилатися на середовище, яке посилається на функцію. У чистого Lisp немає циклічні структури даних. Незрозумілий Лісп робить це шляхом вимкнення середовища, на яке посилається функція.)

Як зазначав @MartinBerger, історичною причиною того, що λ-числення не дозволяє функція називати себе по імені, була спроба виключити парадокс Каррі при спробі використання λ-обчислення як основи математики, включаючи дедуктивну логіку. Це не спрацювало, оскільки такі методи, як комбінатор Y, дозволяють рекурсію навіть без самонаправлення.

З Вікіпедії:

Якщо ми можемо визначити функцію , r = (λ.x x x ⇒ y)то r r = (r r ⇒ y).

Якщо r rце правда, то yце правда. Якщо r rнеправда, то r r ⇒ yце правда, що є протиріччям. Так yвірно, і як це yможе бути будь-яке твердження, будь-яке твердження може бути доведеним істинним.

r r- це обчислення без закінчення. Розглянута як логіка r r- це вираз для значення, яке не існує.


λ.x xxxxx

@RohanPrabhu λ.x x xперекладається на Lisp як (lambda (x) (x x))і на JavaScript як function (x) {return x(x);}. x⇒yзасоби x implies y, приблизно те саме, що (NOT x) OR y. Дивіться en.wikipedia.org/wiki/Lambda_calculus
Jerry101

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