ไวยากรณ์ที่ไวต่อบริบทสำหรับภาษาของคำที่ต่อกับตัวเอง


9

ฉันกำลังมองหาไวยากรณ์ไวตามบริบทที่อธิบายภาษาต่อไปนี้: L={www{a,b},|w|1} .

ฉันมีปัญหากับความจริงที่ว่าไม่มีกฎเช่น Xεได้รับอนุญาตและดังนั้นฉันไม่สามารถวาง nonterminal ใด ๆ ที่ระบุ "กลาง" ของคำ มีเคล็ดลับสำหรับปัญหาหรือไม่?


1
คำตอบที่น่าเบื่อ: กำหนด LBA และใช้การจำลองที่ใช้เพื่อพิสูจน์ว่า LBA และไวยากรณ์ที่ไวต่อบริบทนั้นมีประสิทธิภาพเท่าเทียมกัน
กราฟิลส์

คำตอบ:


6

อันที่จริงมีเคล็ดลับง่ายๆที่ช่วยให้คุณเพิ่มข้อมูลพิเศษในตำแหน่งที่แน่นอน: เพียงแทนที่ตัวอักษรที่อยู่ติดกับตำแหน่งและทำเครื่องหมายด้วยข้อมูลและตัวอักษรเดิม

ในตัวอย่างของคุณมี nonterminal Mสำหรับตรงกลาง แต่เนื่องจากไม่สามารถลบได้มันจึงนับเป็นตัวอักษรปกติ ดังนั้นเราจึงมีสองชุดMa และ Mbเพื่อระบุตัวอักษรที่ถูกแทนที่ ในตอนท้ายของการสืบทอดเครื่องหมายควรถูกแทนที่ด้วยเนื้อหาจดหมายของพวกเขาโดยการผลิตง่าย ๆ เช่นMaa.

ในกรณีส่วนใหญ่การใช้งานของ Maaจะต้องดำเนินการในตอนท้ายของกระบวนการที่ได้รับมา ในการก่อสร้างบางอย่างนี้ไม่จำเป็นต้อง "หมดเวลา": เมื่อMหายไปเร็วเกินไปที่มาไม่สามารถหาตำแหน่งที่เหมาะสมและกระบวนการจะไม่ประสบความสำเร็จ ในอีกกรณีหนึ่งจำเป็นต้องมีการควบคุม บางครั้งจะทำเช่นนี้โดยแนะนำ nonterminal เป็นสัญญาณที่เคลื่อนที่ไปตามตัวอักษร อีกครั้งสัญญาณนี้ควรพกพาเทอร์มินัลมิฉะนั้นคุณจะพบปัญหาเดียวกัน

การย้ายข้อมูลไปรอบ ๆ นั้นง่ายในไวยากรณ์ที่เรียกว่าmonotonic (αβ กับ |α|β|) ใช้กฎเช่น XAAXซึ่งสามารถมองเห็นเป็น X กระโดดข้าม A. สำหรับไวยากรณ์ไวตามบริบทที่เหมาะสมเราต้องแยกสิ่งนี้ออกเป็นสามขั้นตอน:XAXAX,XAXAAX,AAXAX. ในแต่ละการผลิตจะมีการเปลี่ยนตัวอักษรหนึ่งตัวในบริบทที่เหมาะสม ต้องใช้จินตนาการพอสมควรที่จะเห็นว่ากระบวนการนี้ไม่ได้มีปฏิสัมพันธ์กับส่วนอื่น ๆ ของแหล่งที่มา เช่นเกิดอะไรขึ้นเมื่อA ในขั้นตอนสุดท้ายมีส่วนร่วมในขั้นตอนที่มาอื่นหรือไม่

สิ่งนี้อาจใช้ไม่ได้กับคำศัพท์สั้น ๆ เมื่อมีข้อมูลมากกว่าตำแหน่งว่าง ทางออกที่ง่ายที่สุดคือการไม่สนใจสตริงสั้น ๆ ในการสร้างของคุณและสร้างมันแยกกัน


มันจะไม่ต้องการให้มีการดูการผลิตในลำดับที่แน่นอนเพื่อไม่ให้ใช้ Ma → a ก่อนที่จะทำการจัดเรียง nonterminals ใหม่จนจบ? หรือฉันกำลังพลาดอะไรอยู่?
MrBolton

ฉันเพิ่มบันทึกย่อลงในคำตอบของฉัน ในการแก้ปัญหาบางอย่างที่ใช้การผลิตเช่นนี้เร็วเกินไปจะส่งผลให้รูปแบบประโยคที่ไม่สามารถเสร็จสิ้นได้สำเร็จ ในกรณีอื่น ๆ การผลิตจะต้องทำข้อมูลให้ตรงกันอย่างระมัดระวัง เป็นเรื่องของสามัญสำนึกและการลองผิดลองถูก
Hendrik Jan

1

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

