Espressioni regolari, grammatiche regolari e automi finiti sono semplicemente tre diversi formalismi per la stessa cosa. Esistono algoritmi per convertire da uno qualsiasi di essi.
Il motivo fondamentale per cui abbiamo tutti e tre è che sono stati creati in modo indipendente, con la prima serie di equivalenze (ci sono anche molti altri formalismi) dimostrata da Kleene (questo risultato, o parte di esso è chiamato Teorema di Kleene).
Quindi, in quel contesto, a seconda del modo in cui vuoi eseguire i modelli, tutti riconoscono o generano stringhe di un linguaggio normale e matematicamente, in questo senso, non c'è differenza.
Ovviamente a volte un modello è più facile da usare di un altro per un compito particolare, a causa dei dettagli del formalismo. Inoltre il modo in cui lavorano nella testa di un essere umano è spesso un po 'diverso, gli automi finiti "sentono" come i computer, le espressioni regolari "sentono" come se stessi costruendo una stringa da sottostringhe più piccole e le grammatiche regolari "sentono" come una grammatica più tradizionale derivazione o classificazione di una frase in una lingua (non sorprende se si guarda alla storia).
Quindi, per confrontare i due, definiamoli:
Espressioni regolari
Quindi le espressioni regolari sono definite in modo ricorsivo come segue:
- ∅ è un'espressione regolare
- ε è un'espressione regolare
- a ∈ Σun' è un'espressione regolare per ognia ∈ Σ
- se e sono espressioni regolari allora
BUNB
- A ⋅ B è un'espressione regolare (concatentazione)
- A∣B è un'espressione regolare (alternanza)
- A∗ è un'espressione regolare (stella di Kleene)
Insieme ad alcune semantiche (ovvero il modo in cui interpretiamo gli operatori per ottenere una stringa), otteniamo un modo per generare stringhe da un linguaggio normale.
Grammatiche regolari
Le grammatiche regolari sono costituite da quattro tuple cui è l'insieme di non terminali, è l'insieme di terminali, è l'inizio non terminale e è l'insieme di produzioni che ci dicono come cambiare il simbolo iniziale, passo dopo passo, in una stringa in . può avere le sue produzioni tratte da uno di due tipi (non entrambi però):N Σ S P Σ ∗ P(N,Σ,P,S∈N)NΣSPΣ∗P
Grammatiche lineari di destra
Per non-terminali , , terminale e la stringa vuota , tutte le regole sono della forma:C a εBCaε
- B→a
- B→aC
- B→ε
Grammatiche lineari sinistre
Sinistra lineare grammatiche sono gli stessi, ma la regola 2 # è .B→Ca
Cose su cui riflettere
Quindi, guardando queste definizioni e giocando con esse, possiamo vedere che le espressioni regolari sembrano regole di corrispondenza o modi di gestire le stringhe un po 'alla volta.
Le grammatiche sembrano "etichettare" le sezioni della stringa e raggruppare le etichette sotto nuove etichette per convalidare la stringa (ovvero se possiamo ottenere da alla stringa o viceversa, siamo felici).S
Tuttavia, questi stanno davvero facendo la stessa cosa fondamentale, e il modo in cui vedi la metafora della loro funzione dipende davvero da te.