Kalkulus Lambda tampaknya tidak abstrak. Dan saya tidak bisa mengerti intinya

18

Pertanyaan mendasar:

Apa yang dilakukan kalkulus lambda bagi kita yang tidak dapat kita lakukan dengan properti fungsi dasar dan notasi yang umumnya dipelajari dalam aljabar sekolah menengah?

Pertama-tama, apa artinya abstrak dalam konteks kalkulus lambda? Pemahaman saya tentang kata abstrak adalah sesuatu yang terpisah dari mesin, ringkasan konsep dari suatu konsep.

Namun, fungsi lambda, dengan menghilangkan nama fungsi, mencegah tingkat abstraksi tertentu. Sebagai contoh:

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

Tetapi bahkan tanpa mendefinisikan mesin dari fungsi-fungsi ini, kita dapat dengan mudah berbicara tentang komposisi mereka. Sebagai contoh:

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

Kita bisa memasukkan argumen jika kita mau, atau kita bisa abstrak sepenuhnya untuk memberikan gambaran tentang apa yang terjadi. Dan kita dapat dengan cepat menguranginya menjadi satu fungsi. Mari kita lihat komposisi 2. Saya dapat memiliki lapisan detail siswa yang dapat saya tulis dengan tergantung pada penekanan saya:

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

Mari kita lakukan di atas dengan kalkulus lambda, atau setidaknya mendefinisikan fungsi. Saya tidak yakin ini benar, tetapi saya percaya bahwa penambahan ekspresi pertama dan kedua oleh 2.

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

Dan untuk mengalikannya dengan 5y.

(λz.y(5z))

Alih-alih abstrak, ini tampaknya masuk ke dalam mesin apa artinya menambahkan, memperbanyak, dll. Abstraksi, dalam pikiran saya, berarti tingkat yang lebih tinggi daripada tingkat yang lebih rendah.

Lebih jauh, saya berjuang untuk melihat mengapa kalkulus lambda bahkan merupakan suatu hal. Apa kelebihannya?

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

lebih

h(x) = x + 5 y

atau notasi gabungan

Hxy.x+5y

atau bahkan notasi Haskell

h x y = x + 5 * y

Sekali lagi, apa yang dilakukan kalkulus lambda untuk kita yang tidak bisa kita lakukan dengan properti fungsi gaya f (x) dan notasi yang banyak dikenal.

JDG
sumber
9
Lucu bahwa Anda memberi contoh dari Haskell, karena Haskell didasarkan pada kalkulus lambda. Kalkulus Lambda bukan tentang notasi tertentu. Ini adalah model komputasi, setara dengan mesin Turing, di mana "semuanya adalah fungsi".
Yuval Filmus
2
Ya, saya diberitahu bahwa ini didasarkan pada kalkulus lambda. Pertanyaan yang belum saya lihat dijawab dengan cara yang masuk akal bagi saya adalah mengapa haskell didasarkan pada lambda calculus sebagai lawan dari just. . . atribut dasar dari fungsi yang saya pelajari di sekolah dasar. Itulah inti dari seluruh pertanyaan ini.
JDG
6
Bukankah "tidak ada tujuan segera terlintas dalam pikiran" hampir definisi "abstrak"? :-)
David Richerby
1
Saya tidak akan mengatakan itu menghina. Perawatan fungsi dapat diperbaiki melalui kalkulus. Tapi saya bisa melihat bagaimana diberi label sebagai sekolah menengah bisa ditafsirkan demikian. Saya akan menyesuaikannya.
JDG
6
Saya ragu Anda benar-benar memiliki definisi formal "notasi fungsi aljabar sekolah menengah". Jika Anda memiliki definisi untuk fungsi-fungsi seperti itu mungkin teori set yang tidak memiliki arti komputasi. Bagian dari titik kalkulus lambda adalah untuk memahami notasi seperti itu pada istilahnya sendiri dan, berani saya katakan, disarikan dari aplikasi tertentu seperti fungsi polinom atau kalkulus.
Derek Elkins meninggalkan SE

Jawaban:

24

Ada banyak alasan mengapa kalkulus lambda sangat penting.

Alasan yang sangat penting adalah kalkulus lambda memungkinkan kita untuk memiliki model perhitungan di mana fungsi yang dapat dihitung adalah warga negara kelas satu.

