Operazioni sui linguaggi formali

Da testwiki.
Vai alla navigazione Vai alla ricerca

Template:Risorsa

Operazioni sulle stringhe

Concatenazione

La concatenzione tra due stringhe, detto anche prodotto tra due stringhe, è definito come:

siano x=a1a2...ah e y=b1b2...bk due stringhe, allora la loro concatenzione è xy=a1a2...ahb1b2...bk.

La concatenzione è anche indicata con xy=xy. Gode della proprietà associativa x(yz)=(xy)z e dell'additività della lunghezza |xy|=|x|+|y|.

Ha come elemento neutro la stringa vuota: xε=εx=x.

Sottostringa

Diciamo che y è sottostringa di x se e solo se:

x=uyv per qualche stringa u (detta prefisso) e v (detta suffisso).

y è sottostringa propria se e solo se uε e vε.

Riflessione

L'operazione di riflessione è definita come:

sia x=a1a2...ak1ak allora la sua riflessione è xR=akak1...a2a1.

Gode delle seguenti proprietà:

  • riflessiva: (xR)R=x
  • distributiva: (xy)R=yRxR
  • valore nullo: (ε)R=ε

Ripetizione o potenza

Si definisce ripetizione o potenza di una stringa la concatenazione di se stessa m volte:

xm=xxxx...xm con m1. Se m=0, allora xm=x0=ε

Esempi:

  • x=abx5=ababababab
  • x=εx5=ε
  • x=abx0=ε

N.B.: ripetizione e riflessione hanno la precedenza sulla concatenzione! Esempio: ab2=abb e abR=ab.

Operazioni sui linguaggi

Alcune operazioni sui linguaggi sono l'estensione di quelle sulle stringhe.

Riflessione

La riflessione di un linguaggio è l'insieme di tutte le stringhe riflesse del linguaggio:

sia L un linguaggio, allora LR={x|y(yLx=yR)}

Concatenazione

La concatenazione di un linguaggio è definita come il linguaggio contenente la concatenazione delle stringhe dei linguaggi concatenati:

LL={ xy | xLyL }

N.B.

  • L=L=
  • L{ε}={ε}L=L

Ripetizione o potenza

La ripetizione o potenza di un linguaggio viene definita ricorsivamente:

Lm=Lm1L per m1
L0={ε}

N.B. 0={ε}

Esempio: L={a,b,c}L2={a2,b2,c2,ab,ac,ba,ca,bc,cb} 

Come visto la potenza produce un set di stringhe di dimensione fissa e finita m. Utilizzando la stringa vuota è possibile ottenere il set di stringhe con lunghezza minore di m.

Esempio: L={a,b,c,ε}L2={a2,b2,c2,ab,ac,ba,ca,bc,cb,a,b,c,ε} 

Operazioni insiemistiche

I linguaggi godono delle classiche operazioni insiemistiche:

  • : unione (insieme composto da tutte le stringhe che compongono il primo linguaggio o il secondo linguaggio.)
  • : intersezione (insieme composto da tutte le stringhe che compongono il primo linguaggio e il secondo linguaggio.)
  • : differenza (insieme composto da tutte le stringhe che compongono il primo linguaggio ma non il secondo linguaggio.)
  • : inclusione
  • : inclusione stretta
  • =: uguaglianza

Definizioni

Definiamo linguaggio universale Luniversale di un alfabeto Σ come l'insieme di tutte le stringhe di qualsiasi lunghezza sull'alfabeto:

Luniversale=Σ0Σ1Σ2...

Definiamo complemento di un linguaggio ¬L su un alfabeto Σ:

¬L=LuniversaleL

N.B.:

  • Luniversale=¬.
  • Il complemento di un linguaggio finito è sempre infinito;
  • Il complemento di un linguaggio infinito non è sempre finito.

Chiusura di Kleene

La chiusura di Kleene o operatore stella è la chisura riflessiva e transitiva dell'operazione di concatenazione.

L*=h=0,...,Lh=L0L1...={ε}L1...

Informalmente, questo insieme di stringhe è quello che è possibile generare concatenando due stringhe di L, anche con ripetizioni.

Ad esempio:

L={ab,ba,fg}  L*={ε,ab,ba,fg,abab,abba,abfg,baab,baba,bafg,...

L* è evidentemente sempre infinito, qualsiasi sia il linguaggio L{ε}. Può capitare che L=L*, ad esempio: L={an,n0}=L*.

N.B.: Luniversale=Σ*

Spesso si utilizza la sintassi LΣ* per dire che il linguaggio L è un linguaggio sull'alfabeto Σ.

Proprietà

La chiusura di Kleene gode delle seguenti proprietà:

  • monotonicità: LL*
  • chiusura alla concatenazione: if xL* and yL* then xyL*
  • idempotenza: (L*)*=L*
  • commutatività con riflessione: (L*)R=(LR)*
  • *={ε}
  • ε*={ε}

Operatore Cross

L'operatore cross è la chisura transitiva ma non riflessiva dell'operazione di concatenazione. Sostanzialmente rispetto al precedente l'unione non include la prima potenza L0

L+=h=1,...,Lh=L1L2...

Operatore quoziente

L'operatore quoziente, identificato dalla slash L1/L2 (non backslash!). Definito come: L1/L2={ u |( wL2|uwL1L2) }.

Esempio:

L1={ a2nb2n|n>0 }
L2={ b2n+1|n0 }
L1/L2={ a2b,a4b,a4b,... }