Tại sao các ngôn ngữ chức năng Turing hoàn thành?


22

Có lẽ sự hiểu biết hạn chế của tôi về chủ đề này là không chính xác, nhưng đây là những gì tôi hiểu cho đến nay:

  • Lập trình chức năng dựa trên Lambda Tính, được xây dựng bởi Alonzo Church.

  • Lập trình bắt buộc dựa trên mô hình máy Turing, được thực hiện bởi Alan Turing, sinh viên của Church.

  • Tính toán Lambda mạnh mẽ và có khả năng như Turing Machine,
    nghĩa là chúng tương đương với sức mạnh tính toán.

Nếu lập trình chức năng dựa trên Lambda Compus chứ không phải máy Turing, thì tại sao một số (hoặc tất cả) trong số chúng được mô tả là Turing hoàn chỉnh, và Lambda không hoàn thành hay đại loại như vậy? Là thuật ngữ "Turing hoàn thiện" đặc biệt trong bất kỳ cách nào đối với máy Turing, hay nó chỉ là một từ?

Cuối cùng, nếu các ngôn ngữ bắt buộc dựa trên Máy Turing và máy tính về cơ bản là máy Turing, không có bộ nhớ vô hạn, điều đó có nghĩa là chúng hoạt động tốt hơn ngôn ngữ lập trình chức năng trên PC hiện đại của chúng ta?

Nếu đó là trường hợp, thì cái gì sẽ tương đương với máy tính lambda?

Tôi biết đây có vẻ là 3 câu hỏi riêng biệt, nhưng tất cả chúng đều liên quan chặt chẽ với nhau và mỗi câu hỏi phụ thuộc vào câu hỏi trước đó là một câu hỏi hợp lệ để bắt đầu.


6
Không phải là một câu trả lời, nhưng bạn đã đề cập rằng không phải tất cả các phiên bản của phép tính lambda đều là Turing Complete. Công cụ tính toán đơn giản được gõ và các phiên bản mạnh hơn của Coq và Agda dựa trên kiểm tra chấm dứt, không phải là Turing Complete (vì chúng có các vấn đề tạm dừng có thể quyết định). Các ngôn ngữ được gõ mạnh như Haskell và SML khắc phục điều này bằng cách cho phép đệ quy tùy ý với một tổ hợp điểm cố định, một thuật ngữ có kiểu (a -> a) -> a.
jmite

Thật sai lầm khi nói "được xác định là Turing hoàn thành". Chúng tôi có thể vui lòng thay đổi tiêu đề?
Andrej Bauer

@AndrejBauer Cảm ơn bạn đã chỉnh sửa tiêu đề, nhưng tôi tò mò về lý do tại sao nó ( được định nghĩa là Hoàn thành ) sai? Có phải vì đó là một tính từ? Sẽ được mô tả là một từ tốt hơn so với định nghĩa?
Abdul

1
@Abdul Vâng, vấn đề là từ "được xác định". Nếu bạn nói rằng "ngôn ngữ chức năng được định nghĩa là Turing hoàn thành", thì bạn đang nói rằng định nghĩa của "ngôn ngữ chức năng" hoặc định nghĩa của "Turing hoàn thành" nói rằng ngôn ngữ chức năng đã hoàn thành Turing. Như một vấn đề của thực tế, không có định nghĩa nói rằng.
Tanner Swett

Câu trả lời:


20

Tóm lại :

Điều đặc trưng cho các ngôn ngữ lập trình bắt buộc gần với máy Turing và với các máy tính thông thường như PC, (gần với máy truy cập ngẫu nhiên (RAM) hơn là máy Turing) là khái niệm về bộ nhớ rõ ràng có thể được sửa đổi để lưu trữ (kết quả trung gian ). Đây là một cái nhìn tự động về tính toán, với khái niệm trạng thái (bao gồm cả điều khiển trạng thái hữu hạn và nội dung bộ nhớ) có thể thay đổi khi tiến hành tính toán.

Hầu hết các mô hình khác là trừu tượng hơn. Mặc dù chúng có thể biểu thị tính toán như là một chuỗi các bước biến đổi của cấu trúc ban đầu, những phép biến đổi này được áp dụng trong một loại vũ trụ nội tại có ý nghĩa toán học. Điều này có thể bảo tồn các thuộc tính, chẳng hạn như tính minh bạch tham chiếu, có thể làm cho phân tích toán học đơn giản hơn. Nhưng nó là xa hơn từ các mô hình vật lý tự nhiên dựa trên các bộ nhớ.

