Nie ma (co najmniej) jednym ze sposobów wykazania jednoznaczność gramatyki dla języka L . Składa się z dwóch kroków:G=(N,T,δ,S)L
- Wykazać .L⊆L(G)
- Wykazać .[zn]SG(z)=|Ln|
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], mianowicieGnLnG
SG(z)=∑n=0∞tnzn
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.tn=[zn]SG(z)Gn|Ln|
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:SGtnG
⎡⎣A(z)=∑(A,a0…ak)∈δ ∏i=0k τ(ai) :A∈N⎤⎦ with τ(a)={a(z)z,a∈N,a∈T.
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].zGznnG
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ć.S(z)=SG(z)
Przykład
Rozważ prostą gramatykę z regułamiG
.S→aSa∣bSb∣ε
Oczywiste jest, że (krok 1, dowód przez indukcję). Są 2 nL(G)={wwR∣w∈{a,b}∗} palindromy o długościn,jeżelinjest parzyste, wprzeciwnym razie0.2n2nn0
Ustawienie układu równań daje
S(z)=2z2S(z)+1
którego rozwiązaniem jest
.SG(z)=11−2z2
Współczynniki pokrywają się z liczbą palindromów, więc G jest jednoznaczne.SG G
- Algebraiczna teoria języków bezkontekstowych Chomsky'ego, Schützenberger (1963)
- O entropii języków bezkontekstowych autorstwa Kuicha (1970)
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.
źródło
For some grammars, a proof by induction (over word length) is possible.
Consider for example a grammarG over Σ={a,b} given by the following rules:
All words of length≤1 in L(G) -- there's only ε -- have only one left-derivation.
Assume that all words of length≤n for some n∈N have only one left-derivation.
Now consider arbitraryw=w1w′wn∈L(G)∩Σn for some n>0 . Clearly, w1∈Σ . If w1=a , we know that the first rule in every left-derivation has to be S→aSa ; if w1=b , it has to be S→bSb . This covers all cases. By induction hypothesis, we know that there is exactly one left-derivation for w′ . In combination, we conclude that there is exactly one left-derivation for w 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.
źródło
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)
źródło