Mengapa penting untuk fungsi anonim dalam kalkulus lambda?


19

Saya menonton ceramah oleh Jim Weirich, berjudul ' Adventures in Functional Programming '. Dalam kuliah ini, ia memperkenalkan konsep kombinator-Y, yang pada dasarnya menemukan titik tetap untuk fungsi-fungsi tingkat tinggi.

Salah satu motivasi, seperti yang ia sebutkan, adalah untuk dapat mengekspresikan fungsi rekursif dengan menggunakan kalkulus lambda sehingga teori oleh Gereja (apa pun yang dapat dihitung secara efektif dapat dihitung dengan menggunakan kalkulus lambda) tetap ada.

Masalahnya adalah bahwa suatu fungsi tidak dapat memanggil dirinya sendiri begitu saja, karena lambda kalkulus tidak mengizinkan fungsi bernama, yaitu,

n(x,y)=x+y

tidak tahan dengan nama ' ', itu harus didefinisikan secara anonim:n

(x,y)x+y

Mengapa penting bagi lambda calculus untuk memiliki fungsi yang tidak disebutkan namanya? Prinsip apa yang dilanggar jika ada fungsi yang dinamai? Atau apakah saya hanya salah paham tentang video jim?


4
Ini kedengarannya tidak penting sama sekali. Anda dapat menetapkan ke variabel dan kemudian Anda telah memberikan nama pada fungsi tersebut. n(x,t)x+yn
Yuval Filmus

@YuvalFilmus ya, Anda dapat mengikat nama ke suatu fungsi. Saya pikir pertanyaan sebenarnya di sini, kebingungan, mengapa (dalam kalkulus lambda) tidak dapat fungsi memanggil dirinya dengan nama seperti itu? Mengapa kita memerlukan teknik seperti operator Y untuk melakukan fungsi rekursif? Saya harap jawaban saya di bawah ini membantu.
Jerry101

1
@ Jerry101 Alasan historis untuk tidak adanya penerapan-diri adalah bahwa -calculus dimaksudkan sebagai dasar matematika, dan kemampuan untuk menerapkan diri membuat landasan semacam itu segera menjadi tidak konsisten. Jadi ketidakmampuan yang nyata ini (yang kita tahu sekarang dapat dielakkan) adalah fitur desain dari -calculus. λλλ
Martin Berger

@ MartinBerger, tolong ucapkan lebih banyak. Tidak konsisten karena alasan dalam jawaban saya? Atau karena alasan lain?
Jerry101

1
@ Jerry101 Tidak konsisten dalam arti bahwa Anda dapat membuktikan 0 = 1 dalam dasar matematika. Setelah Kleene dan Rosser menunjukkan inkonsistensi murni, untyped kalkulus, hanya-diketik kalkulus dikembangkan sebagai alternatif yang tidak memungkinkan kita untuk mendefinisikan fix-titik combintors seperti . Tetapi jika Anda menambahkan rekursi ke -calculus yang diketik dengan itu kembali menjadi tidak konsisten, karena setiap jenis dihuni oleh program yang tidak berhenti. λ Y λλλYλ
Martin Berger

Jawaban:


24

Teorema utama mengenai masalah ini adalah karena ahli matematika Inggris dari akhir abad ke-16, yang disebut William Shakespeare . Makalahnya yang paling terkenal tentang masalah ini berjudul " Romeo dan Juliet " diterbitkan pada tahun 1597, meskipun pekerjaan penelitian dilakukan beberapa tahun sebelumnya, menginspirasi tetapi pendahulu seperti Arthur Brooke dan William Painter.

Hasil utamanya, dinyatakan dalam Babak II. Adegan II , adalah teorema yang terkenal :

Apa namanya? apa yang kita sebut mawar
Dengan nama lain akan berbau manis;

Teorema ini dapat secara intuitif dipahami sebagai "nama tidak berkontribusi pada makna".

