让的被定义如下组术语:λ
- ,
- ,
- 。
令项t的复杂度定义为从到其正常形式的并行beta减少的次数(使用Levy的最佳估算器)。
我正在寻找一个相同函数的两个正常 -term 的示例,其中较大的term具有较低的复杂性。
...
编辑清晰
由于似乎我要问的内容并不明显,因此我将尝试给出一个可靠的例子。通常认为,函数的“天真” /“最简单”定义是缓慢的而不是最优的。更好的性能会增加术语的复杂性,因为您需要添加数据结构,公式等。一个很好的例子是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
渐近地,这比我所知道的其他定义还快。这种观察使我相信,与通常的看法相反,最简单的术语具有最小的Kolmogorov复杂度,通常更快。我的问题是基本上是否有相反的证据,尽管我很难正式化它。
3
没有具有sqrt(n)复杂度。
—
T ....
我敢肯定,您可以使用比AKS算法更短的 -term 来编码试验划分。
—
EmilJeřábek'15
我同意@EmilJeřábek和,实际上,我看不出一个例子不被看的排序算法得到的,因为你已经做了:是不是 -term实现冒泡排序比短 -term implmenting ,比如说堆排序?或者,我不知道,蛮力搜索,实现起来非常短,但是却需要指数时间,而聪明的polytime算法需要更多的代码行...?我一定想念一些东西,恐怕我不太了解这个问题。λ
—
Damiano Mazza
我实际上并未写下来,但是作为一种启发式原理,两种算法的相对长度通常不受编程语言选择的影响很大,而且我绝对看不出 -calculus应该是一个例外。特别要注意的是,这里的规范化是一个红色的鲱鱼:如何在 -calculus中表达算法的最自然的方法是从一开始就给出正则项,无论如何,根据我对Unlambda的经验,IIRC可以将任何项转化为相似长度的标准术语在应用时给出相同的结果。λ
—
EmilJeřábek'15
是的,正如达米亚诺(Damiano)所说,AKS只是一个例子。在我们拥有微不足道的低效率算法,以及针对同一问题的高效但复杂得多的解决方案的任何情况下,都应采用相同的方法。
—
EmilJeřábek'15