Turing Complete là gì?


Câu trả lời:


324

Đây là lời giải thích ngắn gọn nhất:

Hệ thống Turing Complete có nghĩa là một hệ thống trong đó một chương trình có thể được viết sẽ tìm thấy câu trả lời (mặc dù không có gì đảm bảo về thời gian chạy hoặc bộ nhớ).

Vì vậy, nếu ai đó nói "điều mới của tôi là Turing Complete" có nghĩa là về nguyên tắc (mặc dù thường không thực tế), nó có thể được sử dụng để giải quyết bất kỳ vấn đề tính toán nào.

Thỉnh thoảng đó là một trò đùa ... một anh chàng đã viết một trình giả lập Turing Machine bằng vi, vì vậy có thể nói rằng vi là công cụ tính toán duy nhất từng cần trên thế giới.


18
Để đọc thêm, xem The Annotated Turing. Rất dễ tiếp cận. amazon.com/Annotated-Turing-Through-Historic-Computability/dp/iêu
i_am_jorf

43
"Thường không trong thực tế" là không chính xác. Không có hệ thống nào là Turing-Complete trong thực tế, bởi vì không có hệ thống nào có thể thực hiện được có một cuộn băng vô hạn. Điều chúng tôi thực sự muốn nói là một số hệ thống có khả năng xấp xỉ tính đầy đủ của Turing cho đến giới hạn của bộ nhớ khả dụng của chúng.
Shelby Moore III

22
Nhưng Vi là công cụ tính toán duy nhất từng cần trên thế giới ... ;-)
Joe Edgar

4
Emacs cũng là một máy tiện? XD
alem0lars 16/2/2015

6
Một số người gần đây đã cho thấy rằng PowerPoint là Turing Complete.
Tagc

192

Đây là lời giải thích đơn giản nhất

Alan Turing đã tạo ra một cỗ máy có thể lấy một chương trình, chạy chương trình đó và hiển thị một số kết quả. Nhưng sau đó anh phải tạo ra các máy khác nhau cho các chương trình khác nhau. Vì vậy, ông đã tạo ra "Máy Turing phổ dụng" có thể lấy bất kỳ chương trình nào và chạy nó.

Ngôn ngữ lập trình tương tự như các máy đó (mặc dù ảo). Họ tham gia các chương trình và điều hành chúng. Bây giờ, một ngôn ngữ lập trình được gọi là "Turing hoàn thành", nếu ngôn ngữ đó có thể chạy bất kỳ chương trình nào (không phân biệt ngôn ngữ) mà máy Turing có thể chạy đủ thời gian và bộ nhớ.

Ví dụ: giả sử có một chương trình lấy 10 số và thêm chúng. Máy Turing có thể dễ dàng chạy chương trình này. Nhưng bây giờ hãy tưởng tượng rằng vì một số lý do, ngôn ngữ lập trình của bạn không thể thực hiện cùng một phép cộng. Điều này sẽ làm cho nó "Turing không đầy đủ" (có thể nói). Mặt khác, nếu nó có thể chạy bất kỳ chương trình nào mà máy Turing phổ dụng có thể chạy, thì Turing đã hoàn tất.

