Contextvrije taal

In de theoretische informatica is een contextvrije taal een formele taal die door een contextvrije grammatica gegenereerd wordt. Een alternatieve karakterisering van een contextvrije taal is een taal die door een stapelautomaat geaccepteerd wordt.

In de Chomskyhiërarchie zitten de contextvrije talen tussen de reguliere en contextsensitieve talen in. Elke reguliere taal is ook een contextvrije taal en elke contextvrije taal ook een contextsensitieve. Aan de andere kant bestaan er contextvrije talen die niet regulier zijn en contextsensitieve talen die niet contextvrij zijn. Omdat contextvrije talen aan de ene kant niet zo begrensd zijn als reguliere talen, maar aan de andere kant begrensd genoeg om efficiënt herkend (geparsed) te worden, worden contextvrije talen vaak gebruikt in natuurlijke taalherkenning en in de compilerbouw.

Voorbeelden

  • Laat het alfabet Σ = { 0 , 1 } {\displaystyle \Sigma =\{0,1\}} zijn. De taal L 1 = { 0 n 1 n n 0 } {\displaystyle L_{1}=\{0^{n}1^{n}\mid n\geq 0\}} is contextvrij maar niet regulier. Ze is contextvrij omdat ze wordt gegenereerd door de contextvrije grammatica met de regels S 0 S 1 {\displaystyle S\to 0S1} en S ϵ {\displaystyle S\to \epsilon } . Dat ze niet regulier is kan aangetoond worden met behulp van het pomplemma.
  • Laat het alfabet Σ = { a , b , c } {\displaystyle \Sigma =\{a,b,c\}} zijn. De taal L 2 = { w Σ # a ( w ) # b ( w )  of  # a ( w ) # c ( w ) } {\displaystyle L_{2}=\{w\in \Sigma ^{*}\mid \#_{a}(w)\neq \#_{b}(w){\text{ of }}\#_{a}(w)\neq \#_{c}(w)\}} is contextvrij (waar # a ( w ) {\displaystyle \#_{a}(w)} het aantal a {\displaystyle a} 's in het woord w {\displaystyle w} aangeeft). Het complement van L 2 {\displaystyle L_{2}} is echter de taal L 2 c = { w Σ # a ( w ) = # b ( w ) = # c ( w ) } {\displaystyle L_{2}^{c}=\{w\in \Sigma ^{*}\mid \#_{a}(w)=\#_{b}(w)=\#_{c}(w)\}} , en die taal is niet contextvrij.

Afsluiteigenschappen

Contextvrije talen zijn afgesloten onder de volgende bewerkingen:

  • vereniging: als L 1 {\displaystyle L_{1}} en L 2 {\displaystyle L_{2}} contextvrije talen zijn, dan is ook L 1 L 2 {\displaystyle L_{1}\cup L_{2}} een contextvrije taal;
  • concatenatie: als L 1 {\displaystyle L_{1}} en L 2 {\displaystyle L_{2}} contextvrije talen zijn, dan is ook L 1 L 2 = { w 1 w 2 w 1 L 1 , w 2 L 2 } {\displaystyle L_{1}L_{2}=\{w_{1}w_{2}\mid w_{1}\in L_{1},w_{2}\in L_{2}\}} een contextvrije taal;
  • Kleene-ster: als L {\displaystyle L} een contextvrije taal is, dan is ook L = { w 1 w n w 1 , , w n L } {\displaystyle L^{*}=\{w_{1}\ldots w_{n}\mid w_{1},\ldots ,w_{n}\in L\}} een contextvrije taal;
  • toepassing van homomorphismen en inverse homomorphismen: als L {\displaystyle L} een contextvrije taal is en φ {\displaystyle \varphi } een homomorphisme, dan zijn ook φ ( L ) {\displaystyle \varphi (L)} en φ 1 ( L ) {\displaystyle \varphi ^{-1}(L)} contextvrije talen.

In tegenstelling tot de reguliere talen zijn de contextvrije talen niet afgesloten onder complement, doorsnede of verschil. Ze zijn echter afgesloten onder doorsnede met reguliere talen. Dat wil zeggen: als L {\displaystyle L} een contextvrije en R {\displaystyle R} een reguliere taal is, dan is L R {\displaystyle L\cap R} een contextvrije taal.

Beslissingsproblemen

Voor contextvrije talen (beschreven door een contextvrije grammatica of een stapelautomaat), zijn onder andere de volgende beslissingsproblemen beslisbaar:

  • Het woordprobleem: gegeven een contextvrije taal L {\displaystyle L} en een woord w {\displaystyle w} , geldt w L {\displaystyle w\in L} . Als L {\displaystyle L} gegeven is als contextvrije grammatica, kan het woordprobleem met het CYK-algoritme in O ( n 3 ) {\displaystyle O(n^{3})} opgelost worden, waar n {\displaystyle n} de lengte van het invoerwoord w {\displaystyle w} is.
  • Het leegteprobleem: gegeven een contextvrije taal L {\displaystyle L} , beslis of L = {\displaystyle L=\emptyset } .
  • Het eindigheidsprobleem: gegeven een contextvrij taal L {\displaystyle L} , beslis of L {\displaystyle L} oneindig veel woorden bevat.

Het equivalentieprobleem (gegeven contextvrije talen L 1 {\displaystyle L_{1}} en L 2 {\displaystyle L_{2}} , beslis of L 1 = L 2 {\displaystyle L_{1}=L_{2}} ) is echter voor contextvrije talen niet beslisbaar.