Lambda hesabı soyut görünmüyordu. Ve amacını göremiyorum


18

Temel soru:

Lambda hesabı bizim için, ortaokul cebirinde genel olarak öğrenilen temel işlev özellikleri ve notasyon ile yapamayacağımız için ne yapar ?

Her şeyden önce, soyut lambda hesabı bağlamında ne anlama geliyor? Soyut kelimesini anlamam, bir kavramın kavramsal özeti olan makinelerden ayrılan bir şeydir.

Ancak lambda fonksiyonları, fonksiyon isimlerini kaldırarak belirli bir soyutlama seviyesini önler. Örneğin:

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

Ancak bu işlevlerin makinelerini tanımlamaksızın bile, bileşimleri hakkında kolayca konuşabiliriz. Örneğin:

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

İstersek argümanları ekleyebiliriz ve olup bitenler hakkında genel bir fikir vermek için tamamen soyutlayabiliriz. Ve onları hızla tek bir işleve indirebiliriz. Kompozisyon 2'ye bakalım. Vurgulamaya bağlı olarak yazabileceğim öğrenci detay katmanlarım olabilir:

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

Yukarıdakileri lambda hesabı ile gerçekleştirelim veya en azından fonksiyonları tanımlayalım. Bunun doğru olduğundan emin değilim, ama ilk ve ikinci ifadelerin 2 kat arttığına inanıyorum.

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

Ve 5y ile çarpmak.

(λz.y(5z))

Soyut olmaktan ziyade, bu, ekleme, çarpma, vb. Anlamına gelen makineye giriyor gibi gözüküyor.

Dahası, lambda hesabının neden bir şey olduğunu görmek için uğraşıyorum. Avantajı nedir

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

bitmiş

h(x) = x + 5 y

veya kombine gösterim

Hxy.x+5y

hatta Haskell'in gösterimi

h x y = x + 5 * y

Yine, lambda hesabı bizim için ne yapıyor? F (x) tarzı fonksiyon özellikleri ve çoğunun aşina olduğu notasyon ile yapamayız.


9
Haskell lambda hesabına dayandığından Haskell'den bir örnek vermeniz çok komik. Lambda hesabı belirli bir gösterim ile ilgili değildir. Bu, "her şeyin bir işlev olduğu" Turing makinelerine eşdeğer bir hesaplama modelidir.
Yuval Filmus

2
Evet, bunun lambda taşı temelli olduğu söylendi. Henüz bana mantıklı bir şekilde cevap verdiğini gördüğüm soru, haskell'in neden tam aksine lambda hesabına dayandığı. . . ilkokulda öğrendiğim fonksiyonların temel özellikleri. Bu tüm sorunun özü bu.
JDG

6
Neredeyse "soyut" un tanımı "hemen akla gelmez" değil midir? :-)
David Richerby

1
Bunun aşağılayıcı olduğunu söylemem. Bu fonksiyonların tedavisi, matematik üzerinden kullanılabilir. Ancak ortaokul olarak etiketlenmenin nasıl yorumlanabileceğini görebiliyorum. Ben ayarlayacağım.
JDG

6
Aslında "ortaokul cebir fonksiyon gösterimi" nin resmi bir tanımına sahip olduğunuzdan şüpheliyim. Bu tür işlevler için herhangi bir tanımınız varsa, büyük olasılıkla hesaplamalı anlamı olmayan set teorik olanıdır. Lambda kalkülüsünün noktasının bir kısmı, bu terimleri kendi terimleriyle anlamak ve söylemeye cesaret edebilirim ki, polinom fonksiyonlar veya kalkülüs gibi belirli uygulamalardan soyutlanmıştır.
Derek Elkins SE

Yanıtlar:


24

Lambda hesabının bu kadar önemli olmasının birçok nedeni vardır.

Çok önemli bir neden, lambda hesabı, hesaplanabilir fonksiyonların birinci sınıf vatandaş olduğu bir hesaplama modeline sahip olmamızı sağlar.

Ortaokul cebiri dilinde üst düzey fonksiyonları ifade etmek mümkün değildir .

Örnek olarak lambda ifadesini ele alalım

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

Bu basit ifade bize lambda hesabı içinde fonksiyon kompozisyonunun kendisinin bir fonksiyon olduğunu gösterir. Ortaokul cebirinde bu kolayca ifade edilemez.