Hầu hết các ngôn ngữ lập trình hiện đại (vd dữ liệu và như vậy.

Cập nhật: Bạn có thể tìm hiểu thêm về bài đăng trên blog của tôi: "JavaScript đã hoàn tất" - Giải thích


5
Ý tưởng rằng thậm chí sẽ có một thuật ngữ cho loại máy này có ý nghĩa hơn nhiều khi tôi nhớ Turing và các nhà khoa học máy tính ban đầu khác sẽ chế tạo một máy cụ thể mỗi khi họ muốn giải quyết một vấn đề cụ thể. Chúng ta đã quen với một máy có thể được lập trình lại mãi mãi. Cảm ơn bạn cho bối cảnh, Raja.
Jacob Ford

Làm thế nào JavaScript có thể được Turing Complete? Nó thiếu hệ thống tập tin, API đa luồng thích hợp. Nó có vô số hạn chế, chủ yếu là do tính chất bảo mật hộp cát trình duyệt của nó. Nó khó có thể được gọi là 'ngôn ngữ lập trình'. Xem bao nhiêu biến thể của sự trừu tượng hóa kịch bản tồn tại (phản ứng, bản thảo .. bạn đặt tên cho nó), tất cả những điều đó để bù đắp cho những gì JS không có. (asm.js nên được đề cập ở đây). Java, Python hoặc C ++ là các ví dụ 'Turing Complete' đúng. Nhưng js? Tôi không nghĩ vậy.
Michael IV

2
@MichaelIV Máy lưu diễn cũng không có hệ thống tập tin / chủ đề. JS hoàn toàn lưu diễn hoàn thành.
Bax

@MichaelIV Để thêm vào phản hồi của Bax, người ta có thể xem xét một máy tính hiện đại bao gồm một số máy Turing hoạt động cùng nhau để cho phép tất cả những điều tốt đẹp mà bạn đề cập. Ví dụ: CPU tạo ra "băng" cho GPU để đọc để nó có thể ghi "băng" cho màn hình để màn hình có thể ghi "băng" cho người dùng. Tương tự như vậy, CPU có thể tạo ra "băng" cho các ổ đĩa cứng, NIC, card âm thanh, v.v.

86

Từ wikipedia :

Tính đầy đủ của Turing, được đặt theo tên của Alan Turing, có ý nghĩa quan trọng ở chỗ mọi thiết kế hợp lý cho một thiết bị máy tính tiên tiến cho đến nay đều có thể được mô phỏng bằng một máy Turing phổ dụng - một quan sát được gọi là luận án Church-Turing. Do đó, về nguyên tắc, một cỗ máy có thể hoạt động như một máy Turing phổ dụng có thể thực hiện bất kỳ phép tính nào mà bất kỳ máy tính lập trình nào khác có khả năng. Tuy nhiên, điều này không liên quan gì đến nỗ lực viết chương trình cho máy, thời gian cần thiết để máy thực hiện phép tính hoặc bất kỳ khả năng nào mà máy có thể sở hữu không liên quan đến tính toán.

Mặc dù các máy hoàn chỉnh Turing thực sự rất khó có thể về mặt vật lý, vì chúng yêu cầu lưu trữ không giới hạn, tính hoàn chỉnh của Turing thường được quy cho một cách lỏng lẻo là các máy vật lý hoặc ngôn ngữ lập trình sẽ phổ biến nếu chúng có dung lượng lưu trữ không giới hạn. Tất cả các máy tính hiện đại là Turing - hoàn thành theo nghĩa này.

Tôi không biết làm thế nào bạn có thể phi kỹ thuật hơn thế, ngoại trừ bằng cách nói "hoàn thành nghĩa là" có thể trả lời vấn đề tính toán được cung cấp đủ thời gian và không gian "".


4
Trong bối cảnh này, "thiết bị máy tính" là gì?
dopatraman

30
Như với hầu hết các bài viết trên Wikipedia, mặc dù trích dẫn này là đúng về mặt kỹ thuật, nó không cung cấp giá trị cho một người không có kiến ​​thức về chủ đề này và đang cố gắng hiểu nó. Có thể giải thích mọi thứ một cách chính xác là một khoa học của riêng nó :)
Lacho Tomov

76

Định nghĩa không chính thức

Một ngôn ngữ hoàn chỉnh Turing là ngôn ngữ có thể thực hiện bất kỳ tính toán nào. Các luận đề Church-Turing bang rằng bất kỳ tính toán performable có thể được thực hiện bởi một máy Turing. Máy Turing là một máy có bộ nhớ truy cập ngẫu nhiên vô hạn và một 'chương trình' hữu hạn, ra lệnh khi nào nên đọc, viết và di chuyển qua bộ nhớ đó, khi nào nó sẽ kết thúc với một kết quả nhất định và nó sẽ làm gì tiếp theo. Đầu vào của máy Turing được đặt vào bộ nhớ trước khi khởi động.

Những điều có thể làm cho một ngôn ngữ KHÔNG Turing hoàn thành

Máy A Turing có thể đưa ra quyết định dựa trên những gì nó thấy trong bộ nhớ - Các 'ngôn ngữ' đó chỉ hỗ trợ +, -, *, và /trên các số nguyên không Turing hoàn thành bởi vì nó không thể làm cho một sự lựa chọn dựa trên đầu vào của nó, nhưng một máy Turing có thể.

