Điều gì làm cho một ngôn ngữ Turing-hoàn thành?


79

Tập hợp tối thiểu các tính năng / cấu trúc ngôn ngữ làm cho nó hoàn chỉnh là gì?


21
Sẽ không tốt hơn nếu chỉ google nó? vi.wikipedia.org/wiki/Turing_completity
aml90

2
Chào mèo tò mò, chào mừng các lập trình viên! Các cuộc gọi cho danh sách không thuộc chủ đề ở đây: Tôi đã xóa phần đó khỏi câu hỏi của bạn. Điều đó nói rằng, nhiệm vụ này là vô cùng rộng lớn: có một vấn đề cụ thể mà bạn đang làm việc mà bạn có nghĩ về Turing-đầy đủ không?


Đối với một quan điểm khoa học máy tính, xem ở đây .
Raphael

Câu trả lời:


73

Một tarpit Turing là một loại ngôn ngữ lập trình bí truyền mà phấn đấu để được Turing hoàn tất trong khi sử dụng càng ít yếu tố càng tốt. Brainfuck có lẽ là tarpit nổi tiếng nhất, nhưng có rất nhiều.

  • IotaJot là các ngôn ngữ chức năng với hai và ba ký hiệu tương ứng, dựa trên phép tính tổ hợp SK (I) .

  • OISC ( Máy tính đặt một lệnh) biểu thị một loại tính toán bắt buộc chỉ yêu cầu một lệnh của một hoặc nhiều đối số, thường là trừ và nhánh nếu nhỏ hơn hoặc bằng 0, hoặc trừ ngược lại và bỏ qua nếu mượn. MMU x86 thực hiện hướng dẫn cũ và do đó hoàn thành Turing.

Nói chung, để một ngôn ngữ bắt buộc phải hoàn thành Turing, nó cần:

  1. Một hình thức lặp lại có điều kiện hoặc nhảy có điều kiện (ví dụ while, if+ goto)

  2. Một cách để đọc và viết một số hình thức lưu trữ (ví dụ: biến, băng)

Để ngôn ngữ chức năng lambda-tính toán trở thành TC, nó cần:

  1. Khả năng trừu tượng hóa các hàm trên các đối số (ví dụ: trừu tượng lambda, trích dẫn)

  2. Khả năng áp dụng các hàm cho các đối số (ví dụ: giảm)

Tất nhiên có nhiều cách khác để xem xét tính toán, nhưng đây là những mô hình phổ biến cho các bạt Turing. Lưu ý rằng máy tính thực không phảimáy Turing phổ dụng vì chúng không có bộ nhớ không giới hạn. Nói một cách chính xác, chúng là những cỗ máy lưu trữ có giới hạn. Nếu bạn tiếp tục bổ sung bộ nhớ cho họ, họ sẽ tiếp cận một cách bất thường các máy Turing. Tuy nhiên, ngay cả máy lưu trữ giới hạn và máy trạng thái hữu hạn cũng hữu ích cho việc tính toán; họ chỉ đơn giản là không phổ quát .

Nói đúng ra, I / O không bắt buộc đối với tính đầy đủ của Turing; TC chỉ khẳng định rằng một ngôn ngữ có thể tính toán hàm bạn muốn chứ không phải ngôn ngữ đó có thể hiển thị cho bạn kết quả. Trong thực tế, mọi ngôn ngữ hữu ích đều có cách tương tác với thế giới bằng cách nào đó.


Đối với các ngôn ngữ mệnh lệnh, các biến đơn giản có đủ không? Tôi có ấn tượng rằng một số loại bộ sưu tập (ví dụ như mảng hoặc danh sách được liên kết) sẽ là cần thiết.
luiscubal

1
@luiscubal bạn cần có thể chỉ định một lượng dữ liệu tùy ý. Với các biến đơn giản, bạn có thể biểu thị lượng dữ liệu mà chính các biến đó có. Điều gì sẽ xảy ra nếu bạn cần đại diện cho N + 1 phần dữ liệu khác nhau. Người ta có thể lập luận rằng với các thủ thuật như Fractran chơi, bạn có thể làm điều đó ngay cả trong các biến đơn giản ... nhưng đó không hoàn toàn là những gì bạn đang hỏi.

Không phải ngôn ngữ phải hỗ trợ các vòng lặp ENDLESS sao?
sergiol

