Modulo 4

16 downloads 153 Views 346KB Size Report
2. A → aBbc. 3. Bb → bB. 4. Bc → Cbcc. 5. bC → Cb. 6. aC → aaB. 7. aC → aa. Come si fa a generare una stringa? Come si fa a progettare una grammatica?
Backtracking Il bactracking è un fenomeno che usualmente si verifica quando si intende generare una data stringa. In assenza di particolari strategie il processo di generazione può incorrere in percorsi ingannatori che porterebbero (erroneamente) a concludere che non vi sia un processo di generazione valida. Si consideri ad esempio ancora la Grammatica G2 per la generazione di stringhe aritmetiche data con produzioni P: S ! S+T | T T! I*T | I I!a|b |c Supponiamo di voler generare la stringa a+b*c, un’erronea scelta delle produzioni da applicare (come ad esempio S " T " I*T "a*T " a*I*T " a*b*T" a*b*c ) ci porterebbe a dire che la stringa non è generabile. Questa conclusione (la non generabilità) la si può tuttavia dare solo se si sono fatti tutti i tentativi di sostituzione possibile. L’accorgersi quindi che è stata raggiunta una stringa non voluta fa sì che si inneschi un’azione di bactracking volta a ricercare il percorso voluto (sempre che esso esista!). Nell’esempio precedente poiché la scelta S ! T porta alla generazione della stringa a*b*c, occorre tornare indietro (backtracking) per vedere se per caso un diversa scelta della produzione poteva condurre alla stringa voluta, cioè a+b*c.

Grammatiche Equivalenti Due Grammatiche G e G’ si dicono equivalenti se definiscono lo stesso linguaggio ovvero L(G) = L(G’) Ex1 La grammatica G3 con produzioni Si osservi come la costruzione della A ! aA | b stringa aaaaab venga fatta da È equivalente a G4 con produzioni sinistra verso destra per la grammatica G3 A! b | Sb e da destra verso sinistra per la grammatica G4 S! Sa | a Ex2: La seguente grammatica G5 che genera stringhe an bncn è equivalente alla grammatica G1 vista in precedenza

G5

S ! aBSc | abc Ba ! aB Bb ! bb

G1

A ! aBbc | abc Bb ! bB Bc ! Cbcc bC ! Cb aC ! aaB | aa

Grammatiche Equivalenti

G5

S ! aBSc | abc Ba ! aB Bb ! bb S"aBSc "aBaBScc "aBaBabccc "aaBBabccc "a a B a B b c c c "a a a B b b c c "a a a b b b c c c

G1

A ! aBbc | abc Bb ! bB Bc ! Cbcc bC ! Cb aC ! aaB | aa A " aBbc " abBc " abCbcc " aCbbcc " aaBbbcc " aabBbcc " aabbBcc " aabbCbccc " aabCbbccc " aaCbbbccc "aaabbbccc

L’equivavelza di due grammatiche è una proprietà indecidibile. Ciò significa che non esiste un algoritmo generale per verificare che due grammatiche siano equivalenti.

Classificazione di Chomsky Grammatiche a struttura di frase (Tipo 0) p!q

con p = a X b, X % VN e a,b,q % V*

Grammatiche contestuali (Tipo 1) X % VN e a,b % V* e q % V+

i)

p!q

p = a X b, |p| ! |q|

ii)

uXv!

u x v con u,v % V* , X % VN, x % V+

Grammatiche non constestuali (Tipo 2) X!x

X % VN e x % V+

Grammatiche Regolari (Tipo 3) X!tY X!t

con t % VT*

X, Y % VN

Esempi di Linguaggi di tipo 0 1. La Grammatica G6 con produzioni: S ! aSa | aAb | aAa |& aAa ! a | & aaAb ! b | & È una grammatica di tipo 0. Si osservi come in questo tipo di grammatiche sia possibile accorciare le forme di frase 2. La Grammatica G7 con produzioni: S ! aAb aA ! aaAb A !&

Che genera il linguaggio formato da stringhe an bn è anch’essa di tipo 0

Esempi di linguaggi di tipo 1 La Grammatica G1 che genera il linguaggio an bn cn è di tipo 1

G1

A! abc A ! aBbc Bb ! bB Bc ! Cbcc bC ! Cb aC ! aaB aC ! aa

Che significato dare al fatto che G1 riconosce sequenze di anbncn analogamente alla grammatica G5 ? - Le due grammatiche sono equivalenti

Esempi di linguaggi di tipo2 La Grammatica G2 S ! S+T | T T! I*T | I I! a|b |c che riconosce stringhe aritmetiche è di tipo 2 La Grammatica G8 con produzioni: S ! aSb | a b Che riconosce stringhe anbn è una grammatica di tipo 2 [Cosa dire tra la grammatica G8 con la grammatica G7 vista in precedenza?]

G7

S ! aAb aA ! aaAb A !&

Esempi di linguaggi regolari La Grammatica G9 (regolare sinistra) con produzioni Identifier ! Letter | Identifier Letter | Identifier Digit Letter ! a | b | c | ……. | z Digit ! 0 | 1 | 2 | ……. | 9 Riconosce il linguaggio degli identificatori in un linguaggio di programmazione La Grammatica G3 (regolare a destra) con produzioni A!aA A! b Riconosce stringhe an b [Si osservi che la regolarità destra/sinistra è soltanto di comodo essendo possibile descrivere il medesimo linguaggio regolare indifferentemente con grammatica regolare sinistra o destra]. Ad esempio il linguaggio an b può essere descritto dalla Grammatica regolare A sinistra G4 con produzioni A ! b |S b S! Sa | a

