Home | Chi sono  | Università | Software | Manuali | Giochi | Guestbook | Bookmarks | Cerca

Sezioni

Laboratorio di Informatica I: Programmazione

Progetto Pascal

 

Scopo del progetto è la realizzazione in Pascal di un analizzatore sintattico per grammatiche acontestuali, che implementi l'algoritmo di analisi CYK, descritto nel corso di Programmazione I. Il programma è schematicamente diviso nelle tre fasi seguenti:

1. Acquisizione dei dati (una grammatica acontestuale G);

2. Costruzione della forma normale di Chomsky di G, G';

3. Costruzione dell'analizzatore sintattico CYK di G',

descritte nelle tre sezioni seguenti.

1 Acquisizione dati

La grammatica in input, G = (T, N, S, P), viene letta da un file di testo in cui le produzioni in P sono memorizzate nel formato seguente:

X1 = s11|s21|...|sn11

...

Xm = s1m|s2m|...|snmm

Si assume che S = X1, che N = {X1, X2, ..., Xm} e che T sia l'insieme dei simboli che compaiono in almeno una delle stringhe sji, 1<= i <= m, 1<= j <= ni e non appartengono ad N. Come ipotesi semplificativa, assumiamo che N sia sottoinsieme di [A..Z] e che T sia sottoinsieme di [a..z]. La parola vuota "e" verrà rappresentata dal simbolo "*". Per 1<= j <= m-1, la lista di alternative relative al non terminale Xj termina con un carattere di fine linea, e per j = m con l'end-of-file.

Ad esempio, la grammatica

G = ({A, B}, {a, b}, A, {(A, aAa), (A, B), (B, bBb), (B, e)})

è rappresentata da

A = aAa|B

B= bBb|*

Nella fase di acquisizione dati, il file testo contenente la rappresentazione di G viene letto, e la grammatica memorizzata in una qualche struttura ritenuta opportuna per effettuare le operazioni previste dalle fasi seguenti.

2 Normalizzazione

In questa fase la grammatica G letta nella fase precedente viene normalizzata, eseguendo in sequenza i passi seguenti:

- eliminazione delle produzioni nulle, cioé della forma (A, e), con A diverso da S;

- eliminazione delle produzioni ridondanti, cioé della forma (A, B), con B appartenente ad N;

- eliminazione delle produzioni multiple, cioé della forma (A, s) con taglia (s) >= 2 e s non appartenente a N2.

Queste trasformazioni, note dal corso di Programmazione I, trasformano G in una grammatica equivalente (che genera cioé lo stesso linguaggio) in forma normale di Chomsky, che chiameremo G'.

Alla fine di questa fase è richiesto di stampare G', nello stesso formato descritto nella fase precedente, sul terminale, e di memorizzarla in un file.

3. Analisi grammaticale

Questa fase consiste di un ciclo di interazioni con l'utente: in ciascuna iterazione viene chiesto di inserire da tastiera una parola w appatenente a T*, che supponiamo di lunghezza non superiore a 20 caratteri, seguita dal carattere ".", e viene verificato se tale parola appartiene o meno al linguaggio generato da G', attraverso una implementazione dell'algoritmo CYK, descritto nel corso di Programmazione I. Il ciclo e l'esecuzione del programma terminano quando l'utente dichiara di non voler analizzare ulteriori parole.

4. Ipotesi semplificative

Introduciamo due ipotesi su G, che ne facilitano la normalizzazione:

- ipotesi 1: G non contiene e-produzioni, a parte eventualmente la produzione (S, e). Inoltre se (S, e) appartiene a P, allora S non appare in alcun sij.

- ipotesi 2: G non contiene produzioni multiple.

Nella realizzazione del progetto si supponga che G soddisfi queste ipotesi. La soluzione del problema nel caso generale, cioé quello in cui le due ipotesi sopra non sono necessariamente verificate, è considerata facoltativa.

 

Per scaricare il file zip contenente il file eseguibile, il codice e la relazione in formato Word 97, cliccare sull'immagine qui sotto:

Scarica il progetto Pascal (51 Kb)

 

Laboratorio di Informatica I: Programmazione

Progetto ML

Scopo del progetto è la realizzazione in ML di un insieme di strumenti che permettano di definire dei circuiti combinatori e compiere alcune operazioni su di essi. I circuiti in questione sono realizzati a partire dai seguenti tipi di porte logiche:

  • - porte binarie: AND, OR, NAND, NOR;
  • - porte unarie: NOT;
  • - porte 0-arie (costanti): VERO, FALSO

e da variabili che denotano linee di ingresso al circuito, e che supporremo essere rappresentate da interi positivi; più specificamente, l'insieme delle variabili di un circuito sarà sempre della forma VAR(1), VAR(2), ..., VAR(n), per un certo intero non negativo n. Una volta definito in ML il tipo ricorsivo circuito i cui elementi rappresentano dei circuiti come quelli descritti sopra, definire le funzioni seguenti:

1. Funzione di valutazione: dato un circuito, stampa sul video il grafo della funzione booleana da esso calcolata. Ad esempio, la valutzione del circuito:

OR(AND(OR(VAR(1), NOT(VAR(2))), AND(VAR(3), VERO)), VAR(1))

è:

argomenti risultato
000 0
001 1
010 0
011 0
100 1
101 1
110 1
111 1

2. Funzione di standardizzazione: dato un circuito, ne restituisce uno equivalente (che calcola cioé la stessa funzione) composto unicamente da porte NAND, ca costanti e da variabili.

3. Funzione di fusione: dati due circuiti C e C', aventi rispettivamente n e n' variabili, ne restituisce un terzo, D, avente n+n' variabili tale che la valutazione di D sui valori b1, ..., bn, b'1, ..., b'n, sia l'AND delle valutazioni di C su b1, ..., bn e di C' su b'1, ..., b'n'.

4. Funzione di sintesi: data una funzione ML f di tipo

(Bool x Bool x Bool x Bool x Bool) -> Bool

(che supponiamo totale), restituisce un circuito C che calcola f, e che è in forma normale disgiuntiva.

5. Funzione di normalizzazione: preso un circuito, ne restituisce uno equivalente in forma normale disgiuntiva.

6. Funzione di ottimizzazione: un circuito non triviale (diverso cioé da VERO o FALSO) è ridondante se calcola una funzione costante. Ad esempio:

AND(VAR(1), NOT(VAR(1)))

e NOT(VERO) sono circuiti ridondanti. Il circuito:

AND(VAR(1), OR(VAR(1), NOT(VAR(1))))

non è ridondante ma il suo sottocircuito OR(VAR(1), NOT(VAR(1))) lo è. La funzione di ottimizzazione, preso un circuito C, restituisce un circuito equivalente C' che ha la proprietà che nessun sottocircuito (proprio o improprio) è ridondante.

 

Per scaricare il file zip contenente il codice e la relazione in formato Word 97, cliccare sull'immagine qui sotto:

Scarica il progetto ML (21 Kb)

Ringrazio i miei colleghi Massimo Delungo e Evelise Pintonello per aver contribuito alla realizzazione di questi due progetti.

 

Indietro

Home
Chi sono
Università
Software
Manuali
Giochi
Guestbook
Bookmarks
Cerca
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Home | Chi sono  | Università | Software | Manuali | Giochi | Guestbook | Bookmarks | Cerca