Tính toán Lambda dường như không trừu tượng. Và tôi không thể thấy điểm của nó


18

Câu hỏi cơ bản:

Không gì giải tích lambda làm cho chúng ta biết rằng chúng ta không thể làm gì với các thuộc tính chức năng cơ bản và ký hiệu thường học trong đại số trung học cơ sở?

Trước hết, trừu tượng có nghĩa là gì trong bối cảnh tính toán lambda? Sự hiểu biết của tôi về từ trừu tượng là một cái gì đó được tách ra từ máy móc, tóm tắt khái niệm của một khái niệm.

Tuy nhiên, các hàm lambda, bằng cách loại bỏ các tên hàm, ngăn chặn một mức độ trừu tượng nhất định. Ví dụ:

f(x) = x + 2
h(x, y) = x + 5 y

Nhưng ngay cả khi không xác định máy móc của các chức năng này, chúng ta có thể dễ dàng nói về thành phần của chúng. Ví dụ:

1. h(x, y) . f(x) . f(x) . h(x, y) or 
2. h . f . f . h

Chúng tôi có thể bao gồm các đối số nếu chúng tôi muốn, hoặc chúng tôi có thể trừu tượng hóa hoàn toàn để đưa ra một cái nhìn tổng quan về những gì đang xảy ra. Và chúng ta có thể nhanh chóng giảm chúng thành một chức năng duy nhất. Chúng ta hãy nhìn vào thành phần 2. Tôi có thể có các lớp chi tiết sinh viên tôi có thể viết tùy thuộc vào sự nhấn mạnh của tôi:

g = h . f . f . h
g(x, y) = h(x, y) . f(x) . f(x) . h(x, y)
g(x, y) = h . f . f . h = x + 10 y + 4

Hãy thực hiện các thao tác trên với phép tính lambda hoặc ít nhất là xác định các hàm. Tôi không chắc điều này đúng, nhưng tôi tin rằng biểu thức thứ nhất và thứ hai tăng thêm 2.

(λuv.u(u(uv)))(λwyx.y(wyx))x

Và để nhân lên 5y.

(λz.y(5z))

Thay vì trừu tượng, điều này dường như đi vào chính bộ máy của những gì nó có nghĩa là thêm, nhân lên, v.v. Sự trừu tượng, trong suy nghĩ của tôi, có nghĩa là cấp độ cao hơn là cấp độ thấp hơn.

Hơn nữa, tôi đang đấu tranh để xem tại sao tính toán lambda thậm chí là một điều. Lợi thế của

(λuv.u(u(uv)))(λwyx.y(wyx))x

kết thúc

h(x) = x + 5 y

hoặc ký hiệu kết hợp

Hxy.x+5y

hoặc thậm chí ký hiệu của Haskell

h x y = x + 5 * y

Một lần nữa, tính toán lambda làm gì cho chúng ta mà chúng ta không thể làm với các thuộc tính hàm kiểu f (x) và ký hiệu mà nhiều người quen thuộc.


9
Thật buồn cười khi bạn đưa ra một ví dụ từ Haskell, vì Haskell dựa trên phép tính lambda. Tính toán Lambda không phải là về bất kỳ ký hiệu cụ thể. Đây là một mô hình tính toán, tương đương với các máy Turing, trong đó "mọi thứ đều là chức năng".
Yuval Filmus

2
Vâng, tôi đã nói nó dựa trên tính toán lambda. Câu hỏi mà tôi chưa thấy được trả lời theo cách có ý nghĩa với tôi là tại sao haskell dựa trên tính toán lambda trái ngược với chỉ. . . các thuộc tính cơ bản của chức năng tôi đã học ở trường. Đó thực sự là ý chính của toàn bộ câu hỏi này.
JDG

6
Không phải "không có mục đích ngay lập tức đến với tâm trí" gần như định nghĩa của "trừu tượng" sao? :-)
David Richerby