Lambda hesabında, bir fonksiyonun bir fonksiyonu sonuç olarak döndüreceğini ifade etmek çok kolaydır.

İşte küçük bir örnek. İfade (burada, toplama ve tamsayı sabitleri ile uygulamalı bir lambda hesabı varsayıyorum)

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

azalacak

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

Ayrıca lambda hesabı içinde fonksiyonların f ( x ) = e biçiminin tanımları değil ifadeler olduğuna dikkat edin . Bu bizi işlevleri adlandırma ve sözdizimsel ifade kategorileri ile sözdizimsel tanım kategorileri arasında ayrım yapma ihtiyacından kurtarır.f(x)=e

Ayrıca, daha üst düzey işlevleri ifade etmek imkansız olduğunda (veya sadece notasyonel olarak hantal), ifadelere tür atama konusunda da problemler olacaktır.

Fonksiyon bileşimi polimorfik tiptedir

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

Hindley-Milner tipi sistemde.

Lambda hesabı için çok güçlü bir satış noktası, daktilo edilmiş lambda hesabı kavramının kesin olmasıdır . Haskell ve ML ailesi gibi fonksiyonel programlama dilleri için çeşitli tip sistemleri lambda calculi için tip sistemlerine dayanır ve bu tip sistemler matematiksel teoremler şeklinde güçlü garantiler sağlar:

Bir program iyi yazılmışsa ve e artık e değerine düşerse , e da iyi yazılacaktır.eeee

Ve iyi yazılmışsa, e bazı hatalar göstermez.ee