Máy Turing có thể chạy mãi mãi - Nếu chúng tôi đã sử dụng Java, Javascript hoặc Python và loại bỏ khả năng thực hiện bất kỳ loại vòng lặp, GOTO hoặc gọi hàm nào, thì nó sẽ không hoàn thành Turing vì nó không thể thực hiện tính toán tùy ý không bao giờ kết thúc Coq là một người ủng hộ định lý không thể diễn tả các chương trình không kết thúc, vì vậy nó không hoàn thành.

Máy Turing có thể sử dụng bộ nhớ vô hạn - Một ngôn ngữ giống hệt Java nhưng sẽ chấm dứt một khi nó sử dụng hơn 4 Gigabyte bộ nhớ sẽ không hoàn thành Turing, vì máy Turing có thể sử dụng bộ nhớ vô hạn. Đây là lý do tại sao chúng ta thực sự không thể xây dựng một máy Turing, nhưng Java vẫn là ngôn ngữ hoàn chỉnh Turing vì ngôn ngữ Java không hạn chế ngăn nó sử dụng bộ nhớ vô hạn. Đây là một lý do các biểu thức chính quy không hoàn thành.

Máy Turing có bộ nhớ truy cập ngẫu nhiên - Một ngôn ngữ chỉ cho phép bạn làm việc với bộ nhớ thông qua pushvà các popthao tác với ngăn xếp sẽ không hoàn thành Turing. Nếu tôi có một 'ngôn ngữ' đọc một chuỗi một lần và chỉ có thể sử dụng bộ nhớ bằng cách đẩy và bật từ ngăn xếp, nó có thể cho tôi biết liệu mọi (chuỗi trong chuỗi có )sau đó hay không bằng cách đẩy khi nhìn thấy (và bật lên khi nhìn thấy) . Tuy nhiên, nó không thể cho tôi biết nếu mọi thứ đều ()sau này mọi thứ [sẽ có ]sau này (lưu ý ([)]đáp ứng tiêu chí này nhưng ([]]không). Một máy Turing có thể sử dụng bộ nhớ truy cập ngẫu nhiên của nó để theo dõi()[]Riêng biệt, nhưng ngôn ngữ này chỉ có một ngăn xếp thì không thể.

Máy Turing có thể mô phỏng bất kỳ máy Turing nào khác - Máy Turing, khi được cung cấp một 'chương trình' thích hợp, có thể lấy 'chương trình' của máy Turing khác và mô phỏng nó trên đầu vào tùy ý. Nếu bạn có một ngôn ngữ bị cấm triển khai trình thông dịch Python, thì nó sẽ không hoàn thành Turing.

Ví dụ về ngôn ngữ hoàn chỉnh Turing

Nếu ngôn ngữ của bạn có bộ nhớ truy cập ngẫu nhiên vô hạn, thực thi có điều kiện và một số hình thức thực hiện lặp lại, có lẽ Turing đã hoàn tất. Có nhiều hệ thống kỳ lạ hơn mà vẫn có thể đạt được mọi thứ mà một máy Turing có thể làm cho chúng hoàn thành Turing:

  • Giải tích lambda
  • Trò chơi cuộc sống của Conway
  • Mẫu C ++
  • Prolog

11
SQL chắc chắn là hoàn hảo. Nó có khả năng kịch bản cho phép cho bất kỳ tính toán.
nzifnab

53
Không, bạn đang nhầm lẫn SQL với các phần mở rộng như T-SQL / PL-SQL. ANSI SQL không hoàn chỉnh. Nhưng TSQL / PLSQL - là.
Ag Pa Vasiliauskas

15
Rõ ràng SQL đã hoàn tất: stackoverflow.com/questions/900055/iêu
Newtang

2
Theo tính đầy đủ của Turing - hệ thống là Turing hoàn chỉnh nếu nó có thể được sử dụng để mô phỏng bất kỳ máy Turing nào được nhấn một lần. Nhưng trong ví dụ trên như tôi đã hiểu các nhà phát triển đặc biệt cyclic tag systemvà không universal cyclic tag system. Do đó - bài viết không chứng minh tính hoàn chỉnh của SQL. (Hoặc tôi đã hiểu nhầm điều gì đó)
Ag Pa Vasiliauskas