1
Tôi sẽ không nói đó là xúc phạm. Điều trị các chức năng được phục vụ thông qua tính toán. Nhưng tôi có thể thấy làm thế nào được dán nhãn là trường trung học có thể được giải thích như vậy. Tôi sẽ điều chỉnh nó.
JDG

6
Tôi nghi ngờ bạn thực sự có một định nghĩa chính thức về "ký hiệu hàm đại số trung học cơ sở". Nếu bạn có bất kỳ định nghĩa nào cho các hàm như vậy thì có lẽ đó là định nghĩa lý thuyết tập hợp không có ý nghĩa tính toán. Một phần quan điểm của phép tính lambda là hiểu các ký hiệu như vậy theo các thuật ngữ riêng của nó và, tôi dám nói điều đó, được trừu tượng hóa từ các ứng dụng cụ thể như hàm đa thức hoặc phép tính.
Derek Elkins rời SE

Câu trả lời:


24

Có nhiều lý do tại sao tính toán lambda rất quan trọng.

Một lý do rất quan trọng là phép tính lambda cho phép chúng ta có một mô hình tính toán trong đó các hàm tính toán là công dân hạng nhất.

Người ta không thể diễn tả các hàm bậc cao hơn trong ngôn ngữ của đại số trung học cơ sở.

Lấy ví dụ về biểu thức lambda

λf.λg.λx.f(g(x))

Biểu thức đơn giản này cho chúng ta thấy rằng, trong phép tính lambda, thành phần hàm tự nó là một hàm. Trong đại số trung học, điều này không dễ dàng thể hiện.

Trong phép tính lambda, rất dễ dàng để diễn tả rằng một hàm sẽ trả về một hàm như kết quả của nó.

Đây là một ví dụ nhỏ. Biểu thức (ở đây tôi giả sử một phép tính lambda được áp dụng với các hằng số nguyên và cộng)

