Un esempio in cui il termine lambda normale più piccolo non è il più veloce


12

Lasciare la di λ Capitolato essere definita come segue:sizeλ

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

Lasciare la complessità di un -term t essere definito come il numero di riduzioni beta parallele da t x alla sua forma normale (usando un valutatore ottimale nel senso di Levy).λttx

Sto cercando un esempio di due normali term per la stessa funzione in cui il termine più grande ha una complessità inferiore.λ

...

Modifica per chiarezza

dal momento che sembra che non sia ovvio quello che sto chiedendo, proverò a dare un solido esempio. Spesso si crede che la definizione "ingenua" / "più semplice" di una funzione sia lenta e non ottimale. Prestazioni migliori aumentano la complessità del termine, poiché sono necessarie strutture dati, formule ecc. Aggiunte. Un grande esempio è fibonacciche può essere definito "ingenuamente" come:

-- 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 

Questa è spesso considerata la definizione "più semplice" di fib ed è molto lenta (esponenziale). Se espandiamo le dipendenze di fib(le solite definizioni per l'aggiunta del numero di chiesa, pred, is_zero) e lo normalizziamo, otteniamo questo termine:

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))

Miglioramenti come le tabelle di memoization aumenterebbero questo termine. Tuttavia, esiste un termine diverso che è molto più piccolo ...

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

e, curiosamente, è anche asintoticamente superiore a quello ingenuo, che corre dentro O(N). Di tutte le definizioni che conosco, questa è sia la più veloce che la più semplice . Lo stesso effetto si verifica con l'ordinamento. Le definizioni "ingenue" come ordinamento a bolle e ordinamento per inserzione vengono spesso estese a termini enormi (più di 20 righe), ma esiste una piccola definizione:

-- 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

Che è anche più veloce, asintoticamente, di ogni altra definizione che conosco. Questa osservazione mi porta a credere che, a differenza della credenza comune, il termine più semplice, con la minima complessità di Kolmogorov, sia di solito il più veloce. La mia domanda è sostanzialmente se ci sono prove del contrario, anche se avrei difficoltà a formalizzarlo.


3
n!=n.n1....2.1

2
λ

2
λλ

1
λλ

2
E sì, come menziona Damiano, AKS era solo un esempio. Lo stesso dovrebbe valere in quasi tutte le situazioni in cui abbiamo un banale algoritmo inefficiente e una soluzione efficiente ma molto più sofisticata dello stesso problema.
Emil Jeřábek,

Risposte:


10

λ

Mf(x,y)2yP(x)

λgPhPfg

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

M(g,x)gxM

Di conseguenza:

  • P

  • P

  • P

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.