Ngôn ngữ thông thường có thể được Turing hoàn thành?


32

Tôi đã đọc về Iota và Jot và thấy phần này khó hiểu:

Không giống như Iota, nơi cây cú pháp cho một chuỗi có thể phân nhánh ở bên trái hoặc bên phải, cú pháp Jot được phân nhánh đồng đều. Do đó, Iota hoàn toàn không có ngữ cảnh, nhưng Jot là ngôn ngữ thông thường.

Sự hiểu biết của tôi là cả Iota và Jot đều hoàn thành. Nhưng rõ ràng, một cái là không có ngữ cảnh, và cái kia là thường xuyên! Chắc chắn ngôn ngữ thông thường không thể Turing hoàn thành?


3
Lưu ý rằng một ngôn ngữ mô tả máy turing có thể được viết một cách tầm thường bằng ngôn ngữ thông thường, ví dụ i = {0,1, -1}, b = {kết thúc đầu vào} (i + bi + bi) + b (i +) mô tả một bộ quy tắc không trống theo sau là một đầu vào không trống. Hoặc, đúng hơn, bạn có thể diễn giải nó như thế nếu bạn có một thông dịch viên, mà, như các câu trả lời đề cập, là một khái niệm riêng biệt cho lớp của ngôn ngữ.
Khối

1
@Cubic: đối với vấn đề đó, các máy Turing có thể được đánh số sao cho mỗi số đại diện chính xác cho một máy (tức là chúng có thể đếm được) và những số đó có thể được biểu thị bằng ký hiệu đơn. Tôi chưa bao giờ nghiên cứu chính xác công cụ này, vì vậy tôi phải nghiên cứu các định nghĩa, nhưng tôi cho rằng đó 1*0là ngôn ngữ thông thường ;-) Mặc dù không phải là ngôn ngữ lập trình rất thân thiện cho người lập trình hoặc người viết trình biên dịch.
Steve Jessop

Câu trả lời:


40

Tóm lại, câu trả lời là có.

Nhưng bạn đang trộn lẫn hai ý nghĩa hoàn toàn không liên quan đến thuật ngữ "ngôn ngữ" (vâng, điều này thật khó hiểu):

  • Một bộ dây. "Ngôn ngữ không ngữ cảnh" có nghĩa là "một chuỗi các chuỗi có thể được nhận ra bằng ngữ pháp không ngữ cảnh".
  • Một cách chỉ định một tính toán. "Ngôn ngữ hoàn chỉnh Turing" có nghĩa là "cách chỉ định các chương trình trong đó máy Turing có thể được chỉ định".

Lưu ý rằng bạn có thể nói về "ngôn ngữ C ++" từ hai quan điểm hoàn toàn không liên quan, sử dụng hai ý nghĩa không liên quan của từ "ngôn ngữ":

  • C ++ là một chuỗi các chuỗi hợp pháp theo ngữ pháp C ++
  • C ++ như một cách chỉ định chương trình.

Các đặc điểm của "ngôn ngữ C ++" từ hai quan điểm này không liên quan đến nhau.

Thêm ví dụ để giúp bạn tách các khái niệm này:

  • Biểu thức "[az] + @ [az]. [Az]" mô tả một tập hợp các chuỗi có thể nhận ra bởi automata hữu hạn, tức là một ngôn ngữ thông thường. Tuy nhiên, đó chỉ là - một chuỗi các chuỗi: không phải là một cách chỉ định chương trình (trừ khi bạn quy định cách diễn giải từng chuỗi như một chương trình), vì vậy sẽ không có ý nghĩa gì khi nói về việc đó có phải là Turing- hoàn thành.
  • Ngôn ngữ của sơ đồ là một cách chỉ định chương trình; tùy thuộc vào hương vị đặc biệt của sơ đồ, nó có thể hoặc không hoàn thành Turing. Tuy nhiên, sơ đồ khối không phải là chuỗi, do đó, hoàn toàn không có ý nghĩa khi nói về sơ đồ theo nghĩa "ngôn ngữ như một bộ chuỗi".

3
Tôi sẽ nói thêm rằng đó (([a-z][0-9]*)*[A-Z][0-9]*([a-z][0-9]*)*->([a-zA-Z][0-9]*)*)*là một ngôn ngữ thông thường có thể mô tả ngữ pháp của bất kỳ ngôn ngữ nào của lớp 0
Erbureth nói Phục hồi lại

2
{0,1}

10

Mặc dù bộ chương trình pháp lý trong Jot là thường xuyên, bản thân Jot là Turing-Complete. Điều đó có nghĩa là mỗi chức năng tính toán có thể được biểu thị trong Jot. Chúng ta thậm chí có thể đưa ra một ngôn ngữ trong đó tất cả các chuỗi nhị phân là hợp pháp, nhưng bản thân ngôn ngữ đã hoàn thành Turing (bài tập). Bạn đang nhầm lẫn cú pháp và ngữ nghĩa.

