En küçük normal lambda teriminin en hızlı olmadığı bir örnek


12

Let arasında aşağıdaki gibi tanımlanabilir -terms:λsizeλ

  • size(x)=1 ,
  • size(λx.t)=size(t)+1 ,
  • size(ts)=size(t)+size(s)+1 .

Bir λ -term t karmaşıklığı tx normal formuna tparalel Lev indirgeme sayısı olarak tanımlanabilir olsun (Levy anlamda optimal bir değerlendirici kullanarak).tx

Daha büyük terimin daha düşük karmaşıklığa sahip olduğu aynı işlev için iki normal λ -terms örneği arıyorum .

...

Netlik için düzenleyin

Sorduğum şey belli olmadığı için sağlam bir örnek vermeye çalışacağım. Genellikle bir işlevin "naif" / "en basit" tanımının yavaş ve optimal olmadığı inancı vardır. Daha iyi performans, ek veri yapılarına, formüllere vb. İhtiyaç duyduğunuz için terimin karmaşıklığını artırır. Bunun harika bir örneği, fibonacci"naif" olarak tanımlanabilir:

-- The fixed fibonacci definition
fib_rec fib n =
    if (is_zero x) 
        then 1 
        else fib (n - 1) + f (n - 2)

-- Using church numbers instead of the λ-combinator to get a normal form
fib n = n fib_rec 0 n 

Bu genellikle fiberin "en basit" tanımı olarak kabul edilir ve çok yavaştır (üstel). Bağımlılıklarını genişletirsek fib( kilise-sayısı ilavesi için olağan tanımlar , pred, is_zero) ve normalleştirirsek, bu terimi alırız:

fib = (λa.(a(λbc.(c(λdef.f)(λde.d)(λde.(de))
      (λde.(b(λfg.(c(λhi.(i(hf)))(λh.g)(λh.h)))
      d(b(λfg.(c(λhi.(i(h(λjk.(k(jf))))))(λhi.g)
      (λh.h)(λh.h)))de)))))(λbc.c)a))

Not tabloları gibi iyileştirmeler bu terimi daha büyük hale getirecektir. Oysa vardır çok daha küçük farklı bir terim ...

fib = (λa.(a(λb.(b(λcde.(e(λfg.(cf(dfg)))c))))
      (λb.(b(λcd.(cd))(λcd.d)))(λbc.b)))

ve merakla, asimptotik olarak içeri giren saf olandan daha üstündür O(N). Tüm tanımların farkındayım, bu hem en hızlı hem de en basit olanı . Aynı etki sıralama için de geçerlidir. Örneğin kabarcık sıralaması ve sıralama genellikle ekleme gibi "Naif" tanımları (uzun 20 + çizgiler) büyük terimlere genişletilmeyecektir ama vardır küçük tanım:

-- sorts a church list (represented as the fold) of church numbers
sort = λabc.a(λdefg.f(d(λhij.j(λkl.k(λmn.mhi)l)(h(λkl.l)i))
       (λhi.i(λjk.bd(jhk))(bd(h(λjk.j(λlm.m)k)c))))e)(λde.e)
       (λde.d(λfg.g)e)c

Bu da bildiğim diğer tüm tanımlardan daha hızlı, asimptotik olarak oluyor. Bu gözlem, ortak inanışın aksine, en küçük Kolmogorov karmaşıklığına sahip en basit terimin genellikle daha hızlı olduğuna inanmamı sağlıyor. Sorum temel olarak bunun tersini gösteren bir kanıt olup olmadığıdır, ancak resmileştirmekte zorlanıyordum.


3
Hayır sqrt (n) karmaşıklığına sahiptir. n!=n.n1....2.1
T ....

2
AKS algoritmasından daha kısa bir -term ile deneme bölümünü kodlayabileceğinizden eminim . λ
Emil Jeřábek

2
@ EmilJeřábek ile hemfikirim ve aslında, zaten yaptığınız gibi sıralama algoritmalarına bakarak bir örneğin nasıl elde edildiğini görmüyorum: -term uygulama balonu -term implmenting'den daha kısa değil , söyle, yığın çeşit? Veya bilmiyorum, kaba kuvvet arama, uygulamak için süper kısa ama üstel zaman, daha fazla kod satırı gerektiren akıllı bir çoklu zaman algoritması ...? Bir şey eksik olmalıyım, korkarım soruyu gerçekten anlamıyorum. λλ
Damiano Mazza

1
Bunu gerçekten yazmak için hiçbir çaba göstermedim, ancak sezgisel bir ilke olarak, iki algoritmanın göreli uzunlukları genellikle programlama dilinin seçiminden çok fazla etkilenmez ve kesinlikle hiçbir neden görmüyorum -calculus bir istisna olmalıdır . Özellikle normalleşmenin burada kırmızı bir ringa balığı olduğunu unutmayın: -calculus içinde algoritmaları ifade etmenin en doğal yolu , get-go'dan normal terimler verir ve her neyse, Unlambda ile yaşadığım deneyimden IIRC, herhangi bir terimi bir uygulandığında aynı sonucu veren normal uzunluktaki normal terim. λλ
Emil Jeřábek

2
Ve evet, Damiano'nun belirttiği gibi, AKS sadece bir örnekti. Aynı şey, önemsiz verimsiz bir algoritmaya ve aynı sorunun etkili ama çok daha karmaşık bir çözümüne sahip olduğumuz az çok her durumda geçerlidir.
Emil Jeřábek

Yanıtlar:


10

Blum'un hızlanma teoremi genellikle kısmen özyinelemeli işlevlerin dilinde belirtilir, ancak gösterimdeki önemsiz farklılıklara kadar, -calculus dilinde aynı şekilde çalışır .λ

Herhangi bir makul karmaşıklık ölçüsü (örneğin, sorudaki gibi optimal azaltma sayısı) ve yinelemeli işlevi (örneğin, ) verildiğinde , yinelemeli bir öyle ki:Mf(x,y)2yP(x)

Her algoritma (yani için burada normal formda uzun dönem) işlem , bir algoritma var olan için sahip -speedup fazla : λgPhPfg

f(x,M(h,x))M(g,x) for all large enough inputs x,

burada hesaplama karmaşıklığını gösterir girişi ölçmek için uygun .M(g,x)gxM

Sonuç:

  • P verilen ölçümde asimptotik olarak optimal bir algoritması yoktur

  • özellikle, için en kısa algoritma asimptotik olarak optimal değildirP

  • için herhangi bir algoritma için , normal formu daha uzun olan asimptotik olarak daha hızlı bir algoritma vardır (çünkü değişkenlerin yeniden adlandırılmasına kadar, belirli bir uzunlukta sadece sonlu birçok normal terim vardır)P

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.