Home Hardware Networking Programmazione Software Domanda Sistemi
Conoscenza del computer >> Programmazione >> Computer Programming Languages >> .

Come si può dimostrare che una lingua è senza contesto?

Esistono diversi modi per dimostrare che una lingua è senza contesto. Ecco una ripartizione delle tecniche e delle considerazioni comuni:

1. Fornire una grammatica senza contesto (CFG):

* Il metodo più diretto e frequentemente usato. Se riesci a progettare un CFG che genera * esattamente * le stringhe nella lingua, hai dimostrato che è senza contesto.

* Definizione CFG: Un CFG è costituito da:

* * Non-terminali (variabili):* rappresentato da lettere maiuscole (ad esempio, `s`,` a`, `b`).

* * Terminali:* I simboli dell'alfabeto della lingua (ad esempio, `A`,` b`, `0`,` 1`).

* * Avvia simbolo:* Un distinto non terminale (di solito `s`).

* * Regole di produzione:* Regole del modulo `non terminal -> stringa di terminali e/o non terminali` (ad esempio,` s -> asb | ε`).

* Come usare: Mostra che ogni stringa nel linguaggio può essere derivata dal simbolo iniziale usando le regole di produzione. Inoltre, dimostra che la grammatica * non * genera alcuna stringhe che * non * nella lingua.

* Esempio:

* Lingua:l ={a n B n | n ≥ 0} (stringhe con uguale numero di "a e" b's, in quell'ordine)

* Cfg:

* `S -> asb | ε` (dove ε rappresenta la stringa vuota)

* Spiegazione:

* `S` genera il modello principale` asb`.

* Applicando ricorsivamente la regola `s -> asb`, è possibile creare un numero qualsiasi di` A`s e `b`s, garantendo che siano bilanciati.

* La regola `s -> ε` consente di interrompere la ricorsione e produrre la stringa vuota (che è anche nella lingua quando n =0).

2. Fornire un Automaton Pushdown (PDA):

* equivalente a CFGS: Qualsiasi lingua accettata da un PDA è senza contesto e viceversa. Questa equivalenza è un risultato fondamentale nella teoria degli automi.

* Definizione PDA: Un PDA è un automobile finito con uno stack. Può leggere simboli di input, cambiare il suo stato e spingere o pop simboli dallo stack.

* Come usare: Progetta un PDA che accetta esattamente le corde nella lingua. Spesso lo stack viene utilizzato per tenere traccia dei simboli "senza pari".

* Esempio (per la stessa lingua l ={a n B n | n ≥ 0}):

* Il PDA legge 'A e li spinge sullo stack.

* Quando incontra un 'B', fa scoppiare una 'A' dallo stack.

* Il PDA accetta se ha letto tutto l'input e lo stack è vuoto.

* Importante: Specificare come il PDA passa tra gli stati in base ai simboli di input e al contenuto dello stack.

3. Usa le proprietà di chiusura:

* Le lingue senza contesto sono chiuse in determinate operazioni. Ciò significa che se sai che alcune lingue sono prive di contesti, puoi combinarle utilizzando queste operazioni per creare nuove lingue senza contesto.

* Proprietà di chiusura:

* Unione: Se L1 e L2 sono privi di contesti, allora L1 ∪ L2 è privo di contesto.

* Concatenazione: Se L1 e L2 sono privi di contesti, allora L1L2 è privo di contesto.

* Kleene Star ( *): Se L è senza contesto, allora L* è senza contesto.

* Omomorfismo: Se L è privo di contesto e `h` è un omomorfismo (una funzione che mappa simboli alle stringhe), allora` h (l) `è privo di contesto.