Nhân tiện, các ngôn ngữ không ngữ cảnh cũng (có thể) không phải là NP hoàn chỉnh, vì chúng có thuật toán phân tích thời gian đa thức.


9

Cú pháp một mình (như được mã hóa trong các cây cú pháp) của các ngôn ngữ lập trình hiện đại khác xa với mọi thứ chúng làm. Trong thực tế, các ngôn ngữ chính thức được xác định bởi tập hợp tất cả các chương trình trong một ngôn ngữ nhất định biên dịch mà không có lỗi hiếm khi thậm chí không có ngữ cảnh .

Yếu tố ngữ nghĩa tĩnh và động vào phương trình. Chúng vô hình trong cây cú pháp nhưng xác định xem một đoạn mã có thực sự là một chương trình hay không và nó tính toán cái gì. Dòng dưới cùng, sự tôn trọng không có bối cảnh. ngôn ngữ chính thức thông thường được xác định bởi "cú pháp" đưa ra sự gần đúng của ngôn ngữ lập trình.

Bây giờ để trả lời câu hỏi của bạn: có, nó có thể. Ví dụ, xem xét bất kỳ số thứ tự nào của máy Turing; bạn có được "ngôn ngữ lập trình" của tất cả các số tự nhiên, mỗi số đại diện cho một TM. Cấp, nó không phải là một ngôn ngữ tốt để lập trình, nhưng nó chắc chắn là một ngôn ngữ hoàn chỉnh Turing thường xuyên - tầm thường, thậm chí.


3
  1. Một ngôn ngữ lập trình là Turing-Complete nếu nó đủ biểu cảm để chỉ định mọi chức năng được tính toán bởi các máy Turing. Ở đây chúng ta đang thảo luận về sức mạnh của các ngôn ngữ được chỉ định trong các ngôn ngữ lập trình . Ví dụ, không khó để viết một trình thông dịch cho các máy Turing bằng Python, vì vậy Python là ngôn ngữ lập trình hoàn chỉnh Turing.

  2. Cú pháp của ngôn ngữ lập trình , tức là tập hợp các chuỗi tương ứng với các chương trình hợp lệ trong ngôn ngữ lập trình, chính nó là một ngôn ngữ. Ví dụ, hãy xem xét tập hợp tất cả các chương trình Python có thể. Cú pháp của ngôn ngữ lập trình có thể nhạy cảm theo ngữ cảnh , không ngữ cảnh , thông thường , v.v. Chúng tôi quan tâm đến việc khó kiểm tra xem một chuỗi đã cho có phải là một chương trình hợp lệ trong ngôn ngữ lập trình (điều này được thực hiện bởi trình biên dịch / trình thông dịch). Khi chúng ta nói cú pháp của ngôn ngữ lập trình là không có ngữ cảnh, điều đó có nghĩa là có một ngữ pháp không ngữ cảnh cho cú pháp của nó và ngụ ý rằng có automata đẩy xuống để kiểm tra tính hợp lệ của các chương trình,

Lưu ý rằng sự đơn giản của cú pháp của ngôn ngữ lập trình không bao hàm sự hạn chế về sức mạnh tính toán của các chương trình được chỉ định trong ngôn ngữ lập trình đó.


1

Câu trả lời là có. Bạn thấy, như câu trả lời được chấp nhận, một ngữ pháp độc lập với ý nghĩa của nó. Theo cách nói riêng của Chomsky:

Tôi nghĩ rằng chúng ta buộc phải kết luận rằng một ngữ pháp là tự trị và độc lập với ý nghĩa ...

Chomsky, Cấu trúc cú pháp (1956)

Nếu một ngữ pháp có thể tạo ra các câu đủ để mô tả tất cả những thứ có thể tính toán thì chúng ta có thể tự ý gán ý nghĩa tính toán cho các câu của nó - một câu cho mỗi thứ có thể được tính toán.

Đối với một ví dụ cụ thể thực sự, ngôn ngữ phổ biến whitespacecó ngữ pháp thông thường và thậm chí có thể x86 assembly languages(cần xác minh).


Tôi không nghĩ rằng đoạn văn đó có nghĩa là ngữ pháp của Go là ngôn ngữ thông thường theo nghĩa chính thức; Tôi nghĩ rằng nó chỉ có nghĩa là ngữ pháp không phảibất thường , tức là nhất quán. Nếu cú ​​pháp của Go thực sự là một ngôn ngữ thông thường trong hệ thống phân cấp Chomsky, thì nó sẽ không có khả năng tạo ra các dấu ngoặc đơn được cân bằng, lồng nhau.
tsleyon

Vâng, có sự đệ quy trong ngữ pháp của Go. Đang cập nhật bài viết.
Eric
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.