ปัญหาของฉันคือฉันจะพิสูจน์ได้อย่างไรว่าไวยากรณ์ไม่คลุมเครือ? ฉันมีไวยากรณ์ต่อไปนี้:
และทำให้เป็นไวยากรณ์ที่ชัดเจนฉันคิดว่ามันถูกต้อง:
ฉันรู้ว่าไวยากรณ์ที่ไม่คลุมเครือมีต้นไม้แยกหนึ่งต้นสำหรับทุกเทอม
ปัญหาของฉันคือฉันจะพิสูจน์ได้อย่างไรว่าไวยากรณ์ไม่คลุมเครือ? ฉันมีไวยากรณ์ต่อไปนี้:
และทำให้เป็นไวยากรณ์ที่ชัดเจนฉันคิดว่ามันถูกต้อง:
ฉันรู้ว่าไวยากรณ์ที่ไม่คลุมเครือมีต้นไม้แยกหนึ่งต้นสำหรับทุกเทอม
คำตอบ:
มี (อย่างน้อย) วิธีหนึ่งที่จะพิสูจน์ได้ว่าไม่น่าสงสัยของไวยากรณ์สำหรับภาษาL ประกอบด้วยสองขั้นตอน:
ขั้นตอนแรกค่อนข้างชัดเจน: แสดงว่าไวยากรณ์สร้าง (อย่างน้อย) คำที่คุณต้องการนั่นคือความถูกต้อง
ขั้นตอนที่สองแสดงให้เห็นว่ามีต้นไม้ที่ใช้ไวยากรณ์เป็นจำนวนมากสำหรับคำที่มีความยาวnเมื่อLมีคำที่มีความยาวn - มี 1 ซึ่งหมายถึงความไม่น่าสงสัย มันใช้ฟังก์ชั่นโครงสร้างของGซึ่งกลับไปที่ Chomsky และSchützenberger [1] คือ
กับจำนวนต้นไม้ไวยากรณ์Gมีคำของความยาวn แน่นอนคุณต้องมี| L n | สำหรับสิ่งนี้ในการทำงาน
สิ่งที่ดีคือการที่คือ (ปกติ) ง่ายที่จะได้รับสำหรับภาษาบริบทฟรี แต่การหารูปแบบปิดสำหรับเสื้อnอาจเป็นเรื่องยาก แปลงGให้เป็นระบบสมการของฟังก์ชั่นด้วยตัวแปรเดียวต่อ nonterminal:
สิ่งนี้อาจดูน่ากลัว แต่เป็นเพียงการเปลี่ยนแปลงทางไวยากรณ์เท่านั้นที่จะชัดเจนในตัวอย่าง ความคิดที่จะสร้างสัญลักษณ์ว่าสถานีจะถูกนับในสัญลักษณ์ของและเนื่องจากระบบมีรูปแบบเดียวกับG , Z nเกิดขึ้นบ่อยครั้งในผลรวมเป็นnขั้วสามารถสร้างขึ้นโดยG ตรวจสอบ Kuich [2] เพื่อดูรายละเอียด
การแก้ระบบสมการนี้ (พีชคณิตคอมพิวเตอร์!) ให้ผลตอบแทน ; ตอนนี้คุณ "เท่านั้น" ต้องดึงสัมประสิทธิ์ (ในรูปแบบปิดทั่วไป) TCS โกงแผ่นและคอมพิวเตอร์พีชคณิตมักจะสามารถทำเช่นนั้น
พิจารณาไวยากรณ์อย่างง่ายพร้อมกฎ
ε
เป็นที่ชัดเจนว่า (ขั้นตอนที่ 1 พิสูจน์โดยอุปนัย) มี2 n palindromes ของความยาวnถ้าnเป็นเลขคู่,0มิฉะนั้น
การตั้งค่าระบบสมการให้ผลตอบแทน
whose solution is
.
The coefficients of coincide with the numbers of palindromes, so is unambiguous.
This is a good question, but some Googling would have told you that there is no general method for deciding ambiguity, so you need to make your question more specific.
For some grammars, a proof by induction (over word length) is possible.
Consider for example a grammar over given by the following rules:
All words of length in -- there's only -- have only one left-derivation.
Assume that all words of length for some have only one left-derivation.
Now consider arbitrary for some . Clearly, . If , we know that the first rule in every left-derivation has to be ; if , it has to be . This covers all cases. By induction hypothesis, we know that there is exactly one left-derivation for . In combination, we conclude that there is exactly one left-derivation for as well.
This becomes harder if
It may help to strengthen the claim to all sentential forms (if the grammar has no unproductive non-terminals) and "root" non-terminals.
I think the conversion to Greibach normal form maintains (un)ambiguity, to applying this step first may take care of left-recursion nicely.
The key is to identify one feature of every word that fixes (at least) one derivation step. The rest follows inductively.
Basically, it's a child generation problem. Start with the first expression, and generate it's children .... Keep doing it recursively (DFS), and after quite a few iterations, see if you can generate the same expanded expression from two different children. If you are able to do that, it's ambiguous. There is no way to determine the running time of this algorithm though. Assume it's safe, after maybe generating 30 levels of children :) (Of course it could bomb on the 31st)