Deixe o de -terms ser definido da seguinte maneira:λ
- ,
- ,
- .
Permita que a complexidade de a -term seja definida como o número de reduções beta paralelas de à sua forma normal (usando um avaliador ideal no sentido de Levy).
Estou procurando um exemplo de dois termos \ lambda normais para a mesma função em que o termo maior tem menor complexidade.
...
Editar para maior clareza
como parece que não é óbvio o que estou perguntando, tentarei dar um exemplo sólido. Costuma-se acreditar que a definição "ingênua" / "mais simples" de uma função é lenta e não ideal. Um melhor desempenho aumenta a complexidade do termo, pois você precisa adicionar estruturas de dados, fórmulas etc. Um ótimo exemplo é fibonacci
, que pode ser "ingênuo" definido como:
-- 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
Isso é geralmente considerado como a definição "mais simples" de fib, e é muito lento (exponencial). Se expandirmos as dependências de fib
(as definições usuais para adição de número de igreja, pred, is_zero) e normalizarmos, obteremos este termo:
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))
Melhorias como tabelas de memorização tornariam esse termo maior. No entanto, existe um termo diferente que é muito menor ...
fib = (λa.(a(λb.(b(λcde.(e(λfg.(cf(dfg)))c))))
(λb.(b(λcd.(cd))(λcd.d)))(λbc.b)))
e, curiosamente, também é assintoticamente superior ao ingênuo, correndo O(N)
. De todas as definições que tenho conhecimento, essa é a mais rápida e a mais simples . O mesmo efeito acontece com a classificação. Definições "ingênuas", como classificação de bolha e inserção, geralmente são expandidas para termos enormes (mais de 20 linhas), mas existe uma definição pequena:
-- 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
O que também passa a ser mais rápido, assintoticamente, do que qualquer outra definição que eu conheça. Essa observação me leva a acreditar que, em oposição à crença comum, o termo mais simples, com a menor complexidade de Kolmogorov, geralmente é o mais rápido. Minha pergunta é basicamente se há alguma evidência do contrário, embora eu tenha dificuldade em formalizá-la.
Respostas:
O teorema de aceleração de Blum é geralmente indicado na linguagem de funções parcialmente recursivas, mas até diferenças triviais na notação, funciona da mesma forma na linguagem -calculus.λ
Ele diz que, dada qualquer medida de complexidade razoável (por exemplo, o número ideal de reduções, como na pergunta) e uma função recursiva (por exemplo, ), podemos encontrar um predicado recursivo modo que:M f(x,y) 2y P(x)
onde indica a complexidade do cálculo do na entrada de acordo com a medir .M(g,x) g x M
Consequentemente:
em particular, o algoritmo mais curto para não é assintoticamente idealP
para qualquer algoritmo para , existe um algoritmo assintoticamente mais rápido, cuja forma normal é mais longa (porque até a renomeação de variáveis, há apenas muitos termos normais de um determinado comprimento)P
fonte