Tổng ngôn ngữ mà chỉ một ngôn ngữ hoàn chỉnh Turing có thể diễn giải


16

Bất kỳ ngôn ngữ nào không hoàn thành Turing đều không thể tự viết trình thông dịch. Tôi không biết tôi đã đọc nó ở đâu nhưng tôi đã thấy nó được sử dụng nhiều lần. Có vẻ như điều này làm phát sinh một loại ngôn ngữ hoàn chỉnh "tối thượng" không Turing; một trong những chỉ có thểđược giải thích bởi một máy Turing. Các ngôn ngữ này không nhất thiết có thể tính toán tất cả các hàm từ tự nhiên đến tự nhiên cũng không nhất thiết phải là đẳng cấu (đó có thể là ngôn ngữ cuối cùng A và B tồn tại sao cho tồn tại hàm F mà A có thể tính được nhưng B không thể tính được). Agda có thể diễn giải hệ thống của Godel T và Agda là toàn bộ để một ngôn ngữ tối thượng như vậy sẽ mạnh mẽ hơn nhiều so với hệ thống của Godel T dường như. Dường như với tôi rằng một ngôn ngữ như vậy ít nhất cũng mạnh mẽ như agda (mặc dù tôi không có bằng chứng, chỉ là một linh cảm).

Có bất kỳ nghiên cứu đã được thực hiện trong tĩnh mạch này? Những kết quả nào được biết đến (cụ thể là một ngôn ngữ "tối thượng" như vậy đã biết)?

Phần thưởng: Tôi lo lắng rằng có một trường hợp bệnh lý không thể tính toán các chức năng mà Hệ thống T của Godel vẫn có thể chỉ có thể được giải thích bằng máy Turing vì nó cho phép một số chức năng thực sự kỳ quặc được tính toán. Đây có phải là trường hợp hay chúng ta có thể biết rằng một ngôn ngữ như vậy sẽ có thể tính toán bất cứ thứ gì mà Hệ thống T của Godel có thể tính toán?


2
Tuyên bố của bạn gây nhầm lẫn vì cách bạn sử dụng thuật ngữ. Thay vì dựa vào thuật ngữ, hãy cố gắng nêu câu hỏi của bạn một cách chặt chẽ và rõ ràng về mặt toán học để chúng tôi có thể hiểu câu hỏi của bạn. Bạn có ý nghĩa gì bởi ngôn ngữ lập trình trong bối cảnh của lý thuyết tính toán? Bạn có nghĩa là liệt kê các chức năng tính toán?
Kaveh

1
Tôi đoán về những gì bạn đọc: nếu một ngôn ngữ đủ mạnh và chứa chức năng phổ quát của một lớp chức năng khác thì nó có thể định nghĩa hàm đường chéo cho lớp đó. Nếu nó là một lớp của các hàm tổng thì hàm chéo có thể nằm trong lớp.
Kaveh

Nó đã được tuyên bố không chính thức nơi tôi tìm thấy nó. Một cái gì đó theo nghĩa đen dọc theo dòng của những gì tôi đã đưa ra ở đây. Tôi cũng không biết làm thế nào để nói điều này theo một cách toán học. Sau khi đọc, tôi không chắc "hàm chéo của một lớp hàm là gì". Tôi nghĩ theo thuật ngữ của bạn, ý tôi là "một lớp tổng số hàm không thể chứa hàm phổ quát riêng của nó" và vì vậy tôi nghĩ rằng tôi đang hỏi "đối với lớp nào của hàm tổng C thì đó là trường hợp không có lớp tổng hàm nào chứa chức năng phổ quát cho C ". Nếu tôi hiểu thế nào là "chức năng phổ quát" thì tôi nghĩ đó là chính xác.
Jake

1
Nói đúng ra, đây không phải là một câu hỏi cấp độ nghiên cứu. Ngoài ra, tại sao đây là một wiki cộng đồng? Hoặc là nó?
Andrej Bauer

"Có vẻ như điều này làm phát sinh một loại ngôn ngữ hoàn chỉnh không" tuyệt đỉnh ", một ngôn ngữ chỉ có thể được giải thích bằng máy Turing." Đừng làm theo khẳng định đó có vẻ như không phải là một sequitur, ý bạn là gì, tại sao điều đó có vẻ như vậy?
vzn

Câu trả lời:


42

Đây là một câu hỏi không đúng, vì vậy trước tiên hãy hiểu ý nghĩa của nó. Tôi sẽ làm điều đó theo phong cách của lý thuyết tính toán. Do đó tôi sẽ sử dụng các số thay vì các chuỗi: một đoạn mã nguồn là một số, thay vì một chuỗi các ký hiệu. Nó không thực sự quan trọng, bạn có thể thay thế bằng s t r i n g trong suốt bên dưới.Nstring

Hãy là một chức năng cặp .m,n

Hãy để chúng tôi nói rằng một ngôn ngữ lập trình được cung cấp bởi dữ liệu sau:L=(P,ev)

  1. một tập hợp có thể quyết định của "chương trình hợp lệ" vàPN
  2. một tính toánmột phần chức năng .ev:P×NN

Thực tế là có thể quyết định có nghĩa là có tổng bản đồ tính toán v a l i d : N{ 0 , 1 } sao cho v a l i d ( n ) = 1Pvalid:N{0,1} . Một cách không chính thức, chúng tôi đang nói rằng có thể cho biết một chuỗi đã cho có phải là một đoạn mã hợp lệ hay không. Hàm e v rất cần thiết cho trình thông dịch cho ngôn ngữ của chúng tôi: e v ( m , n )valid(n)=1nPevev(m,n) chạy mã trên đầu vào n - kết quả có thể không được xác định.mn

