Jak udowodnić, że język jest pozbawiony kontekstu?

26

Istnieje wiele technik, aby udowodnić, że język nie jest pozbawiony kontekstu, ale jak udowodnić, że język jest pozbawiony kontekstu?

Jakie są techniki, aby to udowodnić? Oczywiście jednym ze sposobów jest wykazanie gramatyki bezkontekstowej dla tego języka. Czy istnieją jakieś systematyczne techniki znajdowania gramatyki bezkontekstowej dla danego języka?

Dla stałych języków, nie systematyczne sposoby w celu uzyskania regularnego automat gramatyka / skończonych Stan: na przykład, Myhill-Nerode twierdzenie zapewnia jeden sposób. Czy istnieje odpowiednia technika dla języków bezkontekstowych?


Moją motywacją jest (mam nadzieję) zbudowanie pytania referencyjnego zawierającego listę technik, które często są pomocne, gdy próbuję udowodnić, że dany język jest pozbawiony kontekstu. Ponieważ mamy tutaj wiele pytań, które są tego szczególnymi przypadkami, byłoby dobrze, gdybyśmy mogli udokumentować ogólne podejście lub ogólne techniki, których można użyć w obliczu tego rodzaju problemu.

DW
źródło
Pozwólcie, że zostawię moją zwykłą notatkę: gdy zapewniam gramatykę bezkontekstową dla danego języka, potrzebujesz dowodu poprawności, który może sprawić, że podejście będzie raczej niewygodne.
Raphael
Aby uczynić to właściwe pytanie referencyjne, możemy zadać problematycznym wywrotkom, czy mógłbyś dodać odpowiedź na temat wymyślania gramatyk i automatów, być może każdego z nich? Dzięki!
Raphael
Dopóki materiał nie zostanie tu przeniesiony, zwróć uwagę, że Rick Decker i babou zebrali kilka typowych bezkontekstowych idiomów na podwójne pytanie .
Raphael

Odpowiedzi:

13

Praktycznym podejściem, które w wielu przykładach działa [ale nie zawsze, wiem] jest próba znalezienia zagnieżdżonej struktury ciągów w języku. „Zagnieżdżone zależności” muszą być generowane jednocześnie w różnych częściach łańcucha.

Mamy również podstawowy zestaw narzędzi :

  1. konkatenacja: jeśli możesz podzielić język na dwie kolejne części, użyj tej produkcjiSS1S2

  2. związek: podzielony na części rozłączneSS1S2

  3. iteracja:SS1Sε

Przykład 1

Oto przykład zagnieżdżenia (dziękuję Raphael).

L={bkal(bc)manbok,l,m,n,oN,ko,2l=n,m2}

Zamień na . Możemy teraz upuścić w warunkach.2 l nn2ln

Zamień na (mylić? to „oh”, a nie „zero”). Zastosuj narzędzia do unii. Pracujemy tutaj z . Również iff oraz gdzie jest nową zmienną. Zamień na .k > o  lub  k < o o k > okok>o or k<ook>ok = s + o s > 0 s k s + ok>ok=s+os>0sks+o

L1={bs+oal(bc)ma2lbol,m,o,sN,s>0,m2}

Kilka prostych przeróbek.

L1={bbsboalbcbc(bc)m(aa)lbol,m,o,sN}

Teraz widzimy strukturę zagnieżdżania i zaczynamy budować gramatykę.

T b U U b U εS1TV , , (patrz: konkatenacja i iteracja tutaj)TbUUbUε

o bVbVbW (generujemy po obu stronach)o b

WaWaaX

Y b c b c Z b c Z εXYZ , ,YbcbcZbcZε

Przykład 2

K={akblcml=m+k}

Pierwsze „oczywiste” przepisanie.

K={akbm+kcmm,k0}={akbmbkcmm,k0}

W językoznawstwie nazywa się to „zależnością międzyseryjną”: przeplatanie (zwykle) silnie wskazuje na brak kontekstu. Oczywiście i jesteśmy zbawieni.m + k = k + mk,m,k,mm+k=k+m

K={akbk+mcmm,k0}={akbkbmcmm,k0}