* Omomorfismo inverso: Se L è senza contesto e `h` è un omomorfismo, allora` h -1 (L) `è senza contesto. (L'omomorfismo inverso prende una stringa come input e restituisce l'insieme di stringhe che, quando viene applicato l'omomorfismo, ti danno la stringa di input).

* Come usare: Decomponi la lingua di destinazione in lingue più semplici che * già conosci * sono prive di contesto e quindi combinarle usando le proprietà di chiusura.

* Esempio:

* Mostra che l ={a n B n C m D m | n, m ≥ 0} è privo di contesto.

* L1 ={a n B n | n ≥ 0} è privo di contesto (lo sappiamo già).

* L2 ={c m D m | m ≥ 0} è privo di contesto (simile a L1).

* L =L1L2 (la concatenazione di L1 e L2).

* Poiché L1 e L2 sono privi di contesti e le lingue prive di contesto sono chiuse in concatenazione, L è senza contesto.

4. Pompare lemma per lingue senza contesto (per dimostrare una lingua non è * senza contesto):

* Importante: Il lemma di pompaggio viene utilizzato per * confutare * che una lingua è priva di contesto. Non può essere usato per dimostrare che una lingua * è * senza contesto.

* Come funziona: Il lemma di pompaggio afferma che per qualsiasi linguaggio privo di contesto L, esiste una lunghezza di pompaggio "P" in modo tale che qualsiasi "S" in L con lunghezza almeno "P" può essere divisa in cinque parti, s =uvxyz, dove:

1. | VXY | ≤ p (la porzione centrale non è troppo lunga)

2. | Vy | ≥ 1 (la parte da ripetere non è vuota)

3. Per tutti i ≥ 0, UV i xy i Z è in L (è possibile ripetere 'V' e 'y' in ogni numero di volte e la stringa risultante è ancora nella lingua).

* Prova per contraddizione:

1. Supponiamo che la lingua sia senza contesto.

2. Supponiamo che esista una lunghezza di pompaggio 'p' come descritto nel lemma.

3. Scegli una stringa "S" nella lingua più lunga di "P". La scelta di "s" è cruciale. Dovrebbe avere proprietà che rendono problematico il pompaggio.

4. Considera * tutti i modi possibili * di dividere "s" in "uvxyz" che soddisfano le condizioni 1 e 2 del lemma di pompaggio.

5. Per * ciascuno * Possibile divisione, mostra che esiste un 'i' (di solito i =0 o i =2) in modo tale che Uv i xy i Z non è * nella lingua.

6. Ciò contraddice il lemma di pompaggio, quindi il presupposto iniziale che la lingua sia priva di contesto deve essere falsa.

Quale metodo usare:

* Costruzione grammatica/PDA: Il modo più comune e spesso più semplice per mostrare una lingua * è * senza contesto. Scegli qualunque (CFG o PDA) sia più facile da costruire per il linguaggio specifico. Se la lingua sembra coinvolgere strutture nidificate o ricorsive, una grammatica è spesso un buon punto di partenza. Se la lingua si presta a un comportamento simile a uno stack, prendi in considerazione l'uso di un PDA.

* Proprietà di chiusura: Utile quando la lingua può essere espressa come una combinazione di lingue più semplici e già senza contesto.

* Pumping Lemma: Esclusivamente per mostrare una lingua * non * senza contesto.

Considerazioni importanti:

* Le lingue regolari sono prive di contesto: Ogni lingua normale è anche senza contesto. Se puoi mostrare che una lingua è regolare (fornendo un DFA, NFA o espressione regolare), hai anche dimostrato che è privo di contesto. Tuttavia, spesso un CFG o un PDA sarà l'approccio più semplice se la lingua è * ovviamente * senza contesto.

* PDA non deterministici: In generale, i PDA sono non deterministici. I PDA deterministici (DPDA) sono meno potenti; Accettano un sottoinsieme adeguato delle lingue senza contesto (chiamate lingue deterministiche senza contesto). Se non esplicitamente, puoi supporre che tu abbia a che fare con lingue generali (non deterministiche) senza contesto.

* Definizione attenta: Che tu stia progettando una grammatica o un PDA, sii molto preciso nelle tue definizioni. Evita l'ambiguità e spiega chiaramente come funziona la tua costruzione.

* Esempi: Lavora attraverso numerosi esempi per ottenere una buona comprensione di queste tecniche. La pratica è la chiave!

In sintesi, per * dimostrare * una lingua è priva di contesto, costruire un CFG o PDA per esso o dimostrare la sua fine del contesto attraverso le proprietà di chiusura. Usa il lemma di pompaggio per le lingue senza contesto per mostrare che una lingua non è * senza contesto. Buona fortuna!

 

Programmazione © www.354353.com