Bây giờ chúng tôi có thể giới thiệu một số thuật ngữ:

  1. Một ngôn ngữ là tổng nếu nev(m,n) là một chức năng toàn diện cho tất cả .mP
  2. Một ngôn ngữ diễn giải ngôn ngữ L 2 = ( P 2 , e v 2 ) nếu có tồn tại u P 1e v 1 ( u , n , m ) e v 2 ( n , mm N. Ở đâyL1=(P1,ev1) L2=(P2,ev2)uP1 với mọi n Pev1(u,n,m)ev2(n,m)nPmN là trình giả lập cho L 2 được thực hiện trong L 1 . Nó còn được gọi làchương trình phổ quátcho L 2 .uL2L1L2

Các định nghĩa khác về " phiên dịch L 2 " là có thể, nhưng hãy để tôi không đi sâu vào vấn đề này ngay bây giờ.L1L2

Chúng ta nói rằng L 2 là tương đương nếu chúng giải thích lẫn nhau.L1L2

Có là "mạnh nhất" ngôn ngữ của máy Turing (mà bạn gọi là "một máy Turing") trong đó n N là một mã hóa của một máy Turing và φ ( n , m ) là chức năng tính toán một phần "chạy máy Turing được mã hóa bởi n trên đầu vào m ". Ngôn ngữ này có thể can thiệp vào tất cả các ngôn ngữ khác, rõ ràng vì chúng tôi yêu cầu e v phải có thể tính toán được.T=(N,φ)nNφ(n,m)nmev

Định nghĩa của chúng tôi về ngôn ngữ lập trình là rất thoải mái. Để thực hiện những điều sau đây, chúng ta hãy yêu cầu thêm ba điều kiện:

  • thực hiện chức năng kế tiếp: có s u c c P sao cho e v ( s u c c , m ) = m + 1 với mọi m N ,LsuccPev(succ,m)=m+1mN
  • cụ chức năng chéo: có được d i một g P e v ( d i một g , m ) = m , m cho tất cả m N ,LdiagPev(diag,m)=m,mmN
  • được đóng dưới thành phần của các hàm: nếu L thực hiện f g thì nó cũng thực hiện f g ,LLfgfg

Một kết quả kinh điển là thế này:

Định lý: Nếu một ngôn ngữ có thể tự giải thích thì nó không phải là toàn bộ.

Bằng chứng. Giả sử là chương trình phổ thông với tổng langauge L thực hiện trong L , tức là, cho tất cả m Pn N , e v ( u , m , n ) e v ( m , n ) . Như kế, đường chéo, và e v ( u , - ) được thực hiện trong L , như vậy là thành phần của họ k uLLmPnN

ev(u,m,n)ev(m,n).
ev(u,)L . Có tồn tại n 0P e v ( n 0 , k ) e v ( u , k , k ) + 1 , nhưng sau đó e v ( u , n 0 , n 0) n 0 , n 0 ) e vkev(u,k,k)+1n0Pev(n0,k)ev(u,k,k)+1 Vì không có số bằng kế riêng của mình, nó sau đó L là không toàn bộ hoặc rằng L không giải thích riêng của mình. QED.
ev(u,n0,n0)ev(n0,n0)ev(u,n0,n0)+1
LL

Quan sát rằng chúng ta có thể thay thế bản đồ kế vị bằng bất kỳ bản đồ không có điểm cố định nào khác.

Đây là một định lý nhỏ mà tôi nghĩ sẽ xóa sạch một sự hiểu lầm.

Định lý: Mọi ngôn ngữ có thể được diễn giải bằng tổng ngôn ngữ khác.

LLLLevP={0,nnP}{1,0}ev

ev(b,n,m)={ev(n,m)if b=0,ev(m0,m1)if b=1 and m=m0,m1
LLLLu=1,0, since then ev(u,m,n)ev(m,n), as required. QED.

Exercise: [added 2014-06-27] The language L constructed above is not closed under composition. Fix the proof of the theorem so that L satisfies the extra requirements if L does.

In other words, you never need the full power of Turing machines to interpret a total language L – a slightly more powerful total language L suffices. The language L is strictly more powerful than L because it interprets L, but L does not interpret itself.


If I checked the wiki checkbox it was unintentional.
Andrej Bauer

2
Is there any extra power in languages where you can't tell whether or not a given program is valid?
Phylliida

3
@DaniPhye: If the language syntax is not semidecidable then you can "hide" computational power in the syntax. For instance, the language rules could require that each function be equipped with a bit which tells whether the function is total. We could then implement is_total, which is otherwise non-cmputable, but couldn't implement evaluation (because you'd have to also compute the bit of the resulting function). In general I would say it's not a programming language if you can't even implement a parser for it.
Andrej Bauer

3
How does "If a language can interpret itself then it is not total" gel with this result: A Self-Interpreter for F-omega?
Cactus


18

Any language which is not Turing complete can not write an interpreter for it self.

This statement is incorrect. Consider the programming language in which the semantics of every string is "Ignore your input and halt immediately". This programming language is not Turing complete but every program is an interpreter for the language.


Ah! That is a good point. So there has to be certain requirements on what the language computes. It seems that some minimum requirement must be made on the power of the language to make that statement true. It seems like if we demand it be able to solve basic arithmetic problems then it might hold.
Jake

@Jake You might actually be able to get away with something incredibly weak like "the language defines at least one non-constant function" or "the language defines more than one function". My counterexample is clearly trivial for any reasonable definition of "trivial".
David Richerby

Sounds like an interesting problem for me to think about. If I find anything I'll reply back.
Jake
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.