Do đó, không có máy móc chức năng tự nhiên, ngoại trừ theo nghĩa lớn hơn như được giải thích dưới đây, vì phần mềm không thực sự tách rời khỏi phần cứng.

Việc tham khảo Turing như là thước đo khả năng tính toán có lẽ xuất phát từ thực tế là mô hình của anh ta, máy Turing gần nhất với ràng buộc khả năng thực hiện vật lý này, khiến nó trở thành mô hình tính toán trực quan hơn.

Cân nhắc thêm :

Có nhiều mô hình tính toán, được thiết kế để nắm bắt một cách khái quát nhất có thể khái niệm tính toán. Chúng bao gồm các máy Turing, thực tế trong nhiều hương vị khác nhau, tính toán lambda (hương vị cũng vậy), hệ thống viết lại bán Thue, chức năng đệ quy một phần, logic kết hợp.

Tất cả đều nắm bắt một số khía cạnh của các kỹ thuật khác nhau được sử dụng bởi các nhà toán học để thể hiện hoặc tiến hành tính toán. Và hầu hết đã được sử dụng ở một mức độ nào đó như là nền tảng của một số thiết kế ngôn ngữ lập trình (ví dụ Snobol để viết lại các hệ thống, APL cho các tổ hợp, Lisp / Scheme cho phép tính lambda) và thường có thể được kết hợp theo nhiều cách khác nhau trong các ngôn ngữ lập trình hiện đại.

Một kết quả chính là tất cả các mô hình tính toán này đã được chứng minh tương đương, dẫn đến luận điểm Church-Turing rằng không có mô hình tính toán vật lý nào có thể làm được nhiều hơn bất kỳ mô hình nào trong số này. Một mô hình tính toán được cho là Turing hoàn thành nếu nó có thể được chứng minh là tương đương với một trong những mô hình này, do đó tương đương với tất cả chúng.

Tên có thể đã khác. Việc lựa chọn máy Turing (TM) làm tham chiếu có lẽ là do thực tế nó có thể là mô hình đơn giản nhất, bắt chước chặt chẽ (mặc dù đơn giản) theo cách tính toán của con người và khá dễ thực hiện (ở dạng hữu hạn hạn chế ) như một thiết bị vật lý, đến mức mà các máy Turing đã được chế tạo bằng các bộ Lego . Ý tưởng cơ bản không đòi hỏi sự tinh tế toán học. Có lẽ chính sự đơn giản và khả thi của mô hình đã mang lại cho nó vị trí tham chiếu này.

Vào thời điểm Alan Turing tạo ra thiết bị điện toán của mình, các đề xuất khác được đưa ra để phục vụ như là định nghĩa chính thức về khả năng tính toán, một vấn đề quan trọng đối với nền tảng của toán học (xem Entscheidungsprobols ). Đề xuất Turing được các chuyên gia thời đó coi là một công việc có sức thuyết phục nhất được biết đến về khả năng tính toán (xem Tính toán và đệ quy , RI Soare, 1996, xem phần 3.2). Các đề xuất khác nhau đã được chứng minh tương đương, nhưng Turing đã thuyết phục hơn. [từ ý kiến ​​của Yuval Filmus]

Cần lưu ý rằng, từ quan điểm phần cứng, máy tính của chúng tôi không phải là máy Turing, mà là cái được gọi là Máy truy cập ngẫu nhiên (RAM) , cũng là Turing hoàn chỉnh.

Ngôn ngữ hoàn toàn bắt buộc (bất cứ điều gì có thể có nghĩa) có lẽ là các hình thức được sử dụng cho các mô hình cơ bản nhất, chẳng hạn như máy Turing hoặc ngôn ngữ lắp ráp (bỏ qua mã hóa nhị phân) của máy tính. Cả hai đều nổi tiếng là không thể đọc được, và rất khó để viết các chương trình quan trọng với. Trên thực tế, ngay cả ngôn ngữ lắp ráp cũng có một số tính năng cấp cao hơn để dễ dàng lập trình một chút, so với việc sử dụng trực tiếp các hướng dẫn máy. Các mô hình mệnh lệnh cơ bản được đóng lại trong thế giới vật lý, nhưng không thể sử dụng được.

Điều này nhanh chóng dẫn đến sự phát triển của các mô hình tính toán cấp cao hơn, bắt đầu trộn lẫn với nó một loạt các kỹ thuật tính toán, như chương trình con và gọi hàm, đặt tên vị trí bộ nhớ, phạm vi tên, định lượng và biến giả, đã được sử dụng ở một số dạng trong toán học và logic, và thậm chí các khái niệm rất trừu tượng như sự phản chiếu ( Lisp 1958).

