가장 작은 정규 람다 항이 가장 빠르지 않은 예


12

하자가 sizeλ 다음과 같이 정의 될 -terms :

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

term 의 복잡성을 에서 정상 형태 (Levy의 관점에서 최적의 평가자를 사용하여) 에서 병렬 베타 감소의 수로 정의 하자 .t t xλttx

큰 용어가 복잡성을 낮추는 동일한 함수에 대한 두 개의 일반적인 -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

또한 내가 아는 다른 모든 정의보다 무의식적으로 더 빠릅니다. 이 관찰은 일반적인 믿음과는 달리 가장 작은 Kolmogorov 복잡도를 가진 가장 단순한 용어는 일반적으로 더 빠르다고 믿게합니다. 내 질문은 기본적으로 그 반대의 증거가 있지만 공식화에 어려움을 겪을 것입니다.


3
어떠한 SQRT (N)의 복잡도가 없다. n!=n.n1....2.1
T ....

2
AKS 알고리즘보다 짧은 -term으로 시험 분할을 코딩 할 수 있다고 확신합니다 . λ
Emil Jeřábek

2
@ EmilJeřábek에 동의하며 실제로는 이미 정렬 알고리즘을 살펴보면 예제를 얻는 방법을 알지 못합니다. -term이 거품 정렬을 -term implmenting 보다 짧지 않습니까? 예를 들어 힙 정렬? 또는 무차별 검색, 구현 시간이 짧지 만 기하 급수적 인 시간, 더 많은 코드 줄을 필요로하는 영리한 폴리 타임 알고리즘을 모르겠습니다 ...? 나는 무언가를 놓치고 있어야한다. 나는 그 질문을 정말로 이해하지 못하는 것을 두려워한다. λλλ
Damiano Mazza 2016 년

1
실제로 그것을 쓰려고 노력하지는 않았지만 휴리스틱 원칙으로 두 알고리즘의 상대적 길이는 일반적으로 프로그래밍 언어의 선택에 크게 영향을받지 않으며 -calculus가 예외가되어야 할 이유는 전혀 없습니다. . 특히 정규화는 여기에서 붉은 청어입니다. -calculus 에서 알고리즘을 표현하는 가장 자연스러운 방법 은 get-go에서 정상적인 용어를 제공하며 어쨌든 Unlambda에 대한 경험으로 IIRC를 사용하면 모든 용어를 적용 할 때 동일한 결과를 제공하는 유사한 길이의 정규 용어. λλλ
Emil Jeřábek

2
Damiano가 언급했듯이 AKS는 단지 예일뿐입니다. 사소한 비효율적 인 알고리즘과 같은 문제에 대한 효율적이지만 훨씬 더 정교한 솔루션이있는 상황에서도 거의 동일합니다.
Emil Jeřábek

답변:


10

Blum의 속력 정리 는 일반적으로 부분 재귀 함수의 언어로 표시되지만 표기법의 사소한 차이까지 -calculus 의 언어와 동일하게 작동합니다 .λ

합리적인 복잡성 측정치 (예를 들어, 질문에서 최적의 감소 횟수)과 재귀 함수 (예 : ) 가 주어지면 재귀 술어 그런 :f ( x , y ) 2 y P ( x )Mf(x,y)2yP(x)

모든 알고리즘 (예를 들어 여기 정규형 -term) 컴퓨팅 다른 알고리즘가 에 대한 갖는다 -speedup 위에 :  충분히 큰 모든 입력에 대해  λ g P h P f g f ( x , M ( h , x ) ) M ( g , x ) x ,λgPhPfg

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

여기서 는 측정 값 에 따른 입력 에 대한 계산의 복잡성을 나타냅니다 .g X MM(g,x)gxM

따라서:

  • P주어진 측정에서 는 무의식적으로 최적의 알고리즘이 없습니다.

  • 특히, 대한 가장 짧은 알고리즘 은 점진적으로 최적이 아닙니다.P

  • 대한 모든 알고리즘 에는 정규 형식이 더 긴 무조건 빠른 알고리즘이 있습니다 (변수의 이름을 바꿀 때까지 주어진 길이의 정규 항은 무한히 많음)P

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.