2
Không có triển khai có thể thực hiện được của một ngôn ngữ Turing-perfect, bởi vì không có băng vô hạn. Điều chúng tôi thực sự muốn nói là một số ngôn ngữ có khả năng xấp xỉ tính đầy đủ của Turing cho đến giới hạn của bộ nhớ khả dụng của máy chủ.
Shelby Moore III

17

Về cơ bản, Turing-đầy đủ là một yêu cầu ngắn gọn, đệ quy không giới hạn.

Thậm chí không bị ràng buộc bởi bộ nhớ.

Tôi nghĩ về điều này một cách độc lập, nhưng đây là một số thảo luận về khẳng định. Định nghĩa của tôi về LSP cung cấp nhiều bối cảnh hơn.

Các câu trả lời khác ở đây không định nghĩa trực tiếp bản chất cơ bản của tính đầy đủ của Turing.


Máy tự động trạng thái hữu hạn được phép có đệ quy không giới hạn. Trường hợp tại điểm : a*.

3
Các FSM @Rhymoid có bộ nhớ hạn chế Số lượng hữu hạn của các trạng thái) Đệ quy không giới hạn mà không tối ưu hóa đuôi phải có bộ nhớ không giới hạn. Tôi đã không giới hạn định nghĩa của mình đối với tập hợp đệ quy không giới hạn chỉ với tối ưu hóa đuôi. Vui lòng loại bỏ downvote của bạn.
Shelby Moore III

bạn giữ định nghĩa về sương mù đệ quy không giới hạn. Bạn có nghĩa là 'đệ quy' theo nghĩa 'đệ quy nguyên thủy' và 'không giới hạn' bằng cách biến nó thành 'một phần' (hoặc 'chung', hoặc 'mu-')? Sau đó, bạn có thể đúng. Nhưng công thức hiện tại của bạn quá gần với những tuyên bố bị chỉ trích trong "Định lý dân gian" của David Harel. Điều quan trọng là phải nghiêm ngặt trong toán học, và bằng cách loại bỏ các định nghĩa chính xác, bạn bỏ qua điều đó. Nhân tiện: các FSM có thể được khái quát hóa để tương tác mô hình; điều làm cho họ khác biệt với các TM là môi trường của cái sau cũng được mô hình hóa (như băng).

Bảng liệt kê @Rhymoid là phản đề của độ chính xác, ví dụ: liệt kê độ chính xác tối đa của các phân số của một inch. Đệ quy không giới hạn có nghĩa là mọi hình thức đệ quy có thể, điều này là không thể nếu không có một cuộn băng vô hạn. Đệ quy tổng quát hoàn toàn (không chỉ chung chung trong mô hình) luôn luôn hoàn thành Turing. Tôi nói rõ sự tương đương giữa đệ quy tổng quát và khả năng thực hiện bất kỳ tính toán nào có thể. Đó là một sự tương đương quan trọng cần lưu ý.
Shelby Moore III

"Đệ quy không giới hạn có nghĩa là mọi hình thức đệ quy có thể" Đó là cách đọc của bạn . Đối với hầu hết người dùng SO, 'đệ quy không giới hạn' có nghĩa là while (p) { /* ... */ }. "Tôi nói rõ sự tương đương giữa đệ quy tổng quát và khả năng thực hiện bất kỳ tính toán nào có thể." Luận án của Giáo hội là một vấn đề rất khác biệt và thực sự nên được thảo luận riêng.

13

Turing Complete có nghĩa là nó ít nhất mạnh bằng Turing Machine . Điều này có nghĩa là mọi thứ có thể được tính toán bằng Máy Turing đều có thể được tính toán bằng hệ thống Turing Complete.

Chưa ai tìm thấy một hệ thống nào mạnh hơn Turing Machine. Vì vậy, hiện tại, việc nói một hệ thống là Turing Complete cũng giống như nói hệ thống này mạnh như bất kỳ hệ thống máy tính nào được biết đến (xem Luận án Church-Turing ).