Việc phân loại ngôn ngữ lập trình thành mô hình lập trình như mệnh lệnh, chức năng, logic, hướng đối tượng dựa trên sự ưu việt của một số kỹ thuật này trong thiết kế ngôn ngữ và sự hiện diện hay vắng mặt đối với một số tính năng tính toán thực thi một số tính chất cho các chương trình hoặc các đoạn chương trình được viết bằng ngôn ngữ.

Một số mô hình thuận tiện cho các máy vật lý. Một số khác thuận tiện hơn cho mô tả thuật toán cấp cao, nó có thể phụ thuộc vào loại thuật toán được mô tả. Một số nhà lý thuyết thậm chí sử dụng các đặc tả không xác định của các thuật toán, và thậm chí cn đó được dịch theo các thuật ngữ lập trình thông thường hơn. Nhưng không có vấn đề không phù hợp, bởi vì chúng tôi đã phát triển một công nghệ biên dịch / phiên dịch tinh vi có thể dịch từng mô hình sang mô hình khác khi cần thiết (cũng là cơ sở của luận án Church-Turing).

Bây giờ, bạn không bao giờ nên xem máy tính của mình là phần cứng thô. Nó không chứa mạch boolean mà xử lý rất cơ bản. Nhưng phần lớn được điều khiển bởi các chương trình vi mô bên trong máy tính mà bạn không bao giờ biết đến. Sau đó, bạn có hệ điều hành làm cho máy của bạn xuất hiện thậm chí khác với những gì phần cứng làm, Trên hết, bạn có thể có một máy ảo thực thi mã byte và sau đó là một ngôn ngữ cấp cao như Pyva và Jathon hoặc Haskell hoặc OCaml, có thể được biên dịch thành mã byte.

Ở mỗi cấp độ bạn thấy một mô hình tính toán khác nhau. Rất khó để phân tách cấp độ phần cứng với cấp độ phần mềm để gán một mô hình tính toán cụ thể cho máy. Và vì tất cả chúng đều có thể thay thế được, nên ý tưởng về một mô hình tính toán phần cứng cuối cùng chỉ là một ảo ảnh.

Máy tính lambda không tồn tại: nó là một máy tính có thể giảm các biểu thức tính toán lambda. Quảng cáo được thực hiện dễ dàng.

Về kiến ​​trúc máy chuyên dụng

Trên thực tế, bổ sung cho câu trả lời của Peter Taylor và tiếp nối sự kết hợp giữa phần cứng / phần mềm, các máy chuyên dụng đã được sản xuất để thích nghi tốt hơn với mô hình cụ thể và có phần mềm cơ bản được viết bằng ngôn ngữ lập trình dựa trên mô hình đó.

Bao gồm các

  • Các Burroughs B5000 và những người kế của nó (năm 1960), đã được chuyển thể để thực hiện hiệu quả của đệ quy, đại diện đồng thời bằng ngôn ngữ Algol 60 .

  • Các Western Digital WD / 9000 Pascal MicroEngine , một máy dựa trên một bytecode microprogrammed specialied cho Pascal ngôn ngữ lập trình, trong những năm đầu thập niên 1980.

  • Một số thương hiệu của Lisp Machines trong những năm 1980.

Về cơ bản, đây cũng là các cấu trúc phần cứng bắt buộc, nhưng được giảm thiểu bằng các tính năng phần mềm đặc biệt hoặc trình thông dịch được lập trình vi mô để thích ứng tốt hơn với mô hình dự định.

Trên thực tế, phần cứng chuyên dụng cho các mô hình cụ thể dường như chưa bao giờ thành công trong thời gian dài. Lý do là công nghệ biên dịch để thực hiện bất kỳ mô hình nào trên phần cứng vanilla ngày càng hiệu quả hơn, do đó phần cứng chuyên dụng không quá cần thiết. Ngoài ra, hiệu suất của harware được cải thiện nhanh chóng, nhưng chi phí cải thiện (bao gồm cả sự phát triển của phần mềm cơ bản) dễ dàng được khấu hao trên phần cứng vanilla hơn so với phần cứng chuyên dụng. Phần cứng chuyên dụng không thể cạnh tranh trong thời gian dài.

Tuy nhiên, và mặc dù tôi không có dữ liệu chính xác về điều này, tôi sẽ nghi ngờ rằng những mạo hiểm này đã để lại một số ý tưởng có ảnh hưởng đến sự phát triển của máy móc, ký ức và kiến ​​trúc tập lệnh.