z produkcjami , ,X a X b ε Y b Y c εSXYXaXbεYbYcε

PodobnieK={akblcmm=k+l}={akblclckk,l0}

z produkcjami ,X b X c εSaScXXbXcε


Komentarz końcowy: te techniki pomogą ci opracować kandydatową gramatykę bezkontekstową, która, mam nadzieję, rozpozna twój język. Konieczny może być jeszcze dowód poprawności , aby gramatyka naprawdę rozpoznała Twój język (nic więcej i nic mniej).

Hendrik Jan
źródło
11

Istnieje jedna charakterystyka CFL, która może być użyteczna, twierdzenie Chomsky'ego-Schützenbergera .

Język Dyck

Niech alfabet. Definiujemy język Dyck D_T z za pomocą gramatyki bezkontekstowej z podanym przezD TT T G = ( {DT(TT^)TδG=({S},TT^,δ,S)δ

SaSa^Sε,aT .

Twierdzenie Chomsky'ego-Schützenbergera

LΣ jest bezkontekstowy tylko wtedy, gdy istnieją

  • alfabet ,T
  • zwykły język iR(TT^)
  • homomorfizmψ:(TT^)Σ

po to aby

L=ψ(DTR) .

Zauważ, że homomorfizm rozciąga się na słowa (symbol po symbolu), a następnie na języki (słowo po słowie).

Przykład

Rozważ . ZL={anbncmn,mN

  • T = { ] , }T={[,} (i kanonicznie ),T^={],}
  • R=L([]) i
  • ψ(x)={a,x=[b,x= ]ε,x=c,x= 

twierdzenie implikuje, że jest pozbawiony kontekstu, w szczególności od tego czasuL

DTR={[n]nmmn,mN} .

Przykład 2

Pokaż, że jest pozbawiony kontekstu.L={bkal(bc)manbok,l,m,n,oN,ko,2l=n,m2}

Potrzebujemy tutaj jednego rodzaju nawiasów dla , jednego dla , jednego dla i drugiego używanego do modelowania które powodują . Używamyabcbbko

  • T={[,,,<} ,
  • R=L(<+>+[++])L([++]<+>+) i
  • ψ(x)={b,x{,,<}a,x=[aa,x= ]bc,x=ε,else

i zastosuj twierdzenie. Aby zobaczyć, że , nie potrzebujemy więcej niż fakt, że pasujące symbole (np. I ) muszą występować równie często w dowolnym . Dodając to ograniczenie do wyrażeń regularnych, przez które zdefiniowaliśmy , otrzymujemyL=ψ(DTR)[]wDTR

DTR={<p>po[lmm]lop1,o0,l0,m2} {}

i tym razem

ψ(DTR)={bp+oal(bc)ma2lbop1,o0,l0,m2} {}={bkal(bc)manbok,l,m,n,oN,k>o,2l=n,m2} {}=L.

Do gramatyki i automatów

Jeśli w końcu chcemy mieć automat lub gramatykę, mamy przed sobą jeszcze trochę pracy.

  • W kierunku automat skonstruować NPDA dla i NFA dla . Pierwszy z nich jest standardowy, a my mamy algorytmy dla drugiego, pod warunkiem, że język jest podany w odpowiedniej reprezentacji (patrz również tutaj ). Oba przecięcie to kolejna standardowa konstrukcja i można zastosować do każdego przejścia osobno.DTψRψ

  • W kierunku gramatyki, zbuduj ją dla (znowu, powinno być standardowe), weź tę dla i je . Następnie zastosuj do zestawu reguł (symbol dla symbolu).R ψDTψ

Prawdopodobnie jest to łatwe, ponieważ algorytmiczne; złożoność polega na znalezieniu odpowiedniego , i . Nie wiem, czy to podejście jest (często) prostsze niż bezpośrednie tworzenie PDA / gramatyki, ale może pozwolić skupić się na ważnych cechach danego języka. Spróbuj sam!R ψTRψ

Raphael
źródło
Nie można rozstrzygnąć, czy dany język jest pozbawiony kontekstu.
reinierpost