3
Lưu ý rằng tất cả điều này bỏ qua thời gian tường. Nó chỉ nói "nó có thể được thực hiện".
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen thực sự, nó coi thường khả năng tính toán vật lý hoàn toàn. Nó không chỉ có thể mất nhiều thời gian hơn tuổi của vũ trụ, mà còn có thể sử dụng nhiều bộ nhớ hơn mức có thể được xây dựng với tất cả các fermion và boson trong vũ trụ.
Waylon Flinn

Có thể, quitte có thể, không giới hạn số lượng boson và fermion trong vũ trụ. Chúng tôi không biết, và có lẽ sẽ không bao giờ biết, đó là kích thước. Mỗi khi bạn đọc về số lượng X trong 'vũ trụ', mọi người thực sự đang nói về vũ trụ quan sát được . Mặc dù thú vị, nó không phải là một giới hạn vật lý thực tế.
Stijn de Witt

9

Nói một cách đơn giản nhất, một hệ thống hoàn chỉnh Turing có thể giải quyết mọi vấn đề tính toán có thể có.

Một trong những yêu cầu chính là kích thước của Scratchpad không bị ràng buộc và có thể tua lại để truy cập ghi trước vào Scratchpad.

Do đó trong thực tế không có hệ thống nào là Turing-Complete.

Thay vào đó, một số hệ thống gần đúng tính đầy đủ của Turing bằng cách mô hình hóa bộ nhớ không giới hạn và thực hiện bất kỳ tính toán nào có thể phù hợp với bộ nhớ của hệ thống.


2

Tôi nghĩ tầm quan trọng của khái niệm "Turing Complete" nằm ở khả năng xác định một máy tính (không nhất thiết phải là "máy tính" cơ / điện) có thể giải mã các quy trình của nó thành các hướng dẫn "đơn giản", bao gồm đơn giản và đơn giản hơn hướng dẫn, rằng một máy Universal có thể giải thích và sau đó thực thi.

Tôi đánh giá cao The Annotated Turing

@Mark tôi nghĩ những gì bạn đang giải thích là sự pha trộn giữa mô tả của Universal Turing Machine và Turing Complete.

Một cái gì đó là Turing Complete, theo nghĩa thực tế, sẽ là một máy / quy trình / tính toán có thể được viết và biểu diễn dưới dạng một chương trình, được thực hiện bởi Universal Machine (máy tính để bàn). Mặc dù nó không được xem xét về thời gian hoặc lưu trữ, như được đề cập bởi những người khác.


2

Những gì tôi hiểu bằng những từ đơn giản:

Turing Complete: Một ngôn ngữ lập trình / chương trình có thể thực hiện tính toán, là Turing hoàn chỉnh.

Ví dụ :

  1. Bạn có thể thêm hai số bằng cách chỉ sử dụng HTML . (Ans là ' Không ', bạn phải sử dụng javascript để thực hiện bổ sung.), Do đó HTML không phải là Turing Complete.

  2. Các ngôn ngữ như Java, C ++, Python, Javascript, Solidity cho Ethereum, v.v. là Turing Complete vì bạn có thể thực hiện tính toán như thêm hai số bằng ngôn ngữ này.

Hi vọng điêu nay co ich.


0

Nó hoàn thành nếu nó có thể kiểm tra và phân nhánh (có 'nếu')


1
Đối với một câu hỏi cũ như vậy, sẽ đáng để kiểm tra xem liệu những người khác đã đóng góp tương tự hoặc thực chất hơn chưa
alan ocallaghan

Không chắc chắn về tính chính xác của câu trả lời. Nhưng đây là lời giải thích thực sự đơn giản mà tôi chưa từng thấy trước đây. Điều thú vị: từ lâu rồi (sau khi tôi viết đoạn mã đầu tiên của mình) tôi cũng đã sử dụng cách giải thích tương tự để xác định bộ xử lý đơn giản nhất có thể.
Victor Yarema

Đây là lần thử đầu tiên tuyệt vời với định nghĩa hoạt động chính xác, ngắn gọn và chính xác. Tuy nhiên, chi nhánh phải cho phép lặp và, đó không phải là trường hợp máy cũng phải cho phép các cuộc gọi chương trình con (tức là: đệ quy)? Có một chương trình làm phẳng các vòng lặp lồng nhau cho mỗi chương trình với đệ quy không?
dùng3673

