Gramatyka kontekstowa dla języka słów połączonych ze sobą


9

Szukam gramatyki kontekstowej opisującej następujący język: .L={www{a,b},|w|1}

Mam problem z tym, że żadne reguły, takie jak są dozwolone i dlatego nie mogę umieścić żadnego nieterminala wskazującego „środek” słowa. Czy jest jakiś sposób na rozwiązanie tego problemu?Xε


1
Nudna odpowiedź: sformułuj LBA i zastosuj symulację zastosowaną do udowodnienia, że ​​LBA i gramatyki kontekstowe są równie potężne.
Raphael

Odpowiedzi:


6

Rzeczywiście istnieje prosta sztuczka, która pozwala dodać dodatkowe informacje w określonej pozycji: wystarczy zastąpić literę sąsiadującą z pozycją i oznaczyć ją informacją oraz oryginalną literą.

W twoim przykładzie, masz nieterminalny na środku, ale ponieważ nie można go usunąć, liczy się on również jako zwykła litera. Mamy więc dwie kopie i aby wskazać zastąpione litery. Pod koniec wyprowadzania znaczniki należy zastąpić ich literą, prostymi produkcjami, takimi jak .MMaMbMaa

W większości przypadków zastosowanie należy wykonać na końcu procesu wyprowadzania. W niektórych konstrukcjach nie musi to być „mierzone”: gdy zniknie zbyt wcześnie, wyprowadzenie nie może znaleźć właściwej pozycji i proces nie zakończy się pomyślnie. W innych przypadkach potrzeba pewnego rodzaju kontroli. Czasami robi się to poprzez wprowadzenie nieterminala jako sygnału, który porusza się wzdłuż liter. Ponownie, ten sygnał powinien również przenosić terminal, w przeciwnym razie wpadniesz w te same problemy.MaaM

Przenoszenie informacji wokół jest łatwy w tzw monotonicznych gramatyk ( z ) stosując zasady jak , które mogą być postrzegane jako skoków nad . Aby uzyskać prawidłową gramatykę kontekstową, należy podzielić ją na trzy etapy: . w każdej produkcji jedna litera jest zmieniana we właściwym kontekście. Potrzeba trochę wyobraźni, aby zobaczyć, że ten proces nie wchodzi w interakcje z innymi częściami wyprowadzania. Na przykład, co dzieje się, gdy w ostatnim etapie jest po raz pierwszy zaangażowany w inny etap wyprowadzania?αβ|α|β|XAAXXAXAXAX,XAXAAX,AAXAXA

Może to nie działać w przypadku bardzo krótkich słów, gdy dostępnych jest więcej informacji niż dostępnych pozycji. Najprostszym rozwiązaniem tego jest zignorowanie krótkich ciągów w swojej konstrukcji i wygenerowanie ich osobno.


Czy nie wymagałoby to spojrzenia na produkcję w określonej kolejności, aby Ma → a nie był używany przed przestawieniem nieterminali do końca? A może coś mi brakuje?
MrBolton

Do mojej odpowiedzi dodałem notatkę. W niektórych rozwiązaniach zastosowanie takiej produkcji zbyt wcześnie spowoduje powstanie sentymentalnej formy, której nie można pomyślnie zakończyć. W innych przypadkach produkcje muszą być starannie synchronizowane. Kwestia zdrowego rozsądku i prób i błędów.
Hendrik Jan

1

Krótka domyślna odpowiedź: wymyśl LBA, który akceptuje język i użyj symulacji użytej do udowodnienia, że ​​gramatyki kontekstowe i LBA definiują ten sam zestaw języków. Ale nie o to oczywiście chodzi.

W tym konkretnym przypadku spróbuj pomyśleć o użyciu gramatyki liniowo-prawej dla dwa razy, jeden dla lewej i jeden dla prawej połowy. Musisz tylko upewnić się, że obie gramatyki wyprowadzają „zsynchronizowane”.Σ

Można to zrobić, zamieniając token sterujący. Oznacza to, że lewe gramatyki wybierają regułę, generują odpowiedni żeton kontrolny i przekazują go do prawej gramatyki. Prawidłowa gramatyka widzi token kontrolny i wykonuje regułę dopasowania. Zauważ, że możesz w ten sposób zaimplementować dwukierunkową komunikację, ale tutaj nie jest to konieczne.

