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δ
SS′→X^lS′Xr∣aaaa∣abab∣baba∣bbbb∣aa∣bb∣ε→XlS′Xr∣XlX^r
l,r
X^lXlX^lXα→XγX^γl→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^γlXlX^γlXαXγlXlXγlXαXγαXβ→X^lXγl→X^lXγα→XlXγl→XlXγα→XαXγβ
dla wszystkich . Teraz, gdy carry osiągnie odpowiedni token kontrolny, musimy naśladować regułę zastosowaną po lewej stronie:
dla wszystkich(α,β,γ)∈Σ3
XγlX^rXγαX^rX^γrXrX^γr→XlX^γr→XαX^γr→XγX^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
AB→CD
ABAYRXRYRXRD→AYR→XRYR→XRD→CD
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≥1LkLkL