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.