Come dimostrare che una lingua è senza contesto?


26

Esistono molte tecniche per dimostrare che una lingua non è senza contesto, ma come posso dimostrare che una lingua è senza contesto?

Quali tecniche ci sono per dimostrarlo? Ovviamente, un modo è esibire una grammatica senza contesto per la lingua. Esistono tecniche sistematiche per trovare una grammatica senza contesto per una determinata lingua?

Per le lingue normali, ci sono modi sistematici per ricavare un normale automa grammaticale / a stati finiti: ad esempio, il teorema di Myhill-Nerode fornisce un modo. Esiste una tecnica corrispondente per linguaggi senza contesto?


La mia motivazione qui è (si spera) costruire una domanda di riferimento che contenga un elenco di tecniche che sono spesso utili, quando si cerca di dimostrare che una determinata lingua è senza contesto. Dato che qui abbiamo molte domande su casi particolari di questo, sarebbe bello se potessimo documentare l'approccio generale o le tecniche generali che si possono usare per affrontare questo tipo di problema.


Permettetemi di lasciare la mia solita nota: quando si fornisce una grammatica senza contesto per la lingua a portata di mano, è necessaria una prova di correttezza che può rendere l'approccio piuttosto ingombrante.
Raffaello

Per rendere questa una domanda di riferimento adeguata che possiamo porre ai dumpers problematici, potresti aggiungere una risposta su come elaborare grammatiche e automi, magari con un esempio ciascuno? Grazie!
Raffaello

Fino a quando il materiale non viene spostato qui, nota che Rick Decker e Babou hanno raccolto alcuni idiomi tipici senza contesto in una domanda duplicata .
Raffaello

Risposte:


13

Un approccio pratico che in molti esempi funziona [ma non sempre, lo so] sta cercando di trovare la struttura di annidamento delle stringhe nella lingua. Le "dipendenze nidificate" devono essere generate contemporaneamente in diverse parti della stringa.

Inoltre abbiamo la cassetta degli attrezzi di base :

  1. concatenazione: SS1S2 se puoi dividere la lingua in due parti consecutive usa questa produzione

  2. unione: SS1S2 divisa in parti disgiunte

  3. iterazione: SS1Sε

Esempio 1

Ecco un esempio per l'annidamento (grazie Raffaello).

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

Sostituire con 2 l . Ora possiamo rilasciare n in condizioni.n2ln

Sostituisci con k > o  oppure  k < o (confuso? O è 'oh' non 'zero'). Applicare strumenti per l'unione. Lavoriamo con k > o qui. Inoltre k > o iff k = s + o e s > 0 dove s è una nuova variabile. Sostituisci k con s + o .kok>o or k<ook>ok>ok=s+os>0sks+o

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

Alcune semplici riscritture.

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

Ora vediamo la struttura di nidificazione e iniziamo a costruire una grammatica.

, T b U , U b U ε (vedi: concatenazione e iterazione qui)S1TVTbUUbUε

(generiamo o b 's su entrambi i lati)VbVbWo b

WaWaaX

, Y b c b c , Z b c Z εXYZYbcbcZbcZε

Esempio 2

K={akblcml=m+k}

Una prima riscrittura "ovvia".

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

In linguistice questo si chiama "dipendenza cross-seriale": l'interleaving (di solito) indica fortemente non-contesto. Naturalmente m + k = k + m e siamo salvati.k,m,k,mm+k=k+m

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

con produzioni , X a X b ε , Y b Y c εSXYXaXbεYbYcε

Allo stesso modo K={akblcmm=k+l}={akblclckk,l0}

con produzioni , X b X c εSaScXXbXcε


Commento finale: queste tecniche ti aiutano a trovare una grammatica candidata senza contesto che si spera riconoscerà la tua lingua. Potrebbe essere ancora necessaria una prova di correttezza , per garantire che la grammatica funzioni davvero per riconoscere la tua lingua (niente di più e niente di meno).


11

Esiste una caratterizzazione del CFL che può essere utile, il teorema di Chomsky-Schützenberger .

Linguaggio Dyck

Lascia a un alfabeto. Definiamo la Dyck -Lingua D T( T T ) * del T dal contesto privo grammatica G = ( { S } , T T , δ , S ) con δ proposta dalTDT(TT^)TG=({S},TT^,δ,S)δ

.SaSa^Sε,aT

Teorema di Chomsky-Schützenberger

è senza contesto se e solo se ci sonoLΣ

  • un alfabeto ,T
  • un linguaggio regolare eR(TT^)
  • omomorfismo ψ:(TT^)Σ

così che

.L=ψ(DTR)

Si noti che l'omomorfismo è esteso alle parole (simbolo per simbolo) e quindi alle lingue (parola per parola).

Esempio

Considerare . ConL={anbncmn,mN

  • (e, canonicamente, T = { ] , }T={[,}T^={],}),
  • R=L([]) and
  • ψ(x)={a,x=[b,x= ]ε,x=c,x= 

the theorem implies that L is context-free, in particular since

DTR={[n]nmmn,mN}

Esempio 2

L={bkal(bc)manbok,l,m,n,oN,ko,2l=n,m2} is context-free.

Here, we need one type of parentheses for a, one for bc, one for b, and another used to model the b that cause ko. We use

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

and apply the theorem. In order to see that L=ψ(DTR), we don't need more than the fact that matching symbols (e.g. [ and ]) have to occur equally often in any wDT. Adding this contraint to the regular expressions we defined R by, we get

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

and therewith

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

To grammars and automata

If we want to have an automaton or grammar in the end, we have some more work ahead of us.

  • Towards an automaton, construct the NPDA for DT and an NFA for R. The former is standard and we have algorithms for the latter, provided the language is given in a suitable representation (see also here). Intersection both is another standard construction and ψ can be applied to every transition individually.

  • Towards a grammar, build one for R (again, should be standard), take the one for DT and intersect them. Then apply ψ to the rule set (symbol for symbol).

Arguably, this is easy since algorithmic; the complexity lies in finding suitable T, R and ψ. I don't know if this approach is (often) simpler than constructing PDA/grammars directly but it may allow to focus on the important features of the language at hand. Try for yourself!


It is undecidable whether any given language is context-free.
reinierpost
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.