Le !-produzioni Per quanto detto fino ad ora la presenza di !-produzioni in una grammatica fa sì che il processo generativo porta a forme sentenziali che si accorciano, in particolare ci consentono di generare la stringa vuota che, come abbiamo visto, è tipico solo delle grammatiche di tipo 0. Tuttavia le !-produzioni possono presentarsi anche nelle grammatiche di tipo 1, 2 e 3, come abbiamo visto negli esempi. Ciò significa che le !-produzioni possono essere aggiunte a grammatiche di tipo 1, 2 o 3 se lo si ritiene conveniente per motivi definizionali. Data una grammatica G = < VN,VT,P,S> (di tipo 1,2, o 3) che genera il linguaggio L, per poter generare il linguaggio L’ =L#{!} basta considerare la grammatica G’ = G = < VN #{S’},VT,P’,S’> Dove P’ = P#{S’"!} # {S’"x | S"x $P }

G5

S " aBSc | abc Ba " aB Bb " bb

G’5

S’ " aBSc | abc | ! S " aBSc | abc Ba " aB Bb " bb

Le !-produzioni L’aggiunta di !-produzioni può comportare effetti diversi a seconda se vengono aggiunte a grammatiche di tipo 1, 2 o 3. Si può mostrare come l’aggiunta di opportune !-produzioni a grammatiche di tipo 1 comporti come la grammatica si trasformi in una grammatica di tipo 0, in altre parole le !-produzioni aumentano il potere generativo delle grammatiche. Mentre invece l’aggiunta di !-produzioni a grammatiche di tipo 2 o 3 non altera il potere generativo della grammatica. Si può infatti dimostrare che data una grammatica di tipo 2 o 3 con !-produzioni è sempre possibile trasformarla in una equivalente dello stesso tipo in cui o non ci sono !-produzioni o esiste una !produzione solo a partire dall’assioma (se !-appartiene al linguaggio). Es 1

Es 2

S " bX | a B B " cX X"! S" AB | a B | B A " ab | a B B " cX | X X"!

S"b |aB B"c

S" AB | a B | B A " ab | a B B"c|!

S " AB | A | a B | a | B | ! A " ab | a B | a B"c

Proprietà di inclusione dei linguaggi Poiché la gerarchia di Chomsky viene definita per restrizioni successive alle produzioni di una grammatica ne consegue che L3! L2 ! L1 ! L0 Ovviamente il medesimo linguaggio può essere generato con grammatiche di tipo diverso come abbiamo visto dagli esempi precedenti. Definizione: Si dice che un linguaggio è strettamente di tipo n (n=0,1,2,3) se esiste una Grammatica di tipo n che lo genera e non esiste alcuna grammatica di tipo m > n che possa generarlo. Ex: il linguaggio an bn generato dalla grammatica G7 (di tipo 0) è anche generato dalla seguente grammatica G8 (di tipo 2) con produzioni S"aSb|ab Si dimostra che non esiste un linguaggio di tipo 3 che lo possa generare (la dimostrazione sarà vista in seguito).

Classificazione di Chomsky e automi riconoscitori Grammatiche a struttura di frase (Tipo 0) p!q

Macchina di Turing

con p = a X b, X " VN e a,b,q " V*

Grammatiche contestuali (Tipo 1)

Macchina di Turing

X " VN e a,b " V* e q " V+

i)

p!q

p = a X b, |p| ! |q|

ii)

uXv!

u x v con u,v " V* , X " VN, x " V+

Grammatiche non constestuali (Tipo 2) X!x

Automi a Pila

X " VN e x " V+

Grammatiche Regolari (Tipo 3) X!tY X ! t con t " VT*

X, Y " VN

Automi a stati finiti

Automi a Stati Finiti Deterministici Un Automa a Stati Finiti Deterministici è definito dalla 5-pla < !, K, !, Z, S> ! - Alfabeto di Ingresso (Alfabeto terminale) K- Insieme degli stati ! -funzione (parziale) di transizione ! :Kx ! "K Z - Insieme (non vuoto) di Stati finali Z#K S - Stato iniziale S$K

Macchina a Stati ……….

………. Stato

Ciclo di Interpretazione- E’ il ciclo fondamentale che comporta la determinazione dello stato successivo sulla base dello stato corrente e del simbolo di ingresso Aquisisci il prossimo Simbolo s

Ss = ! [Sc,s ]

Ss = Stato Successore Sc = Stato Corrente

Ciclo di Interpretazione e Configurazioni Il processo di interpretazione termina: 1.

Quando si perviene ad una coppia (stato, simbolo) che non consente Il passaggio ad uno stato successivo.

2.

Quando sono stati esaminati tutti i caratteri della stringa

Nel primo caso la stringa non è riconosciuta Nel secondo caso se lo stato a cui si perviene è uno di quelli contenuti in Z si dirà che la stringa è riconosciuta, altrimenti no. Formalmente: Una configurazione è una coppia (q,s) con q $ K e s $ !* Una configurazione (q,s) è detta - Iniziale se q = S - finale se s = % - accettante se s =% e q $ Z

Si sono esauriti simboli della stringa

Configurazioni Date due configurazioni c1= (q, s) e c2 =(q’, t) diremo che c2 è successore diretto di c1 e si indica con (q, s) |& (q’, t) se si verifica che: 1. Esiste a $ ! tale che s = a t 2. !(q,a) = q’ Pertanto dato un automa deterministico A possiamo dire che una stringa s è accettata da A se e solo se (S,s) |&* (q, %) con q $ Z L’insieme delle stringhe accettate dall’automa A definiscono il linguaggio L(A) definito come L(A) = {w$ !* | (S,w) |&* (q, %) con q $ Z }