してみましょうの次のように定義され-terms:
- 、
- 、
- 。
-term tの複雑さを、txからその正規形への並列ベータ削減の数として定義する(Levyの意味で最適な評価を使用)。
私は同じ関数に対して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
また、これは私が知っている他のすべての定義よりも、漸近的に高速です。この観察は、一般的な信念とは対照的に、コルモゴロフの複雑さが最小の最も単純な用語が通常は高速であると考えるようになります。私の質問は基本的に反対の証拠があるかどうかですが、それを形式化するのに苦労します。