Tại sao điều quan trọng là các hàm ẩn danh trong phép tính lambda?


19

Tôi đang xem bài giảng của Jim Weirich, có tựa đề ' Cuộc phiêu lưu trong lập trình chức năng '. Trong bài giảng này, ông giới thiệu khái niệm về tổ hợp Y, về cơ bản tìm thấy điểm cố định cho các hàm bậc cao hơn.

Một trong những động lực, như ông đề cập, là có thể biểu diễn các hàm đệ quy bằng phép tính lambda sao cho lý thuyết của Church (bất cứ thứ gì có thể tính toán hiệu quả đều có thể được tính toán bằng phép tính lambda).

Vấn đề là một hàm không thể gọi chính nó đơn giản như vậy, vì phép tính lambda không cho phép các hàm được đặt tên, tức là

n(x,y)=x+y

không thể mang tên ' ', nó phải được định nghĩa ẩn danh:n

(x,y)x+y

Tại sao điều quan trọng đối với phép tính lambda có các hàm không được đặt tên? Nguyên tắc nào bị vi phạm nếu có chức năng được đặt tên? Hay là tôi chỉ hiểu nhầm video của jim?


4
Điều này không có vẻ quan trọng cả. Bạn có thể gán cho một biến và sau đó bạn đã đặt tên cho hàm. n(x,t)x+yn
Yuval Filmus

@YuvalFilmus có, bạn có thể liên kết tên với hàm. Tôi nghĩ rằng câu hỏi thực sự ở đây, sự bối rối, là tại sao (trong phép tính lambda) không thể gọi hàm theo tên như vậy? Tại sao chúng ta cần một kỹ thuật như toán tử Y để thực hiện các hàm đệ quy? Tôi hy vọng câu trả lời của tôi dưới đây sẽ giúp.
Jerry101

1
@ Jerry101 Lý do lịch sử cho việc không tự ứng dụng là -calculus được dự định là một nền tảng của toán học và khả năng tự áp dụng làm cho một nền tảng như vậy ngay lập tức không nhất quán. Vì vậy, sự bất lực rõ ràng này (mà chúng ta biết bây giờ có thể tránh được) là một tính năng thiết kế của -calculus. λλλ
Martin Berger

@MartinBerger vui lòng nói thêm. Không phù hợp với lý do trong câu trả lời của tôi? Hay vì một lý do khác?
Jerry101

1
@ Jerry101 Không nhất quán theo nghĩa bạn có thể chứng minh 0 = 1 trong một nền tảng toán học như vậy. Sau Kleene và Rosser cho thấy sự mâu thuẫn của tinh khiết, không định kiểu -calculus, chỉ đơn giản là đánh máy -calculus được phát triển như một sự thay thế mà không cho phép chúng ta xác định combintors sửa chữa điểm như . Nhưng nếu bạn thêm đệ quy vào -calculus được gõ đơn giản thì nó lại trở nên không nhất quán, bởi vì mọi loại đều có một chương trình không kết thúc. λ Y λλλYλ
Martin Berger

Câu trả lời:


24

Định lý chính liên quan đến vấn đề này là do một nhà toán học người Anh từ cuối thế kỷ 16, được gọi là William Shakespeare . Bài báo nổi tiếng nhất của ông về chủ đề này có tựa đề " Romeo và Juliet " được xuất bản năm 1597, mặc dù công việc nghiên cứu đã được tiến hành vài năm trước đó, lấy cảm hứng từ những tiền thân như Arthur Brooke và William Họa sĩ.

Kết quả chính của ông, được nêu trong Đạo luật II. Cảnh II , là định lý nổi tiếng :

Những gì trong một cái tên? mà chúng ta gọi là hoa hồng
Bởi bất kỳ tên nào khác cũng sẽ có mùi ngọt ngào;

Định lý này có thể được hiểu một cách trực quan là "tên không đóng góp cho ý nghĩa".

Phần lớn của bài viết được dành cho một ví dụ bổ sung cho định lý và cho thấy rằng, mặc dù tên không có ý nghĩa gì, chúng là nguồn gốc của những vấn đề bất tận.

Như Shakespeare đã chỉ ra, tên có thể được thay đổi mà không thay đổi ý nghĩa, một hoạt động mà sau này được gọi là -conversion của Alonzo Church và những người theo ông. Kết quả là, không nhất thiết đơn giản để xác định những gì được biểu thị bằng một tên. Điều này đặt ra một loạt các vấn đề như phát triển khái niệm môi trường trong đó liên kết tên-nghĩa được chỉ định và quy tắc để biết môi trường hiện tại là gì khi bạn cố gắng xác định ý nghĩa liên quan đến tên. Điều này khiến các nhà khoa học máy tính gặp khó khăn trong một thời gian, làm phát sinh những khó khăn kỹ thuật như vấn đề Funarg khét tiếngα. Môi trường vẫn là một vấn đề trong một số ngôn ngữ lập trình phổ biến, nhưng nó thường được coi là không an toàn về mặt vật lý để cụ thể hơn, gần như gây chết người như ví dụ của Shakespeare trong bài báo của mình.

