ภาษาปกติสามารถทัวริงได้หรือไม่


32

ฉันกำลังอ่านเกี่ยวกับIota และ Jotและพบว่าส่วนนี้ทำให้เกิดความสับสน:

ซึ่งแตกต่างจาก Iota ที่ต้นไม้ syntactic สำหรับสตริงสามารถแยกทั้งทางด้านซ้ายหรือด้านขวาไวยากรณ์ Jot เป็นซ้าย - กิ่งเหมือนกัน เป็นผลให้ Iota ไม่มีบริบทอย่างเคร่งครัด แต่ Jot เป็นภาษาปกติ

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


3
โปรดทราบว่าภาษาที่อธิบายถึงเครื่องทัวริงสามารถเขียนในภาษาปกติได้เล็กน้อยเช่น i = {0,1, -1}, b = {จุดสิ้นสุดการป้อนข้อมูล} (i + bi + bi) + b (i +) อธิบาย ชุดของกฎที่ไม่ว่างเปล่าตามด้วยอินพุตที่ไม่ว่าง หรือค่อนข้างคุณสามารถตีความมันเหมือนว่าถ้าคุณมีล่ามซึ่งเป็นคำตอบที่กล่าวถึงเป็นแนวคิดแยกต่างหากในชั้นเรียนของภาษา
ลูกบาศก์

1
@Cubic: สำหรับเรื่องนั้นเครื่องทัวริงสามารถกำหนดหมายเลขได้เพื่อให้ทุกหมายเลขแสดงถึงเครื่องหนึ่งเครื่อง (นั่นคือนับได้) และตัวเลขเหล่านั้นสามารถแสดงได้ด้วยสัญกรณ์ที่ไม่เหมือนกัน ฉันไม่เคยศึกษาสิ่งนี้อย่างถูกต้องดังนั้นฉันจึงต้องใช้ความพยายามมากกว่าคำจำกัดความ แต่ฉันคิดว่า1*0เป็นภาษาปกติ ;-) ถึงแม้จะไม่ใช่ภาษาโปรแกรมที่เป็นมิตรทั้งสำหรับโปรแกรมเมอร์หรือผู้เขียนคอมไพเลอร์
Steve Jessop

คำตอบ:


40

ในระยะสั้นคำตอบคือใช่

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

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

โปรดทราบว่าคุณสามารถพูดคุยเกี่ยวกับ "ภาษา C ++" จากมุมมองที่ไม่เกี่ยวข้องอย่างสมบูรณ์สองจุดโดยใช้ความหมายที่ไม่เกี่ยวข้องสองคำของคำว่า "ภาษา":

  • C ++ เป็นชุดของสตริงที่ถูกกฎหมายตามไวยากรณ์ C ++
  • C ++ เป็นวิธีการระบุโปรแกรม

ลักษณะของ "ภาษา C ++" จากมุมมองทั้งสองนี้ไม่เกี่ยวข้องกัน

ตัวอย่างเพิ่มเติมเพื่อช่วยให้คุณแยกแนวคิดเหล่านี้:

  • นิพจน์ "[az] + @ [az]. [az]" อธิบายชุดของสตริงที่รู้จักโดย finite automata นั่นคือภาษาปกติ อย่างไรก็ตามมันเป็นเพียงชุดของสตริง: ไม่ใช่วิธีการระบุโปรแกรม (เว้นแต่คุณจะกำหนดวิธีการตีความแต่ละสตริงดังกล่าวเป็นโปรแกรม) ดังนั้นจึงไม่สมเหตุสมผลที่จะพูดถึงว่ามันเป็นทัวริงหรือไม่ สมบูรณ์
  • ภาษาของผังงานเป็นวิธีการระบุโปรแกรม ทั้งนี้ขึ้นอยู่กับรสชาติเฉพาะของผังงานมันอาจหรือไม่ทัวริงเสร็จสมบูรณ์ อย่างไรก็ตามผังงานไม่ใช่สตริงดังนั้นจึงไม่มีเหตุผลที่จะพูดถึงผังงานในแง่ "ภาษาเป็นชุดสตริง"

3
ฉันจะเพิ่มนั่น(([a-z][0-9]*)*[A-Z][0-9]*([a-z][0-9]*)*->([a-zA-Z][0-9]*)*)*เป็นภาษาปกติที่สามารถอธิบายไวยากรณ์ของภาษาใด ๆ ของคลาส 0
Erbureth พูดว่า Reinstate Monica

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

10

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

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


9

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

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

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


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

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

โปรดทราบว่าความเรียบง่ายของไวยากรณ์ของภาษาการเขียนโปรแกรมไม่ได้หมายความถึงข้อ จำกัด ในพลังการคำนวณของโปรแกรมที่ระบุในภาษาการเขียนโปรแกรมนั้น


1

คำตอบคือใช่ คุณจะเห็นว่าไวยากรณ์ตอบรับเป็นอิสระจากความหมายของคำตอบ ในคำพูดของ Chomsky:

ฉันคิดว่าเราถูกบังคับให้ลงความเห็นว่าไวยากรณ์มีอิสระและเป็นอิสระจากความหมาย ...

ชัมสกีโครงสร้างประโยค (2499)

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

สำหรับตัวอย่างที่เป็นรูปธรรมจริง ๆ ภาษาที่เป็นที่นิยมwhitespaceนั้นมีไวยากรณ์แบบปกติและบางทีอาจx86 assembly languagesต้องมีการยืนยันด้วย


ฉันไม่คิดว่าข้อความนี้แปลว่าไวยากรณ์ของ Go เป็นภาษาปกติในความหมายที่เป็นทางการ ฉันคิดว่ามันก็หมายความว่าไวยากรณ์ไม่ผิดปกติเช่นที่สอดคล้องกัน ถ้าจริง ๆ แล้วไวยากรณ์ของ Go เป็นภาษาปกติในลำดับชั้นของ Chomsky จะไม่สามารถสร้างเช่นวงเล็บที่ซ้อนกันและซ้อนกัน
tsleyson

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