นี่เป็นคำถามที่พูดไม่ดีดังนั้นมาทำความเข้าใจก่อนกัน ฉันจะทำมันในรูปแบบของทฤษฎีการคำนวณ ดังนั้นฉันจะใช้ตัวเลขแทนสตริง: ชิ้นส่วนของซอร์สโค้ดคือตัวเลขแทนที่จะเป็นสตริงของสัญลักษณ์ มันไม่สำคัญหรอกคุณอาจแทนที่ด้วยs t r i n gด้านล่างNstring
ให้จะเป็นฟังก์ชั่นการจับคู่⟨m,n⟩
ให้เราบอกว่าภาษาการเขียนโปรแกรมได้รับจากข้อมูลต่อไปนี้:L=(P,ev)
- decidableชุดของ "โปรแกรมที่ถูกต้อง" และP⊆N
- คำนวณและบางส่วนฟังก์ชั่น Nev:P×N→N
ความจริงที่ว่าสามารถถอดรหัสได้หมายความว่ามีแผนที่ที่คำนวณได้ทั้งหมดv a l i d : N → { 0 , 1 }เช่นนั้นv a l i d ( n ) = 1Pvalid:N→{0,1} P อย่างไม่เป็นทางการเรากำลังบอกว่าเป็นไปได้ที่จะบอกได้ว่าสตริงที่กำหนดเป็นโค้ดที่ถูกต้องหรือไม่ ฟังก์ชั่น e vเป็นสิ่งจำเป็นสำหรับนักแปลสำหรับภาษาของเรา: e v ( m , n ) ใช้งานโค้ด mในอินพุต n - ผลลัพธ์อาจไม่ได้กำหนดvalid(n)=1⟺n∈Pevev(m,n)mn
ตอนนี้เราสามารถแนะนำคำศัพท์บางคำ:
- ภาษาคือผลรวมถ้าเป็นฟังก์ชั่นรวมสำหรับm ∈ Pทั้งหมดn↦ev(m,n)m∈P
- ภาษาตีความภาษาL 2 = ( P 2 , e v 2 )หากมีu ∈ P 1เช่นนั้นe v 1 ( u , ⟨ n , m ⟩ ) ≃ e v 2 ( n , m )สำหรับทุกคนn ∈ PL1=(P1,ev1) L2=(P2,ev2)u∈P1ev1(u,⟨n,m⟩)≃ev2(n,m)n∈Pและ N นี่มึงเป็นแบบจำลองสำหรับL 2ดำเนินการในL 1 นอกจากนี้ยังเป็นที่รู้จักกันเป็นโปรแกรมสากลสำหรับL 2m∈NuL2L1L2
คำจำกัดความอื่น ๆ ของ " interprets L 2 " นั้นเป็นไปได้ แต่ขออย่าให้ฉันเข้าใจL1L2
เราบอกว่าและL 2เทียบเท่ากันหากพวกเขาตีความซึ่งกันและกันL1L2
มี "ภาษาที่มีประสิทธิภาพมากที่สุด" ของทัวริงเครื่องจักร (ซึ่งคุณเรียกว่า "เครื่องทัวริง") ซึ่งn ∈ Nเป็นการเข้ารหัสของเครื่องทัวริงและφ ( n , m )คือ ฟังก์ชันที่คำนวณได้บางส่วนที่ "รันเครื่องทัวริงเข้ารหัสโดยnบนอินพุตm " ภาษานี้สามารถขัดจังหวะภาษาอื่น ๆ ทั้งหมดเนื่องจากเราต้องการให้e vคำนวณได้T=(N,φ)n∈Nφ(n,m)nmev
คำจำกัดความของภาษาการเขียนโปรแกรมของเรานั้นผ่อนคลายมาก เพื่อให้สิ่งต่อไปนี้ผ่านไปให้เราต้องการอีกสามเงื่อนไข:
- L implements the successor function: there is succ∈P such that ev(succ,m)=m+1 for all m∈N,
- L implements the diagonal function: there is diag∈P such that ev(diag,m)=⟨m,m⟩ for all m∈N,
- L is closed under composition of functions: if L implements f and g then it also implements f∘g,
A classic result is this:
Theorem: If a language can interpret itself then it is not total.
Proof. Suppose u is the universal program for a total langauge L implemented in L, i.e., for all m∈P and n∈N,
ev(u,⟨m,n⟩)≃ev(m,n).
As successor, diagonal, and
ev(u,−) are implemented in
L, so is their composition
k↦ev(u,⟨k,k⟩)+1. There exists
n0∈P such that
ev(n0,k)≃ev(u,⟨k,k⟩)+1, but then
ev(u,⟨n0,n0⟩)≃ev(n0,n0)≃ev(u,⟨n0,n0⟩)+1
As there is no number equal its own successor, it follows that
L is not total or that
L does not interpret itself. QED.
Observe that we could replace the successor map with any other fixpoint-free map.
Here is a little theorem which I think will clean up a misunderstanding.
Theorem: Every total language can be interpreted by another total language.
Proof. Let L be a total language. We get a total L′ which interprets L by adjoining to L its evaluator ev. More precisely, let P′={⟨0,n⟩∣n∈P}∪{⟨1,0⟩} and define ev′ as
ev′(⟨b,n⟩,m)={ev(n,m)ev(m0,m1)if b=0,if b=1 and m=⟨m0,m1⟩
Obviously,
L′ is total because
L is total. To see that
L′ can simulate
L just take
u=⟨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.