Vấn đề này cũng gần với các vấn đề được nêu ra trong lý thuyết ngôn ngữ chính thức , khi bảng chữ cái và hệ thống chính thức phải được định nghĩa theo một đẳng cấu , để nhấn mạnh rằng các ký hiệu của bảng chữ cái là các thực thể trừu tượng , không phụ thuộc vào cách chúng "cụ thể hóa" như các yếu tố từ một số bộ.

Kết quả chính này của Shakespeare cũng cho thấy rằng khoa học sau đó đã chuyển hướng khỏi ma thuật và tôn giáo, nơi một sinh vật hoặc một ý nghĩa có thể có một tên thật .

Kết luận của tất cả những điều này là đối với công việc lý thuyết, thường không thuận tiện hơn khi không bị vướng tên, mặc dù nó có thể cảm thấy đơn giản hơn cho công việc thực tế và cuộc sống hàng ngày. Nhưng nhớ lại rằng không phải ai cũng gọi mẹ là mẹ của bạn.

Lưu ý :
Vấn đề được giải quyết gần đây hơn bởi nhà logic học người Mỹ thế kỷ 20 Gertrude Stein . Tuy nhiên, các đồng nghiệp toán học của cô vẫn đang cân nhắc các ý nghĩa kỹ thuật chính xác của định lý chính của cô :

Hoa hồng là hoa hồng là hoa hồng là hoa hồng.

xuất bản năm 1913 trong một cuộc giao tiếp ngắn mang tên "Thánh Emily".


3
Lưu ý thêm: Trong những thập kỷ gần đây, "hoa hồng" (trong khoa học máy tính) hầu hết được thay thế bằng "foobar" (và các bộ phận của nó) như là ví dụ điển hình cho một cái tên tốt như bất kỳ tên nào khác. Sở thích này rõ ràng đã được giới thiệu bởi các kỹ sư đường sắt Mỹ.
FrankW

Điều đó nói rằng, tên chính tắc cho các khái niệm thường được sử dụng là rất quan trọng để giao tiếp hiệu quả.
Raphael

1
@Raphael Đồng ý, nhưng tôi sẽ đặt nó trong danh mục cuộc sống hàng ngày. Và làm thế nào để chúng ta biết ranh giới của những gì thực sự kinh điển? Tuy nhiên, tôi thường cảm thấy lo lắng khi thấy các sinh viên sử dụng tất cả các thuật ngữ, ký hiệu và định nghĩa (hoặc thậm chí là cách một số định lý được nêu) cho một sự thật bất di bất dịch do Chúa ban. Ngay cả ở đây, trên SE, sinh viên đặt câu hỏi, không nhận ra rằng chúng ta có thể không biết các ký hiệu của họ, hoặc các định nghĩa họ sử dụng trong lớp. Phép thuật của tên thật không dễ chết.
babou

10

Tôi muốn mạo hiểm một ý kiến ​​khác với ý kiến ​​của @babou và @YuvalFilmus: Điều quan trọng đối với -calculus thuần túy là có chức năng ẩn danh. Vấn đề với việc chỉ có các chức năng được đặt tên là bạn cần biết trước bạn sẽ cần bao nhiêu tên. Nhưng trong -calculus thuần túy, bạn không bị ràng buộc về số lượng chức năng được sử dụng (nghĩ về đệ quy), vì vậy bạn sử dụng (1) chức năng ẩn danh hoặc (2) bạn đi theo lộ trình -calculus và cung cấp một tổ hợp tên mới ( in -calculus) cung cấp nguồn cung cấp tên mới vô tận trong thời gian chạy.λλπνx.Pπ

Lý do thuần túy -calculus không có cơ chế rõ ràng cho đệ quy là vì -calculus ban đầu được dự định là một nền tảng của toán học bởi A. Church, và đệ quy làm cho một nền tảng không đáng kể như vậy. Vì vậy, thật bất ngờ khi Stephen Kleene và JB Rosser phát hiện ra rằng -calculus thuần túy không phù hợp làm nền tảng của toán học ( Nghịch lý Kleene hay Rosser ). Haskell Curry đã phân tích nghịch lý Kleene-Rosser và nhận ra rằng bản chất của nó là thứ mà ngày nay chúng ta gọi là Y-Combinator.λλλ

Đã thêm sau nhận xét của @ babou: không có gì sai khi có chức năng được đặt tên. Bạn có thể làm điều này như sau: là một cách viết tắt cho trong cách gọi theo giá trị -calculus.letf=MinN(λf.N)Mλ