0

Một máy Turing yêu cầu bất kỳ chương trình nào cũng có thể thực hiện kiểm tra điều kiện. Đó là điều cơ bản.

Hãy xem xét một cuộn piano chơi. Đàn piano của người chơi có thể chơi một bản nhạc rất phức tạp, nhưng không bao giờ có logic có điều kiện trong âm nhạc. Đó là Turing Complete.

Logic có điều kiện là cả sức mạnh và sự nguy hiểm của một cỗ máy là Turing Complete.

Cuộn piano được đảm bảo dừng lại mỗi lần. Không có sự đảm bảo nào cho một TM. Đây được gọi là vấn đề tạm dừng.


-1

Như Waylon Flinn đã nói :

Turing Complete có nghĩa là nó ít nhất mạnh bằng Turing Machine.

Tôi tin rằng điều này không chính xác, một hệ thống hoàn thành Turing nếu nó chính xác như Turing Machine, tức là mọi tính toán được thực hiện bởi máy đều có thể được thực hiện bởi hệ thống, nhưng mọi tính toán được thực hiện bởi hệ thống đều có thể được thực hiện bởi máy Turing .


1
Tôi nghĩ rằng bạn đang cho rằng luận điểm của Church-Turing là đúng khi đi đến kết luận này. Nó vẫn chưa được chứng minh. Thuộc tính bạn mô tả được gọi là 'Turing Equivalent'.
Waylon Flinn

1
@WaylonFlinn Không, anh ấy đúng. "Hoàn thành" có nghĩa là cả hai đều mạnh nhất như một thứ, nhưng cũng không mạnh hơn. So sánh với "NP-Complete".
Devin Jeanpierre

3
@DevinJeanpierre Tôi không muốn bắt đầu một cuộc chiến nảy lửa ở đây nhưng tôi gần như chắc chắn lớp tính toán mà bạn mô tả được gọi là "Turing Equivalent". Turing Complete có mối quan hệ tương tự với NP-Complete. NP-Complete bằng NP khi và chỉ khi P = NP. Theo cách tương tự, Turing Complete tương đương với Turing Equivalent khi và chỉ khi luận đề Church-Turing đúng.
Waylon Flinn

@Waylon Nguồn? Không có gì tôi đọc đồng ý với điều đó (ví dụ en.wikipedia.org/wiki/Turing_completiness )
Devin Jeanpierre

4
@DevinJeanpierre Nó nói nó ngay trong bài viết trên wikipedia mà bạn liên kết đến. Trích dẫn phần định nghĩa chính thức: "Một hệ thống tính toán có thể tính toán mọi hàm tính toán Turing được gọi là Turing hoàn thành", "Một hệ thống hoàn chỉnh Turing được gọi là Turing tương đương nếu mọi chức năng mà nó có thể tính toán cũng là Turing tính toán"
Waylon Flinn

-2

Trong các thuật ngữ ngôn ngữ thực tế quen thuộc với hầu hết các lập trình viên, cách thông thường để phát hiện tính hoàn chỉnh của Turing là nếu ngôn ngữ cho phép hoặc cho phép mô phỏng các câu lệnh lồng nhau trong khi các câu lệnh (trái ngược với kiểu Pascal cho các câu lệnh, với giới hạn trên cố định).


1
Một đơn khi không giới hạn vòng lặp là đủ để mô phỏng một máy Turing.
masterxilo

-8

Có thể một cơ sở dữ liệu quan hệ đầu vào vĩ độ và kinh độ của địa điểm và đường, và tính toán con đường ngắn nhất giữa chúng - không. Đây là một vấn đề cho thấy SQL chưa hoàn thành.

Nhưng C ++ có thể làm điều đó, và có thể làm bất kỳ vấn đề. Nó là như vậy.


10
Có thể tính toán con đường ngắn nhất giữa các điểm không phải là định nghĩa của Turing hoàn chỉnh. Có quá nhiều thứ cho nó hơn là một ví dụ.
Eva

1
Tôi sẽ chỉ đặt cái này ở đây ... hansolav.net/blog/Im HiệningDijkstrasAlacticmUsingTSQL.aspx
Matthew Whited
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.