Sự lựa chọn máy Turing làm tài liệu tham khảo, đến phần mở rộng mà nó thực sự được tạo ra, được thúc đẩy chủ yếu theo lịch sử: Turing là người đầu tiên đưa ra một định nghĩa thỏa mãn về khả năng tính toán.
Yuval Filmus

@YuvalFilmus Và tại sao nó lại giống như một "định nghĩa thỏa mãn về khả năng tính toán"?
babou

Đó là những gì Gôdel nghĩ. Bob Soare có một vài từ để nói về vấn đề ở đây: cs.uchicago.edu/~soare/Publications/compute.ps .
Yuval Filmus

@YuvalFilmus Đây là 46 trang. Tôi có nghĩa là tôi đang đưa ra một số lý do tại sao nó nên được thỏa mãn hơn. Họ có thể ngây thơ. Nếu có nhiều điều hấp dẫn hơn để giải thích cho sự thành công, thì đó là đề cập rõ ràng.
babou 10/07/2015

Nhìn vào mục 3.2. Có những định nghĩa trước đây về khả năng tính toán nhưng chúng không thuyết phục. Turing là người đầu tiên có sức thuyết phục, ít nhất là đối với một số người chủ chốt.
Yuval Filmus 10/07/2015

21

Turing-Complete chỉ là một cái tên. Bạn có thể gọi nó là Abdul-Complete nếu bạn muốn. Tên được quyết định theo lịch sử và thường được đặt theo tên của những người "sai". Đó là một quá trình xã hội học không có tiêu chí rõ ràng. Tên này không có ý nghĩa gì ngoài ngữ nghĩa chính thức của nó.

Ngôn ngữ bắt buộc không dựa trên máy Turing. Chúng dựa trên các máy RAM. Máy tính của bạn là một máy RAM. Máy Turing là một mô hình lý thuyết tốt đẹp, nhưng chúng không phải là một mô hình rất tốt của máy tính thực tế.

Các ngôn ngữ lập trình dựa trên các mô hình khác có thể rất thành công, mặc dù CPU cơ bản không hỗ trợ chúng nguyên bản; ví dụ, máy in chạy một ngôn ngữ ngăn xếp. Có nhiều thứ để lập trình hơn mã máy.


"Máy Turing là một mô hình lý thuyết tốt đẹp, nhưng chúng không phải là một mô hình rất tốt của máy tính thực tế." Ngoại trừ việc thiếu bộ nhớ vô hạn, còn những lý do nào khác khiến nó không phải là một mô hình tốt cho các máy tính thực tế? Ngoài ra, tôi đã đúng khi nghĩ rằng các ngôn ngữ chức năng dựa trên tính toán lambda?
Abdul

5
λ

11
Ngôn ngữ bắt buộc có xu hướng để cho phép truy cập mảng trong thời gian liên tục, trong C A[x]. Máy Turing không thể làm điều này trong thời gian liên tục. Đó là lý do tại sao ngay cả trong khoa học máy tính lý thuyết, thời gian chạy của các thuật toán được phân tích trên mô hình máy RAM thay vì trên mô hình máy Turing.
Yuval Filmus

14
Trên thực tế, Turing Machines một sản phẩm tốt của máy tính thực tế trừ khi Turing viết bài báo của mình, "máy tính" là một mô tả công việc cho một người làm việc với bút và giấy. Đầu đọc / ghi là mô hình của một cây bút, băng là mô hình của một chồng giấy vô hạn (chỉ cần cắt chúng thành các dải nhỏ và dán chúng lại với nhau), bảng chữ cái là mô hình của bảng chữ cái của chúng tôi và các chuyển đổi hữu hạn là một mô hình của số lượng quy tắc giới hạn mà người ta có thể giữ trong đầu.
Jörg W Mittag

3
Đó là cái nhìn sâu sắc nhất mà tôi từng có về lý do tại sao địa ngục đã chọn máy Turing. Tôi đã luôn tự hỏi "tại sao anh ta lại chọn một mô hình tính toán nhảm nhí như vậy". Tôi đã luôn nghĩ rằng nếu phát minh ra lý thuyết tính toán đã để lại cho tôi (chúa giúp chúng tôi; chúng tôi sẽ không ở rất xa) tôi có lẽ vẫn chọn một mô hình tính toán tốt hơn. Bây giờ tôi đến nơi anh ấy đến và nó có ý nghĩa hơn nhiều.
Jake

10

Bởi vì "Turing-Complete" chỉ có nghĩa là "nó có thể tính toán bất cứ thứ gì mà máy Turing có thể tính toán."


