มีเกณฑ์ขั้นต่ำสำหรับภาษาการเขียนโปรแกรมที่ทัวริงสมบูรณ์หรือไม่


55

มีชุดภาษาการเขียนโปรแกรมที่สร้างขึ้นในภาษาการเขียนโปรแกรมเพื่อให้ถือว่าเป็นทัวริงสมบูรณ์หรือไม่

จากสิ่งที่ฉันสามารถบอกได้จากวิกิพีเดียภาษาต้องสนับสนุนการเรียกซ้ำหรือดูเหมือนว่าจะต้องสามารถทำงานได้โดยไม่หยุด ทั้งหมดนี้มีไว้เพื่อมันหรือไม่?


6
บางทีคำถามของคุณควรถามว่า "มีชุดการเขียนโปรแกรมที่น้อยที่สุดหรือไม่?" เพราะมันเป็นประโยคคำตอบคือ
Dave Clarke


@DaveClarke ขอบคุณฉันได้อัปเดตแล้ว ฉันพบว่าความคิดเห็นของคุณขอให้ค่อนข้างคำถามแม้ว่าฉันคิดว่ามันเป็นเพราะภาษาของฉันไม่ดี ฉันตั้งใจจะถามว่ามีการดำเนินการสองสามอย่างหรือไม่ถ้าหากภาษาสามารถคำนวณได้มันจะเทียบเท่ากับการคำนวณ
Khanzor

คำตอบ:


45

ฉันมักจะฟังก์ชั่น -recursive ที่จับมันเสมอ นี่คือสิ่งที่กำหนดทั้งชุดของฟังก์ชันที่คำนวณได้ มันเป็นชุดเล็กที่สุดของฟังก์ชั่นที่มี resp ปิดกับ:μ

  1. ฟังก์ชันคงที่0
  2. ฟังก์ชันตัวตายตัวแทน
  3. การเลือกพารามิเตอร์
  4. ฟังก์ชั่นองค์ประกอบ
  5. การเรียกซ้ำแบบดั้งเดิม
  6. -operator (มองหาที่เล็กที่สุดดังกล่าวว่า ... )xμx

ตรวจสอบลิงค์ด้านบนเพื่อดูรายละเอียด; คุณเห็นว่าเป็นภาษาโปรแกรมขนาดเล็กมาก นอกจากนี้ยังเป็นที่น่ากลัวในการเขียนโปรแกรม - ไม่มีอาหารกลางวันฟรี หากคุณทิ้งสิ่งใดสิ่งหนึ่งลงไปคุณจะสูญเสียพลังเต็มที่ดังนั้นมันจึงเป็นสัจพจน์ที่น้อยที่สุด

คุณสามารถแปลสิ่งเหล่านั้นให้เป็นองค์ประกอบทางไวยากรณ์ขั้นพื้นฐานสำหรับโปรแกรม WHILEได้

  1. ค่าคงที่ 0
  2. incrementation _ + 1
  3. การเข้าถึงตัวแปร x
  4. การต่อข้อมูลโปรแกรม / งบ _; _
  5. ลูปนับถอยหลัง for ( x to 0 ) do _ end
  6. ในขณะที่ลูป while ( x != 0 ) do _ end

1
ฉันคิดว่ามันชัดเจนว่าคุณไม่สามารถวางกฎข้อที่ 5 ในภาษานั้นได้ เนื่องจากการwhileวนซ้ำใน 6 เปรียบเทียบกับศูนย์คงที่ตัวแปรสามารถเพิ่มค่าได้ตามกฎ 2 เท่านั้นและไม่มีค่าคงที่เชิงลบที่จะเริ่มจาก (กฎ 1) ดังนั้นการwhileวนซ้ำใน 6 จึงไม่ได้ป้อน (x = 0) หรือไม่มีที่สิ้นสุด ( x> 0 และร่างกายลูปไม่สามารถลดได้)
MSalters

