Szukam gramatyki kontekstowej opisującej następujący język: .
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?
Odpowiedzi:
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 .M Ma Mb Ma→a
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.Ma→a M
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?α→β |α|≤β| XA→AX X A XA→XAX,XAX→AAX,AAX→AX A
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.
źródło
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.
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={wk∣w∈Σ∗} L=⋃i≥1Lk Lk L
źródło
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 ε
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
źródło