จะพิสูจน์ได้อย่างไรว่าภาษาไม่มีบริบท


26

มีเทคนิคมากมายที่จะพิสูจน์ว่าภาษาไม่ได้เป็นแบบไม่มีบริบท แต่ฉันจะพิสูจน์ได้อย่างไรว่าภาษานั้นไม่มีบริบท

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

สำหรับภาษาที่ปกติมีมี วิธีการที่เป็นระบบที่จะได้รับเป็นประจำไวยากรณ์ / จำกัด รัฐหุ่นยนต์: ตัวอย่างเช่น Myhill-Nerode ทฤษฎีบทมีวิธีหนึ่ง มีเทคนิคที่สอดคล้องกันสำหรับภาษาที่ไม่มีบริบทหรือไม่


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


อนุญาตให้ฉันออกจากบันทึกปกติของฉัน: เมื่อให้ไวยากรณ์ที่ไม่มีบริบทสำหรับภาษาที่อยู่ในมือคุณจำเป็นต้องมีหลักฐานการพิสูจน์ความถูกต้องซึ่งสามารถทำให้วิธีการที่ค่อนข้างเทอะทะ
— ราฟาเอล

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

จนกระทั่งวัสดุที่จะย้ายมาที่นี่ทราบว่าริกฉูดฉาดและ Babou รวบรวมสำนวนบางบริบททั่วไปที่เป็นคำถามที่ซ้ำกัน
— ราฟาเอล

คำตอบ:


13

วิธีการปฏิบัติที่เป็นตัวอย่างในการทำงาน [แต่ไม่เสมอไปฉันรู้] กำลังพยายามหาโครงสร้างการซ้อนของสตริงในภาษา "การพึ่งพาแบบซ้อน" ต้องถูกสร้างขึ้นในเวลาเดียวกันในส่วนต่าง ๆ ของสตริง

นอกจากนี้เรายังมีกล่องเครื่องมือพื้นฐาน :

  1. การต่อข้อมูล:หากคุณสามารถแยกภาษาออกเป็นสองส่วนติดต่อกันใช้การผลิตนี้S→S1S2

  2. union:แบ่งออกเป็นส่วนที่แยกจากกันS→S1∣S2

  3. การวนซ้ำ:S→S1S∣ε

ตัวอย่างที่ 1

นี่คือตัวอย่างสำหรับการทำรัง (ขอบคุณกราฟิลส์)

L={bkal(bc)manbo∣k,l,m,n,o∈N,k≠o,2l=n,m≥2}

แทนที่โดย2Lตอนนี้เราสามารถปล่อยในเงื่อนไขn2ln

แทนที่ด้วย (สับสน?คือ 'โอ้' ไม่ใช่ 'ศูนย์') ใช้เครื่องมือสำหรับสหภาพ เราทำงานกับที่นี่ นอกจากนี้ iffและโดยที่เป็นตัวแปรใหม่ แทนที่โดย Ok≠ok>o or k<ook>ok>ok=s+os>0sks+o

L1={bs+oal(bc)ma2lbo∣l,m,o,s∈N,s>0,m≥2}

เขียนใหม่ง่าย ๆ

L1={bbsboalbcbc(bc)m(aa)lbo∣l,m,o,s∈N}

ตอนนี้เราเห็นโครงสร้างการซ้อนและเริ่มสร้างไวยากรณ์

S1→TV , , (ดู: การต่อข้อมูลและการวนซ้ำที่นี่)T→bUU→bU∣ε

V→bVb∣W (เราสร้าง 's ทั้งสองด้าน)o b

W→aWaa∣X

X→YZ , ,Y→bcbcZ→bcZ∣ε

ตัวอย่างที่ 2

K={akblcm∣l=m+k}

การเขียนครั้งแรก "ชัดเจน"

K={akbm+kcm∣m,k≥0}={akbmbkcm∣m,k≥0}

ใน linguistice สิ่งนี้เรียกว่า "cross-serial dependency": interleaving (ปกติ) บ่งชี้อย่างยิ่งว่าไม่ใช่บริบท แน่นอนและเราถูกบันทึกไว้k,m,k,mm+k=k+m

K={akbk+mcm∣m,k≥0}={akbkbmcm∣m,k≥0}

ด้วยโปรดักชั่น , ,S→XYX→aXb∣εY→bYc∣ε

ในทำนองเดียวกันK′={akblcm∣m=k+l}={akblclck∣k,l≥0}

ด้วยโปรดักชั่น ,S→aSc∣XX→bXc∣ε


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


11

มีอยู่คนหนึ่งลักษณะของ CFL ที่สามารถนำไปใช้คือทฤษฎีบทชัม-Schutzenberger

ภาษา Dyck

ปล่อยให้ตัวอักษรเรากำหนดDyck -ภาษาของโดยไวยากรณ์ที่ไม่มีบริบทพร้อมมอบให้โดยTDT⊆(T∪T^)∗TG=({S},T∪T^,δ,S)δ

S→aSa^S∣ε,a∈TT

ทฤษฎีบท Chomsky-Schützenberger

L⊆Σ∗อยู่กับบริบทหากว่ามี

  • ตัวอักษร ,T
  • ภาษาปกติและR⊆(T∪T^)∗
  • โฮโมมอร์ฟิซึมψ:(T∪T^)→Σ∗

ดังนั้น

L=ψ(DT∩R)R)

