Che cos'è una grammatica senza contesto?


104

Qualcuno può spiegarmi cos'è una grammatica libera dal contesto? Dopo aver guardato la voce di Wikipedia e poi la voce di Wikipedia sulla grammatica formale, sono rimasto completamente e totalmente confuso. Qualcuno sarebbe così gentile da spiegare cosa sono queste cose?

Mi chiedo questo perché desidero indagare sull'analisi, e anche sul lato, sulla limitazione di un motore di regex.

Non sono sicuro che questi termini siano direttamente correlati alla programmazione o se siano più legati alla linguistica in generale. Se è così, mi scuso, forse questo potrebbe essere spostato in tal caso?


2
È più correlato aAutomata Theorem
Rahul

2
Se sei interessato ai linguaggi formali e alla teoria degli automi per l'analisi, ti suggerisco un libro come Sudkamp's Languages ​​and Machines o Aho, Sethi & Ullman's Compilers . Ogni libro fornisce una descrizione formale di una grammatica libera dal contesto, che è un tipo di grammatica formale, quindi afferma e dimostra i teoremi di base sulle grammatiche libere dal contesto necessarie per comprenderle (come il lemma di pompaggio per lingue libere dal contesto e la conversione e teoremi della forma normale). Non vi è alcun prerequisito matematico per l'apprendimento della teoria del linguaggio formale oltre una comprensione superficiale della teoria degli insiemi.
danportin

1
Tali domande non dovrebbero essere migrate all'informatica teorica?
Pale Blue Dot

Risposte:


110

Una grammatica libera dal contesto è una grammatica che soddisfa determinate proprietà. In informatica, le grammatiche descrivono le lingue; in particolare, descrivono linguaggi formali.

