คุณสมบัติ / โครงสร้างภาษาขั้นต่ำที่ทำให้ทัวริงสมบูรณ์คืออะไร
คุณสมบัติ / โครงสร้างภาษาขั้นต่ำที่ทำให้ทัวริงสมบูรณ์คืออะไร
คำตอบ:
tarpit ทัวริงเป็นชนิดของการเขียนโปรแกรมภาษาลึกลับซึ่งมุ่งมั่นที่จะเป็นทัวริงสมบูรณ์ในขณะที่ใช้องค์ประกอบไม่กี่เท่าที่เป็นไปได้ Brainfuckอาจเป็นผ้าใบกันน้ำที่รู้จักกันดีที่สุด แต่ก็มีมากมาย
เล็กน้อยและJotภาษาการทำงานที่มีสองและสามสัญลักษณ์ตามลำดับขึ้นอยู่กับเอสเค (I) Combinator แคลคูลัส
OISC ( หนึ่งชุดคำสั่งคอมพิวเตอร์ ) หมายถึงประเภทของการคำนวณเชิงบังคับที่ต้องการเพียงหนึ่งคำสั่งของอาร์กิวเมนต์หนึ่งตัวหรือมากกว่าโดยปกติแล้ว“ ลบและสาขาถ้าน้อยกว่าหรือเท่ากับศูนย์” หรือ“ ลบลบและข้ามถ้ายืม” x86 MMUใช้คำสั่งเดิมและทำให้ทัวริงสมบูรณ์
โดยทั่วไปสำหรับภาษาที่จำเป็นที่จะต้องทำให้ทัวริงสมบูรณ์มันต้องการ:
รูปแบบของการทำซ้ำตามเงื่อนไขหรือการกระโดดตามเงื่อนไข (เช่นwhile
, if
+ goto
)
วิธีการอ่านและเขียนที่เก็บข้อมูลบางรูปแบบ (เช่นตัวแปรเทป)
สำหรับแลมบ์ดาแคลคูลัส - ซึ่งเป็นภาษาที่ใช้งานได้สำหรับ TC มันต้องการ:
ความสามารถในการสรุปฟังก์ชั่นนามธรรมเหนือข้อโต้แย้ง (เช่น lambda abstraction, quote)
ความสามารถในการใช้ฟังก์ชั่นกับข้อโต้แย้ง (เช่นการลด)
แน่นอนว่ามีวิธีอื่นในการดูการคำนวณ แต่นี่เป็นโมเดลทั่วไปสำหรับทัวริง โปรดทราบว่าคอมพิวเตอร์จริงไม่ใช่ เครื่องทัวริงสากลเนื่องจากไม่มีที่เก็บข้อมูลที่ไม่ได้ จำกัด พูดอย่างเคร่งครัดพวกเขาคือ“ เครื่องเก็บข้อมูลที่มีขอบเขต” หากคุณต้องการเพิ่มหน่วยความจำให้กับพวกเขาพวกเขาจะเข้าหาเครื่องทัวริงที่ไม่มีอำนาจ อย่างไรก็ตามเครื่องเก็บข้อมูลที่มีขอบเขตและเครื่องสถานะ จำกัดมีประโยชน์สำหรับการคำนวณ พวกเขาเป็นเพียงไม่สากล
พูดอย่างเคร่งครัดไม่จำเป็นต้องใช้ I / O สำหรับทัวริง - สมบูรณ์; TC เพียง แต่อ้างว่าภาษาสามารถคำนวณฟังก์ชันที่คุณต้องการไม่ใช่ว่าสามารถแสดงผลลัพธ์ได้ ในทางปฏิบัติทุกภาษาที่มีประโยชน์มีวิธีการโต้ตอบกับโลกอย่างใด
จากมุมมองเชิงปฏิบัติที่มากขึ้น: หากคุณสามารถแปลโปรแกรมทั้งหมดด้วยภาษาทัวริงที่สมบูรณ์เป็นภาษาของคุณจากนั้น (เท่าที่ฉันรู้) ภาษาของคุณต้องทัวริงสมบูรณ์ ดังนั้นหากคุณต้องการตรวจสอบว่าภาษาที่คุณออกแบบนั้นสมบูรณ์แบบทัวริงหรือไม่คุณสามารถเขียน Brainf *** ไปยัง YourLanguage คอมไพเลอร์และพิสูจน์ / แสดงให้เห็นว่าสามารถรวบรวมโปรแกรม BF ทางกฎหมายทั้งหมดได้
ในการชี้แจงฉันหมายถึงว่านอกเหนือจากล่ามสำหรับ YourLanguage แล้วคุณยังเขียนคอมไพเลอร์ (ในภาษาใดก็ได้) ที่สามารถคอมไพล์โปรแกรม BF ใด ๆ ไปยัง YourLanguage (แน่นอนว่ามีความหมายเหมือนกัน)
</sarcasm>
ระบบสามารถพิจารณาได้ว่าทัวริงสมบูรณ์หากสามารถทำสิ่งใด ๆ ที่เครื่องทัวริงสากลสามารถทำได้ เนื่องจากเครื่องทัวริงสากลได้รับการกล่าวถึงว่าสามารถแก้ไขฟังก์ชั่นการคำนวณใด ๆ ที่กำหนดเวลาทัวริงระบบที่สมบูรณ์สามารถทำได้โดยการขยายเช่นกัน
เพื่อตรวจสอบว่ามีบางสิ่งที่ทัวริงสมบูรณ์ดูว่าคุณสามารถใช้เครื่องทัวริงภายใน ในคำอื่น ๆ ตรวจสอบเพื่อดูว่ามันสามารถจำลองต่อไปนี้:
สิ่งเหล่านี้เป็นข้อกำหนดขั้นต่ำที่แท้จริงสำหรับระบบที่จะพิจารณาว่าทัวริงสมบูรณ์ ไม่มีอะไรเพิ่มเติมไม่น้อยไปกว่านี้ ถ้ามันไม่สามารถจำลองสิ่งเหล่านี้ในแบบบางอย่างมันก็ไม่สมบูรณ์แบบ วิธีการที่คนอื่นเสนอนั้นหมายถึงจุดจบเท่านั้นเนื่องจากมีระบบที่สมบูรณ์แบบของทัวริงหลายระบบที่ไม่มีคุณสมบัติเหล่านั้น
โปรดทราบว่าไม่มีวิธีที่รู้จักกันในการสร้างระบบทัวริงที่แท้จริงอย่างแท้จริง นี่เป็นเพราะไม่มีวิธีรู้ที่จะจำลองความไร้ขีด จำกัด ของเทปของทัวริงภายในพื้นที่ทางกายภาพ
ภาษาการเขียนโปรแกรมนั้นสมบูรณ์หากคุณสามารถทำการคำนวณใด ๆ ได้ มีคุณสมบัติไม่เพียงชุดเดียวที่ทำให้ภาษาทัวริงสมบูรณ์ดังนั้นคำตอบที่บอกว่าคุณต้องการลูปหรือต้องการตัวแปรไม่ถูกต้องเนื่องจากมีภาษาที่ไม่มีแต่กำลังทำให้สมบูรณ์
Alan Turing สร้างเครื่องจักรทัวริงสากลและหากคุณสามารถแปลโปรแกรมใด ๆ ที่ออกแบบมาเพื่อทำงานกับเครื่องจักรสากลเพื่อให้ทำงานกับภาษาของคุณ สิ่งนี้ยังใช้งานทางอ้อมด้วยดังนั้นคุณสามารถพูดได้ว่าภาษา X กำลังทำให้สมบูรณ์หากโปรแกรมทั้งหมดสำหรับการแปลภาษา Y สมบูรณ์สามารถแปลสำหรับ X ได้เนื่องจากโปรแกรมทัวริงเครื่องสากลทั้งหมดสามารถแปลเป็นโปรแกรม Y ได้
ความซับซ้อนของเวลาความซับซ้อนของพื้นที่รูปแบบอินพุต / เอาต์พุตและการเขียนโปรแกรมใด ๆ ไม่รวมอยู่ในสมการดังนั้นเครื่องจักรดังกล่าวสามารถทำการคำนวณทางทฤษฎีได้ทั้งหมดหากการคำนวณไม่หยุดชะงักเนื่องจากการสูญเสียพลังงานหรือโลกถูกกลืนหายไปจากดวงอาทิตย์
โดยปกติแล้วเพื่อพิสูจน์ความสมบูรณ์ของทัวริงพวกเขาสร้างล่ามสำหรับการพิสูจน์ว่าเป็นภาษาที่สมบูรณ์ แต่สำหรับการทำงานคุณต้องใช้วิธีการอินพุตและเอาท์พุตสองสิ่งที่ไม่จำเป็นสำหรับการทำให้ภาษาสมบูรณ์ ก็เพียงพอแล้วที่โปรแกรมของคุณจะสามารถเปลี่ยนเป็นสถานะเมื่อเริ่มต้นและคุณสามารถตรวจสอบหน่วยความจำได้หลังจากที่โปรแกรมหยุดทำงาน
ในการสร้างภาษาที่ประสบความสำเร็จนั้นต้องการมากกว่าความสมบูรณ์แบบและนี่เป็นความจริงแม้แต่ turing ฉันไม่คิดว่าbrainfuckจะได้รับความนิยมโดยไม่ต้องและ,
.
คุณไม่สามารถบอกได้ว่ามันจะวนซ้ำไม่สิ้นสุดหรือหยุด
คำอธิบาย: เนื่องจากอินพุตบางตัวเป็นไปไม่ได้ที่จะบอกได้ในทุกกรณี (ใช้เครื่องทัวริงเครื่องอื่น) ถ้าสิ่งนั้นวนซ้ำไม่สิ้นสุดหรือในที่สุดจะหยุดยกเว้นเรียกใช้ (ซึ่งให้คำตอบถ้าหยุดไม่ได้ แต่ไม่ใช่ ถ้าลูป!)
ซึ่งหมายความว่าคุณจะต้องสามารถจัดเก็บข้อมูลจำนวนไม่ จำกัด ไม่ว่าในทางใดทางหนึ่ง - จะต้องมีเทปเทียบเท่ากับอนันต์ไม่ว่าจะซับซ้อนเพียงใด! (มิฉะนั้นจะมีจำนวนสถานะที่ จำกัด เท่านั้นจากนั้นคุณสามารถตรวจสอบว่าคุณเคยผ่านสถานะนั้นมาก่อนและหยุดในที่สุด) โดยทั่วไปเครื่องทัวริงสามารถขยายหรือหดขนาดของรัฐด้วยวิธีการที่ควบคุมได้
เนื่องจากเครื่องทัวริงดั้งเดิมของทัวริงมีปัญหาในการหยุดการผลิตที่ไม่สามารถแก้ไขได้เครื่องทัวริงที่สมบูรณ์ของคุณเองก็ต้องมีปัญหาการหยุดพักชั่วคราวเช่นเดียวกัน
การทำระบบทัวริงสมบูรณ์สามารถเลียนแบบระบบทัวริงอื่น ๆ ได้ดังนั้นหากคุณสามารถสร้างโปรแกรมจำลองสำหรับระบบทัวริงสมบูรณ์แบบที่รู้จักกันดีในระบบของคุณซึ่งเป็นการพิสูจน์ว่าระบบของคุณนั้น
ตัวอย่างเช่นสมมติว่าคุณต้องการพิสูจน์ว่า Snakes & Ladders เสร็จสมบูรณ์แล้วเนื่องจากบอร์ดมีรูปแบบกริดที่ซ้ำกันอย่างไม่มีที่สิ้นสุด (มีเวอร์ชันอื่นอยู่ด้านบนและด้านซ้าย) ทราบว่าเครื่องจักร Minsky 2 ตัวนับเป็นทัวริงสมบูรณ์ (ซึ่งมี 2 ตัวนับไม่ จำกัด และ 1 สถานะจากจำนวน จำกัด ) คุณสามารถสร้างบอร์ดที่เทียบเท่าได้โดยที่ตำแหน่ง X และ Y ในตารางเป็นค่าปัจจุบันของ 2 ตัวนับ และเส้นทางปัจจุบันคือสถานะปัจจุบัน ปัง คุณเพิ่งพิสูจน์ว่างูและบันไดกำลังทัวริงเสร็จสมบูรณ์
เงื่อนไขที่จำเป็นอย่างหนึ่งคือการวนซ้ำที่มีจำนวนการวนซ้ำสูงสุดที่ไม่ได้กำหนดล่วงหน้าก่อนการทำซ้ำหรือการเรียกซ้ำที่ความลึกการเรียกซ้ำสูงสุดไม่ได้ถูกกำหนดล่วงหน้า ตัวอย่างเช่นสำหรับ ... ใน ... ลูปในขณะที่คุณพบพวกเขาในภาษาที่ใหม่กว่าจำนวนมากไม่เพียงพอที่จะทำให้ภาษาทัวริงสมบูรณ์ (แต่พวกเขาจะมีวิธีอื่น) โปรดทราบว่านี่ไม่ได้หมายถึงจำนวนการทำซ้ำที่ จำกัด หรือความลึกของการเรียกซ้ำที่ จำกัด แต่ต้องคำนวณการทำซ้ำสูงสุดและความลึกของการเรียกซ้ำก่อนล่วงหน้า
ตัวอย่างเช่นฟังก์ชั่น Ackermann ไม่สามารถคำนวณในภาษาที่ไม่มีคุณสมบัติเหล่านี้ ในทางกลับกันซอฟต์แวร์จำนวนมากที่ซับซ้อนและมีประโยชน์สูงสามารถเขียนได้โดยไม่ต้องใช้คุณสมบัติเหล่านี้
ในทางกลับกันการนับซ้ำทุกครั้งและความลึกการเรียกซ้ำทั้งหมดคำนวณล่วงหน้าไม่เพียง แต่จะสามารถตัดสินใจได้ว่าโปรแกรมจะหยุดหรือไม่ แต่จะหยุดลง
ฉันรู้ว่านี่ไม่ใช่คำตอบที่ถูกต้องอย่างเป็นทางการ แต่เมื่อคุณถอด 'ทัวริสต์' ออกจาก 'ทัวริง' และใส่ 'ภาคปฏิบัติ' ไว้ที่เดิมคุณจะเห็นคุณสมบัติที่สำคัญที่สุดที่แยกภาษาโปรแกรมจาก ภาษามาร์กอัปคือ
ต่อไปมา
เพื่อทดสอบการยืนยันเหล่านี้เริ่มต้นด้วยภาษามาร์กอัปพูด HTML เราสามารถคิดค้น HTML + กับตัวแปรเท่านั้นหรือเงื่อนไขเท่านั้น (MS ไม่ว่ามีความคิดเห็นเงื่อนไข) หรือชนิดของห่วงสร้างบางส่วน (ซึ่งในกรณีที่ไม่มีเงื่อนไขอาจจะจบลงเช่นสิ่งที่ต้องการ<repeat n='4'>...</repeat>
) การทำสิ่งเหล่านี้จะทำให้ HTML + อย่างมีนัยสำคัญ (?) มีประสิทธิภาพมากกว่า HTML ธรรมดา แต่จะยังคงเป็นมาร์กอัพมากกว่าภาษาโปรแกรม ด้วยคุณสมบัติใหม่แต่ละอย่างคุณทำให้ภาษาที่ประกาศน้อยลงและมีความจำเป็นมากขึ้น
การค้นหาขั้นต่ำในตรรกะและการเขียนโปรแกรมแน่ใจว่ามีความสำคัญและน่าสนใจ แต่ถ้าฉันต้องสอน n00bies เด็กหรือเก่า 'สิ่งที่เป็นโปรแกรม' และ 'วิธีการเรียนรู้โปรแกรม' ฉันแทบจะไม่เริ่มต้นด้วยความกว้างและความกว้างเต็มที่ ของรากฐานทางทฤษฎีของทัวริงสมบูรณ์ แก่นแท้ของการทำอาหารและการเขียนโปรแกรมกำลังทำสิ่งต่าง ๆ ตามลำดับที่ถูกต้องทำซ้ำจนกว่าจะพร้อมเหมือนแม่ของคุณทำ เกี่ยวกับผลรวมมันขึ้นสำหรับฉัน
จากนั้นอีกครั้งฉันไม่เคยสำเร็จ CS ของฉัน