Bagian terbesar dari makalah ini dikhususkan untuk contoh yang melengkapi teorema dan menunjukkan bahwa, meskipun nama tidak memberikan makna, mereka adalah sumber masalah yang tak ada habisnya.

Seperti yang ditunjukkan oleh Shakespeare, nama dapat diubah tanpa mengubah makna, operasi yang kemudian disebut -conversion oleh Gereja Alonzo dan para pengikutnya. Akibatnya, tidak selalu mudah untuk menentukan apa yang dilambangkan dengan nama. Ini menimbulkan berbagai masalah seperti mengembangkan konsep lingkungan di mana asosiasi makna-nama ditentukan, dan aturan untuk mengetahui apa lingkungan saat ini ketika Anda mencoba menentukan makna yang terkait dengan nama. Ini membingungkan para ilmuwan komputer untuk sementara waktu, sehingga menimbulkan kesulitan teknis seperti masalah Funarg yang terkenalα. Lingkungan tetap menjadi masalah dalam beberapa bahasa pemrograman populer, tetapi secara fisik umumnya dianggap tidak aman untuk lebih spesifik, hampir sama mematikannya dengan contoh yang dikerjakan oleh Shakespeare dalam makalahnya.

Masalah ini juga dekat dengan masalah yang diangkat dalam teori bahasa formal , ketika huruf dan sistem formal harus didefinisikan hingga isomorfisma , sehingga menggarisbawahi bahwa simbol - simbol huruf adalah entitas abstrak , independen dari bagaimana mereka "terwujud" sebagai elemen dari beberapa set.

Hasil utama oleh Shakespeare ini menunjukkan juga bahwa sains kemudian menyimpang dari sihir dan agama, di mana makhluk atau makna mungkin memiliki nama sejati .

Kesimpulan dari semua ini adalah bahwa untuk pekerjaan teoretis, seringkali lebih mudah untuk tidak dibebani dengan nama, meskipun mungkin terasa lebih sederhana untuk pekerjaan praktis dan kehidupan sehari-hari. Tetapi ingatlah bahwa tidak semua orang memanggil Ibu adalah ibumu.

Catatan :
Masalah ini baru-baru ini ditangani oleh ahli logika Amerika abad ke-20 Gertrude Stein . Namun, rekan-rekan matematikawannya masih merenungkan implikasi teknis yang tepat dari teorema utamanya :

Mawar adalah mawar adalah mawar adalah mawar.

diterbitkan pada tahun 1913 dalam komunikasi singkat berjudul "Sacred Emily".


3
Catatan tambahan: Dalam beberapa dekade terakhir "rose" telah (dalam ilmu komputer) sebagian besar digantikan oleh "foobar" (dan bagian-bagiannya) sebagai contoh kanonik untuk nama yang sama baiknya dengan yang lain. Preferensi ini tampaknya telah diperkenalkan oleh insinyur kereta api Amerika.
FrankW

Yang mengatakan, nama kanonik untuk konsep yang sering digunakan penting untuk komunikasi yang efisien.
Raphael

1
@ Raphael Setuju, tapi saya akan memasukkannya ke dalam kategori kehidupan sehari-hari. Dan bagaimana kita mengetahui batasan-batasan dari apa yang benar-benar kanonik? Namun, saya sering merasa prihatin ketika saya melihat siswa mengambil semua terminologi, notasi dan definisi (atau bahkan cara beberapa teorema dinyatakan) untuk kebenaran abadi yang diberikan Tuhan. Bahkan di sini, pada SE, siswa mengajukan pertanyaan, tidak menyadari bahwa kita mungkin tidak tahu notasi mereka, atau definisi yang mereka gunakan di kelas. Keajaiban nama asli tidak mudah mati.
babou

10

λλπνx.Pπ

λλλ

letf=MinN(λf.N)Mλ