Turing-Complete cũng có thể được đặt tên để vinh danh Turing (người), người đã đưa ra định nghĩa thỏa mãn về mặt triết học đầu tiên về khả năng tính toán; hoặc nó có thể được đặt tên để vinh danh bài báo của Turing, trong đó ông mô tả khái niệm này.
Yuval Filmus 10/07/2015

1
@YuvalFilmus: nó có thể được đặt theo tên của mẹ Alan Turing, nhưng khẳng định ở đây là không phải ;-)
Steve Jessop

@YuvalFilmus Có thể (mặc dù, theo như tôi biết, thì không). Nhưng thuật ngữ đến từ đâu chỉ có tầm quan trọng thứ yếu. Điều quan trọng ở đây là những gì có nghĩa là thuật ngữ .
David Richerby 11/07/2015

2
Điều này là ngắn và ngọt ngào, nhưng có lẽ một chút quá ngắn. Máy Turing "làm gì"? Vâng, trong số những việc họ "làm" là đọc và viết băng, điều mà các biểu thức lambda không làm được, Tốt hơn là "Các mô hình tính toán hoàn chỉnh cho phép tất cả các hàm tính toán được tính toán."
Theodore Norvell

@TheodoreNorvell Tôi nghĩ nhận xét của bạn giống với những gì tôi đã nghĩ. Tôi biết rằng phép tính lambda và máy Turing có sức mạnh tương đương, nhưng khác về cơ chế (và bây giờ tôi đã biết có những người khác), nhưng tôi đã tự hỏi liệu thuật ngữ "Turing hoàn thiện" có đặc biệt đối với máy Turing hay không nếu nó chỉ là một cái tên
Abdul

6

Một trong những câu hỏi của bạn dường như chưa được trả lời:

Nếu đó là trường hợp, thì cái gì sẽ tương đương với máy tính lambda?

Một máy Lisp . Phần cứng được thiết kế đặc biệt để phù hợp với mô hình tính toán LISP. Bài báo Wikipedia nói về các sản phẩm thương mại, nhưng giám đốc nghiên cứu của tôi tại trường đại học đã có một bài viết được xây dựng bằng tay trong văn phòng của ông.


0

các ngôn ngữ chức năng dưới dạng phép tính lambda do Church phát minh đã được chứng minh Turing hoàn chỉnh. đây là một bằng chứng toán học thực tế có thể được tìm thấy trong các bài báo khoa học được công bố bằng cách "giảm" phép tính lambda thành các phép toán / phép tính trên máy Turing. vào khoảng thời gian của bài báo Turings năm 1936 và sau đó, các mô hình tính toán "toàn diện" khác nhau đã được đề xuất / lưu hành. nó không ngay lập tức nhận ra rằng tất cả đều tương đương. bằng chứng rằng chúng tương đương đã được công bố vào khoảng cuối những năm 1930 và 1940 sau bài báo của Turings.

Máy Turing về mặt khái niệm (nhưng không có chức năng) đơn giản hơn các mẫu khác và đó có thể là một phần quan trọng của lý do rằng tính hoàn chỉnh của Turing được đặt theo tên ông. các ý tưởng khác như tính toán lambda trừu tượng hơn và bắt đầu / bắt nguồn chủ yếu trong lý thuyết toán học / logic. Turing đề xuất một máy lý thuyết . một "cỗ máy" đúng nghĩa là một "thiết bị vật lý". nó là một đối tượng khái niệm đáng chú ý / xây dựng gắn kết với nhau / thống nhất hai thế giới khác nhau, ứng dụng và lý thuyết. nó mang lại ý nghĩa trừu tượng mới cho các thực thể vật lý, ví dụ như "thời gian và không gian". không phải ngẫu nhiên mà các nhà toán học đôi khi đề cập đến "công nghệ", "máy móc" hay "thiết bị" của bằng chứng. Turing đã xoay sở khéo léo hợp nhất tất cả những điều này trong phát minh khái niệm của mình. định nghĩa của nó khá đơn giản nhưng phân tích về nó thể hiện một số hành vi nổi lên phi thường nhất từng thấy trong lịch sử tư duy khoa học / toán học. Turing là nhà khoa học / nhà toán học đầu tiên nắm bắt được nhiều ý nghĩa / sức mạnh / tiềm năng này.


nói cách khác, có thể nói rằng Turing là người đầu tiên xác định / "nhận ra" tầm quan trọng của hiện tượng hoàn thiện Turing và đến lượt mình, CS "nhận ra" anh ta vì thành tựu hoành tráng này thông qua việc sử dụng thuật ngữ này.
vzn

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