[1] 

Soluzioni Proposte




Esercizio1

TESTO

Una grammatica regolare per il linguaggio L contenente tutte le parole non vuote formabili sull'alfabeto ∑={a,b,c,d,...,z} tali che mai occorrono due simboli consecutivi uguali

 

SOLUZIONE

Utiliziamo una categoria grammaticale Ca distinta per ogni distinta lettera "a" dell'alfabeto.
La categoria definisce (ha come linguaggio associato) l'insieme di tutte le parole del linguaggio L che non hanno tale lettera come lettera iniziale, inclusa la parola vuota. La grammatica richiesta e' quindi G = <N È {S}, ∑, S, P>, per insieme di non terminali N, categoria iniziale e insieme di produzioni tali che:

·       Definizione di N:     " a Î S, $ Ca Î N

·       Definizione di P:

o      " a Î S,
     S::= a Ca Î P

o      " Ca Î N

§       Ca::= e Î P

§       Ca::= b Cb Î P, " b ≠ a Î S,


La soluzione e' completa e parametrica rispetto a ∑. Ad esempio, sia ∑= {a,b,c}. La grammatica prodotta ha le seguenti produzioni:

S ::= a Ca | b Cb | c Cc

Ca ::= b Cb | c Cc | e

Cb ::= a Ca | c Cc | e

Cc ::= a Ca | b Cb | e

Notiamo tuttavia, che tale soluzione non risponde completamente a quanto richiesto, in particolare non definisce una grammatica regolare. Per ottenere una tale grammatica possiamo seguire due approcci diversi:

·       A) Osserviamo che la grammatica e' lineare, quindi procediamo in accordo al   procedimento di esercizio 6.a

·       B) Riflettiamo su un altro modo di generare il linguaggio, la nuova formulazione non deve mai fare ricorso a definizioni induttive.

Soluzione B
Dobbiamo riformulare la grammatica senza fare ricorso a definizioni induttive. In effetti il “pumping” lemma o lemma di iterazione dei linguaggi regolari ci dice che ogni stringa a di lunghezza maggiore di un opportuno e fissato n è sempre ottenibile da una composizione . Quindi anche le stringhe di L devono poter essere ottenute mediante scomposizioni di tale forma. Confrontate la vostra soluzione con quella proposta per l'esercizio 13.a.

Esercizio2