Re, "mọi ngôn ngữ hữu ích đều có cách tương tác với thế giới." Algol 60 không có bất kỳ cách tương tác xác định nào với thế giới. Tất cả I / O của bạn trong chương trình Algol 60 được thực hiện bằng cách gọi các hàm thư viện và các hàm thư viện có thể hoàn toàn khác nhau trong các lần cấy ghép khác nhau. Nhưng, sau đây tôi tự nhận mình từ bất kỳ cuộc thảo luận nào về việc liệu Algol 60 có "hữu ích" hay không.
Solomon chậm

15

Từ quan điểm thực tế hơn: nếu bạn có thể dịch tất cả các chương trình bằng ngôn ngữ hoàn chỉnh Turing sang ngôn ngữ của bạn, thì (theo như tôi biết), ngôn ngữ của bạn phải là Turing-Complete. Do đó, nếu bạn muốn kiểm tra xem một ngôn ngữ bạn thiết kế có hoàn chỉnh hay không, bạn chỉ cần viết Brainf *** cho trình biên dịch YourL Language và chứng minh / chứng minh rằng nó có thể biên dịch tất cả các chương trình BF hợp pháp.

Để làm rõ, tôi có nghĩa là ngoài một trình thông dịch cho YourL Language, bạn viết một trình biên dịch (bằng bất kỳ ngôn ngữ nào) có thể biên dịch bất kỳ chương trình BF nào thành YourL Language (tất nhiên giữ cùng một ngữ nghĩa).


11
Vâng, đó chắc chắn sẽ là cách thiết thực nhất để tiếp cận nó. </sarcasm>
Robert Harvey

13
@RobertHarvey có một điểm, nhưng ý tưởng chung là khá quan trọng. Brainfuck được chứng minh là hoàn hảo và rất đơn giản khi các ngôn ngữ lập trình đi. Đối với các ngôn ngữ lập trình không bí truyền, việc triển khai trình thông dịch brainfuck có thể dễ dàng và nhanh hơn nhiều so với việc đưa ra một bằng chứng nghiêm ngặt từ hư không (Tôi có thể triển khai BF trong một vài dòng Python, nhưng tôi không chắc bắt đầu từ đâu với một chính thức bằng chứng rằng Python đã hoàn thành); và hàng tá ngôn ngữ lấy cảm hứng từ bộ não bí truyền được biết là đã hoàn tất vì nó biết cách chúng ánh xạ tới bộ não.

7
@RobertHarvey: Tại sao không? Chắc chắn ai đó thiết kế ngôn ngữ của riêng họ sẽ có thể viết trình biên dịch BF cho nó (nếu điều đó là bắt buộc và tìm một ngôn ngữ khác phù hợp khác).
Anton Golov

5
@delnan: Bạn sẽ phải chứng minh, tuy nhiên, thông dịch viên BF của bạn thực hiện một cách chính xác các đặc điểm kỹ thuật BF, IOW bạn sẽ phải chứng minh rằng phiên dịch BF của bạn là, trên thực tế, một thông dịch viên BF và không phải là một thông dịch viên cho một ngôn ngữ BF-như thế có thể hoặc không thể hoàn thành Turing.
Jörg W Mittag

2
@ DarekNędza, đó chỉ là hệ quả tự nhiên của cách Turing Complete được định nghĩa; mọi phần mở rộng của ngôn ngữ Turing Complete vẫn sẽ là Turing Complete.
Anton Golov

8

Một hệ thống chỉ có thể được coi là hoàn thành Turing nếu nó có thể làm bất cứ điều gì mà một máy Turing phổ dụng có thể. Vì máy Turing phổ dụng được cho là có thể giải quyết bất kỳ chức năng tính toán nào trong thời gian nhất định, các hệ thống hoàn chỉnh của Turing có thể, bằng cách mở rộng, cũng làm như vậy.

