Sabit nokta birleştiricinin (Y birleştiricisi) net, sezgisel türevi?


28

(Yazılmamış) lambda hesabındaki ( ) sabit nokta birleştirici FIX (aka Y birleştirici ) şöyle tanımlanır:λ

FIXλf.(λx.f (λy.x x y)) (λx.f (λy.x x y))

Amacını anlıyorum ve uygulamasının yürütülmesini tamamen iyi izleyebiliyorum; FIX'in ilk prensiplerden nasıl türetileceğini anlamak istiyorum .

İşte kendim türetmeye çalıştığımda öğrendiğim kadarıyla:

  1. FIX bir işlevdir: FIX λ
  2. FIX başka fonksiyon alır f , bu özyinelemeli yapmak: FIX λf.
  3. F fonksiyonunun ilk argümanı, fözyinelemeli bir uygulamanın amaçlandığı durumlarda kullanılan fonksiyonun "adı" dır. Bu nedenle, ilk argüman her görünüşe f bir işlev değiştirilmesi gerektiğini ve bu fonksiyon argümanları geri kalanını beklemelidir f (Sadece varsayalım f bir argüman alır): FIX λf.f (λy.y)

Bu, mantığımda "nasıl adım atacaklarını" bilmediğim yer. Küçük elipsler, FIX'imde bir şeyin eksik olduğunu gösterir (ancak bunu "gerçek" FIX ile karşılaştırarak öğrenebilmeme rağmen).

Zaten doğrudan türetmeye çalışmayan Türleri ve Programlama Dillerini okudum ve bunun yerine okuyucuyu bir türetme için The Little Schemer'a yönlendirdim . Ben de okudum ve "türetilmesi" hiç de yardımcı olmadı. Dahası, doğrudan bir türetme işleminden daha azdır ve çok spesifik bir örneğin kullanımı ve \ lambda'da uygun bir özyinelemeli fonksiyon yazmaya geçici bir girişimden daha fazladır λ.


1
Bu yayın yardımcı olabilir. Genel olarak, sadece birleştiricinin birkaç yinelemesinin üzerinden geçip hesaplanmasının neden işe yaradığını bulmakta yardımcı olacağını düşünüyorum.
Xodarap

2
Birkaç farklı sabit nokta birleştirici var. Belki de insanlar üzerlerine tökezleninceye kadar birleştiricilerle oynadılar.
Yuval Filmus

@YuvalFilmus, araştırmamın ve bu soruya verdiğim yanıt beni düşündürmeye başlıyor. Ancak yine de, birleştiricilerin mantıksal olarak nasıl oluşturulduğunu "görmenin", örneğin yeni bir birleştiriciyi kurmaya çalışırken özellikle yardımcı olacak bir yeteneğin "öğretilmesinin" öğretici olacağını düşünüyorum.
BlueBomber

Daniel P. Friedman (ya da "The Little Schemer") tarafından "Küçük Lisper" bölüm 9'u okuyun.
user18199

2
OP, bunu zaten okuduklarını gösteriyor gibi görünüyor.
Raphael

Yanıtlar:


29

Bunu hiçbir yerde okumamıştım, ama türetilmiş olabileceğine bu şekilde inanıyorum :Y

Bir özyinelemeli işlevi , belki de bir faktörleme veya bunun gibi bir şey yapalım . Gayri resmi olarak, kendi tanımında gerçekleştiği -sözde-lambda terimi olarak tanımlarız:f ffff

f=ff

İlk olarak, özyinelemeli çağrının bir parametre olarak dikkate alınabileceğinin farkındayız:

f=(λr.(rr))Mf

Şimdi sadece kendisine argüman olarak geçirmenin bir yolunu bulabilirsek tanımlayabiliriz . Elbette bu mümkün değil, çünkü elimizde yok . Elimizde el atıyor . Yana tanımlarız gereken her şeyi içerir , biz geçmek deneyebilirsiniz yerine argüman olarak ve yeniden deneyin sonradan içeri ondan. İlk girişimimiz şöyle görünüyor:f M M f M f fffMMfMff

f=(λr.(rr))M(λr.(rr))M

Ancak, bu tamamen doğru değil. Daha önce , içindeki değiştirdi . Ama şimdi yerine geçiyoruz. Biz bir şekilde kullanan tüm yerleri düzeltmek zorunda onlar yeniden böylece den . Aslında tüm bu zor değil: Şimdi biliyorum ki kullandığımız her yerde, biz sadece bunu değiştirin .r EfrMR f M f = M E r ( r r )MrfMf=MMr(rr)

