ESPRESSIONI REGOLARI Strumento per descrivere linguaggi, detti

Transcript

ESPRESSIONI REGOLARI Strumento per descrivere linguaggi, detti
ESPRESSIONI REGOLARI
Strumento per descrivere linguaggi, detti regolari.
Es: l'espressione regolare ((1+2+...+9) . (0+1+...9)* + 0) descrive i numeri
interi non negativi scritti senza zeri inutili.
Def. Chiamiamo espressione regolare su un alfabeto Σ una parola r
sull'alfabeto:
Σ ∪ {+, . , * , (, ) , Ø}
tale che:
1.
2.
3.
r=Ø
oppure
r=a
r=s+t
con a elemento di Σ, oppure
oppure r = s. t
oppure r = s*
con s e t espressioni regolari
con s espressione regolare
4.
r = (s)
Semantica
L' espressione
descrive
il linguaggio
Ø
Λ
a
{a}
s+t
s. t
s*
(s)
L(s) ∪ L(t)
L(s) ° L(t)
L(s) *
L(s)
∀a∈Σ
s, t esp. reg.
s, t esp. reg.
s esp. reg.
s esp. reg.
cioè:
L(Ø) = Λ
L(a) = {a}
L(s+t) = L(s) ∪ L(t)
L(s. t) = L(s) ° L(t)
L(s*) = L(s)*
L((s)) = L(s)
Per semplifcare la scrittura delle espressioni regolari possiamo:
• eliminare il simbolo di concatenazione e scrivere ( s t) anziche' (s . t);
• usare precedenze tra operatori: * > . > +
e scrivere a + b c d anziche' (a + (b . (c . d))).
Oss. Notazioni aggiuntive:
ε
sta per Ø*
s+
sta per s. s*
descrive il linguaggio {ε}
s esp. reg. descrive il ling. L(s) ° L(s)*
Esempi
1 - (a+b)* rappresenta il linguaggio L = {a, b}*
2 - (a+b)*a rappresenta il linguaggio L = {x | x ∈ {a, b}* ∧ "x termina con a"}
3 - scrivere espressione regolare su Σ = {a, b} che rappresenta parole il cui 3-ultimo
carattere è b.
4 - scrivere espressione regolare su Σ = {a,b,c} che rappresenta parole che contengono
almeno un a oppure almeno un b.
5 - ((1+2+...+9) (0+1+...9)*+ 0) , (0+1+...+9)+
rappresenta il linguaggio che descrive i numeri reali positivi scritti con virgola e
senza zeri inutili nella parte intera.
6 - 0* + (( (0*(1+11)) ( (00*) (1+11) )* ) 0*)
rappresenta le stringhe binarie prive di 3 uni consecutivi.
7 - qual’è il linguaggio defnito da: a* ( (aa)*b + (bb)*a) b* ?
8 - scrivere esp. reg. su Σ = {a, b, c, d, e, f, g} che rappresenta tutti i percorsi da A a B,
anche passanti più volte per uno stesso nodo.
9 - scrivere esp. reg. su Σ = {0,1} che rappresenta stringhe dove si alternano 0 ed 1.
10 - scrivere esp. reg. su Σ = {0,1} che rappresenta stringhe con al massimo una coppia
di 1 consecutivi.
I linguaggi rappresentabili da espressioni regolari vengono chiamati linguaggi regolari.
Li caratterizzeremo anche mediante grammatiche e macchine semplici (gli automi a
stati fniti).
Vedremo che i linguaggi regolari sono decidibili (riconoscibili con algoritmi), cioè
per ogni linguaggio regolare L (sull'alfabeto Σ) esiste un algoritmo che sa decidere se
una stringa x ∈ ∑* appartiene al linguaggio oppure no.
In generale se ci chiediamo se, dato un alfabeto ∑ ed un linguaggio L su ∑, e' sempre
possibile trovare un algoritmo che "lo riconosce", la risposta è negativa.
Basti pensare che l'insieme di tutti i linguaggi su ∑ ha la cardinalità del continuo
(ricorda che ∑* è numerabile) mentre l'insieme di tutti i programmi che possiamo
scrivere, in un qualunque linguaggio di programmazione, è numerabile. In altre parole,
esistono "più" linguaggi su un alfabeto che programmi che possono riconoscerli.
Un linguaggio si dice semidecidibile (semiriconoscibile con algoritmi) se esiste un
algoritmo che sa riconoscere se una stringa x ∈ ∑* appartiene al linguaggio, ma se la
stringa non appartiene al linguaggio può rispondere correttamente oppure non
rispondere mai.