Làm thế nào gần các ngôn ngữ lập trình phổ biến để không được Turing hoàn thành?


7

Thuật ngữ "Tính đầy đủ của Turing" đã được thảo luận trong một số lớp Khoa học Máy tính mà tôi đã học. Tuy nhiên, tôi chưa bao giờ có được cảm giác trực quan về những gì Turing hoàn thành thực sự đòi hỏi. Tôi tìm thấy câu hỏi này , nhưng câu trả lời là toán học hơn một chút so với những gì tôi đang tìm kiếm.

Lấy một ngôn ngữ lập trình phổ biến, chẳng hạn như C ++, Python, Java hoặc Lisp. Làm thế nào gần những ngôn ngữ này để không Turing hoàn thành? Những ngôn ngữ này có các tính năng cơ bản mà nếu loại bỏ sẽ làm cho ngôn ngữ không Turing hoàn chỉnh? Hoặc bạn có thể thay đổi một thuộc tính của ngôn ngữ (ví dụ: tạo một cái gì đó ngẫu nhiên) và bằng cách đó làm cho ngôn ngữ không Turing hoàn chỉnh?


1
Tôi nghĩ rằng các câu trả lời cho câu hỏi bạn liên kết trả lời tất cả các câu hỏi của bạn.
Raphael

Tôi không đồng ý. Họ thảo luận về các tính năng tối thiểu cần có của một ngôn ngữ để ngôn ngữ hoàn chỉnh, nhưng không đề cập đến các ngôn ngữ thực tế thực tế.
haroba

Các ngôn ngữ trong đời thực, phần lớn, không chính thống ở đây. Bạn có thể dễ dàng so sánh các tính năng được liệt kê trong câu trả lời của tôi với bất kỳ ngôn ngữ nào, ví dụ: hầu hết các ngôn ngữ hướng thủ tục / hướng đối tượng đều có whilevòng lặp.
Raphael

1
Lưu ý rằng Turing Hoàn thiện là một điều phổ biến. Bạn có thể mô phỏng các máy Turing bằng các công cụ kỳ lạ nhất: Bóng bi-a , Máy tự động di động , lỗi trang Intel và nhiều hơn nữa. Hầu như mọi hệ thống thú vị đều cho phép Turing tính toán hoàn chỉnh, tôi cảm thấy.
adrianN

Câu trả lời:


7

Các ngôn ngữ lập trình phổ biến rất chắc chắn Turing-Complete, nếu bạn có một cái nhìn lý tưởng hóa nơi các chương trình có thể sử dụng một lượng lớn bộ nhớ tùy ý. Thông thường không có một tính năng nào mà bạn có thể cô lập mà không có ngôn ngữ nào sẽ không hoàn chỉnh.

Nói một cách trực giác, Turing hoàn thiện đòi hỏi hai điều:

  • Một cách để các chương trình thao tác một lượng bộ nhớ không chỉ phụ thuộc vào kích thước của đầu vào. Bất kỳ hình thức tạo đối tượng đó có thể xây dựng những vật lớn từ các vật thể nhỏ là phù hợp: đối tượng, vật kiến trúc, cặp, danh sách, malloc, new, vv Thậm chí ngăn xếp dựa trên phân bổ được đủ điều kiện là có một cách để đối tượng truy cập bất kỳ khoảng cách từ trên xuống của ngăn xếp (chỉ với phân bổ dựa trên ngăn xếp và chỉ truy cập vào đầu ngăn xếp, bạn chỉ nhận được một máy tự động đẩy xuống). Nhiều hình thức thao tác dữ liệu yếu hơn cũng phù hợp: ví dụ, trong một ngôn ngữ như Lisp hoặc Python nơi số nguyên không có kích thước giới hạn, chỉ các thao tác số nguyên cơ bản là đủ để hoàn thành Turing.
  • Một cách để các chương trình tiếp tục chạy hoặc tạm dừng dựa trên một số phần của dữ liệu. Trong khi các vòng lặp, đệ quy cộng với một số dạng điều kiện (ví dụ ifhoặc case/ switch) và gotocộng với một số dạng điều kiện là ba cách phổ biến, nhưng có những cách khác.

Tôi nghĩ rằng cách tốt nhất để hiểu điều gì tạo nên một ngôn ngữ Turing-Complete là xem xét các ví dụ về các ngôn ngữ mạnh mẽ, nhưng không hoàn chỉnh Turing. Tôi sẽ đưa ra hai ví dụ minh họa hai họ chính của các ngôn ngữ đó (trừ các ngôn ngữ hoạt động trong bộ nhớ giới hạn).

Xem xét một ngôn ngữ bắt buộc với các hoạt động và mảng số nguyên, nhưng chỉ cho các vòng lặp ( for i = 1 to n, trong đó ikhông thể được sửa đổi trong vòng lặp), không phải các vòng lặp tùy ý (trong khi) và không có đệ quy. BlooP và các phiên bản đầu tiên của FORTRAN là ví dụ. Trong một ngôn ngữ như vậy, bạn chỉ có thể diễn tả các hàm đệ quy nguyên thủy - các hàm trong đó số lượng tính toán được giới hạn trong kích thước của đầu vào. Ngôn ngữ không phải là Turing-Complete - không thể biểu thị các hàm đệ quy tùy ý - do bị ràng buộc về thời gian tính toán.

Một ngôn ngữ chức năng có thể được thực hiện không hoàn chỉnh bằng cách hạn chế đệ quy thông qua một hệ thống loại hạn chế tất cả các chức năng được chấm dứt. Nếu hệ thống loại là có thể quyết định (nghĩa là nếu nó có thể quyết định liệu chương trình có được gõ tốt hay không), thì ngôn ngữ đó không thể là Turing-Complete (vì vấn đề tạm dừng là không thể giải quyết được). Các ngôn ngữ được sử dụng để chứng minh định lý, như CoqAgda , thuộc loại này.

Xem thêm Idris không thể làm gì khi từ bỏ tính hoàn chỉnh của Turing?


Mặt khác, các định lý định lý yêu cầu người dùng nhập bằng chứng chấm dứt (nghĩa là họ không tự tìm thấy chúng). Vì vậy, bạn có thể thực hiện một định lý định lý với một hệ thống loại không thể giải quyết được: nếu bạn nhận được một bằng chứng chính xác, bạn sẽ vui, nếu không bạn sẽ bỏ cuộc sau một thời gian. Nhưng nó sẽ không thân thiện với người dùng. Hầu hết các provers định lý có một hệ thống loại có thể quyết định: bạn nhập một thuật ngữ và nó được chấp nhận hoặc bạn nhận được một lỗi loại. Những gì các nhà cung cấp định lý không có là loại suy luận có thể quyết định : nếu bạn nhập một thuật ngữ với thông tin loại một phần và nó bị từ chối, bạn không biết liệu đó có phải là thuật ngữ không thể gõ hay không vì công cụ suy luận không đủ thông minh.

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.