ไวยากรณ์ฟรีตามบริบทคืออะไร?


105

ใครช่วยอธิบายให้ฉันเข้าใจว่าไวยากรณ์ที่ไม่มีบริบทคืออะไร หลังจากดูรายการ Wikipedia และรายการ Wikipedia เกี่ยวกับไวยากรณ์ที่เป็นทางการแล้วฉันก็รู้สึกสับสนอย่างสิ้นเชิง จะมีใครใจดีอธิบายว่าสิ่งเหล่านี้คืออะไร?

ฉันสงสัยสิ่งนี้เพราะฉันต้องการตรวจสอบการแยกวิเคราะห์และในด้านข้างข้อ จำกัด ของเอนจิน regex

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


2
เกี่ยวข้องกับAutomata Theorem
ราหุล

2
หากคุณมีความสนใจในภาษาที่เป็นทางการและทฤษฎีออโตสำหรับการแยกผมขอแนะนำหนังสือเล่ม Sudkamp ของภาษาและเครื่องหรือ Aho, Sethi & Ullman ของคอมไพเลอร์ หนังสือแต่ละเล่มให้คำอธิบายอย่างเป็นทางการเกี่ยวกับไวยากรณ์ที่ไม่มีบริบทซึ่งเป็นไวยากรณ์ที่เป็นทางการประเภทหนึ่งจากนั้นระบุและพิสูจน์ทฤษฎีพื้นฐานเกี่ยวกับไวยากรณ์ที่ไม่อิงบริบทซึ่งจำเป็นในการทำความเข้าใจ (เช่นคำขยายสำหรับภาษาที่ไม่มีบริบทและการแปลงและ ทฤษฎีบทรูปแบบปกติ) ไม่มีข้อกำหนดเบื้องต้นทางคณิตศาสตร์สำหรับการเรียนรู้ทฤษฎีภาษาที่เป็นทางการนอกเหนือจากความเข้าใจคร่าวๆเกี่ยวกับทฤษฎีเซต
danportin

1
คำถามดังกล่าวไม่ควรย้ายไปที่วิทยาศาสตร์คอมพิวเตอร์เชิงทฤษฎีหรือไม่?
Pale Blue Dot

คำตอบ:


111

ไวยากรณ์ที่ไม่มีบริบทคือไวยากรณ์ที่ตรงตามคุณสมบัติบางประการ ในวิทยาการคอมพิวเตอร์ไวยากรณ์อธิบายภาษา โดยเฉพาะอย่างยิ่งพวกเขาอธิบายภาษาที่เป็นทางการ

ภาษาที่เป็นทางการเป็นเพียงชุด (คำศัพท์ทางคณิตศาสตร์สำหรับชุดของวัตถุ) ของสตริง (ลำดับของสัญลักษณ์ ... คล้ายกับการเขียนโปรแกรมของคำว่า "สตริง") ตัวอย่างง่ายๆของภาษาที่เป็นทางการคือชุดของสตริงไบนารีทั้งหมดที่มีความยาว 3, {000, 001, 010, 011, 100, 101, 110, 111}

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

S -> BBB
B -> 0
B -> 1

วิธีการแปลความหมายนี้คือจะบอกว่าSจะถูกแทนที่ด้วยBBBและBจะถูกแทนที่ด้วย 0 และBจะถูกแทนที่ด้วย 1. ดังนั้นเพื่อสร้างสตริง 010 S -> BBB -> 0BB -> 01B -> 010ที่เราสามารถทำได้

ไวยากรณ์ที่ไม่มีบริบทเป็นเพียงไวยากรณ์ที่สิ่งที่คุณกำลังแทนที่ (ด้านซ้ายของลูกศร) เป็นสัญลักษณ์ "non-terminal" เพียงสัญลักษณ์เดียว สัญลักษณ์ที่ไม่ใช่เทอร์มินัลคือสัญลักษณ์ใด ๆ ที่คุณใช้ในไวยากรณ์ที่ไม่สามารถปรากฏในสตริงสุดท้ายของคุณ ในไวยากรณ์ด้านบน "S" และ "B" เป็นสัญลักษณ์ที่ไม่ใช่เทอร์มินัลและ "0" และ "1" เป็นสัญลักษณ์ "เทอร์มินัล" ไวยากรณ์เช่น

S -> AB
AB -> 1
A -> AA
B -> 0

ไม่ปกติเนื่องจากมีกฎเช่น "AB -> 1"


13
โดย 'not ปกติ' คุณหมายถึง 'not context-free' หรือไม่? (เนื่องจากภาษาที่ CFG สามารถแสดงได้นั้นเป็นชุดที่ยอดเยี่ยมของสิ่งเหล่านั้นที่สามารถแสดงได้ด้วยนิพจน์ทั่วไป)
Anti Earth

3
"S สามารถแทนที่ด้วย B" อ่านว่า "S สามารถแทนที่ด้วย BBB" ได้หรือไม่?
Cosmo Harrigan