Utiliziamo uno stato distinto per ogni distinta lettera dell'alfabeto. Tale stato e' attraversato allorche' la parola contenga tale lettera. L'automa richiesto e' quindi A = <N U {0}, Sigma, Move, {0}, N>, per insieme di stati N, stato iniziale 0 e funzione Move cosi' definita (utiliziamo una iniettiva i:Sigma -> [1..#Sigma], dove # e' la cardinalita'):

·       per ogni a ISIN Sigma,

Move(0,a) = i(a)

·       per ogni a ISIN Sigma, per ogni b=/=a ISIN Sigma,

Move(i(a),b) = i(b)


La soluzione e' completa e parametrica rispetto a Sigma. La si applichi, ad esempio, per Sigma = {a,b,c}.

 

Esercizio3

Utiliziamo stati in grado di distinguere tra pari e dispari numero di "a" gia' riconosciute. In particolare:
        0: attraversato fintantoche nessun "a" sia stato riconosciuto oppure una nuova "a" appena riconosciuta conduca a un numero pari di occorrenze totali di "a" nella parola finora scandita.
        1: attraversato allorche una nuova "a" appena riconosciuta conduca a un numero dispari di occorrenze totali di "a" al momento riconosciute.

                A = <{0,1}, {a,b,c}, Move, {0}, {0}>

dove Move e' descritta dalla seguente tabella:
 
 

 

a

b

c

0

1

0

0

1

0

1

1

Esercizio5
 

Utiliziamo stati in grado di distinguere tra pari e dispari numero di "a", indichiamo 2(a) e 1(a), e pari e dispari numero di "b", indichiamo 0(b), 1(b), 2(b). Notiamo una certa asimmetria: per le motivazioni si risova prima l'esercizio4. I nostri stati saranno i seguenti: a fianco e' indicato quando lo stato sara' attraversato

        0: 2(a)0(b)
        1: 1(a)0(b)
        2: 1(a)1(b)
        3: 1(a)2(b)
        4: 2(a)1(b)
        5: 2(a)2(b)

                    A = <{0,1,2,3,4,5}, {a,b,c}, Move, {0}, {0,4}>

dove Move e' descritta dalla seguente tabella:
 
 

 

a

b

c

0

1

4

0

1

0

2

1

2

4

3

2

3

5

2

3

4

2

5

4

5

3

4

5

Esercizio6a

 
Associamo ad ogni stato "i" dell'automa il non terminale "Si" ed introduciamo le seguenti produzioni (si noti la produzione Si::=e allorche' i sia stato finale):
 

S0 ::= a S1 | b S0 | c S0 | e

S1 ::= a S0 | b S1 | c S1

Otteniamo una grammatica non regolare che riscriviamo in:
 
 

S0 ::= a S1 | (b | c) S0 | e

S1 ::= a S0 | (b | c) S1

e trasformiamo, risolvendo la ricorsione mediante interpretazione delle produzioni come equazioni sugli insiemi definiti dai linguaggi L(S0) e L(S1), in una regolare equivalente:
 

1.        riduzione ricorsione da S0

S0 ::= (b | c)* (a S1 | e)

S1 ::= a S0 | (b | c) S1

 

§          rimpiazzamento

S0 ::= (b | c)* (a S1 | e)

S1 ::= a (b | c)* (a S1 | e) | (b | c) S1

 

§          riduzione ricorsione da (commutativita' e associativita'): S1 ::= (a (b | c)*a  |  b  |  c) S1  |   a (b | c)*

S0 ::= (b | c)* (a S1 | e)

S1 ::= (a (b | c)*a  |  b  |  c)* a (b | c)*

Esercizio8b

La grammatica puo' essere facilmente espressa dall'unione di due linguaggi:

      1. il linguaggio L(N) non contenente occorrenze di "b"
      2. il linguaggio L(D) contenente occorrenze dispari di "b"

A ciascun linguaggio associamo una categoria lessicale e un'espressione regolare che lo esprima:
 
 

S::= N | D

N::= (a | c)*

D::= P b N

P::= (N b N b)*

Notare l'introduzione della categoria lessicale P, categoria ausiliaria che definisce il linguaggio delle occorrenze pari di "b" se occorre.
 


Esercizio13a

Lex e' uno strumento progettato per manipolare stringhe e individuare sottostringhe di esse che soddisfino vincoli esprimibili mediante espressioni regolari. Pertanto puo' essere utilizzato, come noi facciamo, per "studiare" grammatiche regolari ma non e' concepito per tale scopo e il suo uso non richiede specifiche competenze. Questa premessa e' obbligatoria per capire come talora possa accadere che soluzioni formalmente corrette, complete e efficenti non trovino piena esprimibilita' in Lex, o altrimenti risultino piu' inefficenti di soluzioni che dovrebbero avere costi maggiori, o infine scritture scorrette si rivelino in Lex soluzioni lecite e complete. Di fatto Lex nasconde alcuni meccanismi (quali la complementazione) non esprimibili nelle grammatiche regolari.
Pertanto daremo due soluzioni Lex.
La prima e' una grammatica regolare che costruisce le frasi del linguaggio osservando che:

·      possiamo ordinare il nostro alfabeto

·      data una qualunque parola w del linguaggio, sia "a" la lettera di valore minore che occorre nalla parola, ed n il numero di occorrenze di "a" in w. Allora,  w=w0.aw1. ... . awn, dove w0 e wn possono essere vuote, e w1,...,wn-1 sono parole del linguaggio non contenente "a".

·      Ad ogni lettera dell'alfabeto associamo il sottolinguaggio delle parole che contengono tale lettera e che sono strutturate come w sopra.

Notiamo che in questo modo ad ogni lettera possiamo far corrispondere una categoria grammaticale e tale categoria puo' essere espressa facendo ricorso alle categorie grammaticali di lettere di valore maggiore: concludiamo che le categorie grammaticali sono totalmente ordinabili e la gramatica e' quindi regolare.
La seconda soluzione si basa sull;uso del meccanismo di complementazione. A tale soluzione non corrisponde tuttavia, alcuna grammatica regolare.

 

 

Esercizio 15 (Espressioni regolari: estensioni)

TESTO

Come sappiamo i linguaggi regolari sono chiusi rispetto a:

a)      prodotto (giustapposto): L1 x L2 = {u.v | u Î L1, v Î L2} è linguaggio regolare;

b)     unione: L1 È L2 è linguaggio regolare;

c)      complemento: L = {u | u Î S*-L} è linguaggio regolare;

d)      intersezione: L1 Ç L2 è linguaggio regolare;

assunti L, L1, L2 linguaggi regolari su S.

Per i casi a) e b) è immediato, dati automi per L1 ed L2, ottenere automi per L1xL2 ed L1 È L2. Si dia un procedimento per ottenere un automa nei casi c) e d). Ovvero si risolvano i seguenti esercizi:

1)     Sia A un automa per il linguaggio regolare L, si dia un procedimento per generare un automa A per il linguaggio L, complemento di L su S.

2)    Siano A1 ed A2 automi per, rispettivamente, il linguaggio regolare L1 e il linguaggio regolare L2, si dia un procedimento per generare un automa A1ÇA2 per il linguaggio regolare L1 Ç L2, intersezione dei linguaggi L1 ed L2.

3)    Come sappiamo, le espressioni regolari hanno la stessa potenza degli automi a stati finiti, ovvero descrivono la stessa classe di linguaggi descritta dagli automi a stati finiti, cioè la classe dei linguaggi regolari. La usuale definizione di espressione regolare prevede i soli operatori di giustapposizione “.”, altenato “|”, potenza finita, “_k”, potenza limite o stella di Kleene, “_*”.  Esistono però definizioni, come quelle adottate nei sistemi LEX o in linguaggi come PERL, che includono anche operatori di negazione “~”, e di congiunzione “&”. Queste definizioni introducono una classe di espressioni più potente di quella usuale?

 

SOLUZIONE

 

 

[ Home | Back ]

 

Ultimo aggiornamento 7 Marzo 2203

 



[1]