ในกรณีที่เฉพาะเจาะจงนี้ให้ลองนึกถึงการใช้ไวยากรณ์เชิงเส้นตรงสำหรับ Σสองครั้งหนึ่งอันสำหรับซ้ายและอีกอันหนึ่งสำหรับครึ่งขวา สิ่งที่คุณต้องทำเพื่อให้แน่ใจว่าไวยากรณ์ทั้งสองได้รับ "ซิงค์"

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

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

วิธีหนึ่งในการบรรลุเป้าหมายนี้คือการใช้เล่ห์เหลี่ยมเช่นเดียวกับข้อพิสูจน์บางประการเกี่ยวกับ LBA: สร้างเทอร์มินัลที่ไม่ใช่ทั้งหมดที่คุณต้องการก่อนเช่นเตรียม "เทป" ต่อมา "ย้ายไปรอบ ๆ " บนเทปนั้น เฉพาะ "ที่ส่วนท้าย" แทนที่เทอร์มินัลที่ไม่ใช่ทั้งหมดด้วยเทอร์มินัล

ดังนั้นขอG=(N,Σ,δ,S) กับ Σ={a,b} การก่อสร้างขยายไปสู่ตัวอักษรที่ใหญ่ขึ้นและ N, δ กำหนดโดยกฎต่อไปนี้

SX^lSXraaaaababbababbbbaabbεSXlSXrXlX^r

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

X^lXlXγX^lγX^lXαXγXαγ

เพื่อทุกสิ่ง (α,γ)Σ2. สังเกตวิธีที่เราใช้ดัชนีระดับสูงเพื่อนำสัญลักษณ์ที่สร้างขึ้นไปทางขวาXa และ Xbเป็นเทอร์มินัลที่ไม่ใช่ "ขั้นสุดท้าย" ซึ่งจะใช้สำหรับการย้ายโทเค็นการควบคุมไปรอบ ๆ และเพื่อรับเทอร์มินัลในภายหลัง โปรดทราบว่ากฎข้อที่สองคือ (เท่านั้น) ใช้สำหรับสัญลักษณ์สุดท้ายของครึ่งขวา

สำหรับการเคลื่อนย้ายกระเป๋าไปทางขวาเราต้องเลื่อนผ่านทั้งคู่ที่เหลือXl และสร้างขึ้นแล้ว Xα:

X^lγXlX^lXlγX^lγXαX^lXαγXlγXlXlXlγXlγXαXlXαγXαγXβXαXβγ

เพื่อทุกสิ่ง (α,β,γ)Σ3. ทีนี้เมื่อการพกพามาถึงโทเค็นการควบคุมที่ถูกต้องเราต้องเลียนแบบกฎที่ใช้ทางด้านซ้าย:

XlγX^rXlX^rγXαγX^rXαX^rγX^rγXrXγX^rX^rγXγ

เพื่อทุกสิ่ง (α,γ)Σ2. โปรดทราบว่ากฎข้อแรกนั้นใช้สำหรับสัญลักษณ์แรกของครึ่งขวาและกฎสุดท้ายสามารถใช้ได้กับสัญลักษณ์สุดท้ายเท่านั้นมิฉะนั้นการสืบทอดจะไม่สิ้นสุด ตอนนี้เราต้องการเพียงกฎการยกเลิก

Xαα

เพื่อทุกสิ่ง αΣและเราทำเสร็จแล้ว กฎเหล่านี้ก็สามารถใช้ได้หลังจากทำทุกอย่าง (ทางซ้าย) มิฉะนั้นการสืบทอดจะไม่สิ้นสุด

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

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

ABCD

โดย

ABAYRAYRXRYRXRYRXRDXRDCD

ดังนั้นเราจึงดีและสามารถทำงานกับไวยากรณ์ที่เล็กลงได้ แสดงให้เห็นว่าการแทรกสอดระหว่างการจำลองดังกล่าวไม่ทำให้เกิดความเสียหายนั้นถือเป็นแบบฝึกหัด

คุณเห็นวิธีการขยายนี้ Lk={wkwΣ}? มันใช้งานได้กับL=i1Lk? คุณสามารถใช้สิ่งก่อสร้างเดียวกันได้หรือไม่Lk สำหรับปกติ L?


0

แม้ว่าฉันจะไม่ทราบว่าไวยากรณ์ไวตามบริบทจะเป็นอย่างไรคุณสามารถหลีกเลี่ยงปัญหาของคุณด้วยสัญลักษณ์ X ดังนี้

คุณรู้ว่าคำตัดแบ่งของคุณ w ต้องมีความยาวอย่างน้อย |w|1. ดังนั้นคุณสามารถ "เข้ารหัส" สิ่งเหล่านั้นได้ε- กฎไวยากรณ์ของคุณโดยกฎบางอย่างเช่น:

aXaaa,  aXbab,  bXaba,  bXbbb

แม้ว่าฉันจะยังไม่เห็นโซลูชันโดยรวมเพราะในใจของฉันดูเหมือนว่ามือซ้ายของกฎไวยากรณ์ของคุณอาจมีความยาวตามอำเภอใจเพราะฉันคิดว่าคุณจะลองพิจารณาคำนำหน้าของ w อย่างใดในกฎของคุณ


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