f=(λr.((rr)(rr)))M(λr.((rr)(rr)))M

Bu çözüm iyi, ancak içeride değiştirmek zorunda kaldık . Bu çok uygun değil. Biz değiştirmek zorunda kalmadan daha zarif yapabilirsiniz başka tanıtarak gönderdiği ifade ile: kendi argümanı kendisine uygulanan olarak aldığımızM λ M M ' λ x . M ( x x )MMλMMλx.M(xx)

f=(λx.(λr.(rr))M(xx))(λx.(λr.(rr))M(xx))

Bu şekilde , için ikame edildiğinde , , ikame edilir ; bu, eşit tanımdır . Bu bize , geçerli bir lambda terimi olarak ifade edilen, özyinelemeli olmayan tanımını verir !x M M r f fMxMMrff

geçiş artık kolaydır. yerine rastgele bir lambda terimi alabilir ve bu işlemi gerçekleştirebiliriz. Böylece çarpanlara ayırabilir ve tanımlayabiliriz.M MYMM

Y=λm.(λx.m(xx))(λx.m(xx))

Nitekim, tanımladığımız gibi düşer .fYMf


Not: türevlenen ettik , literatürde tarif edildiği gibi. Tanımladığınız birleştirici , bazen olarak da adlandırılan değere göre arama dilleri için bir çeşididir . Bkz bu Wikipedia makalesine .Y ZYYZ


1
Mükemmel cevabınızın bana verdiği eksik ama görünüşte açık olan sezgi, özyinelemeli bir fonksiyonun kendisini bir argüman olarak gerektirmesi gerektiğidir, bu yüzden fonksiyonun bazı için biçimine sahip olacağı varsayımıyla başlarız . Biz inşa Sonra, , biz o iddianın faydalanmak dahili kendisine şeyin uygulaması olarak tanımlanır uygulayarak, örneğin etmek için eşit tanımı gereği olduğunu Cevabınız, içinde . Büyüleyici! X X f X x x ff=X(X)XXfXxxf
BlueBomber

11

Yuval'nın belirttiği gibi sadece bir sabit nokta operatörü yok. Bunlardan çok var. Başka bir deyişle, sabit nokta teoremi için denklemin tek bir cevabı yoktur. Yani operatörü onlardan çıkaramazsın.

İnsanların u için nasıl bir çözüm olarak elde ettiklerini sormak gibidir . Onlar değil! Denklemin benzersiz bir çözümü yok.x = y(x,y)=(0,0)x=y


Sadece bilmek istediğin şey olduğunda, ilk sabit nokta teoreminin nasıl keşfedildiğidir. Onları ilk gördüğümde sabit nokta / özyineleme teoremleri ile nasıl karşılaştıklarını merak ettiğimi söyleyeyim. Çok zekice görünüyor. Özellikle hesaplanabilirlik teorisi formunda. Yuval'ın söylediğinin aksine, insanların bir şey bulana kadar oynadığı bir durum değil. İşte ne buldum:

Hatırladığım kadarıyla, teorem aslında SC Kleene'den kaynaklanıyor. Kleene, kilisenin orijinal lambda hesabının tutarsızlığının kanıtını silerek orijinal sabit nokta teoremini ortaya çıkardı. Kilisenin orijinal lambda matematiği Russel tipi bir paradokstan muzdaripti. Modifiye lambda matematiği problemi önledi. Kleene, muhtemelen değiştirilmiş lambda hesabının benzer bir sorundan muzdarip olup olmayacağını görmek için tutarsızlık kanıtı üzerinde çalıştı ve tutarsızlık kanıtını değiştirilmiş lambda hesabında yararlı bir teorem haline getirdi. Lambada matematiğinin diğer hesaplama modelleriyle (Turing makineleri, özyinelemeli fonksiyonlar, vb.) Denkliği konusundaki çalışmaları ile diğer hesaplama modellerine aktardı.


İstediğiniz operatörü nasıl türetirsiniz? İşte aklımda nasıl tutuyorum. Sabit nokta teoremi, öz referansın kaldırılmasıyla ilgilidir.

Herkes yalancı paradoksu bilir:

Ben bir ineğim.