Để kiểm tra xem một cái gì đó đã hoàn thành Turing chưa, hãy xem bạn có thể triển khai máy Turing bên trong nó không. Nói cách khác, kiểm tra xem nó có thể mô phỏng như sau không:

  1. Khả năng đọc và viết "biến" (hoặc dữ liệu tùy ý) : Khá nhiều tự giải thích.
  2. Khả năng mô phỏng di chuyển đầu đọc / ghi : Không đủ để chỉ có thể truy xuất và lưu trữ các biến. Cũng có thể mô phỏng khả năng di chuyển đầu của băng để tham chiếu các biến khác. Điều này thường có thể được mô phỏng trong các ngôn ngữ lập trình với việc sử dụng cấu trúc dữ liệu mảng (hoặc tương đương) hoặc, trong trường hợp của một số ngôn ngữ nhất định như mã máy, khả năng tham chiếu các biến khác thông qua việc sử dụng "con trỏ" (hoặc tương đương).
  3. Khả năng mô phỏng một máy trạng thái hữu hạn : Mặc dù không được đề cập thường xuyên, máy Turing thực sự là một biến thể của các máy trạng thái hữu hạn thường được sử dụng trong quá trình phát triển AI. Alan Turing cho biết mục đích của các quốc gia là mô phỏng "nhiều phương thức giải quyết vấn đề" của một người.
  4. Trạng thái "tạm dừng" : Mặc dù nó thường được đề cập, một bộ quy tắc phải có khả năng lặp lại để được coi là hoàn thành Turing, nhưng đó không thực sự là một tiêu chí tốt vì định nghĩa chính thức về thuật toán là thuật toán trạng thái phải luôn luôn cuối cùng kết luận. Nếu họ không thể kết luận theo một cách nào đó, thì nó không phải là Turing hoàn chỉnh, hoặc thuật toán cho biết không phải là một hàm tính toán. Sử dụng các hệ thống hoàn chỉnh mà về mặt kỹ thuật không thể kết luận do cách chúng hoạt động (ví dụ như máy chơi game chẳng hạn) đã khắc phục được giới hạn này bằng cách có thể "mô phỏng" trạng thái tạm dừng trong một số thời trang. Đừng nhầm lẫn với "vấn đề tạm dừng", một chức năng không thể giải quyết được chứng minh nó '

Đây là những yêu cầu tối thiểu thực sự cho một hệ thống được coi là hoàn thành Turing. Không hơn không kém. Nếu nó không thể mô phỏng bất kỳ thứ nào trong số này theo cách nào đó, thì nó không hoàn thành. Các phương pháp mà người khác đề xuất chỉ có nghĩa là đến cuối cùng vì có một số hệ thống hoàn chỉnh Turing không có các tính năng đó.

Lưu ý rằng không có cách nào thực sự để xây dựng một hệ thống hoàn chỉnh Turing thực sự. Điều này là do không có cách nào để mô phỏng thực sự sự vô hạn của băng của máy Turing trong không gian vật lý.


4

Một ngôn ngữ lập trình đang hoàn tất nếu bạn có thể thực hiện bất kỳ phép tính nào với nó. Không chỉ có một bộ tính năng làm cho một ngôn ngữ hoàn chỉnh, vì vậy các câu trả lời nói rằng bạn cần các vòng lặp hoặc rằng bạn cần các biến là sai vì có những ngôn ngữ không có nhưng vẫn hoàn thành.

Alan Turing đã tạo ra máy turing phổ dụng và nếu bạn có thể dịch bất kỳ chương trình nào được thiết kế để hoạt động trên máy vạn năng để chạy trên ngôn ngữ của bạn thì nó cũng hoàn thành Turing. Điều này cũng hoạt động một cách gián tiếp để bạn có thể nói ngôn ngữ X đang hoàn tất nếu tất cả các chương trình sử dụng ngôn ngữ hoàn chỉnh Y có thể được dịch cho X vì tất cả các chương trình máy turing phổ dụng có thể được dịch sang chương trình Y.

Độ phức tạp thời gian, độ phức tạp không gian, dễ định dạng đầu vào / đầu ra và dễ viết bất kỳ chương trình nào không được đưa vào phương trình để máy tính về mặt lý thuyết có thể thực hiện tất cả các phép tính nếu các tính toán không bị dừng do mất điện hoặc Trái đất bị mặt trời nuốt chửng.

Thông thường để chứng minh tính hoàn chỉnh của họ, họ tạo ra một trình thông dịch cho bất kỳ ngôn ngữ nào được chứng minh là ngôn ngữ hoàn chỉnh nhưng để nó hoạt động, bạn cần phương tiện đầu vào và đầu ra, hai điều thực sự không bắt buộc đối với một ngôn ngữ phải hoàn thành. Nó đủ để chương trình của bạn có thể thay đổi trạng thái khi khởi động và bạn có thể kiểm tra bộ nhớ sau khi chương trình bị tạm dừng.

Để làm cho một ngôn ngữ thành công, nó cần nhiều hơn là hoàn thiện và mặc dù điều này đúng cho cả các tarpits. Tôi không nghĩ rằng Brainfuck có thể đã được phổ biến không ,..


2
"Một ngôn ngữ lập trình đang hoàn tất nếu bạn có thể thực hiện bất kỳ phép tính nào với nó." Đó là luận điểm của Church-Turing, không phải là thứ tạo nên một ngôn ngữ Turing.
Hình thoi

@Rhymoid Vì vậy, bạn có nghĩa là không có gì là hoàn thành trừ khi bạn có thể làm một thông dịch viên? I E. tính toán lambda không hoàn thành ngay cả khi nó bằng nhau?
Sylwester