1
@Malters ฉันคิดว่าคุณพูดถูก สำหรับการจำลองที่ดูเหมือนว่าจะมีอยู่ในใจเราต้องการ_ - 1และฉันไม่สามารถคิดวิธีที่จะใช้สิ่งนั้นforได้ ขอบคุณสำหรับการจับ! (อะไรคือ "ดีกว่า" - รวม_ - 1หรือfor? อืม.)
Raphael

20

มีชุดของการคำนวณที่จำเป็นต้องมีในภาษาการเขียนโปรแกรมเพื่อที่จะถือว่าเป็นทัวริงที่สมบูรณ์หรือไม่

ใช่เพื่อที่จะได้รับการพิจารณาว่าทัวริงสมบูรณ์ภาษาการเขียนโปรแกรมจำเป็นต้องสามารถทำการคำนวณใด ๆ ที่สามารถทำได้โดยเครื่องทัวริง ดังนั้นตามข้อกำหนดขั้นต่ำที่อาจกล่าวได้คุณต้องสามารถใช้เครื่องทัวริงสากล - หรือล่ามสำหรับภาษาทัวริงที่สมบูรณ์อื่น ๆ - ในนั้น

จากสิ่งที่ฉันสามารถบอกได้จากวิกิพีเดียภาษาต้องสนับสนุนการเรียกซ้ำหรือดูเหมือนว่าจะต้องสามารถทำงานได้โดยไม่หยุด ทั้งหมดนี้มีไว้เพื่อมันหรือไม่?

ไม่ตัวอย่างเช่นภาษาที่มีการอนุญาตให้ดำเนินการซ้ำได้ (เช่นฟังก์ชันที่เป็นไปได้เท่านั้นที่คุณสามารถเขียนได้f(x) = f(x)คือ Turing ไม่สมบูรณ์เพราะสิ่งที่คุณสามารถเขียนได้คือโปรแกรมที่ไม่เคยสิ้นสุดดังที่ฉันได้กล่าวไว้ก่อนหน้านี้ จำเป็นต้องสามารถใช้การคำนวณใด ๆ ที่สามารถทำได้โดยเครื่องทัวริงดังนั้นชัดเจนว่าไม่เพียงพอ

ภาษาก็ไม่จำเป็นต้องสนับสนุนการเรียกซ้ำในวิธีที่คุณคิด เป็นวิธีการแสดงลูปที่ไม่ จำกัด นั่นอาจเป็นการเรียกซ้ำ แต่อาจเป็น while-loop หรือ goto ภาษาที่ไม่มีฟังก์ชั่นเลยยังสามารถทัวริงได้อย่างสมบูรณ์ และฟังก์ชั่นวนซ้ำหรือการเรียกซ้ำก็ไม่เพียงพอ คุณยังคงต้องการวิธีในการรันโค้ดที่แตกต่างกันขึ้นอยู่กับเงื่อนไขและวิธีการคำนวณค่าใหม่จากค่าเก่า (มิฉะนั้นลูป / การเรียกซ้ำทั้งหมดอาจเป็นอนันต์หรือไม่ทำงานเลย)


สำหรับว่ามีการดำเนินการที่จำเป็นและเพียงพอเล็กน้อยเช่นว่าภาษาใดก็ตามที่สนับสนุนการดำเนินการเหล่านี้คือทัวริงที่สมบูรณ์และภาษาใดก็ตามที่ไม่ได้ไม่ใช่: ไม่มีไม่มี (เว้นแต่คุณจะกำหนด "การดำเนินการ") ว่ามันจะไร้ความหมาย):

เช่นที่ฉันพูดไปแล้วมีทัวริงภาษาสมบูรณ์ที่ไม่รองรับฟังก์ชั่นซ้ำ (หรือฟังก์ชั่นใด ๆ เลย) สิ่งเหล่านั้นยังสามารถทำให้ทัวริงสมบูรณ์หากมีgotoคำสั่งหรือwhileลูป (และวิธีการจัดเก็บข้อมูลตามอำเภอใจ) แต่ภาษาที่มีฟังก์ชั่น recursive ต้องการค่าwhileมิได้gotoที่จะทัวริงสมบูรณ์ ดังนั้นgotoจะไม่อยู่ในชุดของการดำเนินงานที่จำเป็นเพียงพอ gotoแต่มีภาษาที่ไม่ทัวริงสมบูรณ์หากคุณลบ ดังนั้นจึงไม่มีชุดดังกล่าว