Un linguaggio formale è solo un insieme (termine matematico per una raccolta di oggetti) di stringhe (sequenze di simboli ... molto simile all'uso di programmazione della parola "stringa"). Un semplice esempio di linguaggio formale è l'insieme di tutte le stringhe binarie di lunghezza tre, {000, 001, 010, 011, 100, 101, 110, 111}.

Le grammatiche funzionano definendo le trasformazioni che puoi apportare per costruire una stringa nella lingua descritta da una grammatica. La grammatica dirà come trasformare un simbolo di inizio (solitamente S) in una stringa di simboli. Una grammatica per la lingua data prima è:

S -> BBB
B -> 0
B -> 1

Il modo per interpretarlo è dire che Spuò essere sostituito da BBB, e Bpuò essere sostituito da 0 e Bpuò essere sostituito da 1. Quindi per costruire la stringa 010 possiamo fare S -> BBB -> 0BB -> 01B -> 010.

Una grammatica senza contesto è semplicemente una grammatica in cui l'elemento che stai sostituendo (a sinistra della freccia) è un singolo simbolo "non terminale". Un simbolo non terminale è un qualsiasi simbolo che usi nella grammatica che non può apparire nelle stringhe finali. Nella grammatica precedente, "S" e "B" sono simboli non terminali e "0" e "1" sono simboli "terminali". Grammatiche piace

S -> AB
AB -> 1
A -> AA
B -> 0

Non sono regolari poiché contengono regole come "AB -> 1".


12
Con "non regolare" intendi "non privo di contesto"? (perché il linguaggio rappresentabile dai CFG è un superinsieme di quelli rappresentabili dalle espressioni regolari)
Anti Earth

3
"S può essere sostituito da B" leggere "S può essere sostituito da BBB"?
Cosmo Harrigan

4
Buon Dio, questa è una delle risposte meglio spiegate che ho visto su SO.
Rafael Dias da Silva

1
@AntiEarth il secondo esempio non è una grammatica regolare perché ha regole che generano due simboli non terminali da un singolo simbolo non terminale, cosa non consentita nelle grammatiche regolari (inoltre, come ha sottolineato OP, ha regole con più simboli non terminali su la sinistra). en.wikipedia.org/wiki/Regular_grammar
awwsmm

21

La teoria del linguaggio è correlata alla teoria del calcolo. Qual è il lato più filosofico dell'informatica, sul decidere quali programmi sono possibili, o quali potranno mai essere scritti, e quale tipo di problemi è impossibile scrivere con un algoritmo per risolvere.

Un'espressione regolare è un modo per descrivere un linguaggio regolare. Un linguaggio regolare è un linguaggio che può essere deciso da un automa finito deterministico.

Dovresti leggere l'articolo su Finite State Machines: http://en.wikipedia.org/wiki/Finite_state_machine

E lingue regolari: http://en.wikipedia.org/wiki/Regular_language

Tutte le lingue normali sono lingue libere dal contesto, ma ci sono lingue libere dal contesto che non sono regolari. Un Context Free Language è l'insieme di tutte le stringhe accettate da un Context Free Grammer o un Pushdown Automata che è una macchina a stati finiti con un unico stack: http://en.wikipedia.org/wiki/Pushdown_automaton#PDA_and_Context-free_Languages

Esistono linguaggi più complicati che richiedono una macchina di Turing (qualsiasi programma possibile che puoi scrivere sul tuo computer) per decidere se una stringa è nella lingua o meno.

La teoria del linguaggio è anche molto correlata al problema P vs. NP e ad altre cose interessanti.

Il mio libro di testo di Introduzione all'informatica del terzo anno è stato piuttosto bravo a spiegare queste cose: Introduzione alla teoria del calcolo. Di Michael Sipser. Ma mi è costato $ 160 per comprarlo nuovo e non è molto grande. Forse puoi trovare una copia usata o trovarne una copia in una biblioteca o qualcosa che potrebbe aiutarti.

MODIFICARE:

I limiti delle espressioni regolari e delle classi linguistiche superiori sono stati studiati moltissimo negli ultimi 50 anni circa. Potresti essere interessato al lemma di pompaggio per le lingue normali. È un mezzo per dimostrare che una certa lingua non è regolare:

http://en.wikipedia.org/wiki/Pumping_lemma_for_regular_languages

Se una lingua non è regolare potrebbe essere Context Free, il che significa che potrebbe essere descritta da un Context Free Grammer, o potrebbe essere anche in una classe di lingua superiore, potresti provare che non è Context Free dal lemma di pompaggio per Context Free linguaggi che è simile a quello delle espressioni regolari.

Una lingua può anche essere indecidibile, il che significa che anche una macchina di Turing (può essere eseguito un programma che il tuo computer può eseguire) non può essere programmata per decidere se una stringa deve essere accettata come nella lingua o rifiutata.

Penso che la parte che ti interessa di più sia la macchina a stati finiti (sia deterministica che deterministica) per vedere quali lingue può decidere un'espressione regolare e il lemma pompante per dimostrare quali lingue non sono regolari.

Fondamentalmente una lingua non è regolare se ha bisogno di una sorta di memoria o capacità di contare. Il linguaggio delle parentesi corrispondenti non è regolare ad esempio perché la macchina ha bisogno di ricordare se ha aperto una parentesi per sapere se deve chiuderla.

La lingua di tutte le stringhe che utilizzano le lettere aeb che contengono almeno tre b è una lingua normale: a ba ba ba

La lingua di tutte le stringhe che utilizzano le lettere aeb che contengono più b di a non è regolare.

Inoltre non dovresti che tutti i linguaggi finiti siano regolari, ad esempio:

Il linguaggio di tutte le stringhe di lunghezza inferiore a 50 caratteri che utilizzano le lettere aeb che contengono più b di a è regolare, poiché è finito sappiamo che potrebbe essere descritto come (b | abb | bab | bba | aabbb | ababb |. ..) ect finché non vengono elencate tutte le possibili combinazioni.


1
Le espressioni regolari non sono programmi decisionali che confrontano le stringhe con i modelli. Sono espressioni che denotano insiemi regolari, per i quali il problema dell'appartenenza è decidibile.
danportin

1
Se un set è regolare è ovviamente decidibile. Non sono sicuro di come dirlo altrimenti. Sono effettivamente programmi decisionali che non hanno memoria.
Paul

Stai descrivendo automi finiti deterministici, che forniscono una procedura decisionale per linguaggi regolari ("programmi decisionali che non hanno memoria"). Le espressioni regolari sono termini che denotano linguaggi regolari, non i programmi sono procedure. Questa era la mia unica lamentela.
danportin

1
L'ho cambiato in "Un'espressione regolare è un modo di descrivere un linguaggio regolare. Un linguaggio regolare è un linguaggio che può essere deciso da un automa finito deterministico". Suona meglio?
Paul
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.