Veya daha dilsel biçimde:

Bu cümle yanlıştır.

Şimdi çoğu insan bu cümle ile sorunun kendi referansı ile olduğunu düşünüyor. O değil! Kendinden referans ortadan kaldırılabilir (sorun doğrudur, bir dil genel olarak kendi cümlelerinin gerçeği hakkında konuşamaz, bkz. Tarski'nin doğruluk teoreminin tanımsızlığı ). Öz referansın kaldırıldığı form aşağıdaki gibidir:

Aşağıdaki alıntıyı iki kez yazarsanız, ikinci kez tırnak içinde, ortaya çıkan cümle yanlıştır: "Aşağıdaki alıntıyı iki kez yazarsanız, ikinci kez tırnak içine alındığında, sonuçtaki cümle yanlıştır:"

Öz-referans yok, bir cümleyi nasıl oluşturacağımıza ve sonra onunla bir şeyler yapacağımıza dair talimatlarımız var. Ve yapılan cümle talimatlara eşittir. O Not veri ve talimatlar arasında bir fark olmadığından -calculus biz tırnak içine alınması gerekmez.λ

Bu analiz Şimdi eğer biz nerede inşa etmek talimatları olduğunu ve ona bir şeyler yapın.MMMxxx

Mx=f(xx)

Yani ise ve bizMλx.f(xx)

MM=(λx.f(xx))(λx.f(xx))

Bu sabit bir . Eğer bir operatör yapmak istiyorsan, sadece ekleriz ve alırız :fYλfY

Y=λf.(MM)=λf.((λx.f(xx))(λx.f(xx)))

Bu yüzden sadece referans olmadan paradoksu aklımda tutuyorum ve bu neyle ilgili olduğunu anlamama yardımcı oluyor .Y


3

Bu yüzden sabit bir nokta birleştiriciyi tanımlamanız gerekir

fix f = f (fix f)
      = f (f (fix f))
      = f (f (f ... ))

ancak açıkça tekrarlama olmadan. En basit indirgenemez birleştirici ile başlayalım

omega = (\x. x x) (\x. x x)
      = (\x. x x) (\x. x x)
      = ...

xİlk lambda art arda ikinci lambda ile ikame edilir. Basit alfa dönüşümü bu süreci daha net hale getirir:

omega =  (\x. x x) (\x. x x)
      =α (\x. x x) (\y. y y)
      =β (\y. y y) (\y. y y)
      =α (\y. y y) (\z. z z)
      =β (\z. z z) (\z. z z)

Yani birinci lambdadaki değişken daima kaybolur. Yani filk lambda bir eklersek

(\x. f (x x)) (\y. y y)

firade bob yukarı

f ((\y. y y) (\y. y y))

Sırtımızı omegageri aldık . Şimdi açık olmalı, eğer fikinci lambdaya bir eklersek f, ilk lambda ortaya çıkacak ve daha sonra yükselecektir:

Y f = (\x. x x)     (\x. f (x x))
      (\x. f (x x)) (\x. f (x x)) -- the classical definition of Y

Dan beri

(\x. s t) z = s ((\x. t) z), if `x' doesn't occur free in `s'

ifadesini şu şekilde yeniden yazabiliriz:

f ((\x. x x) (\x. f (x x))

hangisi sadece

f (Y f)

ve denklemimizi aldık Y f = f (Y f). Yani Ybirleştirici aslında

  1. iki katına f
  2. ilk fyaralanmak
  3. tekrar et

2

Normal bir form olmadan klasik bir denklem örneğini görmüş olabilirsiniz:

(λx.xx)(λx.xx)(λx.xx)(λx.xx)

Benzer bir denklem genel tekrarlama için de önerilmektedir:

(A)(λx.R(xx))(λx.R(xx)) R( (λx.R(xx))(λx.R(xx)) )R(R( (λx.R(xx))(λx.R(xx)) ))

(A) , genel özyinelemeli denklemleri lambda hesabına (ilkel özyinelemenin ötesinde) yazmanın bir yoludur. Peki denklemini nasıl ? Almak için yukarıdaki denklemde için takın :Yf=f(Yf)fR

, Y = λ f . ( λ x . f ( x x ) ) ( λ x . f ( x x ) )

Yf=(λx.f(xx))(λx.f(xx))
Y=λf.(λx.f(xx))(λx.f(xx))
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.