1
Tôi vẫn đang tìm kiếm một định nghĩa có thẩm quyền về các thuật ngữ tương đương Turing và Turing-đầy đủ (và Turing-mạnh). Tôi đã thấy quá nhiều trường hợp, từ những người trên bảng tin đến các nhà nghiên cứu trong các bài viết của họ, những người diễn giải các thuật ngữ này khác nhau.
Rhymoid

Dù sao, tôi hiểu 'Turing-Complete' là mô phỏng tương đương với Máy Turing phổ dụng (UTM; đến lượt nó, có khả năng mô phỏng bất kỳ máy Turing nào - do đó là 'phổ quát'). Trong bài báo của Turing từ năm 1936, nơi ông giới thiệu các máy móc của mình, ông đã xác định khái niệm về UTM và đưa ra một bản phác thảo bằng chứng rằng UTM là mô phỏng tương đương với phép tính lambda của Church. Bằng cách đó, ông đã chứng minh rằng họ có sức mạnh tính toán tương tự. Luận án Church-Turing khẳng định, nói một cách đơn giản rằng "đó là tất cả sức mạnh tính toán mà bạn từng có".
Rhymoid

Nó có hai định nghĩa chính thức cho trang hoàn chỉnh Turing của Wikipedia . Một yêu cầu I / O khác không. Máy không nói rằng máy đang hoạt động hoàn chỉnh nếu nó có thể tính toán mọi chức năng tính toán Turing. Điều đó đặt phép tính lambda trở lại hoàn thành vì bạn có thể dễ dàng tạo một chương trình tương đương trong phép tính lambda tính toán giống như bất kỳ chương trình máy turing nào.
Sylwester

4

Bạn không thể biết nó sẽ lặp lại vô hạn hay dừng lại.

-------------

Giải thích: Với một số đầu vào, không thể biết trong mọi trường hợp (sử dụng máy Turing khác) nếu sự việc sẽ lặp đi lặp lại vô tận hoặc cuối cùng sẽ dừng lại, ngoại trừ bằng cách chạy nó (cung cấp cho bạn câu trả lời nếu nó dừng, nhưng không nếu nó lặp!).

Điều này có nghĩa là bạn phải có khả năng lưu trữ một lượng dữ liệu có khả năng không giới hạn theo một cách nào đó - phải có một băng tương đương với băng vô hạn, bất kể bị xáo trộn như thế nào! (Nếu không, chỉ có một số trạng thái hữu hạn và sau đó bạn có thể kiểm tra xem bạn đã từng qua trạng thái đó trước đó chưa và cuối cùng dừng lại). Nói chung, máy Turing có thể tăng hoặc thu nhỏ kích thước trạng thái của chúng bằng một số phương tiện có thể kiểm soát được.

Vì máy Turing phổ dụng ban đầu của Turing có vấn đề tạm dừng không thể giải quyết, nên máy Turing hoàn chỉnh của riêng bạn cũng phải có vấn đề tạm dừng không thể giải quyết.

Các hệ thống hoàn chỉnh Turing có thể mô phỏng bất kỳ hệ thống hoàn chỉnh Turing nào khác, vì vậy nếu bạn có thể xây dựng trình giả lập cho một số hệ thống hoàn chỉnh Turing nổi tiếng trong hệ thống của mình, điều đó chứng tỏ rằng hệ thống của bạn cũng đã hoàn thành Turing.

Chẳng hạn, giả sử bạn muốn chứng minh rằng Snakes & Ladder đã hoàn thành Turing, được cung cấp một bảng với mô hình lưới lặp lại vô hạn (với một phiên bản khác ở phía trên và bên trái). Biết rằng máy Minsky 2 bộ đếm đã hoàn thành Turing (có 2 bộ đếm không giới hạn và 1 trạng thái trong số hữu hạn), bạn có thể tạo một bảng tương đương trong đó vị trí X và Y trên lưới là giá trị hiện tại của 2 bộ đếm và đường dẫn hiện tại là trạng thái hiện tại. Bang! Bạn vừa chứng minh rằng Rắn & Thang đã hoàn thành.


1
Tôi không mua lập luận đó. Chỉ vì vấn đề tạm dừng là không thể giải quyết được cho các máy Turing không trực tiếp ám chỉ rằng mọi ký hiệu cho phép bạn chỉ định một chương trình mà vấn đề tạm dừng là không thể giải quyết được là Turing hoàn tất. Chỉ có điều ngược lại rõ ràng là đúng: Nếu ký hiệu là Turing hoàn tất, thì tất nhiên có thể viết các chương trình mà vấn đề tạm dừng là không thể giải quyết được.
5gon12eder

