Một ví dụ trong đó thuật ngữ lambda bình thường nhỏ nhất không nhanh nhất


12

Đặt của λ -terms được định nghĩa như sau:sizeλ

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

Đặt độ phức tạp của -term được định nghĩa là số lần giảm beta song song từ sang dạng bình thường (sử dụng công cụ đánh giá tối ưu theo nghĩa của Levy).λttx

Tôi đang tìm một ví dụ về hai -terms bình thường cho cùng một hàm trong đó thuật ngữ lớn hơn có độ phức tạp thấp hơn.λ

...

Chỉnh sửa cho rõ ràng

vì dường như không rõ ràng những gì tôi đang hỏi, tôi sẽ cố gắng đưa ra một ví dụ chắc chắn. Thường có một niềm tin rằng định nghĩa "ngây thơ" / "đơn giản nhất" của một hàm là chậm và không tối ưu. Hiệu suất tốt hơn làm tăng độ phức tạp của thuật ngữ, vì bạn cần thêm cấu trúc dữ liệu, công thức, v.v. Một ví dụ tuyệt vời là fibonacci, có thể được "ngây thơ" định nghĩa là:

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

Đây thường được coi là định nghĩa "đơn giản nhất" của sợi và rất chậm (theo cấp số nhân). Nếu chúng tôi mở rộng sự phụ thuộc của fib(các định nghĩa thông thường để thêm số nhà thờ, trước, is_zero) và bình thường hóa nó, chúng tôi sẽ nhận được thuật ngữ này:

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

Các cải tiến như bảng ghi nhớ sẽ làm cho thuật ngữ này lớn hơn. Tuy nhiên, tồn tại một thuật ngữ khác nhỏ hơn nhiều ...

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

và, tò mò, cũng vượt trội so với người ngây thơ, chạy vào O(N). Trong tất cả các định nghĩa tôi biết, đây là cách nhanh nhất và đơn giản nhất . Hiệu ứng tương tự xảy ra với sắp xếp. Các định nghĩa "Ngây thơ" như sắp xếp bong bóng và sắp xếp chèn thường được mở rộng thành các thuật ngữ lớn (dài hơn 20 dòng), nhưng tồn tại một định nghĩa nhỏ:

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

Điều này cũng xảy ra nhanh hơn, không có triệu chứng, hơn mọi định nghĩa khác mà tôi biết. Quan sát này khiến tôi tin rằng, trái ngược với niềm tin chung, thuật ngữ đơn giản nhất, với độ phức tạp Kolmogorov nhỏ nhất, thường là nhanh hơn. Câu hỏi của tôi về cơ bản là có bất kỳ bằng chứng nào ngược lại, mặc dù tôi có một thời gian khó khăn trong việc chính thức hóa nó.


3
Không có độ phức tạp sqrt (n). n!=n.n1....2.1
T ....

2
Tôi khá chắc chắn rằng bạn có thể mã hóa phân chia thử nghiệm bằng một -term ngắn hơn thuật toán AKS. λ
Emil Jeřábek 3.0

2
Tôi đồng ý với @ EmilJeřábek và, trên thực tế, tôi không thấy làm thế nào một ví dụ không được thu được bằng cách nhìn vào các thuật toán phân loại, như bạn đã làm: không phải là bong bóng -term thực hiện loại ngắn hơn -term implmenting , nói, sắp xếp đống? Hoặc, tôi không biết, một tìm kiếm vũ phu, siêu ngắn để thực hiện nhưng thời gian theo cấp số nhân, so với thuật toán đa thời gian thông minh đòi hỏi nhiều dòng mã hơn ...? Tôi phải thiếu một cái gì đó, tôi sợ rằng tôi không thực sự hiểu câu hỏi. λλ
Damiano Mazza

1
Tôi đã không nỗ lực để thực sự viết nó ra, nhưng theo nguyên tắc heuristic, độ dài tương đối của hai thuật toán thường không bị ảnh hưởng nhiều bởi sự lựa chọn ngôn ngữ lập trình và tôi thấy hoàn toàn không có lý do gì -calculus là một ngoại lệ . Đặc biệt lưu ý rằng bình thường hóa là cá trích đỏ ở đây: cách tự nhiên nhất để thể hiện thuật toán trong -calculus đưa ra các thuật ngữ bình thường từ việc di chuyển, và dù sao, IIRC từ kinh nghiệm của tôi với Unlambda, bạn có thể chuyển đổi bất kỳ thuật ngữ nào thành thuật ngữ bình thường có độ dài tương tự cho kết quả tương tự khi áp dụng. λλ
Emil Jeřábek 3.0

2
Và vâng, như Damiano đề cập, AKS chỉ là một ví dụ. Điều tương tự cũng sẽ xảy ra trong bất kỳ trường hợp nào chúng ta có một thuật toán không hiệu quả tầm thường và một giải pháp hiệu quả nhưng tinh vi hơn nhiều cho cùng một vấn đề.
Emil Jeřábek 3.0

Câu trả lời:


10

Định lý tăng tốc của Blum thường được nêu trong ngôn ngữ của các hàm đệ quy một phần, nhưng với sự khác biệt nhỏ trong ký hiệu, nó hoạt động giống nhau trong ngôn ngữ của -calculus.λ

Nó nói rằng với bất kỳ số đo phức tạp hợp lý (ví dụ: số lượng giảm tối ưu như trong câu hỏi) và hàm đệ quy (ví dụ: ), chúng ta có thể tìm thấy một biến vị ngữ đệ quy sao cho:Mf(x,y)2yP(x)

Đối với mọi thuật toán (ví dụ: -term ở dạng bình thường ở đây) tính toán , có một thuật toán cho có -speedup trên : λgPhPfg

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

nơi biểu thị sự phức tạp của việc tính toán trên đầu vào theo để đo .M(g,x)gxM

Hậu quả là:

  • P không có thuật toán tối ưu tiệm cận trong phép đo đã cho

  • đặc biệt, thuật toán ngắn nhất cho không tối ưu hóa không có triệu chứngP

  • đối với bất kỳ thuật toán nào cho , có một thuật toán nhanh hơn bất thường có dạng bình thường dài hơn (vì để đổi tên các biến, chỉ có nhiều thuật ngữ bình thường có độ dài nhất định)P

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.