ส่วนเดียวที่ฉันไม่แน่ใจคือคำตอบของคุณสำหรับชุดปฏิบัติการขั้นต่ำที่จำเป็น ดูเหมือนว่าคุณจะจำกัดความหมายของการดำเนินงานของคุณให้อยู่ในโครงสร้างการควบคุมซึ่งดูเหมือนจะเป็นขอบเขตที่แคบกว่าที่ถามไว้และเกินความต้องการของคุณเองที่จะไม่นิยามพวกเขา "อย่างคลุมเครือ
Joshua Drake

@JoshuaDrake ฉันไม่แน่ใจว่าคุณหมายถึงอะไร ฉันไม่ได้ จำกัด การดำเนินการเพื่อควบคุมโครงสร้าง เป็นเพียงที่ฉันไม่ได้พูดเกี่ยวกับการดำเนินการใด ๆ ที่ไม่ได้ควบคุมโครงสร้างในตัวอย่างที่เคาน์เตอร์ของฉันเพราะพวกเขาไม่เกี่ยวข้องกับตัวอย่าง อันที่จริงฉันพูดถึง "วิธีการจัดเก็บข้อมูลจำนวนพล" - ที่แทบจะไม่โครงสร้างการควบคุม
sepp2k

คุณทำให้จุดที่บางภาษารองรับทัวริงสมบูรณ์ด้วยgotoแต่บางคนไม่ดูเหมือนอ้างว่าเพราะบางคนใช้มันและบางคนไม่ว่าgotoจะไม่สามารถเป็นส่วนหนึ่งของชุดของการดำเนินงานที่จำเป็นสำหรับทัวริงครบถ้วน ประเด็นของฉันgotoคือเพียงวิธีการสร้างประโยคโดยใช้การดำเนินการทั่วไปที่เฉพาะเจาะจงมากขึ้นเช่นการกระโดด ดังนั้นฉันเชื่อว่าถ้าคุณแยกตัวออกจากโครงสร้างควบคุมเฉพาะคุณจะเข้าใกล้ชุดปฏิบัติการที่อย่างน้อยก็จะชี้ไปที่ Turing ครบถ้วน
Joshua Drake

@JoshuaDrake ฉันไม่คิดว่าการใช้ "jump" แทน goto ทำให้เราถึงจุดที่เราสามารถกำหนดชุดปฏิบัติการที่เพียงพอและจำเป็น อาจเป็นเรื่องจริงที่ทุกภาษาจะต้องมีการทำงานแบบกระโดด (และถ้าเป็นเพียงการเรียกใช้ฟังก์ชั่น) แต่ฉันไม่คิดว่าคุณจะสามารถดำเนินการเพิ่มเติมได้เพื่อให้เพียงพอ ตัวอย่างเช่นแคลคูลัสแลมบ์ดามีสองการดำเนินงาน: แอปพลิเคชัน (เช่นการดำเนินการกระโดดของเรา) และนามธรรม (เช่นการสร้างฟังก์ชั่น) ...
sepp2k

1
@JoshuaDrake ฉันไม่คิดว่าบทความกำลังพยายามอ้างว่าภาษาทัวริงที่สมบูรณ์ใด ๆ จำเป็นต้องมีการดำเนินการเหล่านั้น โดยเฉพาะอย่างยิ่งเนื่องจากมัน จำกัด เฉพาะคำสั่งที่เป็นภาษาขั้นตอน ยกเว้นรูปแบบของ goto (เช่นแอปพลิเคชั่นฟังก์ชั่น) แลมบ์ดาแคลคูลัสไม่มีสิ่งเหล่านี้เลย ฉันคิดว่า "ขั้นต่ำ" ที่นี่เท่านั้นหมายความว่าในภาษาที่มีคุณสมบัติเหล่านั้นเท่านั้นคุณไม่สามารถลบออกได้โดยไม่สูญเสียความสมบูรณ์ของทัวริง ไม่ใช่ว่าจะไม่มีชุดการทำงานขั้นต่ำอื่น ๆ ที่เพียงพอสำหรับความสมบูรณ์ของทัวริง
sepp2k