5
เจ้านายที่ดีนี่เป็นหนึ่งในคำตอบที่อธิบายได้ดีที่สุดที่ฉันเคยเห็นใน SO
Rafael Dias da Silva

1
@AntiEarth ตัวอย่างที่สองไม่ใช่ไวยากรณ์ทั่วไปเนื่องจากมีกฎที่สร้างสัญลักษณ์ที่ไม่ใช่เทอร์มินัลสองสัญลักษณ์จากสัญลักษณ์ที่ไม่ใช่เทอร์มินัลเดียวซึ่งไม่อนุญาตให้ใช้ในไวยากรณ์ปกติ (เช่นเดียวกับที่ OP ชี้ให้เห็นว่ามีกฎที่มีสัญลักษณ์ที่ไม่ใช่เชิงเทอร์มินัลหลายตัวบน ทางซ้าย). en.wikipedia.org/wiki/Regular_grammar
awwsmm

21

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

นิพจน์ทั่วไปเป็นวิธีการอธิบายภาษาปกติ ภาษาปกติคือภาษาที่สามารถตัดสินใจได้โดยออโตเมตัน จำกัด ที่กำหนด

คุณควรอ่านบทความเกี่ยวกับ Finite State Machines: http://en.wikipedia.org/wiki/Finite_state_machine

และภาษาทั่วไป: http://en.wikipedia.org/wiki/Regular_language

ภาษาปกติทั้งหมดเป็นภาษาฟรีตามบริบท แต่มีภาษาฟรีตามบริบทที่ไม่ปกติ Context Free Language คือชุดของสตริงทั้งหมดที่ยอมรับโดย Context Free Grammer หรือ Pushdown Automata ซึ่งเป็น Finite State Machine ที่มีสแต็กเดียว: http://en.wikipedia.org/wiki/Pushdown_automaton#PDA_and_Context-free_Languages

มีภาษาที่ซับซ้อนมากขึ้นซึ่งต้องใช้ Turing Machine (โปรแกรมที่เป็นไปได้ใด ๆ ที่คุณสามารถเขียนบนคอมพิวเตอร์ของคุณได้) เพื่อตัดสินใจว่าสตริงนั้นเป็นภาษาหรือไม่

ทฤษฎีภาษายังเกี่ยวข้องกับปัญหา P เทียบกับ NP และสิ่งที่น่าสนใจอื่น ๆ

หนังสือเรียนรู้เบื้องต้นเกี่ยวกับวิทยาการคอมพิวเตอร์ปีที่สามของฉันค่อนข้างดีในการอธิบายสิ่งนี้: บทนำสู่ทฤษฎีการคำนวณ โดย Michael Sipser แต่ฉันต้องเสียเงิน 160 เหรียญเพื่อซื้อใหม่และมันก็ไม่ใหญ่มาก บางทีคุณอาจหาสำเนาที่ใช้แล้วหรือหาสำเนาที่ห้องสมุดหรือบางอย่างที่อาจช่วยคุณได้

แก้ไข:

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

http://en.wikipedia.org/wiki/Pumping_lemma_for_regular_languages

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

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

ฉันคิดว่าส่วนที่คุณสนใจมากที่สุดคือ Finite State Machines (ทั้งกำหนดและกำหนด) เพื่อดูว่าภาษาใดที่นิพจน์ทั่วไปสามารถตัดสินใจได้และคำขยายการปั๊มเพื่อพิสูจน์ว่าภาษาใดไม่ปกติ

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

ภาษาของสตริงทั้งหมดที่ใช้ตัวอักษร a และ b ที่มี b อย่างน้อยสามตัวเป็นภาษาปกติ: ba ba ba

ภาษาของสตริงทั้งหมดที่ใช้ตัวอักษร a และ b ที่มี b มากกว่า a ไม่ใช่ภาษาปกติ

นอกจากนี้คุณไม่ควรให้ภาษา จำกัด ทั้งหมดเป็นภาษาปกติตัวอย่างเช่น:

ภาษาของสตริงทั้งหมดที่มีความยาวน้อยกว่า 50 อักขระโดยใช้ตัวอักษร a และ b ที่มี b มากกว่า a เป็นปกติเนื่องจากเป็นภาษาที่ จำกัด เรารู้ว่าสามารถอธิบายได้ว่าเป็น (b | abb | bab | bba | aabbb | ababb | .. ) ฯลฯ จนกว่าจะมีการระบุชุดค่าผสมที่เป็นไปได้ทั้งหมด


1
นิพจน์ทั่วไปไม่ใช่โปรแกรมการตัดสินใจที่จับคู่สตริงกับรูปแบบ เป็นนิพจน์ที่แสดงถึงชุดปกติซึ่งปัญหาการเป็นสมาชิกนั้นสามารถตัดสินใจได้
danportin

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

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

1
ฉันเปลี่ยนเป็น "นิพจน์ทั่วไปเป็นวิธีการอธิบายภาษาปกติภาษาทั่วไปคือภาษาที่สามารถตัดสินใจได้โดยออโตเมติก จำกัด ที่กำหนดขึ้นเอง" ฟังดูดีกว่าไหม
พอล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.