最小の通常のラムダ項が最速ではない例


12

してみましょうsizeλ次のように定義され-terms:

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

λ -term tの複雑さを、txからその正規形へのt並列ベータ削減の数として定義する(Levyの意味で最適な評価を使用)。tx

私は同じ関数に対して2つの通常の λ -termsの例を探しています。ここで、より大きな用語はより複雑ではありません。

...

明確にするために編集する

私が尋ねていることは明らかではないように思えるので、堅実な例を挙げようとします。多くの場合、関数の「単純な」/「最も単純な」定義は遅く、最適ではないという考えがあります。データ構造や数式などを追加する必要があるため、パフォーマンスが向上すると用語の複雑さが増します。優れた例はfibonacci、「単純」に次のように定義できます。

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

これはしばしばfibの「最も単純な」定義と見なされ、非常に遅い(指数関数的)。fib(教会番号の追加、pred、is_zero の通常の定義)の依存関係を拡張し、それを正規化すると、この用語が得られます。

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

メモ表などの改善により、この用語が大きくなります。しかし、はるかに小さい別の用語が存在します...

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

そして、奇妙なことに、で実行されている単純なものよりも漸近的に優れていO(N)ます。私が知っているすべての定義の中で、これは最速かつ最も単純なものです。同じ効果はソートでも発生します。バブルソートや挿入ソートなどの「単純な」定義は、しばしば大きな用語(20行以上)に拡張されますが、小さな定義があります。

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

また、これは私が知っている他のすべての定義よりも、漸近的に高速です。この観察は、一般的な信念とは対照的に、コルモゴロフの複雑さが最小の最も単純な用語が通常は高速であると考えるようになります。私の質問は基本的に反対の証拠があるかどうかですが、それを形式化するのに苦労します。


3
はsqrt(n)の複雑さはありません。n!=n.n1....2.1
T ....

2
AKSアルゴリズムよりも短い -termでトライアル除算をコーディングできると確信しています。λ
エミールイェジャベク3.0

2
ありません:私は実際に、私は例が既に行ったように、ソートアルゴリズムを見ることで得られていませんどのように表示されていない、EmilJeřábek@に同意し、よりもソート短い-term実装バブル -term implmenting 、例えば、ヒープソート?または、ブルートフォース検索、実装するには非常に短いが指数関数的な時間、対より多くのコード行を必要とする賢いポリタイムアルゴリズム... 私は何かが欠けているに違いない、私は本当に質問を理解していないのではないかと心配している。λλ
ダミアーノマッツァ

1
私は実際にそれを書き留める努力はしませんでしたが、ヒューリスティックな原則として、2つのアルゴリズムの相対的な長さは通常プログラミング言語の選択によってあまり影響されず、 -calculusが例外であるべき理由はまったくありません。特にここでの正規化は赤いニシンであることに注意してください。 -calculusでアルゴリズムを表現する最も自然な方法は、開始から通常の用語を提供し、とにかく、Unlambdaでの私の経験から、IIRCは、任意の用語を適用されたときに同じ結果を与える同様の長さの通常の用語。λλ
エミールイェジャベク3.0

2
そして、はい、ダミアーノが言及するように、AKSは単なる例でした。些細な非効率的なアルゴリズムと、同じ問題の効率的だがはるかに洗練された解決策が存在するような状況でも、ほぼ同じことが当てはまるはずです。
エミールイェジャベク3.0

回答:


10

Blumの高速化定理は通常、部分再帰関数の言語で記述されていますが、表記法の些細な違いまでは、 -calculusの言語でもまったく同じように機能します。λ

合理的な複雑さの測度(たとえば、問題のような最適な削減の数)と再帰関数(たとえば、)が与えられると、再帰述語そのような:Mf(x,y)2yP(x)

すべてのアルゴリズムのために(すなわち、 -term正規形でここに)演算、別のアルゴリズムが存在するのために有する -speedupオーバー: λgPhPfg

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

ここで、は、測定応じた入力でのの計算の複雑さを示します。M(g,x)gxM

その結果:

  • Pは、与えられた尺度で漸近的に最適なアルゴリズムがありません

  • 特に、の最短アルゴリズムは漸近的に最適ではありませんP

  • 任意のアルゴリズムの場合、正規形がより長い漸近的に高速なアルゴリズムがあります(変数の名前を変更するまで、与えられた長さの有限数の正規項しかありません)P

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.