14

มีคำแนะนำเดียวต่าง ๆ ที่นำไปสู่การทัวริงภาษาที่สมบูรณ์ ตัวอย่างทั่วไปคือ "ลบและสาขาถ้าเป็นศูนย์" สิ่งเหล่านี้เป็นที่รู้จักกันดีในบริบทของการเขียนโปรแกรมภาษาแอสเซมบลี ดูบทความ Wikipediaสำหรับรายละเอียด

สิ่งนี้นำไปสู่การศึกษาลักษณะเฉพาะ: ภาษากำลังทำให้ทัวริงสมบูรณ์หากว่าสามารถจำลองการทำงานของการดึงและจัดเก็บจำนวนเต็มในหน่วยความจำและทำการปฏิบัติการ "ลบและแยกหากศูนย์" ในนั้น


13

นี่ไม่ใช่คำตอบทั่วไปสำหรับคำถามของคุณ แต่ตามทฤษฎีบทการเขียนโปรแกรมที่มีโครงสร้างสิ่งที่จำเป็นคือความสามารถในการเลือก (เช่นifใน C / C ++) และการทำซ้ำ (เช่นwhileใน C / C ++) แก้ไข: ตามที่เดฟคลาร์กชี้ให้เห็นในความคิดเห็นทฤษฎีบทการเขียนโปรแกรมที่มีโครงสร้างยังต้องมีลำดับ ฉันไม่ได้เขียนสิ่งนี้ตั้งแต่แรกเพราะฉันอนุญาตให้ผู้อ่านเข้าใจว่าบล็อกพื้นฐานของคำแนะนำอื่น ๆ เช่นที่กล่าวถึงในภายหลังสำหรับการอ่านจากและการเขียนไปยังที่เก็บหน่วยความจำ ฯลฯ ก็จำเป็นเช่นกัน) แน่นอนว่ามันชัดเจนกว่า คุณต้องสามารถทำสิ่งเหล่านี้ได้เช่นกัน

เนื่องจากทั้งสองสิ่งนี้สามารถใช้งานได้โดยใช้คำสั่งการกระโดดตามเงื่อนไข (เช่นJNZใน x86) นั่นก็เพียงพอแล้วสำหรับการเทียบเท่าทัวริง

โปรดทราบว่าจำเป็นต้องมีสิ่งอื่น ๆ เช่นความสามารถในการเขียนสัญลักษณ์ที่ไม่ จำกัด จำนวน (เช่นบิต ... 0 หรือ 1) ไปยังหน่วยความจำภายนอกบางประเภท ในความหมายนั้นคอมพิวเตอร์จริงไม่เทียบเท่าทัวริงเนื่องจากไม่มีคอมพิวเตอร์เครื่องใดมีพื้นที่เก็บข้อมูลไม่ จำกัด ทัวริงโมเดลยังคงมีประโยชน์ แต่เนื่องจากจำนวนหน่วยความจำมีขนาดใหญ่และถึงแม้ว่าปัญหาใด ๆ ที่คอมพิวเตอร์จริงสามารถแก้ไขได้สามารถแก้ไขได้ด้วยการ จำกัด ขอบเขตของออโตเมตอัตโนมัติการใช้รูปแบบการคำนวณนั้นไม่มีประโยชน์อย่างยิ่ง จำนวนของรัฐจะใหญ่ผิดปกติ)

โปรดทราบว่านี่ไม่จำเป็นต้องขัดแย้งกับคำตอบของ sepp2k นี่เป็นวิธีที่แตกต่างในการคิดคำถามเดียวกัน