โปรดทราบว่าโฮโมมอร์ฟิซึมจะขยายไปยังคำ (สัญลักษณ์ทีละสัญลักษณ์) และจากนั้นเป็นภาษา (คำต่อคำ)

ตัวอย่าง

พิจารณา{N} กับL={anbncm∣n,m∈N

  • T={[,⟨} (และ, บัญญัติ, ),T^={],⟩}
  • R=L([∗]∗⟨∗⟩∗)และ
  • ψ(x)={a,x=[b,x= ]ε,x=⟨c,x= ⟩

ทฤษฎีบทบอกว่าไม่มีบริบทโดยเฉพาะอย่างยิ่งตั้งแต่L

DT∩R={[n]n⟨m⟩m∣n,m∈N}\}

ตัวอย่างที่ 2

แสดงว่าไม่มีบริบทL={bkal(bc)manbo∣k,l,m,n,o∈N,k≠o,2l=n,m≥2}

ที่นี่เราต้องประเภทหนึ่งของวงเล็บสำหรับหนึ่งสำหรับหนึ่งสำหรับและอื่น ๆ ที่ใช้ในการจำลองว่าสาเหตุo เราใช้abcbbk≠o

  • T={[,⟨,⊢,<} ,
  • R=L(<+>+⊢∗[∗⟨⟨+⟩+⟩]∗⊣∗)∪L(⊢∗[∗⟨⟨+⟩+⟩]∗⊣∗<+>+)และ
  • ψ(x)={b,x∈{⊢,⊣,<}a,x=[aa,x= ]bc,x=⟨ε,else

และใช้ทฤษฎีบท เพื่อที่จะเห็นว่าเราไม่ต้องการมากกว่าความจริงที่ว่าสัญลักษณ์ที่ตรงกัน (เช่นและ ) ต้องเกิดขึ้นอย่างเท่าเทียมกันบ่อยครั้งในใด ๆ การเพิ่มความขัดแย้งนี้ให้กับนิพจน์ทั่วไปที่เรานิยามโดยเราจะได้รับL=ψ(DT∩R)[]w∈DTR

DT∩R={<p>p⊢o[l⟨m⟩m]l⊣o∣p≥1,o≥0,l≥0,m≥2}∪ {…}

และด้วยสิ่งนั้น

ψ(DT∩R)={bp+oal(bc)ma2lbo∣p≥1,o≥0,l≥0,m≥2}∪ {…}={bkal(bc)manbo∣k,l,m,n,o∈N,k>o,2l=n,m≥2}∪ {…}=L.

เพื่อไวยากรณ์และออโตมาตา

หากเราต้องการมีหุ่นยนต์หรือไวยากรณ์ในตอนท้ายเราก็มีงานอื่นอีกมากมายรออยู่ข้างหน้า

  • ต่อหุ่นยนต์, สร้าง NPDA สำหรับและ NFA สำหรับRอดีตคือมาตรฐานและเรามีอัลกอริทึมสำหรับหลังโดยให้ภาษาเป็นตัวแทนที่เหมาะสม (ดูที่นี่ด้วย ) ทางแยกทั้งสองเป็นโครงสร้างมาตรฐานอีกรูปแบบหนึ่งและสามารถใช้กับการเปลี่ยนแปลงทุกอย่างแยกกัน R ψDTRψ

  • ต่อไวยากรณ์, การสร้างหนึ่งสำหรับ (อีกครั้งควรจะมีมาตรฐาน) ใช้เวลาหนึ่งสำหรับและตัดพวกเขา จากนั้นใช้กับชุดกฎ (สัญลักษณ์สำหรับสัญลักษณ์)D T ψRDTψ

เนื้อหานี้เป็นเรื่องง่ายตั้งแต่อัลกอริทึม; ความซับซ้อนอยู่ที่การหา ,และเหมาะสม ฉันไม่รู้ว่าวิธีการนี้ง่ายกว่าการสร้าง PDA / grammars โดยตรงหรือเปล่า แต่อาจอนุญาตให้มุ่งเน้นไปที่คุณสมบัติที่สำคัญของภาษาในมือ ลองด้วยตัวคุณเอง!R ψTRψ


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