(λf.λg.λx.f((g(x)))(λx.x+2)

sẽ giảm xuống

λg.λx.g(x)+2

Cũng lưu ý rằng trong phép tính lambda, các hàm là các biểu thức và không phải là định nghĩa có dạng . Điều này giải phóng chúng ta khỏi nhu cầu đặt tên hàm và phân biệt giữa một loại cú pháp biểu thức và phạm trù cú pháp của định nghĩa.f(x)=e

Ngoài ra, khi không thể (hoặc chỉ cồng kềnh về mặt lý thuyết) để thể hiện các hàm bậc cao hơn, người ta cũng sẽ gặp vấn đề với việc gán các loại cho biểu thức.

Thành phần chức năng có kiểu đa hình

α.β.γ.(βγ)((αβ)γ)

trong hệ thống loại Hindley-Milner.

Một điểm bán rất mạnh cho phép tính lambda chính xác là khái niệm về phép tính lambda đã gõ . Các hệ thống loại khác nhau cho các ngôn ngữ lập trình chức năng như Haskell và họ ML dựa trên các hệ thống loại cho phép tính lambda và các hệ thống loại này cung cấp các đảm bảo mạnh mẽ dưới dạng các định lý toán học:

Nếu một chương trình nổi gõ và e giảm đến còn lại e ' , sau đó e ' cũng sẽ có nổi gõ.eeee

Và nếu được gõ tốt, thì e sẽ không có lỗi nhất định.ee

Bằng chứng là sự tương ứng của chương trình là đặc biệt đáng chú ý. Sự đồng hình của Curry-Howard (xem ví dụ https://www.rocq.inria.fr/semdoc/Pftimeations/20150217_PierreMariePedrot.pdf ) cho thấy rằng có một sự tương ứng rất chính xác giữa phép tính đơn giản được gõ và tính toán trực quan tương ứng với một công thức logic φ T . Một bằng chứng về φ T tương ứng với một thuật ngữ lambda với loại T , một phiên bản beta-giảm này tương ứng với hạn để thực hiện một loại bỏ cắt trong chứng minh.TϕTϕTT

Tôi kêu gọi những ai cảm thấy rằng đại số trung học là một giải pháp thay thế tốt cho phép tính lambda để phát triển một tài khoản của đại số trung học được đánh máy đa hình, cùng với một khái niệm thích hợp về đẳng cấu Curry-Howard. Nếu bạn thậm chí có thể tìm ra một trợ lý chứng minh tương tác dựa trên đại số trung học sẽ cho phép chúng tôi chứng minh nhiều định lý đã được chính thức hóa bằng cách sử dụng các trợ lý chứng minh dựa trên tính toán lambda như Coq và Isabelle, điều đó còn tốt hơn nữa. Sau đó tôi sẽ bắt đầu sử dụng đại số trung học cơ sở, và vì vậy, tôi chắc chắn, sẽ có nhiều người khác với tôi.


Đây là lời giải thích tuyệt vời. Thật hữu ích khi biết rằng các hàm bậc cao hơn (như thành phần) và gõ được thể hiện tốt hơn trong phép tính lambda rất đáng khích lệ, thậm chí còn cho rằng điều này tạo thuận lợi cho các bằng chứng và mã chứng minh. Tôi không thấy sự phân nhánh của phần lớn những gì bạn đã đề cập và tại sao ký hiệu truyền thống không đầy đủ (ví dụ: về việc không cần một cú pháp định nghĩa riêng biệt f (x) = e), tuy nhiên, rất hữu ích khi bạn đặt tên cho một số lý do này và nó mang lại cảm giác về những khu vực được cải thiện bằng phép tính lambda.
JDG

Tất nhiên người ta có thể giới thiệu các định nghĩa địa phương của mẫu nhưng đã có thể được thể hiện bằng các cú pháp của giải tích lambda như ( λ x . e ) e ' . Phép tính lambda cho phép chúng ta thể hiện các hàm mà không cần phải đặt tên cho chúng, giống như người ta có thể (trong đại số trung học!) Nói về số 4 mà không phải đặt tên cho chúng theo một số biến. letx=eine(λx.e)e4
Hans Hüttel 4/12/2016

5

Khi các chức năng được mô tả lần đầu tiên cho những người trẻ tuổi, về cơ bản chúng được xác định bằng các biểu đồ (sơ đồ) hoặc có lẽ với các công thức; đây là cách các chức năng được hiểu theo lịch sử trước khi xuất hiện các xu hướng chính thống trong toán học. Ngày nay các chức năng, như được dạy trong tính toán năm đầu tiên, là chức năng thực tế, có nghĩa là, chức năng từ đến R .RR

Các hàm trong tính toán lambda là tổng quát hơn nhiều. Định nghĩa chính xác phụ thuộc vào việc tính toán lambda của bạn được gõ hay gỡ. Trong phép tính lambda thuần túy, mọi thứ là một hàm. Điều này là tổng quát hơn nhiều so với các chức năng thực sự của tính toán.

Ngay cả các ngôn ngữ thủ tục đôi khi sử dụng ý tưởng từ tính toán lambda. Hàm sắp xếp trong C chấp nhận làm tham số là hàm so sánh , hàm này sử dụng để so sánh các phần tử. Tính toán Lambda đi xa hơn nhiều - các hàm không chỉ chấp nhận các hàm làm đầu vào, mà còn có thể xuất chúng.

Lambda tính toán là một mô hình tính toán tương đương sức mạnh với máy Turing. Đây là một hệ thống hoàn chỉnh cho chính nó. Phép tính lambda thuần túy không có "5" hoặc "+" như các thuật ngữ nguyên thủy - chúng có thể được định nghĩa bên trong phép tính, giống như "5" và "+" không phải là nguyên thủy của lý thuyết tập hợp. (Ngôn ngữ lập trình thực tế thực hiện số tự nhiên nguyên bản vì lý do hiệu quả.)

Tôi nghi ngờ rằng một trong những lý do khiến bạn không ấn tượng với tính toán lambda là ý tưởng của nó đã tràn ngập các diễn ngôn lập trình đến mức nó không còn có vẻ sáng tạo.


"Tôi nghi ngờ rằng một trong những lý do khiến bạn không ấn tượng với tính toán lambda" Therin nói dối câu hỏi tôi đang hỏi: tính toán lambda làm gì cho chúng ta? Nói cách khác, khi chúng ta không sử dụng phép tính lambda, điều gì sẽ xảy ra. Khi chúng ta sử dụng phép tính lambda, chúng ta đạt được gì? Nếu phép tính lambda là lần đầu tiên mà mọi người nghĩ, nếu các hàm có thể tự tạo ra các hàm thì điều đó có ấn tượng không? Trong số các chương trình python ban đầu của tôi có văn bản chứa các hàm mà sau này tôi đã đánh giá, giống như giao nhiệm vụ ra quyết định cho người bao phấn. Có vẻ rõ ràng?
JDG

đây là trước khi tôi biết nhiều thứ Tôi chỉ nghĩ rằng mã rất khó chịu khi gõ đi viết lại và lập trình đó sẽ giúp tôi tự động tạo chức năng, bao gồm cả các chức năng.
JDG

2
Python hỗ trợ lập trình chức năng. Các ngôn ngữ lập trình đầu tiên không có. Nếu bạn đã lập trình trong FORTRAN, bạn sẽ không tạo các chương trình có văn bản chứa các hàm mà sau này bạn đã đánh giá. Thậm chí không nhận ra điều đó, bạn đã sử dụng các khả năng được cung cấp bởi các ý tưởng từ phép tính lambda.
Yuval Filmus

2
Eval bắt nguồn từ LISP , chịu ảnh hưởng mạnh mẽ của phép tính lambda. Một cái gì đó như thế này không thể có trong FORTRAN, C, COBOL và nhiều ngôn ngữ lập trình khác.
Yuval Filmus

Vâng, python hỗ trợ progamming chức năng --- nhưng tôi không chắc rằng khả năng eval () được lấy cảm hứng từ λCalc --- bạn không λCalc nghĩ: Tôi muốn tự động tạo mã mà tôi có thể eval sau này. Điều đó giống như nói Calc bắt buộc phải suy nghĩ, "Tôi sẽ nói với Miranda sử dụng phán đoán tốt nhất của mình về cách điều hành bộ phận của mình" --- nói cách khác là có được một chức năng để tạo ra các chức năng của riêng mình. Bạn không cần λCalc để suy nghĩ về việc ủy ​​thác các nhiệm vụ cấp cao. Nếu bạn muốn nói về cảm hứng vẽ từ λCalc, đó là điểm thích hợp hơn cho các chức năng lambda, hiểu, v.v.
JDG

4

x2xx2

λx.x2x2

ff(x)=x2f

Việc sử dụng các biểu thức lambda trong các ngôn ngữ lập trình có một lợi thế tương tự; bạn có thể viết những gì chức năng thực hiện ngay tại nơi cần thiết thay vì phải xác định một chức năng hoàn toàn mới ở nơi khác trong chương trình của bạn.

ddxx2ddxx2


θ:VV

θ(v)(f)=f(v)

Nhiều người tìm thấy ký hiệu đánh giá kép này gây nhầm lẫn và / hoặc không đáng lo ngại, cũng như việc sử dụng đệ quy định nghĩa theo chiều của hàm. Phiên bản trừu tượng lambda

θ=λv.λf.f(v)

không có vấn đề đó


Cuối cùng, có một định lý vô nghĩa trừu tượng rằng "tính toán đơn giản là gõ lambda" về cơ bản giống như "danh mục đóng cartesian" - vì vậy nếu bạn từng thấy mình muốn tính toán trong một thể loại đóng cartesian, có lẽ nên sử dụng chỉ cần gõ lambda tính toán để làm như vậy.


Tôi đang trở lại câu hỏi này và tôi thấy câu trả lời này rất hay. Cảm ơn bạn. Các câu trả lời ở đây nói chung là thực sự thú vị.
JDG

4

Tôi sẽ nói trước Tôi không phải là một chuyên gia về chủ đề này, nhưng tôi chỉ dành một chút thời gian để nghiên cứu về nó và một trong những điều hấp dẫn nhất đối với tôi trong bất kỳ chủ đề nào là lịch sử đằng sau nó. Vì vậy, để tôi hiểu một chút về lịch sử đằng sau phép tính lambda giúp giải thích tại sao nó hữu ích.

Tóm tắt ngắn gọn là vào đầu những năm 1900 sau khi lý thuyết tập hợp bắt đầu cất cánh và toán học được hình dung lại dựa trên các tập hợp, một số nhà toán học nhận thấy rằng trong khi một định nghĩa lý thuyết tập hợp cho phép bạn khẳng định rằng một cấu trúc nhất định tồn tại, họ không nói cho bạn biết để xây dựng nó và tính toán nó. Vì vậy, định nghĩa lý thuyết tập hợp là không xây dựng . Nhà toán học bắt đầu tự hỏi nếu có một cách để phát triển mang tính xây dựng định nghĩa rằng sẽ vượt qua chứng minh rằng cái gì và thay vào đó chứng minh làm thế nào nó là .

Từ Wikipedia :

Trong toán học, một bằng chứng xây dựng là một phương pháp chứng minh chứng minh sự tồn tại của một đối tượng toán học bằng cách tạo hoặc cung cấp một phương thức để tạo ra đối tượng. Điều này trái ngược với một bằng chứng phi xây dựng (còn được gọi là bằng chứng tồn tại hoặc định lý tồn tại thuần túy) chứng minh sự tồn tại của một loại đối tượng cụ thể mà không đưa ra ví dụ.

Sau đó, người ta đã chứng minh rằng phép tính lambda và máy Turing có thể đại diện cho bất kỳ chức năng tính toán nào và do đó tương đương nhau.

Về lý thuyết, bất kỳ hàm hoặc khái niệm toán học nào cũng có thể được mã hóa dưới dạng tính toán lambda và được tính toán. Điều này có nghĩa là phép tính lambda có thể là một cơ sở hoàn toàn riêng biệt cho toán học, mặc dù rõ ràng là một cơ sở cực kỳ tẻ nhạt.

Phép tính Lambda không "hữu ích" theo nghĩa là bạn sẽ không viết mã bằng cách sử dụng nó, nhưng nó tạo thành cơ sở cho ngữ nghĩa học biểu thị được sử dụng để mô tả các chương trình và hiệu ứng động của chúng. Điều này được sử dụng trong các cuộc thảo luận về tính chính xác của chương trình và ý nghĩa ngữ nghĩa. Nó rõ ràng cũng ảnh hưởng lớn đến sự phát triển của các ngôn ngữ lập trình chức năng, từ đó rút ra toàn bộ khái niệm thực thi của họ từ phép tính lambda.

Mong rằng sẽ giúp.

Chỉnh sửa để thêm: Tôi vừa chỉ vào bài báo này cho thấy mối quan hệ giữa cấu trúc liên kết, tính toán lambda và vật lý. Lướt qua nó một thời gian ngắn tôi chạy qua tuyên bố tuyệt vời này:

Trong khi một máy Turing có thể được xem là một mô hình phần cứng máy tính được lý tưởng hóa, đơn giản hóa , thì phép tính lambda giống như một mô hình phần mềm đơn giản . ... Nói về mặt thi pháp, phép tính lambda mô tả một vũ trụ trong đó mọi thứ đều là chương trình và mọi thứ đều là dữ liệu: chương trình là dữ liệu .

Vấn đề là phép tính lambda là một mô hình lý tưởng hóa tính toán phần mềm và vì thế không liên quan đến việc triển khai cụ thể trong bất kỳ ngôn ngữ lập trình nào. Nó mô hình tính toán thuần túy .


Thông tin thêm về lịch sử: Tóm tắt lịch sử calcul-tính toán tại Bách khoa toàn thư Stanford. Họ có nhiều mục hơn một người có thể xử lý trong cả cuộc đời.
David Tonhofer


3

Tính toán Lambda không được thiết kế để trở thành một ngôn ngữ lập trình. Thật vậy, nó đã được tạo ra vào những năm 1930, nhiều thập kỷ trước khi chúng ta thậm chí có máy tính lập trình được. Thay vào đó, nó được tạo ra như một mô hình chính thức để nghiên cứu tính toán. Nếu bạn thất vọng về cách nó dễ dàng thể hiện mã hoặc các hàm toán học, thì đó không phải là thứ nó dùng để làm.


1
"Nhiều thập kỷ trước khi chúng ta thậm chí có máy tính lập trình" - sai. Máy tính lập trình đã tồn tại trước đây (nếu có thể không phải là máy tính phổ quát) và máy tính phổ quát đầu tiên được chế tạo trong những năm 1930.
Raphael

-2

Tính toán Lambda tồn tại để các hàm ẩn danh (còn gọi là lambda) có thể được tạo. Nếu bạn không loại bỏ tên hàm, thì không gian tên có thể bị lộn xộn và người ta có thể dùng hết tên hàm có sẵn. Điều này đặc biệt quan trọng khi xử lý cái gọi là "hàm bậc cao" trả về hàm (hoặc con trỏ hàm) vì những lý do rõ ràng.

Về cơ bản, các hàm lambda tương đương với các biến trong phạm vi cục bộ. Lập trình chức năng không có chức năng lambda tương tự như lập trình thủ tục mà không có bất kỳ biến cục bộ nào, tức là một ý tưởng tồi tệ.

"Tại sao tính toán lambda thậm chí là một điều" các nhà toán học thích sự dư thừa. phép tính lambda hiếm khi được sử dụng trong toán học vì như bạn đã phát hiện ra ký hiệu không hữu ích lắm.

"Nếu bạn thậm chí có thể tìm ra một trợ lý chứng minh tương tác dựa trên đại số trung học sẽ cho phép chúng tôi chứng minh nhiều định lý đã được chính thức hóa bằng cách sử dụng các trợ lý chứng minh dựa trên tính toán lambda như Coq và Isabelle, điều đó còn tốt hơn nữa. sau đó bắt đầu sử dụng đại số trung học cơ sở, và vì vậy, tôi chắc chắn, sẽ có nhiều người khác đi cùng tôi. " Bạn đã nghe nói về metamath? Không có phép tính lambda nào liên quan ở đó, có thể chứng minh nhiều định lý coq / isabelle


Bên cạnh một số ý kiến, câu trả lời này cung cấp những gì?
Raphael

@Raphael Thông tin sai lệch. Hầu hết câu trả lời này thậm chí không có ý nghĩa. Không thiếu tên. "Hàm Lambda" không tương đương với các biến trong phạm vi cục bộ; Điều này thậm chí không có ý nghĩa. Tôi cho rằng điều này có nghĩa là để chỉ let, nhưng trong khi letcó thể được mã hóa bằng các hàm ẩn danh, rõ ràng bạn không thể đi theo một cách khác. Lập trình chức năng không yêu cầu "các hàm lambda", ví dụ: Backus ' FP hoặc Salu .
Derek Elkins rời SE

chủ yếu tôi muốn đăng một bình luận cho câu trả lời của hans nhưng không có đủ nghiệp. vì vậy tôi quyết định biến bình luận thành một câu trả lời đầy đủ
sn
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.