Deliller programları gibi yazışmalar özellikle dikkat çekicidir. Curry-Howard izomorfizmi (bkz. Https://www.rocq.inria.fr/semdoc/Presentations/20150217_PierreMariePedrot.pdf ) basitçe yazılan lambda hesabı ile sezgisel önermenin mantığı arasında çok kesin bir yazışma olduğunu gösterir: mantıksal formüle tekabül φ T . Bir kanıtı, φ T türü ile bir lambda terimine karşılık gelir T , ve dayanıklı bir kesim eliminasyonunu gerçekleştirmeden bu terim tekabül bir beta-azalma.TϕTϕTT

Ortaokul cebirinin, uygun bir Curry-Howard izomorfizmi kavramıyla birlikte daha üst düzey, polimorfik olarak tiplenmiş ortaokul cebirinin bir hesabını geliştirmesi için lambda hesabına iyi bir alternatif olduğunu düşünenleri çağırıyorum. Ortaokul cebirine dayalı etkileşimli bir kanıt asistanı bile çalıştırabilirseniz, Coq ve Isabelle gibi lambda hesabı tabanlı kanıt asistanları kullanılarak resmileştirilmiş birçok teoremleri daha da iyi hale getirebiliriz. O zaman ortaokul cebirini kullanmaya başlarım ve bu yüzden eminim birçokları benimle olur.


Bu harika bir açıklama. Daha yüksek seviyeli fonksiyonların (kompozisyon gibi) ve yazmanın lambda hesapta daha iyi temsil edildiğini duymak yararlıdır, hatta bunun kanıtları ve kanıtlanabilir kodu kolaylaştırdığını da unutmayın. Bahsettiğiniz şeylerin çoğunun ve geleneksel gösterimin neden yetersiz olduğunu (örneğin, f (x) = e ayrı bir tanım sözdizimine ihtiyaç duymama hakkında) sonuçları görmüyorum, ancak bu nedenlerden bazılarını adlandırmanız yararlı olur ve lambda hesabı ile hangi alanların geliştirildiğine dair bir fikir verir.
JDG

Elbette biri kutu formu yerel tanımları tanıtmak ancak bunlar zaten lambda hesabının sözdiziminde ( λ x . e ) e ′ olarak ifade edilebilir . Lambda hesabı, işlevleri adlandırmak zorunda kalmadan ifade etmemizi sağlar, tıpkı bir kişinin (ortaokul cebirinde!) Bir sayıdan 4'ü bir değişkenle adlandırmak zorunda kalmadankonuşabileceği gibi. letx=eine(λx.e)e4
Hans Hüttel

5

Fonksiyonlar ilk kez gençlere tarif edildiğinde, bunlar aslında grafikler (grafikler) veya belki de formüller ile tanımlanır; matematikteki biçimci eğilimlerin ortaya çıkmasından önce işlevlerin tarihsel olarak anlaşılması budur. Günümüzde fonksiyonlar, birinci yıl matematik öğretilen, gerçek fonksiyonlar, gelen fonksiyonlar için R .RR

Lambda hesabındaki fonksiyonlar çok daha geneldir. Tam tanım, lambda hesabınızın tipine veya tipine bağlı olmamasına bağlıdır. Saf türetilmemiş lambda hesabında her şey bir işlevdir. Bu, analizin gerçek işlevlerinden çok daha geneldir.

Prosedürel diller bile bazen lambda hesabından fikirler kullanır. C'deki sıralama işlevi parametre olarak öğeleri karşılaştırmak için kullandığı bir karşılaştırma işlevi olarak kabul eder . Lambda hesabı çok daha ileri gider - fonksiyonlar sadece fonksiyonları girdi olarak kabul etmekle kalmaz, aynı zamanda çıktısını da alabilir.

Lambda hesabı Turing makinelerine eşit güçte bir hesaplama modelidir. Kendi kendine tamamlanmış bir sistemdir. Saf lambda hesabı ilkel terimler olarak "5" veya "+" içermez - tıpkı "5" ve "+" gibi küme teorisinin ilkel değerleri gibi, hesap içinde tanımlanabilirler. (Pratik programlama dilleri verimlilik nedeniyle doğal sayıları doğal olarak uygular.)

Lambda hesabından etkilenmemenizin nedenlerinden birinin, fikirlerinin programlama söylemini o kadar çok kapladığı ve artık yenilikçi görünmediğinden şüpheleniyorum.


"Lambda hesabı ile etkilenmemenizin nedenlerinden birinin şüpheleniyorum" Therin şu soruyu soruyor: Lambda hesabı bizim için ne yapıyor? Başka bir deyişle, lambda hesabı kullanmadığımızda ne olur. Lambda hesabı kullandığımızda ne kazanıyoruz? Lambda hesabı insanların ilk düşündüğü şeyse, işlevlerin kendileri işlevler yaratabilirse, o zaman bu etkileyici midir? İlk python programlarım arasında, daha sonra değerlendirdiğim işlevleri içeren metinler yaptım, tıpkı bir başkasına karar verme görevini devretmek gibi. Açık görünüyor mu?
JDG

bir şey bilmeden önceydi. Kodun tekrar tekrar yazmak için can sıkıcı olduğunu düşündüm ve bu programlama, işlevlerin kendileri de dahil olmak üzere otomatik olarak işlevsellik üretmeme yardımcı olmalı.
JDG

2
Python fonksiyonel programlamayı destekler. İlk programlama dilleri yoktu. FORTRAN'da programlamış olsaydınız, daha sonra değerlendirdiğiniz fonksiyonları içeren metin içeren programlar oluşturmazdınız. Farkına bile varmadan, lambda hesabının fikirlerinin sağladığı yetenekleri kullandınız.
Yuval Filmus

2
Eval kökenli Lisp'i güçlü lambda hesap etkilenmiştir. FORTRAN, C, COBOL ve diğer birçok programlama dilinde böyle bir şey mümkün değildir.
Yuval Filmus

Evet, python fonksiyonel programlamayı destekler --- ama eval () yeteneğinin λCalc'dan esinlendiğinden emin değilim - düşünmek için λCalc yapmıyorsunuz: Daha sonra değerlendirebileceğim kodu otomatik olarak oluşturmak istiyorum. ΛCalc'ın "Miranda'ya departmanını nasıl yöneteceğine dair en iyi kararını vermesini söyleyeceğim" --- başka bir deyişle kendi işlevlerini üretmek için bir işlev elde etmesini düşünmek gerektiğini söylemek gibi. Üst düzey görevleri devretmeyi düşünmek için λCalc'a ihtiyacınız yoktur. ΛCalc'den ilham almak hakkında konuşmak istiyorsanız, lambda fonksiyonları, kavrayışları vb. İçin daha uygun bir nokta
JDG

4

x2xx2

λx.x2x2

ff(x)=x2f

Programlama dillerinde lambda ifadelerinin kullanımı da benzer bir avantaja sahiptir; programınızda başka bir yerde yepyeni bir işlev tanımlamak yerine, işlevin gereken yere tam olarak ne yazdığını yazabilirsiniz.

Hatta lambda soyutlamanın matematikte örtülü olduğunu bile görebilirsiniz; örn. kalkülüs öğrencilerine sadece fonksiyonların türevleri hakkında bilgi verilir , bu nedenle Leibniz notasyonu uzlaştırmak içinddxx2ddxx2


θ:VV

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

Birçok kişi, bu çift değerlendirme gösterimini kafa karıştırıcı ve / veya rahatsız edici bulmanın yanı sıra, bir fonksiyonun noktasal tanımının tekrarlı olarak kullanılmasını bulur. Lambda soyutlama versiyonu

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

bu problemi yok.


Son olarak, "basitçe yazılan lambda taşı" nın temelde "kartezyen kapalı kategori" ile aynı şey olduğu soyut bir saçmalık teorisi vardır - bu yüzden kendinizi kartezyen kapalı bir kategoride hesaplama yapmak istediğinizde bulursanız, muhtemelen kullanmak iyi bir fikirdir. basitçe bunu yapmak için lambda hesabı yazdım.


Bu soruya geri dönüyorum ve bu cevabı harika buluyorum. Teşekkür ederim. Genel olarak buradaki cevaplar gerçekten ilginç.
JDG

4

Önde diyeceğim ki, bu konuda uzman değilim, ama bunu incelemek için biraz zaman harcadım ve herhangi bir konuda en büyüleyici şeylerden biri arkasındaki tarih. Bu yüzden bana lambda hesabının arkasındaki tarihin birazını anlamak neden yararlı olduğunu açıklamaya yardımcı oluyor .

Kısa özet, set teorisinin başlamasından sonraki 1900'lerin başında ve matematiğin setlere dayanarak yeniden tasarlandığını, bazı matematikçiler ise bir set teorisi tanımının belirli bir yapının var olduğunu iddia etmenizi sağlarken, size nasıl olduğunu söylemediklerini fark ettiler. inşa etmek ve hesaplamak için. Yani set-teorik tanımlar yapıcı değildir . Matematikçiler, bir şeyin olduğunu kanıtlamanın ötesinde yapıcı tanımlar geliştirmenin ve bunun nasıl olduğunu kanıtlamanın bir yolu olup olmadığını merak etmeye başladılar .

Gönderen Vikipedi :

Matematikte yapıcı bir kanıt, nesneyi oluşturmak için bir yöntem oluşturarak veya sağlayarak matematiksel bir nesnenin varlığını gösteren bir kanıt yöntemidir. Bu, belirli bir tür nesnenin varlığını örnek vermeden kanıtlayan, yapıcı olmayan bir kanıtın (varlık varlığı veya saf varlık teoremi olarak da bilinir) aksine.

Turing, soruyu cevaplamak için Turing Machine otomatlarını geliştirdi ve Church, soruyu cevaplamak için lambda hesabını da geliştirdi. Kleene ayrıca Kleene Star'ı içeren bir yöntem geliştirdi*düzenli ifadeler olarak benimsenmiştir ve başka bir yöntem geliştiren (hazırlıksız olarak hatırlayamayan) bir başkası vardı. Bütün bunlar, başından itibaren yapıcı tanımlara izin verecek bir temelde matematik sistemi inşa etmek amacıyla geliştirilmiştir.

Daha sonra lambda kalkülüsünün ve Turing makinesinin her türlü hesaplanabilir fonksiyonu temsil edebileceği ve dolayısıyla eşdeğer olduğu gösterilmiştir.

Teoride, herhangi bir matematiksel fonksiyon veya kavram lambda hesabı biçiminde kodlanabilir ve hesaplanabilir. Bu, lambda kalkülüsünün, matematik için tamamen ayrı bir temel olabileceği anlamına gelir, ancak açıkça son derece sıkıcıdır.

Lambda hesabı, kodu kullanarak kod yazmayacağınız anlamında "yararlı" değildir, ancak programları ve dinamik etkilerini tanımlamak için kullanılan anlamsal anlambilimin temelini oluşturur . Bu, programın doğruluğu ve anlambilimsel anlamın tartışılmasında kullanılır. Ayrıca, tüm uygulama kavramlarını lambda hesabından alan fonksiyonel programlama dillerinin gelişimini de açıkça etkiledi.

Umarım yardımcı olur.

Eklemek için düzenleyin: Topoloji, lambda hesabı ve fizik arasındaki ilişkiyi gösteren bu makaleye işaret ettim . Kısaca gözden geçirme bu fantastik açıklamaya rastladım:

Bir Turing makinesi ideal, basitleştirilmiş bir bilgisayar donanımı modeli olarak görülebilirken , lambda hesabı daha çok basit bir yazılım modeline benzer . ... Şiirsel olarak konuşursak, lambda hesabı her şeyin bir program olduğu ve her şeyin veri olduğu bir evreni tanımlar: programlar veridir .

Mesele şu ki, lambda hesabı ideal bir yazılım hesaplaması modelidir ve bu nedenle herhangi bir programlama dilinde belirli bir uygulamaya bağlı değildir . Saf hesaplamayı modeller .


Tarih hakkında daha fazla bilgi: Stanford Felsefe Ansiklopedisinde λ-hesabının kısa tarihi . Bir ömür boyu işleyebileceğinden daha fazla girişi vardır.
David Tonhofer

3

Yuval'ın yorumlarda belirttiği gibi Haskell, λ-calculus. Lambda hesabının bu kadar önemli olmasının bir başka nedeni de tembel değerlendirmenin varlığını haklı kılan Church-Rosser Teoremi'dir . (Haskell'in birçok harika özelliğinden biri)


3

Lambda hesabı bir programlama dili olarak tasarlanmamıştır. Gerçekten de, programlanabilir bilgisayarlarımız bile olmadan, onlarca yıl 1930'larda yaratıldı. Daha ziyade, kendisi, hesaplama üzerinde çalışmak için resmi bir model olarak yaratıldı. Kodu veya matematiksel işlevleri ne kadar kolay ifade ettiğinden hayal kırıklığına uğradıysanız, bunun nedeni bu değildir.


1
"onlarca yıl önce bile programlanabilir bilgisayar vardı" - yanlış. Programlanabilir bilgisayar daha önce vardı (belki evrensel olmasa da) ve ilk evrensel bilgisayarlar 1930'larda inşa edildi.
Raphael

-2

Lambda hesabı, anonim (diğer adıyla lambda) fonksiyonların yaratılabilmesi için mevcuttur. İşlev adlarını ortadan kaldırmazsanız, ad alanı karmaşıklaşabilir ve kullanılabilir işlev adları bitebilir. Bu, belirgin nedenlerle işlevleri (veya işlev işaretleyicilerini) döndüren "yüksek dereceli işlevler" ile uğraşırken özellikle önemlidir.

Esasen lambda fonksiyonları, yerel olarak kapsamış değişkenlere eşdeğerdir. Lambda fonksiyonları olmadan fonksiyonel programlama, herhangi bir yerel değişken olmadan prosedürel programlamaya benzer, yani korkunç bir fikir.

"neden lambda hesabı bir şeydir" matematikçiler artıklığı sever. lambda hesabı matematikte nadiren kullanılır çünkü gösterimi keşfettiğiniz için çok kullanışlı değildir.

"Ortaokul cebirine dayalı, Coq ve Isabelle gibi lambda kalkülüs-tabanlı kanıt asistanları kullanılarak resmileştirilmiş birçok teoremleri kanıtlamamıza izin veren etkileşimli bir kanıt asistanı bile çalışabilseydiniz, bu daha iyi olurdu. sonra ortaokul cebirini kullanmaya başladım ve eminim pek çok kişi benimle olur. " Metamat duydun mu? Orada bulunan hiçbir lambda hesabı, coq / isabelle teoremlerinin çoğunu kanıtlayamaz


Bazı görüşlerin yanı sıra, bu cevap ne sunuyor?
Raphael

@Raphael Yanlış Bilgi. Bu cevabın çoğu anlamlı değil. İsim sıkıntısı yok. "Lambda fonksiyonları" yerel olarak kapsamış değişkenlere eşdeğer değildir; bu hiç mantıklı değil. Bunun atıfta bulunmak için olduğunu varsayıyorum let, ancak letanonim işlevlerle kodlanabilse de, açıkça başka yöne gidemezsiniz. Fonksiyonel programlama yok değil mesela "lambda fonksiyonları", Backus' gerektiren FP veya Sisal .
Derek Elkins SE

çoğunlukla hans'ın cevabına bir yorum göndermek istedim ama yeterli karması yoktu. Bu yüzden yorumu tam teşekküllü bir cevaba dönüştürmeye karar verdim
sn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.