มีชุดภาษาการเขียนโปรแกรมที่สร้างขึ้นในภาษาการเขียนโปรแกรมเพื่อให้ถือว่าเป็นทัวริงสมบูรณ์หรือไม่
จากสิ่งที่ฉันสามารถบอกได้จากวิกิพีเดียภาษาต้องสนับสนุนการเรียกซ้ำหรือดูเหมือนว่าจะต้องสามารถทำงานได้โดยไม่หยุด ทั้งหมดนี้มีไว้เพื่อมันหรือไม่?
มีชุดภาษาการเขียนโปรแกรมที่สร้างขึ้นในภาษาการเขียนโปรแกรมเพื่อให้ถือว่าเป็นทัวริงสมบูรณ์หรือไม่
จากสิ่งที่ฉันสามารถบอกได้จากวิกิพีเดียภาษาต้องสนับสนุนการเรียกซ้ำหรือดูเหมือนว่าจะต้องสามารถทำงานได้โดยไม่หยุด ทั้งหมดนี้มีไว้เพื่อมันหรือไม่?
คำตอบ:
ฉันมักจะฟังก์ชั่น -recursive ที่จับมันเสมอ นี่คือสิ่งที่กำหนดทั้งชุดของฟังก์ชันที่คำนวณได้ มันเป็นชุดเล็กที่สุดของฟังก์ชั่นที่มี resp ปิดกับ:
ตรวจสอบลิงค์ด้านบนเพื่อดูรายละเอียด; คุณเห็นว่าเป็นภาษาโปรแกรมขนาดเล็กมาก นอกจากนี้ยังเป็นที่น่ากลัวในการเขียนโปรแกรม - ไม่มีอาหารกลางวันฟรี หากคุณทิ้งสิ่งใดสิ่งหนึ่งลงไปคุณจะสูญเสียพลังเต็มที่ดังนั้นมันจึงเป็นสัจพจน์ที่น้อยที่สุด
คุณสามารถแปลสิ่งเหล่านั้นให้เป็นองค์ประกอบทางไวยากรณ์ขั้นพื้นฐานสำหรับโปรแกรม WHILEได้
0
_ + 1
x
_; _
for ( x to 0 ) do _ end
while ( x != 0 ) do _ end
while
วนซ้ำใน 6 เปรียบเทียบกับศูนย์คงที่ตัวแปรสามารถเพิ่มค่าได้ตามกฎ 2 เท่านั้นและไม่มีค่าคงที่เชิงลบที่จะเริ่มจาก (กฎ 1) ดังนั้นการwhile
วนซ้ำใน 6 จึงไม่ได้ป้อน (x = 0) หรือไม่มีที่สิ้นสุด ( x> 0 และร่างกายลูปไม่สามารถลดได้)
_ - 1
และฉันไม่สามารถคิดวิธีที่จะใช้สิ่งนั้นfor
ได้ ขอบคุณสำหรับการจับ! (อะไรคือ "ดีกว่า" - รวม_ - 1
หรือfor
? อืม.)
มีชุดของการคำนวณที่จำเป็นต้องมีในภาษาการเขียนโปรแกรมเพื่อที่จะถือว่าเป็นทัวริงที่สมบูรณ์หรือไม่
ใช่เพื่อที่จะได้รับการพิจารณาว่าทัวริงสมบูรณ์ภาษาการเขียนโปรแกรมจำเป็นต้องสามารถทำการคำนวณใด ๆ ที่สามารถทำได้โดยเครื่องทัวริง ดังนั้นตามข้อกำหนดขั้นต่ำที่อาจกล่าวได้คุณต้องสามารถใช้เครื่องทัวริงสากล - หรือล่ามสำหรับภาษาทัวริงที่สมบูรณ์อื่น ๆ - ในนั้น
จากสิ่งที่ฉันสามารถบอกได้จากวิกิพีเดียภาษาต้องสนับสนุนการเรียกซ้ำหรือดูเหมือนว่าจะต้องสามารถทำงานได้โดยไม่หยุด ทั้งหมดนี้มีไว้เพื่อมันหรือไม่?
ไม่ตัวอย่างเช่นภาษาที่มีการอนุญาตให้ดำเนินการซ้ำได้ (เช่นฟังก์ชันที่เป็นไปได้เท่านั้นที่คุณสามารถเขียนได้f(x) = f(x)
คือ Turing ไม่สมบูรณ์เพราะสิ่งที่คุณสามารถเขียนได้คือโปรแกรมที่ไม่เคยสิ้นสุดดังที่ฉันได้กล่าวไว้ก่อนหน้านี้ จำเป็นต้องสามารถใช้การคำนวณใด ๆ ที่สามารถทำได้โดยเครื่องทัวริงดังนั้นชัดเจนว่าไม่เพียงพอ
ภาษาก็ไม่จำเป็นต้องสนับสนุนการเรียกซ้ำในวิธีที่คุณคิด เป็นวิธีการแสดงลูปที่ไม่ จำกัด นั่นอาจเป็นการเรียกซ้ำ แต่อาจเป็น while-loop หรือ goto ภาษาที่ไม่มีฟังก์ชั่นเลยยังสามารถทัวริงได้อย่างสมบูรณ์ และฟังก์ชั่นวนซ้ำหรือการเรียกซ้ำก็ไม่เพียงพอ คุณยังคงต้องการวิธีในการรันโค้ดที่แตกต่างกันขึ้นอยู่กับเงื่อนไขและวิธีการคำนวณค่าใหม่จากค่าเก่า (มิฉะนั้นลูป / การเรียกซ้ำทั้งหมดอาจเป็นอนันต์หรือไม่ทำงานเลย)
สำหรับว่ามีการดำเนินการที่จำเป็นและเพียงพอเล็กน้อยเช่นว่าภาษาใดก็ตามที่สนับสนุนการดำเนินการเหล่านี้คือทัวริงที่สมบูรณ์และภาษาใดก็ตามที่ไม่ได้ไม่ใช่: ไม่มีไม่มี (เว้นแต่คุณจะกำหนด "การดำเนินการ") ว่ามันจะไร้ความหมาย):
เช่นที่ฉันพูดไปแล้วมีทัวริงภาษาสมบูรณ์ที่ไม่รองรับฟังก์ชั่นซ้ำ (หรือฟังก์ชั่นใด ๆ เลย) สิ่งเหล่านั้นยังสามารถทำให้ทัวริงสมบูรณ์หากมีgoto
คำสั่งหรือwhile
ลูป (และวิธีการจัดเก็บข้อมูลตามอำเภอใจ) แต่ภาษาที่มีฟังก์ชั่น recursive ต้องการค่าwhile
มิได้goto
ที่จะทัวริงสมบูรณ์ ดังนั้นgoto
จะไม่อยู่ในชุดของการดำเนินงานที่จำเป็นเพียงพอ goto
แต่มีภาษาที่ไม่ทัวริงสมบูรณ์หากคุณลบ ดังนั้นจึงไม่มีชุดดังกล่าว
goto
แต่บางคนไม่ดูเหมือนอ้างว่าเพราะบางคนใช้มันและบางคนไม่ว่าgoto
จะไม่สามารถเป็นส่วนหนึ่งของชุดของการดำเนินงานที่จำเป็นสำหรับทัวริงครบถ้วน ประเด็นของฉันgoto
คือเพียงวิธีการสร้างประโยคโดยใช้การดำเนินการทั่วไปที่เฉพาะเจาะจงมากขึ้นเช่นการกระโดด ดังนั้นฉันเชื่อว่าถ้าคุณแยกตัวออกจากโครงสร้างควบคุมเฉพาะคุณจะเข้าใกล้ชุดปฏิบัติการที่อย่างน้อยก็จะชี้ไปที่ Turing ครบถ้วน
มีคำแนะนำเดียวต่าง ๆ ที่นำไปสู่การทัวริงภาษาที่สมบูรณ์ ตัวอย่างทั่วไปคือ "ลบและสาขาถ้าเป็นศูนย์" สิ่งเหล่านี้เป็นที่รู้จักกันดีในบริบทของการเขียนโปรแกรมภาษาแอสเซมบลี ดูบทความ Wikipediaสำหรับรายละเอียด
สิ่งนี้นำไปสู่การศึกษาลักษณะเฉพาะ: ภาษากำลังทำให้ทัวริงสมบูรณ์หากว่าสามารถจำลองการทำงานของการดึงและจัดเก็บจำนวนเต็มในหน่วยความจำและทำการปฏิบัติการ "ลบและแยกหากศูนย์" ในนั้น
นี่ไม่ใช่คำตอบทั่วไปสำหรับคำถามของคุณ แต่ตามทฤษฎีบทการเขียนโปรแกรมที่มีโครงสร้างสิ่งที่จำเป็นคือความสามารถในการเลือก (เช่น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
... การก่อสร้างควรจะเป็นไปได้และเป็นไปได้ถ้าคุณระวังนั่นก็คือ โปรดทราบว่าหากคุณมีฟังก์ชั่นวนซ้ำในที่สุดคุณก็ต้องเลือกเช่นกัน เนื่องจากฟังก์ชั่นเวียนเกิดโดยไม่มีการเลือกไม่สามารถใช้เคสพื้นฐานได้ดังนั้นฟังก์ชันเรียกซ้ำใด ๆ จะส่งผลให้เกิดการเรียกซ้ำแบบไม่สิ้นสุด
แก้ไข:
นอกจากนี้เกี่ยวกับคำถามของคุณว่าความสามารถในการเขียนโปรแกรมที่ไม่ได้หยุดนั้นก็เพียงพอแล้วสำหรับทัวริงเทียบเท่าคำตอบคือไม่; มีความจำเป็น แต่ไม่เพียงพอ เราสามารถแก้ปัญหาการหยุดชะงักสำหรับโปรแกรมที่เขียนด้วยภาษาซึ่งไม่สามารถแสดงโปรแกรมที่ไม่สามารถหยุดได้ คำตอบคือ "โปรแกรมจะหยุด" สำหรับทุกกรณี อย่างไรก็ตามเราสามารถกำหนดภาษาที่คำสั่งเดียวทำให้เครื่องเข้าสู่ลูปไม่สิ้นสุด ... ภาษาดังกล่าวไม่เทียบเท่ากับทัวริง
combinatorsและโดยที่และเพียงพอที่จะแสดงคำแลมบ์ดาใด ๆ (ปิด) ดังนั้นฟังก์ชันใด ๆ ที่คำนวณได้ ดูหน้าวิกิพีเดียนี้เพื่อดูรายละเอียดK ( S x y z ) = ( x z ( y z ) ) ( K x y ) = x
ในความเป็นจริงแลมบ์ดาคำเป็นพื้นฐานที่เพียงพอที่จะแสดงคำแลมบ์ดาทั้งหมด ดูในภายหลังเดียวกันหน้าวิกิพีเดีย
ไม่มีเกณฑ์ที่กำหนดขั้นต่ำเกี่ยวกับสิ่งที่สร้างจะต้องเป็นโดยกำเนิดจะให้บริการโดยการเขียนโปรแกรมภาษา หากมีการสร้างสิ่งแปลก ๆ บางอย่างที่สามารถโน้มน้าวให้แสดงระบบทัวริงที่สมบูรณ์แล้วก็เห็นได้ชัดว่าการสร้างเหล่านั้นเป็น "เพียงเหมาะสม" กับคนอื่น ๆ
เพื่อพิสูจน์สิ่งนี้ - ภาษาที่ให้เฉพาะการดำเนินการ "ลบและสาขาหากศูนย์" กำลังทำให้ทัวริงสมบูรณ์ มีทัวริงภาษาสมบูรณ์ที่ไม่ได้ให้ "substract และสาขาที่แยกต่างหากถ้าสร้าง" ศูนย์ดังนั้นยังไม่มีการสร้างหรือชุดของการสร้างที่จำเป็น
ผลกระทบของการสร้างภาษาที่สมบูรณ์ TP ใด ๆ สามารถจำลองได้โดยการสร้างภาษา TP อื่นใดที่สมบูรณ์