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


26

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

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

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


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


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

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

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

คำตอบ:


13

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

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

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

  2. union:แบ่งออกเป็นส่วนที่แยกจากกันSS1S2

  3. การวนซ้ำ:SS1Sε

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

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

L={bkal(bc)manbok,l,m,n,oN,ko,2l=n,m2}

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

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

L1={bs+oal(bc)ma2lbol,m,o,sN,s>0,m2}

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

L1={bbsboalbcbc(bc)m(aa)lbol,m,o,sN}

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

S1TV , , (ดู: การต่อข้อมูลและการวนซ้ำที่นี่)TbUUbUε

VbVbW (เราสร้าง 's ทั้งสองด้าน)o b

WaWaaX

XYZ , ,YbcbcZbcZε

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

K={akblcml=m+k}

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

K={akbm+kcmm,k0}={akbmbkcmm,k0}

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

K={akbk+mcmm,k0}={akbkbmcmm,k0}

ด้วยโปรดักชั่น , ,SXYXaXbεYbYcε

ในทำนองเดียวกันK={akblcmm=k+l}={akblclckk,l0}

ด้วยโปรดักชั่น ,SaScXXbXcε


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


11

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

ภาษา Dyck

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

SaSa^Sε,aTT

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

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

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

ดังนั้น

L=ψ(DTR)R)

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

ตัวอย่าง

พิจารณา{N} กับL={anbncmn,mN

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

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

DTR={[n]nmmn,mN}\}

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

แสดงว่าไม่มีบริบทL={bkal(bc)manbok,l,m,n,oN,ko,2l=n,m2}

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

  • T={[,,,<} ,
  • R=L(<+>+[++])L([++]<+>+)และ
  • ψ(x)={b,x{,,<}a,x=[aa,x= ]bc,x=ε,else

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

DTR={<p>po[lmm]lop1,o0,l0,m2} {}

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

ψ(DTR)={bp+oal(bc)ma2lbop1,o0,l0,m2} {}={bkal(bc)manbok,l,m,n,oN,k>o,2l=n,m2} {}=L.

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

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

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

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

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


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