Jest jeden problem z gramatykami kontekstowymi: nigdy nie mogą usuwać terminali (z wyjątkiem jeśli puste słowo jest w języku). Dlatego musimy stworzyć tylko tyle terminali, ile będziemy potrzebować; żaden nie może być zbędny.Sε

Jednym ze sposobów na osiągnięcie tego jest użycie tej samej sztuczki, co w przypadku niektórych dowodów dotyczących LBA: wygeneruj wszystkie nieterminale, których będziesz najpierw potrzebować , tj. Przygotuj „taśmę”. Później „poruszaj się” po tej taśmie. Tylko „na końcu” zamień wszystkie nie-terminale na terminale.

Niech więc z (konstrukcja łatwo rozciąga się na większe alfabety) i , podane przez następujące reguły. to reguły generowania „taśmy”. Zauważ, że czapka oznacza „pozycję głowy”, a indeksy oznaczają, do której połowy słowa należy nieterminalny. Krótkie słowa są generowane, aby zabezpieczyć niektóre reguły poniżej. Teraz potrzebujemy reguł, aby uzyskać jeden symbol w lewej części:G=(N,Σ,δ,S)Σ={a,b}Nδ

SX^lSXraaaaababbababbbbaabbεSXlSXrXlX^r

l,r

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

dla wszystkich . Zwróć uwagę, jak używamy górnego indeksu do przenoszenia wygenerowanego symbolu w prawo. i są „końcowymi” nieterminalami, które będą używane tylko do przesuwania tokena sterującego i uzyskiwania terminali później. Zauważ ponadto, że druga reguła jest (tylko) używana dla ostatniego symbolu prawej połowy. Aby przenieść przeniesienie do prawej połowy, musimy przejść obok pozostałych i już wygenerowanych :(α,γ)Σ2XaXb

XlXα

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

dla wszystkich . Teraz, gdy carry osiągnie odpowiedni token kontrolny, musimy naśladować regułę zastosowaną po lewej stronie: dla wszystkich(α,β,γ)Σ3

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

(α,γ)Σ2. Zauważ, że pierwsza reguła jest używana dla pierwszego symbolu prawej połowy, i że ostatnia reguła może być użyta tylko dla ostatniego symbolu, w przeciwnym razie wyprowadzenie nigdy się nie kończy. Teraz potrzebujemy tylko reguł kończących dla wszystkich i gotowe. Te zasady również można zastosować dopiero po wykonaniu wszystkiego (po lewej), w przeciwnym razie wyprowadzenie nie zostanie zakończone. Zauważ, że ta gramatyka jest niejednoznaczna. Można nie tylko (bezpiecznie) zastosować dowolnym miejscu na lewo od lewej „głowy” w dowolnym momencie, ale może być jednocześnie prowadzonych wiele operacji przenoszenia. Ponieważ nigdy nie mogą się dogonić, utrzymywana jest poprawna kolejność.

Xαα

αΣ

Xαα

Trzeba jeszcze jedna uwaga: powyżej gramatyki nie zależy od kontekstu, ponieważ wiele reguł zmienia oba symbole po lewej stronie. Nie jest to dozwolone w przypadku gramatyk kontekstowych. Na szczęście możemy symulować dowolną regułę w postaci przez więc jesteśmy dobrzy i możemy pracować z mniejszą gramatyką. Wykazanie, że interferencja między wieloma takimi symulacjami nie szkodzi, pozostawia się jako ćwiczenie.R

ABCD



ABAYRAYRXRYRXRYRXRDXRDCD

Czy widzisz, jak rozszerzyć to na ? Czy to działa również dla ? Czy możesz użyć tej samej konstrukcji dla dowolnego dla zwykłego ?Lk={wkwΣ}L=i1LkLkL


0

Chociaż nie wiem, jak będzie wyglądała gramatyka kontekstowa, możesz obejść swój problem z symbolem w następujący sposób.X

Wiesz, że twoje połączone słowa muszą mieć co najmniej długość . Dlatego możesz po prostu „zakodować” te zasady swojej gramatyki według kilku zasad, takich jak: w|w|1ε

aXaaa,  aXbab,  bXaba,  bXbbb

Chociaż nie widzę jeszcze ogólnego rozwiązania, ponieważ moim zdaniem wydaje się, że twoje lewe strony reguł gramatycznych potencjalnie stają się arbitralnie długie, ponieważ myślę, że spróbowałbyś rozważyć prefiksy jakoś w swoich regułach.w


Jednak użycie podejścia @ hendrik-jan oszczędza dwie zasady.
Rmn
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.