1
Tôi nghĩ rằng OP muốn có khả năng đặt tên cho các chức năng, không cấm các chức năng ẩn danh. Điều này nói rằng, tôi sẽ nghĩ rằng bất kỳ yêu cầu nào của tính toán regarding liên quan đến nhu cầu về các hàm ẩn danh cũng sẽ hiển thị trong các ngôn ngữ như Lisp / Scheme hoặc ML. Trong trường hợp của Lisp / Scheme, tính tuần hoàn của các nhà đánh giá sẽ giúp tạo ra các tên mới khi cần, mặc dù tôi không chắc chắn tôi sẽ muốn nó theo cách đó trong một hệ thống chính thức. Việc sử dụng số lượng hàm không giới hạn không nhất thiết là một vấn đề khi đệ quy cho phép sử dụng lại các tên đã sử dụng cục bộ.
babou

@babou Scheme và ML có letrec, vì vậy chúng có thể dễ dàng sống với một số hữu hạn các hàm được đặt tên. Tôi rất muốn xem một bài thuyết trình về -calculus thuần túy với sơ đồ rõ ràng để sử dụng lại tên. Và đúng vậy, khả năng đặt tên các hàm (và các thuật ngữ khác) hoàn toàn tương thích với -calculus thuần túy . λλλ
Martin Berger

Dòng cuối cùng có nên đọc (lambda f. N) M không?
Joe the Person

@JoethePerson Vâng, phát hiện tốt. Đã sửa. Cảm ơn.
Martin Berger

4

Tôi tin rằng ý tưởng là tên không cần thiết. Bất cứ điều gì xuất hiện để yêu cầu tên đều có thể được viết dưới dạng hàm ẩn danh.

Bạn có thể nghĩ về phép tính lambda như ngôn ngữ lắp ráp. Ai đó trong một bài giảng về lắp ráp có thể nói "Không có cây thừa kế hướng đối tượng trong ngôn ngữ lắp ráp." Sau đó, bạn có thể nghĩ ra một cách thông minh để thực hiện cây thừa kế, nhưng đó không phải là vấn đề. Vấn đề là cây thừa kế không được yêu cầu ở mức cơ bản nhất về cách máy tính vật lý được lập trình.

Trong phép tính lambda, điểm là các tên không bắt buộc để mô tả thuật toán ở mức cơ bản nhất.


4

Tôi đang tận hưởng 3 câu trả lời ở đây cho đến nay - đặc biệt nhất là phân tích Shakespearen của @ babou - nhưng họ không làm sáng tỏ những gì tôi nghĩ là cốt lõi của câu hỏi.

-tính toán liên kết tên với các chức năng bất cứ khi nào bạn áp dụng một chức năng cho một chức năng. Vấn đề không phải là thiếu tên.

"Vấn đề là một hàm không thể gọi chính nó đơn giản" bằng cách tham khảo tên của nó.

(Trong Lisp thuần, liên kết tên -> hàm không nằm trong phạm vi trong thân của hàm. Để một hàm tự gọi nó bằng tên của nó, hàm sẽ phải tham chiếu đến một môi trường đề cập đến hàm. Pure Lisp không có Cấu trúc dữ liệu tuần hoàn. Impure Lisp thực hiện nó bằng cách thay đổi môi trường mà hàm đề cập đến.)

Như @MartinBerger đã chỉ ra, lý do lịch sử mà-compus không cho phép một hàm tự gọi mình là một nỗ lực để loại trừ nghịch lý của Curry khi cố gắng sử dụng λ-compus làm nền tảng của toán học, bao gồm cả logic suy diễn. Điều này không hoạt động vì các kỹ thuật như tổ hợp Y cho phép đệ quy ngay cả khi không tự tham chiếu.

Từ Wikipedia:

Nếu chúng ta có thể định nghĩa chức năng r = (λ.x x x ⇒ y)thì r r = (r r ⇒ y).

Nếu r rđúng thì yđúng. Nếu r rlà sai thì r r ⇒ yđúng, đó là một mâu thuẫn. Vì vậy, ylà đúng và như ycó thể là bất kỳ tuyên bố, bất kỳ tuyên bố có thể được chứng minh là đúng.

r rlà một tính toán không kết thúc. Được coi là logic r rlà một biểu thức cho một giá trị không tồn tại.


Tôi khá mới với tính toán lambda, vì vậy tôi đã có một câu hỏi, mà tôi đã có khá nhiều cho đến bây giờ. Không gì nghĩa là gì? Tôi khá chắc chắn rằng nó không có nghĩa là nhân với . Có nghĩa là áp dụng biểu thức cho chính nó? Ngoài ra, phần => y biểu thị điều gì? x x xλ.x xxxxx
Rohan Bohhu

@RohanPrabhu λ.x x xdịch sang Lisp (lambda (x) (x x))và JavaScript thành function (x) {return x(x);}. x⇒ycó nghĩa là x implies y, giống như (NOT x) OR y. Xem en.wikipedia.org/wiki/Lambda_calculus
Jerry101

Cảm ơn bạn đã trả lời câu hỏi tân binh lúng túng đó!
Rohan Bohhu
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.