1
Saya pikir OP menginginkan kemampuan untuk menyebutkan fungsi, bukan untuk melarang yang anonim. Ini mengatakan, saya akan berpikir bahwa persyaratan λ-kalkulus mengenai perlunya fungsi anonim akan ditampilkan juga dalam bahasa seperti Lisp / Skema atau ML. Dalam kasus Lisp / Skema, meta-sirkuler dari evaluator harus memungkinkan untuk membuat nama baru sesuai kebutuhan, meskipun saya tidak yakin saya menginginkannya seperti itu dalam sistem formal. Penggunaan jumlah fungsi yang tidak terbatas tidak selalu menjadi masalah ketika rekursi memungkinkan penggunaan kembali nama-nama yang sudah digunakan secara lokal.
babou

λλ

Haruskah baris terakhir dibaca (lambda f. N) M?
Joe the Person

@ JoethePerson Ya, terlihat baik. Tetap. Terima kasih.
Martin Berger

4

Saya percaya idenya adalah bahwa nama tidak perlu. Apa pun yang tampaknya memerlukan nama dapat ditulis sebagai fungsi anonim.

Anda dapat memikirkan kalkulus lambda seperti bahasa rakitan. Seseorang dalam ceramah tentang majelis mungkin mengatakan "Tidak ada pohon warisan berorientasi objek dalam bahasa majelis." Anda mungkin berpikir cara cerdas untuk menerapkan pohon warisan, tapi bukan itu intinya. Intinya adalah bahwa pohon warisan tidak diperlukan pada tingkat paling dasar tentang bagaimana komputer fisik diprogram.

Dalam kalkulus lambda intinya adalah bahwa nama tidak diperlukan untuk menggambarkan suatu algoritma pada tingkat paling dasar.


4

Saya menikmati 3 jawaban di sini sejauh ini - terutama analisis Shakespearen @ babou - tetapi mereka tidak menjelaskan apa yang saya pikir adalah inti dari pertanyaan.

λ-calculus mengikat nama ke fungsi setiap kali Anda menerapkan fungsi ke fungsi. Masalahnya bukan kurangnya nama.

"Masalahnya adalah bahwa suatu fungsi tidak dapat memanggil dirinya sendiri hanya" dengan merujuk pada namanya.

(Dalam Lisp murni, nama -> fungsi mengikat tidak dalam ruang lingkup di dalam tubuh fungsi. Untuk fungsi memanggil dirinya dengan namanya, fungsi harus merujuk ke lingkungan yang merujuk ke fungsi. Lisp murni tidak memiliki struktur data siklik. Tidak murni Lisp melakukannya dengan memutasikan lingkungan yang merujuk fungsi.)

Seperti yang ditunjukkan oleh @MartinBerger, alasan historis bahwa λ-calculus tidak membiarkan fungsi memanggil dirinya dengan nama adalah upaya untuk mengesampingkan paradoks Curry ketika mencoba menggunakan λ-calculus sebagai dasar matematika, termasuk logika deduktif. Ini tidak berhasil karena teknik seperti kombinator Y memungkinkan rekursi bahkan tanpa referensi sendiri.

Dari Wikipedia:

Jika kita dapat mendefinisikan fungsi r = (λ.x x x ⇒ y)maka r r = (r r ⇒ y).

Jika r rbenar maka yitu benar. Jika r rsalah maka r r ⇒ yitu benar, yang merupakan kontradiksi. Begitu yjuga benar dan seperti yhalnya pernyataan apa pun, pernyataan apa pun dapat dibuktikan benar.

r radalah perhitungan yang tidak berakhir. Dianggap sebagai logika r radalah ekspresi untuk nilai yang tidak ada.


λ.x xxxxx

@RohanPrabhu λ.x x xmenerjemahkan ke Lisp as (lambda (x) (x x))dan JavaScript as function (x) {return x(x);}. x⇒yberarti x implies y, hampir sama dengan (NOT x) OR y. Lihat en.wikipedia.org/wiki/Lambda_calculus
Jerry101

Terima kasih telah menjawab pertanyaan pemula yang memalukan itu!
Rohan Prabhu
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.