Seseorang tidak dapat mengekspresikan fungsi tingkat tinggi dalam bahasa aljabar sekolah menengah.

Ambil contoh ungkapan lambda

λf.λg.λx.f(g(x))

Ungkapan sederhana ini menunjukkan kepada kita bahwa, dalam kalkulus lambda, komposisi fungsi itu sendiri adalah fungsi. Dalam aljabar sekolah menengah, ini tidak mudah diungkapkan.

Dalam kalkulus lambda, sangat mudah untuk menyatakan bahwa suatu fungsi akan mengembalikan fungsi sebagai hasilnya.

Ini adalah contoh kecil. Ekspresi (di mana saya di sini mengasumsikan kalkulus lambda yang diterapkan dengan konstanta penambahan dan integer)

(λf.λg.λx.f((g(x)))(λx.x+2)

akan berkurang menjadi

λg.λx.g(x)+2

Perhatikan juga bahwa dalam kalkulus lambda, fungsi adalah ekspresi dan bukan definisi bentuk . Ini membebaskan kita dari kebutuhan untuk menamai fungsi dan untuk membedakan antara kategori ekspresi sintaksis dan kategori definisi sintaksis.f(x)=e

Juga, ketika menjadi tidak mungkin (atau hanya tidak praktis) untuk mengekspresikan fungsi tingkat tinggi, orang juga akan mengalami masalah dengan menetapkan tipe ke ekspresi.

Komposisi fungsi memiliki tipe polimorfik

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

dalam sistem jenis Hindley-Milner.

Nilai jual yang sangat kuat untuk kalkulus lambda adalah tepatnya gagasan kalkulus lambda yang diketik . Berbagai jenis sistem untuk bahasa pemrograman fungsional seperti Haskell dan keluarga ML didasarkan pada sistem tipe untuk kalkulus lambda, dan sistem tipe ini memberikan jaminan kuat dalam bentuk teorema matematika:

Jika suatu program diketik dengan baik dan e mengurangi ke residu e , maka e juga akan diketik dengan baik.eeee

Dan jika diketik dengan baik, maka e tidak akan menunjukkan kesalahan tertentu.ee

The bukti sebagai program korespondensi sangat penting. Isomorfisme Curry-Howard (lihat misalnya https://www.rocq.inria.fr/semdoc/Presentations/20150217_PierreMariePedrot.pdf ) menunjukkan bahwa ada korespondensi yang sangat tepat antara kalkulus lambda yang diketik sederhana dan logika proposisi intuitionistic: Untuk setiap jenis sesuai formula logis φ T . Bukti ϕ T sesuai dengan istilah lambda dengan tipe T , dan pengurangan beta dari istilah ini terkait dengan melakukan eliminasi pemotongan dalam bukti.TϕTϕTT

Saya mendesak mereka yang merasa bahwa aljabar sekolah menengah adalah alternatif yang baik untuk kalkulus lambda untuk mengembangkan akun aljabar sekolah menengah yang diketik secara polimorfik bersama-sama dengan gagasan isomorfisma Curry-Howard yang sesuai. Jika Anda bahkan dapat menemukan asisten bukti interaktif berdasarkan aljabar sekolah menengah yang akan memungkinkan kami untuk membuktikan banyak teorema yang telah diformalkan menggunakan asisten bukti berbasis kalkulus lambda seperti Coq dan Isabelle, itu akan lebih baik. Saya kemudian akan mulai menggunakan aljabar sekolah menengah, dan jadi, saya yakin, akan banyak orang lain yang bersama saya.

Hans Hüttel
sumber
Ini penjelasan yang bagus. Sangat membantu untuk mendengar bahwa fungsi tingkat tinggi (seperti komposisi) dan mengetik lebih baik diwakili dalam kalkulus lambda yang menggembirakan, bahkan lebih dari itu memfasilitasi bukti dan kode yang dapat dibuktikan. Saya tidak melihat konsekuensi banyak dari apa yang Anda sebutkan dan mengapa notasi tradisional tidak memadai (misalnya, tentang tidak memerlukan sintaks definisi yang terpisah f (x) = e), namun sangat membantu jika Anda menyebutkan beberapa alasan berikut dan ini memberi gambaran tentang bidang apa yang diperbaiki oleh kalkulus lambda.
JDG
Seseorang tentu saja dapat memperkenalkan definisi lokal dari form tetapi ini sudah dapat dinyatakan dalam sintaks kalkulus lambda sebagai ( λ x . e ) e . Kalkulus lambda memungkinkan kita untuk mengekspresikan fungsi tanpa harus menamai mereka, sama seperti seseorang dapat (dalam aljabar sekolah menengah!) Berbicara tentang angka 4 tanpa harus menyebutkannya dengan beberapa variabel. membiarkanx=edie(λx.e)e4
Hans Hüttel
5

Ketika fungsi pertama kali dijelaskan kepada anak-anak, mereka pada dasarnya diidentifikasi dengan grafik (plot), atau mungkin dengan rumus; ini adalah cara fungsi dipahami secara historis sebelum munculnya tren formalis dalam matematika. Saat ini fungsi, seperti yang diajarkan dalam kalkulus tahun pertama, adalah fungsi nyata, yaitu, fungsi dari ke R .RR

Fungsi dalam kalkulus lambda jauh lebih umum. Definisi yang tepat tergantung pada apakah kalkulus lambda Anda diketik atau tidak. Dalam kalkulus lambda murni yang belum diketik semuanya adalah fungsi. Ini jauh lebih umum daripada fungsi kalkulus yang sebenarnya.

Bahkan bahasa prosedural kadang-kadang menggunakan ide dari lambda calculus. Fungsi pengurutan dalam C menerima sebagai parameter fungsi perbandingan , yang digunakannya untuk membandingkan elemen. Kalkulus Lambda melangkah lebih jauh - fungsi tidak hanya menerima fungsi sebagai input, tetapi juga dapat menampilkannya.

Kalkulus Lambda adalah model komputasi yang setara dalam daya untuk mesin Turing. Ini adalah sistem yang lengkap untuk dirinya sendiri. Kalkulus lambda murni tidak memiliki "5" atau "+" sebagai istilah primitif - mereka dapat didefinisikan di dalam kalkulus, seperti "5" dan "+" bukan primitif dari teori himpunan. (Bahasa pemrograman praktis menerapkan bilangan asli secara alami karena alasan efisiensi.)

Saya menduga bahwa salah satu alasan mengapa Anda tidak terkesan dengan kalkulus lambda adalah bahwa idenya telah begitu menyebar dalam wacana pemrograman sehingga tidak lagi terlihat inovatif.

Yuval Filmus
sumber
"Saya menduga bahwa salah satu alasan mengapa Anda tidak terkesan dengan kalkulus lambda" Therin menjawab pertanyaan yang saya ajukan: Apa yang dilakukan kalkulus lambda bagi kita? Dengan kata lain, ketika kita tidak menggunakan kalkulus lambda, apa yang terjadi. Ketika kita menggunakan kalkulus lambda, apa yang kita dapatkan? Jika kalkulus lambda adalah pertama kalinya orang berpikir, bagaimana jika fungsi dapat membuat fungsi sendiri, lalu apakah itu mengesankan? Di antara program python awal saya membuat teks yang berisi fungsi-fungsi yang kemudian saya evaluasi, seperti mendelegasikan tugas pengambilan keputusan kepada orang lain. Tampak jelas?
JDG
ini sebelum saya tahu banyak tentang apa pun. Saya hanya berpikir kode itu menjengkelkan untuk mengetik berulang dan pemrograman yang seharusnya membantu saya secara otomatis menghasilkan fungsionalitas, termasuk fungsi itu sendiri.
JDG
2
Python mendukung pemrograman fungsional. Bahasa pemrograman pertama tidak. Jika Anda telah memprogram dalam FORTRAN, Anda tidak akan membuat program dengan fungsi yang mengandung teks yang kemudian Anda evaluasi. Tanpa menyadarinya, Anda memanfaatkan kemampuan yang disediakan oleh ide-ide dari kalkulus lambda.
Yuval Filmus
2
Eval berasal dari LISP , yang sangat dipengaruhi oleh kalkulus lambda. Sesuatu seperti ini tidak mungkin di FORTRAN, C, COBOL, dan banyak bahasa pemrograman lainnya.
Yuval Filmus
Ya, python mendukung progamming fungsional --- tapi saya tidak yakin kemampuan eval () diilhami oleh λCalc --- Anda tidak λCalc untuk berpikir: Saya ingin membuat kode otomatis yang dapat saya evaluasi nanti. Itu seperti mengatakan λCalc diharuskan untuk berpikir, "Saya akan memberitahu Miranda untuk menggunakan penilaian terbaiknya tentang bagaimana menjalankan departemennya" --- dengan kata lain mendapatkan fungsi untuk menghasilkan fungsinya sendiri. Anda tidak perlu λCalc untuk memikirkan tentang mendelegasikan tugas tingkat tinggi. Jika Anda ingin berbicara tentang menggambar inspirasi dari λCalc, itu lebih tepat untuk fungsi lambda, pemahaman, dll.
JDG
4

x2xx2

λx.x2x2

ff(x)=x2f

Penggunaan ekspresi lambda dalam bahasa pemrograman memiliki keunggulan yang sama; Anda dapat menulis apa fungsi tidak di sana di mana itu diperlukan daripada harus mendefinisikan fungsi baru di tempat lain dalam program Anda.

ddxx2ddxx2


θ:VV

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

Banyak orang menganggap notasi evaluasi ganda ini membingungkan dan / atau meresahkan, juga penggunaan definisi fungsi secara langsung. Versi abstraksi lambda

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

tidak memiliki masalah itu.


Akhirnya, ada teorema abstrak omong kosong bahwa "cukup ketik lambda kalkulus" pada dasarnya adalah hal yang sama dengan "kategori tertutup cartesian" - jadi jika Anda pernah ingin melakukan perhitungan dalam kategori tertutup kartesius, mungkin ide yang baik untuk digunakan cukup ketik lambda kalkulus untuk melakukannya.


sumber
Saya kembali ke pertanyaan ini dan menemukan jawaban ini hebat. Terima kasih. Jawaban di sini secara umum sangat menarik.
JDG
4

Saya akan mengatakan di muka saya bukan ahli dalam topik ini, tapi saya hanya menghabiskan sedikit waktu mempelajarinya dan salah satu hal yang paling menarik bagi saya dalam topik apa pun adalah sejarah di baliknya. Jadi bagi saya memahami sedikit sejarah di balik kalkulus lambda membantu menjelaskan mengapa ini berguna.

Ringkasan singkatnya adalah bahwa pada awal 1900-an setelah teori himpunan mulai lepas landas dan matematika direvisi berdasarkan pada himpunan, beberapa matematikawan memperhatikan bahwa sementara definisi himpunan teori memungkinkan Anda untuk mengklaim bahwa ada struktur tertentu, mereka tidak memberi tahu Anda bagaimana untuk membangun dan menghitungnya. Jadi definisi set-theoretik tidak konstruktif . Matematikawan mulai bertanya-tanya apakah ada cara untuk mengembangkan definisi konstruktif yang akan melampaui membuktikan bahwa sesuatu itu dan bukannya membuktikan bagaimana itu .

Dari Wikipedia :

Dalam matematika, bukti konstruktif adalah metode bukti yang menunjukkan keberadaan objek matematika dengan membuat atau menyediakan metode untuk membuat objek. Ini berbeda dengan bukti non-konstruktif (juga dikenal sebagai bukti keberadaan atau teorema keberadaan murni) yang membuktikan keberadaan jenis objek tertentu tanpa memberikan contoh.

Kemudian ditunjukkan bahwa kalkulus lambda dan mesin Turing dapat mewakili fungsi yang dapat dihitung dan karenanya setara.

Dalam teori setiap fungsi matematika atau konsep dapat dikodekan dalam lambda bentuk kalkulus dan dihitung. Ini berarti bahwa kalkulus lambda dapat menjadi dasar yang sepenuhnya terpisah untuk matematika, meskipun jelas yang sangat membosankan.

Kalkulus Lambda tidak "berguna" dalam arti bahwa Anda tidak akan menulis kode menggunakannya, tetapi itu membentuk dasar untuk semantik denotasional yang digunakan untuk menggambarkan program dan efek dinamisnya. Ini digunakan dalam diskusi tentang kebenaran program dan makna semantik. Ini juga jelas sangat mempengaruhi pengembangan bahasa pemrograman fungsional, yang menarik seluruh konsep eksekusi dari kalkulus lambda.

Semoga itu bisa membantu.

Sunting untuk ditambahkan: Saya baru saja menunjuk ke makalah ini yang menunjukkan hubungan antara topologi, kalkulus lambda, dan fisika. Melintas sebentar, saya menemukan pernyataan yang fantastis ini:

Sementara mesin Turing dapat dilihat sebagai model perangkat keras komputer yang ideal dan disederhanakan , kalkulus lambda lebih seperti model perangkat lunak sederhana . ... Secara puitis, kalkulus lambda menggambarkan alam semesta di mana segala sesuatu adalah sebuah program dan semuanya adalah data: program adalah data .

Intinya adalah bahwa kalkulus lambda adalah model perhitungan perangkat lunak yang ideal , dan karena itu tidak terikat pada implementasi tertentu dalam bahasa pemrograman apa pun. Ini model perhitungan murni .

Dave
sumber
Lebih lanjut tentang sejarah: Sejarah singkat λ-calculus di Stanford Encyclopedia of Philosophy. Mereka memiliki lebih banyak entri daripada yang dapat diproses seumur hidup.
David Tonhofer
3

Kalkulus Lambda tidak dirancang untuk menjadi bahasa pemrograman. Memang, itu dibuat pada 1930-an, dekade sebelum kita bahkan memiliki komputer yang dapat diprogram. Alih-alih, itu dibuat sebagai model formal untuk mempelajari komputasi, itu sendiri. Jika Anda kecewa dengan betapa mudahnya mengekspresikan kode, atau fungsi matematika, itu karena bukan itu gunanya.

Andrew
sumber
1
"Beberapa dekade sebelum kita bahkan memiliki komputer yang dapat diprogram" - salah. Komputer yang dapat diprogram ada sebelumnya (jika mungkin bukan yang universal) dan komputer universal pertama dibangun pada 1930-an.
Raphael
-2

Kalkulus Lambda ada sehingga fungsi anonim (alias lambda) dapat dibuat. Jika Anda tidak menghilangkan nama fungsi, maka namespace bisa berantakan dan orang bisa kehabisan nama fungsi yang tersedia. Ini sangat penting ketika berhadapan dengan apa yang disebut "fungsi tingkat tinggi" yang mengembalikan fungsi (atau fungsi pointer) karena alasan yang jelas.

Pada dasarnya, fungsi lambda setara dengan variabel cakupan lokal. Pemrograman fungsional tanpa fungsi lambda analog dengan pemrograman prosedural tanpa variabel lokal, yaitu, ide yang mengerikan.

"mengapa kalkulus lambda bahkan adalah sesuatu" ahli matematika suka redundansi. kalkulus lambda jarang digunakan dalam matematika karena ketika Anda telah menemukan notasi tidak terlalu berguna.

"Jika Anda bahkan dapat mengerjakan asisten bukti interaktif berdasarkan aljabar sekolah menengah yang akan memungkinkan kami untuk membuktikan banyak teorema yang telah diformalkan menggunakan asisten bukti berbasis kalkulus lambda seperti Coq dan Isabelle, itu akan lebih baik. Saya akan kemudian mulai menggunakan aljabar sekolah menengah, dan karenanya, saya yakin, akan banyak orang lain yang ikut dengan saya. " Pernahkah Anda mendengar tentang metamath? Tidak ada kalkulus lambda yang terlibat di sana, dapat membuktikan banyak teorema coq / isabelle

sn
sumber
Selain dari beberapa pendapat, apa yang ditawarkan jawaban ini?
Raphael
@Raphael Informasi yang salah. Sebagian besar jawaban ini bahkan tidak masuk akal. Tidak ada kekurangan nama. "Fungsi Lambda" tidak setara dengan variabel yang dicakup secara lokal; ini bahkan tidak masuk akal. Saya berasumsi ini dimaksudkan untuk merujuk let, tetapi sementara letdapat dikodekan dengan fungsi anonim, Anda jelas tidak bisa pergi ke arah lain. Pemrograman fungsional tidak memerlukan "fungsi lambda", misalnya Backus ' FP atau Sisal .
Derek Elkins meninggalkan SE
kebanyakan saya ingin memposting komentar untuk jawaban hans tetapi tidak memiliki cukup karma. jadi saya memutuskan untuk mengubah komentar menjadi jawaban lengkap
sn