1. Costruire un automatico finito (FA) o deterministico Automate finito (DFA)
* Spiegazione: Se puoi costruire un DFA o NFA (automobile finito non deterministico) che accetta * tutto * e * solo * le stringhe nella lingua, allora la lingua è regolare.
* Come farlo:
* Definisci gli stati: Gli stati della tua FA rappresentano la "memoria" di ciò che è stato visto finora nella stringa di input. Pensa a quali informazioni sono essenziali per ricordare di determinare se la stringa è nella lingua.
* Definisci le transizioni: Le transizioni determinano il modo in cui la FA si sposta da stato a stato in base ai simboli di input. Assicurati che le tue transizioni riflettano correttamente le regole della lingua.
* Definisci lo stato di partenza: Dove l'automa inizia l'elaborazione.
* Definisci gli stati accettanti: Gli stati che indicano la stringa sono nella lingua.
* Esempio: Considera la lingua l ={stringhe su {a, b} che contengono "ab" come sottostringa}.
`` `
Stati:Q0 (Start), Q1, Q2 (accettazione)
Transizioni:
- Q0, A -> Q1 (visto un 'A' finora, potenzialmente porta a "AB")
- Q0, B -> Q0 (visto a 'B', reset)
- Q1, A -> Q1 (visto 'AA' finora, ancora alla ricerca di "AB")
- Q1, B -> Q2 (visto 'AB'!)
- Q2, A -> Q2 (già visto 'AB', quindi ogni ulteriore input ci fa accettare)
- Q2, B -> Q2 (già visto 'AB', quindi ogni ulteriore input ci fa accettare)
State State:Q0
Accettazione dello stato:Q2
`` `
Puoi disegnare un diagramma di stato per visualizzare questa FA.
2. Costruire un'espressione regolare
* Spiegazione: Se riesci a scrivere un'espressione regolare che descrive * tutte * e * solo * le stringhe nella lingua, allora la lingua è regolare.
* Come farlo:
* Comprendi gli operatori di espressione regolare di base:
* Concatenation:`AB` (abbina la stringa" AB ")
* Unione (o):`a | b` (corrispondenze" a "o" b ")
* Kleene Star (zero o più ripetizioni):`a*` (abbina "", "a", "aa", "aaa", ...)
* Kleene Plus (una o più ripetizioni):`a+` (corrisponde "a", "aa", "aaa", ...)
* Parentesi per il raggruppamento:`(a | b) c` (corrisponde a" ac "o" bc ")
* Classi di personaggi:`[ABC]` (abbina 'a', 'b' o 'c')
* Gamme:`[a-z]` (abbina qualsiasi lettera minuscola)
* Abbattere il linguaggio in parti più piccole e combinarle usando gli operatori.
* Esempio: Usando la stessa lingua l ={stringhe su {a, b} che contengono "ab" come sottostringa}.
L'espressione regolare è:`(a | b)*ab (a | b)*`
* `(A | B)*` significa zero o più occorrenze di 'A' o 'B' (qualsiasi stringa di 'A e' B).
* `AB` è la sottostringa richiesta.
* `(A | B)*` consente di nuovo qualsiasi stringa di 'A e' B's* dopo* "AB".
3. Utilizzo delle proprietà di chiusura delle lingue regolari
* Spiegazione: Le lingue regolari sono chiuse sotto determinate operazioni. Ciò significa che se si applica queste operazioni a lingue regolari, il risultato è anche una lingua normale. Le proprietà di chiusura comuni includono:
* Unione
* Concatenazione
* Kleene Star
* Intersezione
* Complementazione
* Differenza
* Inversione
* Omomorfismo (sostituzione)
* Come farlo:
1. Mostra che la lingua può essere costruita da linguaggi regolari più semplici e noti utilizzando le operazioni di chiusura.
2. Ad esempio, se puoi dimostrare che la tua lingua è l'unione di due lingue regolari, hai dimostrato che è regolare.
* Esempio: Sia l1 ={stringhe su {a, b} a partire da 'a'} e l2 ={stringhe su {a, b} che terminano con 'b'}. Sia L1 che L2 sono regolari (puoi facilmente scrivere espressioni regolari per loro:`a (a | b)*` e `(a | b)*b`).
Ora, considera la lingua l =l1 ∩ l2 ={stringhe su {a, b} a partire da 'a' * e * terminando con 'b'}.
Poiché le lingue regolari sono chiuse sotto l'intersezione, L è anche regolare. La sua espressione regolare è `a (a | b)*b`.
4. Teorema myhill-nnerode
* Spiegazione: Il teorema di Myhill-nnerode fornisce una condizione necessaria e sufficiente affinché una lingua sia regolare. Dichiara che una lingua L è regolare se e solo se ha un numero finito di *suffissi distinguibili *. Due suffissi *x *e *y *sono distinguibili rispetto a *l *se esiste una stringa *z *tale che esattamente una di *xz *o *yz *è in *l *. In termini più semplici:una lingua L è regolare se puoi dividere tutti i possibili prefissi in un numero finito di classi di equivalenza.
* Come farlo (più avanzato):
1. Definire una relazione di equivalenza basata su suffissi distinguibili:`x ≡ y` se e solo se per tutte le stringhe` z`, `xz ∈ L` se e solo se` yz ∈ L`.
2. Mostra che il numero di classi di equivalenza in questa relazione è finito. Se lo è, allora la lingua è regolare. Il numero di classi di equivalenza è uguale al numero di stati nel DFA minimo per la lingua.
* Esempio: Let l ={0
Considera i prefissi 0, 00, 000, .... Se L era regolare, quindi alla fine due prefissi, diciamo 0
5. Il lemma di pompaggio per le lingue regolari (per dimostrare che una lingua non è * normale)
* Spiegazione: Il lemma di pompaggio è uno strumento per dimostrare che una lingua non è * regolare. Afferma che se una lingua l è regolare, esiste una lunghezza di pompaggio *P *(un numero intero), tale che qualsiasi stringa *s *in l con lunghezza maggiore o uguale a *p *può essere divisa in tre substrazioni, *x *, *y *e *z *, dove *s *=*xyz *, e le seguenti condizioni detengono:
1. Per ogni i> =0, xy
2. | Y |> 0. (La parte Y "pompata" deve avere una lunghezza almeno 1).
3. | xy | <=p. (La parte "pompata" deve verificarsi all'interno dei primi caratteri P).
* Come usarlo per dimostrare la non regolare:
1. Supponiamo che l sia regolare.
2. Supponiamo che la lunghezza di pompaggio sia *P *. (Non sai cosa sia * p *, ma presumi che esista).
3. Scegli una stringa * s * in l tale che | s |> =*p *. La chiave qui è scegliere una stringa * s * che porterà a una contraddizione in seguito. Questa è spesso la parte più difficile.
4. Considera tutti i modi possibili per dividere * s * in * xyz * tale che | y |> 0 e | xy | <=*p *.
5. Per *ciascuno *Possibile divisione, trova un valore di *i *tale che *xy
6. Da quando hai trovato una contraddizione, la tua ipotesi iniziale che L sia regolare deve essere falsa. Pertanto, L non è regolare.
* Esempio: Let l ={a
1. Supponiamo che l sia regolare.
2. Let * p * sia la lunghezza di pompaggio.
3. Scegli * s * =a
4. Considera le possibili divisioni di * s * in * xyz * con | y |> 0 e | xy | <=*p *. Dal momento che | xy | <=* p * e * s * inizia con un
* x =a
* y =a
* z =a
5. Scegli i =0. Quindi xy
6. Contradiction! Il lemma di pompaggio dice che per tutto io, xy
7. Pertanto, L non è regolare.
Considerazioni chiave e migliori pratiche:
* Scegli il metodo giusto: Il metodo migliore dipende dalla lingua.
* Per lingue semplici, la costruzione di un DFA/NFA o un'espressione regolare è spesso il più semplice.
* Per le lingue costruite da altre lingue regolari che utilizzano operazioni standard, utilizzare le proprietà di chiusura.
*Per le lingue sospettate di essere *non regolare *, utilizzare il lemma di pompaggio o il teorema di Myhill-nnerode.
* chiarezza e rigore: Quando si prova una lingua è regolare, definisci chiaramente l'automa/espressione regolare e spiega perché accetta * tutte * stringhe nella lingua e * solo * quelle stringhe. In altre parole, prova entrambe le direzioni dell'implicazione. Una descrizione vaga non è sufficiente.
* minimizzazione: Se costruisci un DFA, è utile (ma non richiesto) per minimizzarlo. Un DFA minimizzato è unico per una determinata lingua.
* Pratica: Lavorare attraverso molti esempi è il modo migliore per comprendere questi concetti e sviluppare l'intuizione necessaria per applicarli in modo efficace.
In sintesi, dimostrare che un linguaggio è regolare in genere comporta la dimostrazione della sua equivalenza a una definizione formale di regolarità:costruendo direttamente una macchina (FA) o un modello (espressione regolare) che lo riconosce o mostrando che è costruita da componenti regolari usando operazioni note che preservano la regolarità. Il lemma di pompaggio, al contrario, viene utilizzato per confutare la regolarità.
Informazioni correlate
Programmazione © www.354353.com