Mój problem polega na tym, jak mogę udowodnić, że gramatyka jest jednoznaczna? Mam następującą gramatykę:
i uczynię to jednoznaczną gramatyką, myślę, że jest poprawne:
Wiem, że jednoznaczna gramatyka ma jedno drzewo analizy dla każdego terminu.
Mój problem polega na tym, jak mogę udowodnić, że gramatyka jest jednoznaczna? Mam następującą gramatykę:
i uczynię to jednoznaczną gramatyką, myślę, że jest poprawne:
Wiem, że jednoznaczna gramatyka ma jedno drzewo analizy dla każdego terminu.
Odpowiedzi:
Nie ma (co najmniej) jednym ze sposobów wykazania jednoznaczność gramatyki dla języka L . Składa się z dwóch kroków:
Pierwszy krok jest całkiem jasny: pokaż, że gramatyka generuje (przynajmniej) słowa, które chcesz, to jest poprawność.
Drugi krok pokazuje, że ma tyle drzew składni dla słów o długości n, jak L ma słowa o długości n - z 1. oznacza to jednoznaczność. Wykorzystuje funkcję struktury G, która sięga do Chomsky'ego i Schützenbergera [1], mianowicie
z liczba drzew składniowych G ma dla słów o długości n . Oczywiście trzeba mieć | L n | aby to zadziałało.
Zaletą jest to, że jest (zwykle) łatwy do uzyskania dla języków bezkontekstowych, chociaż znalezienie zamkniętego formularza dla t n może być trudne. Przekształć G w układ równań funkcji z jedną zmienną na nieterminal:
Może to wyglądać zniechęcająco, ale tak naprawdę jest to tylko syntaktyczna transformacja, co stanie się jasne w przykładzie. Chodzi o to, że wygenerowane symbole końcowe są liczone w wykładnik i dlatego, że układ ma taką samą postać co G , Z, n zachodzi tak często, w sumie, jak N zaciski mogą być generowane przez G . Szczegóły w Kuich [2].
Rozwiązanie tego układu równań (algebra komputerowa!) Daje ; teraz „tylko” trzeba pociągnąć za współczynnik (w zamkniętej, ogólnej formie). TCS Ściągawka i komputer algebra często może zrobić.
Rozważ prostą gramatykę z regułami
.
Oczywiste jest, że (krok 1, dowód przez indukcję). Są 2 n palindromy o długościn,jeżelinjest parzyste, wprzeciwnym razie0.
Ustawienie układu równań daje
którego rozwiązaniem jest
.
Współczynniki pokrywają się z liczbą palindromów, więc G jest jednoznaczne.
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)