แก้ไข:

โปรดทราบว่าคุณไม่จำเป็นต้องใช้ทั้งสองifและwhileใน C / C ++ คุณสามารถจำลองการifใช้whileดังนี้:

bool C;
// some code that sets C
if(C) { /* some other code /* }
// rest of the program

รหัสต่อไปนี้เทียบเท่าเสมอ:

bool C;
// some code that sets C
bool C2 = C;
while(C2) { /* some other code /* C2 = false; }
// rest of the program

... การก่อสร้างควรจะเป็นไปได้และเป็นไปได้ถ้าคุณระวังนั่นก็คือ โปรดทราบว่าหากคุณมีฟังก์ชั่นวนซ้ำในที่สุดคุณก็ต้องเลือกเช่นกัน เนื่องจากฟังก์ชั่นเวียนเกิดโดยไม่มีการเลือกไม่สามารถใช้เคสพื้นฐานได้ดังนั้นฟังก์ชันเรียกซ้ำใด ๆ จะส่งผลให้เกิดการเรียกซ้ำแบบไม่สิ้นสุด

แก้ไข:

นอกจากนี้เกี่ยวกับคำถามของคุณว่าความสามารถในการเขียนโปรแกรมที่ไม่ได้หยุดนั้นก็เพียงพอแล้วสำหรับทัวริงเทียบเท่าคำตอบคือไม่; มีความจำเป็น แต่ไม่เพียงพอ เราสามารถแก้ปัญหาการหยุดชะงักสำหรับโปรแกรมที่เขียนด้วยภาษาซึ่งไม่สามารถแสดงโปรแกรมที่ไม่สามารถหยุดได้ คำตอบคือ "โปรแกรมจะหยุด" สำหรับทุกกรณี อย่างไรก็ตามเราสามารถกำหนดภาษาที่คำสั่งเดียวทำให้เครื่องเข้าสู่ลูปไม่สิ้นสุด ... ภาษาดังกล่าวไม่เทียบเท่ากับทัวริง


13

combinatorsและโดยที่และเพียงพอที่จะแสดงคำแลมบ์ดาใด ๆ (ปิด) ดังนั้นฟังก์ชันใด ๆ ที่คำนวณได้ ดูหน้าวิกิพีเดียนี้เพื่อดูรายละเอียดK ( S x y z ) = ( x z ( y z ) ) ( K x y ) = xSK(S x y z)=(x z (y z))(K x y)=x

ในความเป็นจริงแลมบ์ดาคำเป็นพื้นฐานที่เพียงพอที่จะแสดงคำแลมบ์ดาทั้งหมด ดูในภายหลังเดียวกันหน้าวิกิพีเดียX=λx.((x S) K)


5

โครงสร้างภาษาสามารถใช้แทนกันได้

ไม่มีเกณฑ์ที่กำหนดขั้นต่ำเกี่ยวกับสิ่งที่สร้างจะต้องเป็นโดยกำเนิดจะให้บริการโดยการเขียนโปรแกรมภาษา หากมีการสร้างสิ่งแปลก ๆ บางอย่างที่สามารถโน้มน้าวให้แสดงระบบทัวริงที่สมบูรณ์แล้วก็เห็นได้ชัดว่าการสร้างเหล่านั้นเป็น "เพียงเหมาะสม" กับคนอื่น ๆ

เพื่อพิสูจน์สิ่งนี้ - ภาษาที่ให้เฉพาะการดำเนินการ "ลบและสาขาหากศูนย์" กำลังทำให้ทัวริงสมบูรณ์ มีทัวริงภาษาสมบูรณ์ที่ไม่ได้ให้ "substract และสาขาที่แยกต่างหากถ้าสร้าง" ศูนย์ดังนั้นยังไม่มีการสร้างหรือชุดของการสร้างที่จำเป็น

ผลกระทบของการสร้างภาษาที่สมบูรณ์ TP ใด ๆ สามารถจำลองได้โดยการสร้างภาษา TP อื่นใดที่สมบูรณ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.