Đó là một điều kiện cần thiết. Nếu bạn có thể quyết định cho mọi chương trình cho dù chương trình đó dừng lại thì ngôn ngữ vẫn chưa hoàn thành.
gnasher729

4

Một điều kiện cần thiết là một vòng lặp có số lần lặp tối đa không được xác định trước lần lặp hoặc đệ quy trong đó độ sâu đệ quy tối đa không được xác định trước. Ví dụ, đối với ... trong ... các vòng lặp khi bạn tìm thấy chúng trong nhiều ngôn ngữ mới hơn là không đủ để làm cho ngôn ngữ trở nên hoàn chỉnh (nhưng chúng sẽ có các phương tiện khác). Lưu ý rằng điều này không có nghĩa là số lần lặp giới hạn hoặc độ sâu đệ quy giới hạn, nhưng độ sâu lặp lại và độ sâu đệ quy tối đa phải được tính toán trước.

Ví dụ, hàm Ackermann không thể được tính bằng ngôn ngữ mà không có các tính năng này. Mặt khác, rất nhiều phần mềm rất phức tạp và rất hữu ích có thể được viết mà không yêu cầu các tính năng này.

Mặt khác, với mỗi lần lặp đếm và mỗi độ sâu đệ quy tính trước, không chỉ có thể nó được quyết định liệu một chương trình sẽ tạm dừng hay không, nhưng nó sẽ ngăn chặn.


-1

Tôi biết đây không phải là câu trả lời chính xác, nhưng một khi bạn rút 'tối thiểu' ra khỏi 'Turing-perfect' và đưa 'thực tế' trở lại nơi nó thuộc về, bạn sẽ thấy các tính năng quan trọng nhất phân biệt ngôn ngữ lập trình với ngôn ngữ đánh dấu là

  • biến
  • điều kiện (nếu / thì ...)
  • vòng lặp (vòng lặp / ngắt, trong khi ...)

tiếp theo đến

  • chức năng ẩn danh và được đặt tên

để kiểm tra các xác nhận này, hãy bắt đầu bằng ngôn ngữ đánh dấu, giả sử, HTML. chúng ta có thể phát minh ra HTML + chỉ với các biến hoặc chỉ có điều kiện (MS đã làm điều đó với các nhận xét có điều kiện) hoặc một loại cấu trúc vòng lặp (trong trường hợp không có điều kiện có thể sẽ kết thúc giống như vậy <repeat n='4'>...</repeat>). thực hiện bất kỳ điều nào trong số này sẽ làm cho HTML + (hoặc) mạnh hơn đáng kể so với HTML đơn giản, nhưng nó vẫn sẽ mang nhiều dấu ấn hơn là ngôn ngữ lập trình; với mỗi tính năng mới, bạn làm cho nó ít hơn một ngôn ngữ khai báo và nhiều ngôn ngữ bắt buộc hơn.

Nhiệm vụ tối thiểu trong logic và lập trình chắc chắn rất quan trọng và thú vị, nhưng nếu tôi phải dạy cho n00 người trẻ hay già 'lập trình' và 'cách học lập trình', tôi sẽ khó bắt đầu với chiều rộng và chiều rộng đầy đủ của các nền tảng lý thuyết của sự hoàn thiện Turing. toàn bộ bản chất của nấu ăn và lập trình là làm mọi thứ, theo đúng thứ tự, lặp đi lặp lại cho đến khi sẵn sàng, như mẹ bạn đã làm. đó là về số tiền đó cho tôi.

sau đó một lần nữa, tôi không bao giờ kết thúc CS của tôi.


2
Nếu bạn không chắc chắn, bạn nên nghiên cứu nó trước. fractranhoàn thành , cũng như brainf * ck . Cũng lưu ý rằng html 5 + CSS 3 đã hoàn tất Turing vì nó có thể thực hiện quy tắc 110 .

1
yesyesyes tôi biết. nhưng tất cả các ví dụ đưa ra là ít nhiều bí truyền (trong khi có thể thú vị hoặc đáng ngạc nhiên), câu trả lời của tôi là một câu hỏi thực dụng, và rất có thể không phải là tối thiểu. Tôi nghĩ rằng điều quan trọng là chỉ ra rằng trang này là số 1 khi tìm kiếm tính đầy đủ của Turing trên google, câu trả lời ở đây là IMHO ít sử dụng, giả sử, một n00bie muốn biết phân biệt HTML với PHP hay Python. ý tôi là, brainf ck không được gọi là brainf ck mà không có lý do.
chảy
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.