Introduzione. 1 Manuale d uso 1. 2 Nozioni preliminari Linguaggi formali XML DTD... 5

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Introduzione. 1 Manuale d uso 1. 2 Nozioni preliminari 2 2.1 Linguaggi formali... 2 2.2 XML... 4 2.3 DTD... 5"

Transcript

1

2 Introduzione Obiettivo di questo progetto è calcolare quantitativamente quanto due file siano simili tra loro. Vengono infatti presi in input due file di un tipo preciso (Document Type Definition, d ora in poi DTD) e viene restituito in output un numero percentuale che ne rappresenta il grado di similarità. In seguito, si precisa il concetto di similarità strutturale ed esso viene messo in pratica tramite l implementazione in Java di una metrica ad hoc, in modo da poter individuare e valutare elementi in comune e differenze tra i due file, o meglio tra i due alberi corrispondenti che vengono costruiti univocamente dal parser, il quale costituisce una prima parte dell applicazione. Il programma esegue poi un algoritmo ricorsivo sulla radice dei due alberi ottenuti nella prima fase; ciò costituisce la computazione della similarità vera e propria. Le due fasi di computazione rispettivamente parsing ed esecuzione dell algoritmo di similarità sono ben distinte dal punto di vista della programmazione, ma non lo sono per l utente: visto dall esterno, tutto avviene in modo trasparente. Dopo l esecuzione del programma, vengono visualizzati su schermo i due alberi DTD seguiti dal punteggio di similarità calcolato. ii

3 Indice Introduzione Indice ii iii 1 Manuale d uso 1 2 Nozioni preliminari Linguaggi formali XML DTD Parsing e alberi DTD Grammatiche LL(k) e LL(1) Grammatica fornita a JavaCC: DTDParser.jj Alberi DTD Semplificazioni Metriche di similarità Similarità tra DTD: princìpi di base Come valutare le differenze La funzione livello Rilevanza di un nodo La funzione peso Ruolo del parametro γ Casi particolari di input Caso generale dell algoritmo di similarità Implementazione Java La classe DTDSimilarity Strutture dati Il package similarity.dtdparser Gestione delle eccezioni iii

4 Bibliografia 35 Indice analitico 36 iv

5 Capitolo 1 Manuale d uso Se si dispone di un sistema operativo Microsoft Windows, la prima volta che si usa l applicazione occorre lanciare i seguenti file batch presenti sul CDROM del progetto: setenv.bat, per impostare correttamente le variabili di ambiente CLASSPATH e PATH; build.bat, per compilare sia la grammatica DTDParser.jj (supponendo che JavaCC sia installato in c:\programmi\javacc-3.2) che i sorgenti Java del progetto. Poi, si può eseguire il programma digitando da riga di comando run seguito dai nomi dei due file di input. Esempio: run file1.dtd file2.dtd Alternativamente, si può lanciare uno dei seguenti file batch con input predefiniti: empty.bat; hotel.bat; normal.bat; uni.bat. Se il sistema operativo è UNIX, GNU/Linux o Mac OSX, fare riferimento al file README.txt di istruzioni sul CDROM. 1

6 Capitolo 2 Nozioni preliminari Prima di entrare nel merito del progetto, vale a dire nella trattazione di file DTD, è bene spendere qualche parola sulla teoria dei linguaggi formali in informatica e su uno strumento ben più famoso delle DTD stesse, in funzione del quale esse sono state inventate: il linguaggio a marcatura estensibile, meglio noto come XML (dal suo nome in inglese, Extensible Markup Language). 2.1 Linguaggi formali Per approfondire le nozioni che vengono in questa sede soltanto accennate, si vedano [LSF] e [LMC] in bibliografia. Definizione 2.1 (alfabeto). Chiamiamo alfabeto un insieme finito di simboli (o caratteri) e lo denotiamo con la lettera A. Esempio 2.2. I seguenti sono alfabeti: L alfabeto latino, A = {a... z, A... Z {simboli di interpunzione e spazio. L insieme dei 128 simboli ASCII. L insieme delle cifre arabe: A = {0, 1,..., 9. L alfabeto binario: A = {0, 1. Definizione 2.3 (stringa). Una stringa o parola s su A è una sequenza finita di simboli di A; inoltre, ɛ denota la stringa vuota. Una stringa si ottiene concatenando simboli di un alfabeto. Esempio 2.4. Stringhe o parole su un alfabeto A: 2

7 A è l alfabeto latino e s = Buongiorno. A è l insieme dei simboli ASCII e s = arw A = {0, 1 e s = A = { e s = ɛ, cioè la stringa vuota. Definizione 2.5 (linguaggio). Un linguaggio su A è un insieme, finito o infinito, di stringhe su A. Equivalentemente si può dire che, dato A, un linguaggio è un qualsivoglia sottoinsieme di A, dove l asterisco indica la chiusura transitiva e riflessiva. Quando si parla di definizione di un linguaggio si intende in effetti la definizione di un insieme di stringhe; la definizione stabilisce quali stringhe appartengono al linguaggio e quali no. La teoria dei linguaggi formali si occupa pertanto della definizione della sintassi di un linguaggio ma non della sua semantica; in seguito preciseremo l importanza di questo fatto. Definizione 2.6 (grammatica). Definiamo grammatica G la quadrupla A, V N, S, P, dove A e V N sono insiemi disgiunti finiti, non vuoti e: 1. A è detto l alfabeto terminale di G. 2. V N è detto l alfabeto non terminale o alfabeto delle variabili. 3. S è il simbolo iniziale o assioma, S V N. 4. P è l insieme delle produzioni di G, dove una produzione è una coppia v, w con v (A V N ) + e contiene almeno un simbolo non terminale, mentre w è un elemento arbitrario di (A V N ). Per specificare la definizione di un linguaggio esistono diversi formalismi; i più noti sono: espressioni regolari; automi a stati finiti; grammatiche non contestuali in Backus-Naur Form o Extended Backus- Naur Form; XML Schema; DTD. 3

8 Tra quelli appena citati, gli strumenti formali usati concretamente in questo progetto sono le DTD e le grammatiche EBNF, rispettivamente per i file di input e per la definizione di una grammatica che riconosca tutte e sole le DTD valide. 2.2 XML XML è un metalinguaggio, vale a dire che è più astratto, espressivo, potente dei comuni linguaggi formali dell informatica, anzi serve proprio a definirne di nuovi: XML crea linguaggi a marcatura personalizzati. È dunque un metodo per mettere dei dati strutturati in file di testo. Per comprendere cosa si intende per dati strutturati, conviene pensare innanzitutto a comuni applicazioni informatiche dagli usi più disparati: fogli elettronici, agende, parametri di configurazione, transazioni finanziarie, disegni tecnici e quant altro. Ebbene, di norma i programmi che producono e gestiscono tali dati li salvano anche su disco, per cui possono usare il formato binario oppure quello testuale; quest ultimo ha l immediato vantaggio di essere leggibile da un comune editor di testi. XML è proprio l insieme di linee guida per progettare file di testo atti a contenere i dati, in un modo che produca file che siano: facili da generare e leggere da parte di un computer; non ambigui; tali da scongiurare pericoli tipici dei formati per dati né strutturati né standard, quali la mancanza di estensibilità, la carenza di supporto per l internazionalizzazione e la dipendenza da una particolare piattaforma hardware o da un particolare sistema operativo. L ascesa di XML prosegue senza sosta dal 1998, anno in cui è diventato uno standard approvato dal W3C (World Wide Web Consortium). È oggi accettato come standard de facto per l archiviazione di testi su Web, in particolare per applicazioni professionali che consentono un indicizzazione dei documenti assai articolata. Tra i possibili impieghi di XML citiamo la gestione avanzata dei link, distribuiti in varie categorie funzionali, lo sviluppo di protocolli platformindependent per lo scambio dei dati, e non ultima la possibilità di far comunicare dispositivi elettronici (ad esempio PDA, agende elettroniche, navigatori satellitari etc.) tra di loro o con un computer, comunicazione questa che in passato non era affatto scontata da ottenere a causa della mancanza di standard nell interfacciamento. 4

9 Altri progressi sono rappresentati dalla possibilità di processare automaticamente i documenti ricevuti e dalla personalizzazione, in quanto i dati strutturati ricevuti possono essere visualizzati grazie ai fogli di stile a cascata (Cascading Style Sheet, CSS), secondo modalità scelte dall utente. Qualcosa di confrontabile con le query di SQL, benché in quel caso si abbia a che fare con basi di dati ovverosia tabelle, mentre XML tratta strutture ad albero. 2.3 DTD Passiamo ora alle DTD, il mezzo più semplice per specificare proprietà strutturali di documenti XML. Per inciso, un documento XML può contenere una DTD ma questo non è obbligatorio. Quando essa è presente, però, la DTD stessa deve precedere il primo elemento del documento XML, cioè l elemento radice. Per associare una DTD a un istanza di documento XML, si deve inserire in testa a esso una marca che viene chiamata Document Type Declaration e non Definition, la quale a sua volta è concettualmente divisa in due: interna ed esterna. Quest ultima è tutta scritta in un file come suggerisce il nome esterno e con estensione.dtd; ecco il tipo di file d interesse per il nostro progetto. Precisiamo quanto appena detto secondo la definizione delle specifiche [W3C], facendo attenzione a non confondere DTD (Document Type Definition) con Document Type Declaration. Una XML Document Type Declaration contiene o punta a dichiarazioni di marcatura che costituiscono una grammatica per una classe di documenti. La grammatica è la DTD (Document Type Definition). La Document Type Declaration, per quel che la riguarda, può puntare a un sottoinsieme esterno il quale è propriamente un tipo particolare di ENTITY esterna contenente dichiarazioni di marcatura, oppure può contenere tali dichiarazioni direttamente in un sottoinsieme esterno, oppure può fare entrambe le cose. La DTD di un documento XML consiste nell unione dei due sottoinsiemi, interno ed esterno. Un esempio di Document Type Declaration è la seguente: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> Per riassumere quanto detto finora, una DTD, che di per sé non è un file XML in quanto la sua sintassi interna conserva delle vestigia del vecchio formato SGML (decisamente non XML: risale agli anni 60!), serve a definire 5

10 le strutture ammesse per l istanza di documenti XML; essa elenca quindi degli insiemi di dichiarazioni: di tipi di elemento; di attributi; di entità; di notazione. L insieme delle dichiarazioni di tipi di elemento sarà l unico preso in considerazione dall analizzatore di similarità del progetto. Tutti gli altri verranno solo considerati dal punto di vista della correttezza sintattica, ma ai fini della nostra applicazione non hanno alcun contenuto semantico e, in parole povere, vengono dimenticati dall applicazione non appena passa dalla prima fase di parsing a quella di calcolo di similarità. Si ricorda che una dichiarazione di tipo di elemento ha la seguente sintassi: <!ELEMENT nome-elemento content-model> Il content model è un espressione regolare (particolarmente adatta a essere rappresentata come un albero, così come i documenti XML) la quale specifica la struttura degli elementi di tipo nome-elemento. Inoltre, il content model è costruito su: ulteriori tipi di elemento; #PCDATA, che rappresenta del testo libero senza etichette. Gli operatori usati nel content model, che sono poi quelli tipici delle espressioni regolari, sono: sequenza ovvero AND, indicata con (a, b,..., h); alternativa ovvero OR, indicata con (a b... k); opzionalità, indicata con a?; ripetizione zero o più volte, indicata con a*; ripetizione una o più volte, indicata con a+. Con a, b,... abbiamo indicato un generico content model. 6

11 Capitolo 3 Parsing e alberi DTD Illustriamo ora la prima fase del programma, che consiste nel parsing validante di ciascuno dei due file DTD che vengono forniti dall utente. Ragioniamo su una singola DTD. L applicazione ha a disposizione una classe Java DTDParser, che è stata generata automaticamente a partire dalla grammatica DTDParser.jj che definisce tutte e sole le DTD valide. Ciò significa che, qualora vi siano errori sintattici nel file, l applicazione deve terminare immediatamente, stampando su schermo un messaggio esplicativo che segnali quale dichiarazione ovvero quale riga della DTD ha causato l errore violando la grammatica. Contestualmente a tale parsing, avviene una traduzione guidata dalla sintassi; è qui che, oltre agli aspetti prettamente sintattici, si aggiunge un ulteriore strato stavolta semantico, che in generale è diverso da applicazione ad applicazione. Il fatto che la grammatica sia univoca e precisa mentre l aspetto semantico da associare a ciascuna regola di derivazione non si possa generalizzare, ma debba essere specificato di volta in volta al seconda del programma che si deve implementare, è fondamentalmente la conferma del fatto che gli aspetti sintattici di qualsiasi programma che prenda in input delle DTD siano generalizzabili, mentre quando si tratta di significato si spalanca una porta che costringe a ragionare su ogni particolare problema e formalizzare algoritmi ad hoc, non esistendo un comun denominatore. Questo ci porta a descrivere uno strumento usato per l implementazione del parser di DTD: JavaCC. JavaCC è un compiler-compiler, vale a dire un programma che riceve in input una grammatica formale con una sintassi di tipo EBNF, e genera automaticamente un analizzatore sintattico e lessicale (cioè un parser) topdown. Il fatto che l analisi sintattica sia di tipo top-down significa che l albero 7

12 sintattico di derivazione della stringa di input (da non confondersi con gli alberi DTD ad hoc che andremo a costruire in fase di traduzione guidata dalla sintassi) viene generato a partire dalla radice o assioma scendendo fino alle foglie, che sono i simboli terminali della medesima stringa di input. Nel nostro caso, la stringa di input al parser sarà un intero file DTD comprensivo dei suoi caratteri di a capo. Poiché riconoscere una stringa rispetto a una grammatica è un operazione di per sé non deterministica, in generale questo porta a tempi esponenziali dunque inaccettabili per risolvere il problema del riconoscimento e di conseguenza anche quello dell analisi sintattica. Di contro, un analizzatore sintattico deve essere molto efficiente: 1. tipicamente si esige che l analizzatore sintattico giri in tempi lineari rispetto alle dimensioni della stringa di input; 2. inoltre, si richiede allo stesso analizzatore di costruire l albero sintattico leggendo solo pochi simboli della stringa per volta; anzi, di norma solo 1 simbolo della stringa per volta, che viene detto simbolo di lookahead. Questo vincolo è dettato dal fatto che memoria e disco rigido dei computer non sono infiniti: sarebbe bello per un analizzatore poter leggere un grande file atomicamente ovvero in un colpo solo, ma questo non è possibile per motivi pratici e a causa delle dimensioni notevoli (ordini di grandezza del gigabyte, 10 9 caratteri) che un file può raggiungere nelle applicazioni moderne. È pertanto necessario che le regole di produzione della grammatica rispettino dei vincoli che la rendano adatta all analisi sintattica. In particolare, essa è adatta allo scopo se per tale grammatica è possibile costruire un algoritmo di analisi sintattica deterministico. La grammatica non può essere ambigua, altrimenti il problema diventerebbe inerentemente non deterministico perché esisterebbero tanti alberi sintattici per la stessa sequenza di input, inoltre la forma delle regole deve essere tale da evitare il non determinismo. Per JavaCC, la grammatica deve essere di tipo LL(1), e vedremo ora che questa è una condizione molto forte ma necessaria. 3.1 Grammatiche LL(k) e LL(1) Definizione 3.1 (grammatica LL(k)). Una grammatica è LL(k) se ammette un riconoscitore deterministico che è in grado di costruire la derivazione canonica sinistra della stringa di input usando k simboli di lookahead e leggendo la stringa da sinistra verso destra. 8

13 La prima L di LL(k) indica la direzione in cui si legge la stringa: da sinistra a destra (Left-to-right). La seconda L indica che la stringa di input viene ricostruita per derivazione sinistra (Leftmost derivation), dunque il parser è top-down. Il numero tra parentesi indica il numero di simboli di lookahead. Meccanicamente, possiamo ora dare la seguente definizione sulla falsariga della precedente. Definizione 3.2 (grammatica LL(1)). Una grammatica è LL(1) se ammette un riconoscitore deterministico che è in grado di costruire la derivazione canonica sinistra della stringa di input usando 1 simbolo di lookahead e leggendo la stringa da sinistra verso destra. Occorrono un altro paio di nozioni per far capire come si è lavorato con JavaCC. Definizione 3.3 (ricorsione sinistra). Una grammmatica presenta ricorsione sinistra (diretta) se esiste almeno una sua regola di produzione che ha forma X Xα Definizione 3.4 (prefisso comune). Una grammatica presenta un prefisso comune se esistono almeno due sue regole nella forma A αβ 1 con α V N A αβ 2 indicante una qualsiasi forma di frase. Ciò detto, condizioni necessarie ma non sufficienti affinché una grammatica sia LL(1) sono: la grammatica deve essere priva di ricorsioni sinistre; la grammatica deve essere priva di prefissi comuni. Per fortuna, quando una grammatica presenta una di queste due caratteristiche che la rendono non LL(1), è sempre possibile operare trasformazioni equivalenti che portino a rispettare le due condizioni necessarie lasciando invariato il linguaggio corrispondente. Come già sottolineato, le due condizioni di cui sopra non sono sufficienti per poter affermare che una grammatica è LL(1). Quello che si fa quando si deve scrivere un parser è: 9

14 1. presentare una grammatica non contestuale al compiler-compiler e provare a compilarla; 2. se il compiler-compiler rileva delle ambiguità perché la grammatica non è LL(1), eliminare le ricorsioni sinistre e i prefissi comuni; 3. se non ci sono alternative, aumentare il numero di lookahead solo per la regola di produzione che causa i problemi; 4. se ora la grammatica è LL(1) fermarsi, altrimenti tornare al primo passo. Illustriamo a questo punto alcune parti salienti della nostra grammatica DTDParser.jj. 3.2 Grammatica fornita a JavaCC: DTDParser.jj In sintassi EBNF, la grammatica di tutte e sole le DTD è la seguente: ctypedecl ::= <!DOCTYPE S Name (S ExternalID)? S? ( [ intsubset ] S?)? > DeclSep ::= PEReference S intsubset ::= (markupdecl DeclSep)* markupdecl ::= elementdecl AttlistDecl EntityDecl NotationDecl PI Comment I non terminali usati nella parte destra delle regole di derivazione hanno questo significato: il nonterminale S indica spazi bianchi (tabulazioni, invio, etc.); NameChar ::= Letter Digit. - _ : CombiningChar Extender Name ::= (Letter _ : ) (NameChar)* Names ::= Name (#x20 Name)* Nmtoken ::= (NameChar)+ Nmtokens ::= Nmtoken (#x20 Nmtoken)* EntityValue ::= " ([^%&"] PEReference Reference)* " " " ([^%& ] PEReference Reference)* " " 10

15 AttValue ::= " ([^<&"] Reference)* " " " ([^<& ] Reference)* " " SystemLiteral ::= ( " [^"]* " ) (" " [^ ]* " ") PubidLiteral ::= " PubidChar* " " " (PubidChar - " ")* " " PubidChar ::= #x20 #xd #xa [a-za-z0-9] [- La grammatica DTDParser.jj si basa proprio sulla grammatica ufficiale delle DTD appena illustrata. Un esempio significativo è la regola qui di seguito, corredata di azioni semantiche. ElementDeclaration elem_decl() throws ElementDeclarationException, NodeException : { /* attributi: */ Token t; Node cm; { "<!ELEMENT" t=<alpha_string> cm=content_model() <CTAG> { if(cm.getname().equals("ignore") cm.getname().equals("") (t.image.length() >= 3 && t.image.substring(0,3).tolowercase().equals("xml")) ) return null; return new ElementDeclaration(t.image, cm); In sostanza, cosa fa la regola elem_decl()? Sintatticamente, espande il non terminale elem_decl() nella sequenza: "<!ELEMENT" <ALPHA_STRING> content_model() <CTAG> dove content_model() è a sua volta un non terminale da espandere, mentre le altre tre parole sono token, ovvero identificatori letterali predefiniti. Poi aspetto pregnante della regola di produzione c è un contenuto semantico associato, con un istruzione if. 11

16 Se il content model della dichiarazione di elemento corrisponde alla stringa IGNORE (una stringa di comodo definita da noi per fare la potatura degli alberi, come verrà spiegato in seguito) oppure corrisponde alla stringa vuota, oppure inizia per i tre caratteri xml a meno delle maiuscole (cosa vietata nelle specifiche XML), allora la regola deve restituire un valore null al non terminale padre, che saprà come gestirlo opportunamente. In tutti gli altri casi, ovvero se la dichiarazione è valida, deve restituire un istanza della struttura dati ElementDeclaration contenente il nome dell elemento e la struttura ad albero del content model. Dal momento che già abbiamo dato cenno di alberi e di strutture dati personalizzate per il progetto, sarà bene ora illustrarle. Ricordiamo che il fine ultimo di questa prima fase (fase di parsing) dell applicazione è quello di rappresentare una DTD come un albero in Java, sufficientemente semplice per essere visitato da un algoritmo e per subire operazioni, ma al tempo stesso che preservi il significato del file DTD in questione. 3.3 Alberi DTD Definizione 3.5 (albero). Dato un insieme N di nodi, un albero è definito in modo induttivo in questo modo: v N è un albero; se T 1,..., T n sono alberi, allora (v, [T 1,..., T n ]) è un albero 1. Definizione 3.6 (albero etichettato). Dato un insieme A di etichette e indicando con N(T ) N l insieme dei nodi di un albero T, un albero etichettato è una coppia (T, ϕ), dove ϕ è una funzione etichettatrice tale che per ogni v N(T ), ϕ(v) A. Le etichette usate per etichettare un albero appartengono a un insieme di marche di elemento, insieme che indichiamo con EN ; chiamiamo inoltre V l insieme delle foglie del generico albero. Per rappresentare in memoria l albero di una DTD ai fini di poter applicare alla sua radice vari algoritmi, si è scelto di scrivere da zero una struttura dati molto semplice: la struttura Node (nodo), avente le seguenti variabili: private String name; public Node[] children; 1 Per alleggerire la notazione, d ora in poi denoteremo con C i sottoalberi di T, nel senso che C = [T 1,..., T n ], qualora sia rilevante sapere che T è un sottoalbero interno di una DTD. 12

17 <!ELEMENT biblioteca (libro+,registro?,impiegato)> <!ELEMENT libro (autore,titolo)> <!ELEMENT registro (#PCDATA)> <!ELEMENT impiegato (#PCDATA)> <!ELEMENT autore (#PCDATA)> <!ELEMENT titolo (#PCDATA)> Figura 3.1: Esempio di DTD Figura 3.2: Esempio di albero DTD 13

18 Tali variabili rappresentano rispettivamente il nome del nodo e l elenco dei suoi figli come array di Node, eventualmente vuoto. Aggiungendo nodi in modo gerarchico tra loro grazie a un opportuno metodo void addchild(node n, int numero_del_figlio) si ottiene proprio una struttura dati ad albero. In particolare, si tratta di un albero n-ario ordinato. Per una spiegazione degli altri metodi presenti nella classe Node si veda l ultimo capitolo. 3.4 Semplificazioni Una delle caratteristiche di XML consiste nelle tante opzioni possibili quando si modellano i sottoelementi di un documento nelle DTD. Nella stesura del content model di una DTD, c è a disposizione una certa gamma di operatori, che sono quelli tipici delle espressioni regolari. Per ciascun sottoelemento è possibile specificare se esso è opzionale (? ), se esso può comparire molteplici volte ( se zero o più volte, e + se una o più volte), se alcuni sottoelementi sono alternativi tra di loro ( cioè OR logico) oppure sono raggruppati in sequenze in cui tutti devono comparire (, cioè AND logico). È nostra intenzione concentrarci su un sottoinsieme di DTD, per semplicità. Facciamo pertanto le seguenti ipotesi: consideriamo solo le dichiarazioni di elemento, eventualmente annidate; scartiamo gli attributi, i quali del resto possono essere pensati come un caso particolare degli elementi; ne consegue che di fatto consideriamo solo elementi non vuoti; ciò non è particolarmente limitativo né deve sconvolgere in quanto gli elementi vuoti sono sempre trattabili al pari di elementi #PCDATA col vincolo di avere contenuto nullo; non prendiamo in considerazione sequenze di operatori unari (?, *, + ) dal momento che esiste sempre una rappresentazione equivalente più concisa che usi un singolo operatore; ogni nodo corrisponde a un elemento, o a un tipo di elemento, o a un operatore. 14

19 L albero che il parser costruisce dalla DTD che riceve in ingresso è un albero etichettato sui nodi. Introduciamo l insieme di operatori OP = {?, *, +, AND, OR per poter rappresentare vincoli su opzionalità, ripetizioni, sequenze, alternative tra elementi. L operatore AND causa una sequenza di elementi tutti obbligatori, l operatore OR un alternativa di elementi (una tra le alternative deve essere presente), l operatore? l opzionalità, mentre gli operatori * e + rappresentano ripetizione di elementi (zero o più volte, una o più volte, rispettivamente). In tutti gli alberi DTD, l etichetta del nodo radice appartiene a EN e tale nodo possiede un solo arco uscente. Osservazione 3.7. Sotto le ipotesi fatte, gli unici nodi con più di un arco uscente possono essere solamente quelli etichettati AND o OR, e mai nodi con nome di elemento. Infine, si ha che tutti i nodi etichettati da tipi di elemento sono foglie dell albero. Sia ET l insieme dei possibili tipi di elemento base; per la nostra applicazione, ET = {#PCDATA, ANY. Con l armamentario formale che abbiamo definito, precisiamo ora la nozione di DTD vista come albero. Definizione 3.8 (albero DTD). Una DTD è un albero etichettato (T, ϕ T ) definito dall insieme di etichette (EN ET OP), e gode delle seguenti proprietà: 1. T è nella forma (v, [T ]), con ϕ T (v) EN ; 2. per ogni sottoalbero (v, C) di T, ϕ T (v) (EN OP); 3. per ogni sottoalbero foglia v di T, ϕ T (v) ET ; 4. per ogni sottoalbero (v, C) di T, se ϕ T (v) {OR, AND allora C = [T 1,..., T n ], con n > 1; 5. per ogni sottoalbero (v, C) di T, se ϕ T (v) ({?, *, + EN ) allora C = [T ]. L introduzione degli operatori OP = {?, *, +, AND, OR permette di rappresentare univocamente e formalmente la struttura di tutte le DTD possibili. Introdurre l operatore AND è stato necessario per poter distinguere tra il caso di un elemento contenente un alternativa tra sequenze (per esempio <!ELEMENT a(b c1,c2))>) e il caso di un elemento contenente invece l alternativa tra tutti gli elementi di una sequenza (<!ELEMENT a(b c1 c2)>). 15

20 Capitolo 4 Metriche di similarità La similarità, che gioca un ruolo di notevole importanza in diversi campi di ricerca, funge da principio di organizzazione e catalogazione in molti aspetti pratici: è usata dagli uomini per classificare concetti ed enti anche astratti, oltre che per formare nuovi concetti e generalizzazioni. Da un punto di vista informatico si distinguono astrattamente diversi possibili tipi di similarità misurabile: 1. a livello di dati; 2. a livello di tipi di dato, cioè di schemi o modelli o strutture, a seconda del dominio di applicazione in cui si opera; 3. a entrambi i livelli, confrontando tanto i dati quanto i loro tipi. Il primo modo è utile se si vogliono creare cluster di informazioni relativi allo stesso argomento e classificare tali informazioni; ad esempio, raggruppare immagini grafiche che riguardano lo stesso soggetto. Il secondo approccio di similarità possibile, relativo ai tipi, diventa rilevante per lo schema clustering oppure nell ambito di integrazioni di tanti schemi che descrivono sì lo stesso tipo di informazione ma usano strutture dati diverse. È questo il concetto su cui opera il progetto in questione. Infine, la similarità sia di dato che di tipo può essere usata per identificare un generatore di dati comune e per applicare a questi ultimi le proprietà specificate nel tipo. Ortogonalmente a questa prima classificazione, la similarità si può concentrare sui contenuti oppure sulle strutture di dati coinvolti. Poiché una quantità enorme di informazioni scambiate sul Web sta man mano aderendo al formato XML e le applicazioni hanno sempre più bisogno di parlare XML (ricevere, accedere, manipolare documenti XML con vincoli 16

21 e condizioni più o meno rilassati e risultati più o meno approssimati), è logico comprendere come la possibilità di valutare la similarità sia utile e attuale. 4.1 Similarità tra DTD: princìpi di base Confrontando due file DTD ovvero i due alberi corrispondenti, può capitare che alcuni elementi presenti nella prima DTD manchino nella seconda oppure che la prima ne abbia in eccesso rispetto all altra, o viceversa. Non solo: gli elementi, pur essendo comuni, potrebbero essere disposti in un ordine (gerarchia) differente tra i due alberi. E ancora: un sottoinsieme delle marche di una delle DTD potrebbero essere non proprio identiche ma concettualmente vicine a marche dell altro file, secondo relazioni definite in un dizionario. Questo implicherebbe la necessità di gestire, oltre all uguaglianza tra nomi di marche, anche la similarità semantica tra essi. Il lettore avrà già intuito che il problema di definire una metrica per stabilire la similarità tra due DTD è arduo, e il grado di raffinatezza dell algoritmo che si vuole progettare è inversamente proporzionale alla facilità di concepirlo, pianificarlo, gestirlo informaticamente a livello algoritmico e di codice. Non c è limite alla granularità che potremmo implementare, a scapito però di complicazioni concettuali. Per fini pratici scegliamo una raffinatezza limitata operando alcune ipotesi semplificative. Tanto per cominciare, consideriamo solo l uguaglianza tra marche e mai una vicinanza concettuale tra esse: o una certa marca è presente in entrambe le DTD in input (e in questo caso il grado di similarità restituita sarà maggiore di 0%), oppure due marche in posizioni corrispondenti hanno nomi diversi. Non ci sono vie di mezzo. Un altra semplificazione che operiamo è quella di confrontare solo le marche di tipo ELEMENT e di scartare a priori i vari ATTLIST ed ENTITY. Del resto, questa scelta era stata messa in atto già a livello di parsing. 4.2 Come valutare le differenze L algoritmo di similarità, in buona sostanza, consiste nell identificazione e successiva valutazione numerica di: elementi comuni, cioè che appaiono in entrambe le DTD; elementi differenti: quelli che compaiono solo in una delle due DTD. Per quanto riguarda la valutazione degli elementi, questa avviene prendendo in considerazione principalmente due fattori. 17

22 1. L algoritmo assegna un peso a seconda del livello a cui gli elementi comuni sono situati nei due alberi da confrontare. Elementi a livelli più alti, cioè vicini alla radice del documento, devono possedere un coefficiente di peso maggiore dei sottoelementi più periferici, quelli profondamente annidati nell albero, vicino alla sua fronda. 2. Successivamente, la valutazione prende in considerazione la struttura degli elementi in comune. Trovare in comune due elementi complessi i quali sono a loro volta grandi sottoalberi deve premiare di più che trovare in comune due elementi foglia. Introdurremo ora alcune funzioni matematiche ricorsive di ausilio per questa prima parte dell algoritmo, quella di parsing. 4.3 La funzione livello Come già accennato, è auspicabile che la misura di similarità sia coerente col fatto che elementi in alto nell albero, dunque vicini alla radice, abbiano un peso maggiore di quelli più periferici. Il concetto di livello di un elemento è strettamente collegato a quello della sua altezza nell albero, oppure specularmente della sua profondità. Dato un albero T che rappresenta una DTD, definiamo il livello di T come il numero dei nodi, non contando gli operatori, toccati lungo il massimo cammino possibile in T, dalla radice verso una foglia. Il motivo per cui i nodi in OP non contano ai fini della funzione livello è il seguente: i nodi operatore di una DTD influenzano soltanto la larghezza degli alberi corrispondenti alla classe di XML associati, non la loro profondità; siccome a noi in questo momento interessa la funzione livello, che associa a ogni nodo un valore dipendente proprio dalla sua profondità nell albero, ecco spiegato perché questi operatori non incrementano il conteggio lungo i cammini radice-foglia. Formalizziamo quanto appena stabilito. Definizione 4.1 (funzione livello). Sia T = (v, [T 1,..., T n ]) un sottoalbero di una DTD. Allora la funzione livello è così definita: 1 + max n i=1 level(t i ) se T EN level(t ) = max n i=1 level(t i ) se T OP 0 altrimenti. Ricordiamo che EN è l insieme delle marche elemento, mentre OP denota gli operatori {?, *, +, AND, OR. Nella definizione precedente, inoltre, T i denota il generico eventuale sottoalbero figlio di T. 18

23 4.4 Rilevanza di un nodo Chiamiamo l = level(d) il livello di una DTD D (del suo nodo radice) e γ = 2 un fattore di rilevanza di un livello dell albero di D rispetto al successivo. Il nodo radice ha dunque rilevanza r l = γ l ; quelli del livello inferiore sono divisi per un fattore γ e hanno dunque rilevanza γ l 1, e così via. Definizione 4.2 (rilevanza). Per un generico livello i dell albero corrispondente a una DTD D, la rilevanza vale γ l i. Dopo aver parlato di level, andiamo ora a definire una seconda, fondamentale funzione che associa un valore a ciascun nodo. 4.5 La funzione peso Abbiamo scritto di voler considerare la più semplice struttura possibile di una DTD. Questa scelta è particolarmente sensata per applicazioni che lavorino, invece che con sole DTD in input come la nostra, con un mix di file DTD e file XML in ingresso; si veda ad esempio [BGM]. Per motivi di semplicità, non prendiamo in considerazione gli elementi opzionali o ripetuti. Inoltre, per quanto riguarda elementi alternativi (in OR logico), l algoritmo dovrà considerare solo uno di tali elementi: presumibilmente quello con la struttura (sottoalbero) più semplice. Si capisce già che la seguente funzione ricorsiva assocerà un valore diverso a ogni nodo a seconda che esso sia una marca di elemento oppure un vincolo operatore. Definizione 4.3 (funzione peso). Sia D una DTD con r l rilevanza corrispondente. Allora si definisce la seguente funzione peso 1 : se D {#PCDATA, ANY r l 0 se D {*,? weight(d, r l ) se D = + ; D è il figlio di D weight(d, r l ) = n i=1 weight(d i, r l ) se D = AND ; D i sono i figli di D min n i=1 weight(d i, r l ) n i=1 weight(d i, r l ) + r γ l se D = OR ; D i sono i figli di D altrimenti. Cominciamo a illustrare l ultimo caso della funzione, il più importante e delicato. Dice questo: se il nodo di cui occorre calcolare il peso è una marca 1 Con un leggero abuso di notazione, indichiamo con D non la DTD nel suo insieme ma il nodo che inizialmente è il nodo radice della DTD stessa, mentre nelle chiamate ricorsive D sarà meramente la radice del sottoalbero attuale. 19

24 un nome di elemento, allora aggiungi r l al subtotale della similarità poi applica l algoritmo ai vari figli, dividendo per un fattore γ = 2 il secondo parametro (r l ), che dalla prossima chiamata, inclusa, è quindi aggiornato. Il significato del quarto e del quinto caso si intuisce facilmente. Se il nodo di cui vogliamo calcolare il peso è un vincolo AND, allora il suo peso sarà uguale alla somma dei pesi di tutti i figli, mantenendo il parametro r l di cui sopra immutato. Se il nodo è invece un OR, il suo peso è il minimo dei pesi di tutti i figli del nodo OR stesso, anche qui lasciando il parametro di rilevanza immutato; esplorare solo il sottoalbero figlio con peso minimo corrisponde a selezionare il sottoalbero con la struttura DTD più semplice possibile. Continuiamo ad analizzare le varie possibilità della funzione dal basso verso l alto. Il terzo caso dice che il peso di un nodo di vincolo + è il peso del suo figlio, che tra l altro è per forza di cose un figlio unico, per come abbiamo costruito l albero a partire dalla DTD in fase di parsing. La seconda opzione della funzione peso è quella che essa incontri un nodo * o? ; in questi casi, coerentemente con le ipotesi semplificative sugli alberi DTD, appiattiamo il vincolo di cardinalità al valore 0, potando di fatto il nodo in questione con tutti i suoi eventuali figli. Infine, il primo caso elencato della funzione considera i nodi foglia, che per ipotesi possono essere solo #PCDATA o ANY. A essi la funzione associa direttamente il valore attuale del parametro di rilevanza r l, che sarà tanto più piccolo quanto la foglia è profonda, in quanto a ogni livello si ha un aumento esponenziale del denominatore dell espressione. La rilevanza del primo livello, in altre parole della radice, vale r l = γ l ; la rilevanza del secondo livello r l /γ = r l /2; quella del terzo livello r l /γ 2 = r l /4 e così via. Pertanto, trovare una marca di elemento in comune tra i due alberi a un livello i-esimo aggiungerà al subtotale di similarità una quantità r l /γ i 1, il che rispetta uno degli obiettivi iniziali: più un nodo è vicino alla radice, più esso pesa nel computo in positivo o in negativo (a seconda che sia in comune tra le due DTD o meno, rispettivamente). La figura 4.1 a pagina 21 rappresenta un esempio dei valori risultanti dalle due funzioni level e weight su ogni nodo. 4.6 Ruolo del parametro γ Al crescere del valore assegnato al numero naturale γ, l algoritmo assegna maggiore rilevanza a elementi in comune che si trovano a un livello alto vicino alla radice piuttosto che a elementi periferici, prossimi alla fronda dell albero, in definitiva strutturalmente poco rilevanti. 20

25 Figura 4.1: Esempio di livelli e pesi Se poniamo γ = 1, tutte le informazioni sono valutate rilevanti alla stessa maniera, perciò il fatto che un elemento appaia al terzo o al quarto livello della struttura dati non conta. Viceversa, la scelta di porre γ = 2 fa sì che i nodi di un certo livello abbiano rilevanza doppia rispetto ai loro figli. Con γ 3 il divario sarebbe ancora maggiore. In questa sede noi supporremo sempre che γ valga 2. L utente che volesse fare esperimenti con altri valori del parametro può modificare la riga private int GAMMA = 2 all inizio del file DTDSimilarity.java. 4.7 Casi particolari di input Prima di illustrare il caso generale dell algoritmo, adatto a computare la similarità di qualsiasi coppia di DTD, citiamo due situazioni limite. Il primo caso particolare su cui vale la pena spendere qualche parola è quello in cui i due alberi DTD ottenuti dal parser siano vuoti, ovvero contengano zero nodi. Questo può capitare se i due file di testo forniti in input sono proprio file vuoti di 0 byte, ma non solo: tenendo a mente che stiamo prendendo in considerazione le dichiarazioni di elemento, un albero vuoto può risultare anche da un file DTD che contiene sì zero dichiarazioni di elemento, ma magari ne contiene di altre: di esse viene controllata la 21

Introduzione alla codifica XML per i testi umanistici

Introduzione alla codifica XML per i testi umanistici Introduzione alla codifica XML per i testi umanistici Daniele Silvi, Domenico Fiormonte, Fabio Ciotti fiormont@uniroma3.it - silvi@lettere.uniroma2.it - ciotti@lettere.uniroma2.it 1 La digitalizzazione

Dettagli

G I O R D A N I A L E S S A N D R A I T T S E R A L E G. M A R C O N I

G I O R D A N I A L E S S A N D R A I T T S E R A L E G. M A R C O N I Introduzione ad XML G I O R D A N I A L E S S A N D R A I T T S E R A L E G. M A R C O N I XML XML (Extensible Markup Language) è un insieme standard di regole sintattiche per modellare la struttura di

Dettagli

Linguaggi e tecnologie per il Web

Linguaggi e tecnologie per il Web Sapienza Università di Roma Corso di Laurea in Ingegneria Informatica e Automatica Linguaggi e tecnologie per il Web a.a. 2015/2016 Riccardo Rosati Dipartimento di ingegneria informatica, automatica e

Dettagli

Semantica operazionale dei linguaggi di Programmazione

Semantica operazionale dei linguaggi di Programmazione Semantica operazionale dei linguaggi di Programmazione Oggetti sintattici e oggetti semantici Rosario Culmone, Luca Tesei Lucidi tratti dalla dispensa Elementi di Semantica Operazionale R. Barbuti, P.

Dettagli

XML. Parte VI - Introduzione e nozioni fondamentali di sintassi. XML: Extensible Markup Language:

XML. Parte VI - Introduzione e nozioni fondamentali di sintassi. XML: Extensible Markup Language: XML Parte VI - Introduzione e nozioni fondamentali di sintassi XML: cosa è XML: Extensible Markup Language: è un linguaggio che consente la rappresentazione di documenti e dati strutturati su supporto

Dettagli

La struttura: DTD. Laura Farinetti Dip. Automatica e Informatica Politecnico di Torino. laura.farinetti@polito.it

La struttura: DTD. Laura Farinetti Dip. Automatica e Informatica Politecnico di Torino. laura.farinetti@polito.it La struttura: DTD Laura Farinetti Dip. Automatica e Informatica Politecnico di Torino laura.farinetti@polito.it L. Farinetti - Politecnico di Torino 1 Modello di struttura I tag annidati danno origine

Dettagli

HTML e Linguaggi. Politecnico di Milano Facoltà del Design Bovisa. Prof. Gianpaolo Cugola Dipartimento di Elettronica e Informazione

HTML e Linguaggi. Politecnico di Milano Facoltà del Design Bovisa. Prof. Gianpaolo Cugola Dipartimento di Elettronica e Informazione HTML e Linguaggi Politecnico di Facoltà del Design Bovisa Prof. Gianpaolo Cugola Dipartimento di Elettronica e Informazione cugola@elet.polimi.it http://home.dei.polimi.it/cugola Indice Il linguaggio del

Dettagli

Infrastrutture INFormatiche Ospedaliere 2 Corso di laurea di Ingegneria Medica. Indice

Infrastrutture INFormatiche Ospedaliere 2 Corso di laurea di Ingegneria Medica. Indice Indice 4. XML Extensible Markup Language...2 4.1 Usi di XML...3 4.2 Caratteristiche di XML...3 4.3 Elementi...5 4.4 Attributi...5 4.4.1 Documento XML ben formato...6 4.5 Informazioni di controllo...6 4.5.1

Dettagli

XML: La nascita del linguaggio

XML: La nascita del linguaggio XML: introduzione alla codifica dei testi Con la codifica dei testi si intende la rappresentazione dei testi stessi su un supporto digitale in un formato utilizzabile dall'elaboratore (Machine Readable

Dettagli

extensible Markup Language

extensible Markup Language XML a.s. 2010-2011 extensible Markup Language XML è un meta-linguaggio per definire la struttura di documenti e dati non è un linguaggio di programmazione un documento XML è un file di testo che contiene

Dettagli

Introduzione a XML. Language

Introduzione a XML. Language Introduzione a XML 1 Che cos è XML? XML: Extensible Markup Language anguage: è un linguaggio che consente la rappresentazione di documenti e dati strutturati su supporto digitale è uno strumento potente

Dettagli

a cura di Maria Finazzi

a cura di Maria Finazzi Esercitazioni di XML a cura di Maria Finazzi (11-19 gennaio 2007) e-mail: maria.finazzi@unipv.it pagine web: Il trattamento dell'informazione Testo a stampa: Come

Dettagli

La sintassi di un DTD si basa principalmente sulla presenza di quattro dichiarazioni:

La sintassi di un DTD si basa principalmente sulla presenza di quattro dichiarazioni: XML: DTD Da un punto di vista cronologico, il primo approccio per la definizione di grammatiche per documenti XML è rappresentato dai Document Type Definition (DTD). Un DTD è un documento che descrive

Dettagli

Tecnologie Web T Introduzione a XML

Tecnologie Web T Introduzione a XML Tecnologie Web T Introduzione a Home Page del corso: http://www-db.deis.unibo.it/courses/tw/ Versione elettronica: 2.01..pdf Versione elettronica: 2.01.-2p.pdf 1 Che cos è? : Extensible Markup Language:

Dettagli

FONDAMENTI di INFORMATICA Prof. Lorenzo Mezzalira

FONDAMENTI di INFORMATICA Prof. Lorenzo Mezzalira FONDAMENTI di INFORMATICA Prof. Lorenzo Mezzalira Appunti del corso 1 Introduzione all informatica: algoritmi, linguaggi e programmi Indice 1. Introduzione 2. Risoluzione automatica di problemi - Algoritmi

Dettagli

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C Università di Roma Tre Facoltà di Scienze M.F.N. Corso di Laurea in Matematica Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C Marco Liverani (liverani@mat.uniroma3.it)

Dettagli

Dispensa 3. 1.1 YACC: generalità

Dispensa 3. 1.1 YACC: generalità Dispensa 3 1.1 YACC: generalità Il tool Yacc (acronimo per Yet Another Compiler Compiler) è uno strumento software che a partire da una specifica grammaticale context free di un linguaggio scritta in un

Dettagli

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C Università di Roma Tre Dipartimento di Matematica e Fisica Corso di Laurea in Matematica Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C Marco Liverani (liverani@mat.uniroma3.it)

Dettagli

Tipi di Dato Ricorsivi

Tipi di Dato Ricorsivi Tipi di Dato Ricorsivi Luca Abeni September 2, 2015 1 Tipi di Dato Vari linguaggi di programmazione permettono all utente di definire nuovi tipi di dato definendo per ogni nuovo tipo l insieme dei suoi

Dettagli

Modellazione e Gestione di Informazioni non Strutturate

Modellazione e Gestione di Informazioni non Strutturate Università della Calabria, Corso di Laurea Specialistica in Ingegneria Gestionale Progettazione di Sistemi Informativi Docente: Alfredo Cuzzocrea Modellazione e Gestione di Informazioni non Strutturate

Dettagli

I tipi di dato astratti

I tipi di dato astratti I tipi di dato astratti.0 I tipi di dato astratti c Diego Calvanese Fondamenti di Informatica Corso di Laurea in Ingegneria Elettronica A.A. 001/00.0 0 I tipi di dato astratti La nozione di tipo di dato

Dettagli

INTERAZIONE CON L UTENTEL

INTERAZIONE CON L UTENTEL IL SISTEMA OPERATIVO Insieme di programmi che opera al di sopra della macchina fisica, mascherandone le caratteristiche e fornendo agli utenti funzionalità di alto livello. PROGRAMMI UTENTE INTERPRETE

Dettagli

IL SISTEMA OPERATIVO IL SISTEMA OPERATIVO INTERFACCE TESTUALI INTERFACCE TESTUALI FUNZIONI DEL SISTEMA OPERATIVO INTERFACCE GRAFICHE

IL SISTEMA OPERATIVO IL SISTEMA OPERATIVO INTERFACCE TESTUALI INTERFACCE TESTUALI FUNZIONI DEL SISTEMA OPERATIVO INTERFACCE GRAFICHE IL SISTEMA OPERATIVO Insieme di programmi che opera al di sopra della macchina fisica, mascherandone le caratteristiche e fornendo agli utenti funzionalità di alto livello. PROGRAMMI UTENTE INTERPRETE

Dettagli

E una notazione per descrivere gli algoritmi.

E una notazione per descrivere gli algoritmi. Linguaggio di Programmazione E una notazione per descrivere gli algoritmi. Programma:: e la rappresentazione di un algoritmo in un particolare linguaggio di programmazione. In generale, ogni linguaggio

Dettagli

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 05 La rappresentazione dell informazione Carla Limongelli Ottobre 2011 http://www.dia.uniroma3.it/~java/fondinf/ La rappresentazione

Dettagli

COS È UN LINGUAGGIO? LINGUAGGI DI ALTO LIVELLO LA NOZIONE DI LINGUAGGIO LINGUAGGIO & PROGRAMMA

COS È UN LINGUAGGIO? LINGUAGGI DI ALTO LIVELLO LA NOZIONE DI LINGUAGGIO LINGUAGGIO & PROGRAMMA LINGUAGGI DI ALTO LIVELLO Si basano su una macchina virtuale le cui mosse non sono quelle della macchina hardware COS È UN LINGUAGGIO? Un linguaggio è un insieme di parole e di metodi di combinazione delle

Dettagli

APPENDICE C extensible Markup Language

APPENDICE C extensible Markup Language APPENDICE C extensible Markup Language C.1 extensible Markup Language, concetti di base XML è un dialetto di SGML progettato per essere facilmente implementabile ed interoperabile con i suoi due predecessori

Dettagli

Progetto Automi e Linguaggi Parser svliluppato con JLex e cup

Progetto Automi e Linguaggi Parser svliluppato con JLex e cup Progetto Automi e Linguaggi Parser svliluppato con JLex e cup Sviluppato da Santoro Carlo Maurizio Matricola:0108/528 Sviluppo terminato il: 18/06/06 TRACCIA DEL PROGETTO Si costruisca, utilizzando la

Dettagli

Linguaggi formali e compilazione

Linguaggi formali e compilazione Linguaggi formali e compilazione Corso di Laurea in Informatica A.A. 2015/2016 Linguaggi formali e compilazione Elementi generali Un parser generico di tipo procede operando una sequenza di riduzioni a

Dettagli

Uso di un browser (con riferimento a Microsoft Internet Explorer 6.0)

Uso di un browser (con riferimento a Microsoft Internet Explorer 6.0) Uso di un browser (con riferimento a Microsoft Internet Explorer 6.0) Nota Bene: Si raccomanda di leggere queste dispense di fronte al computer, provando passo dopo passo le funzionalità descritte. Per

Dettagli

Risoluzione. Eric Miotto Corretto dal prof. Silvio Valentini 15 giugno 2005

Risoluzione. Eric Miotto Corretto dal prof. Silvio Valentini 15 giugno 2005 Risoluzione Eric Miotto Corretto dal prof. Silvio Valentini 15 giugno 2005 1 Risoluzione Introdurremo ora un metodo per capire se un insieme di formule è soddisfacibile o meno. Lo vedremo prima per insiemi

Dettagli

Laboratorio di Algoritmi e Strutture Dati

Laboratorio di Algoritmi e Strutture Dati Laboratorio di Algoritmi e Strutture Dati Docente: Camillo Fiorentini 18 dicembre 2007 Esercizio 1: rappresentazione di una tabella di occorrenze L obiettivo è quello di rappresentare in modo efficiente

Dettagli

Corso di Laurea in INFORMATICA

Corso di Laurea in INFORMATICA Corso di Laurea in INFORMATICA Algoritmi e Strutture Dati MODULO 2. Algebre di dati Dati e rappresentazioni, requisiti delle astrazioni di dati, costrutti. Astrazioni di dati e dati primitivi. Specifica

Dettagli

Laboratorio Matematico Informatico 2

Laboratorio Matematico Informatico 2 Laboratorio Matematico Informatico 2 (Matematica specialistica) A.A. 2006/07 Pierluigi Amodio Dipartimento di Matematica Università di Bari Laboratorio Matematico Informatico 2 p. 1/1 Informazioni Orario

Dettagli

Linguaggio Java. Robusto. Orientato agli oggetti. Protegge e gestisce dagli errori. Non permette costrutti pericolosi

Linguaggio Java. Robusto. Orientato agli oggetti. Protegge e gestisce dagli errori. Non permette costrutti pericolosi Linguaggio Java Robusto Non permette costrutti pericolosi Eredità Multipla Gestione della Memoria Orientato agli oggetti Ogni cosa ha un tipo Ogni tipo è un oggetto (quasi) Protegge e gestisce dagli errori

Dettagli

Uso di un browser (con riferimento a Microsoft Internet Explorer 7.0)

Uso di un browser (con riferimento a Microsoft Internet Explorer 7.0) Uso di un browser (con riferimento a Microsoft Internet Explorer 7.0) Nota Bene: Si raccomanda di leggere queste dispense di fronte al computer, provando passo dopo passo le funzionalità descritte. Per

Dettagli

Interpretazione astratta

Interpretazione astratta Interpretazione astratta By Giulia Costantini (819048) e Giuseppe Maggiore (819050) Contents Interpretazione astratta... 2 Idea generale... 2 Esempio di semantica... 2 Semantica concreta... 2 Semantica

Dettagli

I Modelli della Ricerca Operativa

I Modelli della Ricerca Operativa Capitolo 1 I Modelli della Ricerca Operativa 1.1 L approccio modellistico Il termine modello è di solito usato per indicare una costruzione artificiale realizzata per evidenziare proprietà specifiche di

Dettagli

16.3.1 Alberi binari di ricerca

16.3.1 Alberi binari di ricerca 442 CAPITOLO 16. STRUTTURE DI DATI DINAMICHE root 7 5 11 2 8 13 10 Figura 16.11 Esempio di albero binario: ogni nodo contiene il dato da immagazzinare e tre puntatori che definiscono le sue relazioni di

Dettagli

Creare documenti XML. La natura epistemologica della codifica. Perché comprare XML? La struttura gerarchica ordinata. Riassumendo le componenti

Creare documenti XML. La natura epistemologica della codifica. Perché comprare XML? La struttura gerarchica ordinata. Riassumendo le componenti Lez. 7 Creare documenti XML La codifica deve raggiungere 2 traguardi: Accessibilità tecnica Permanenza a lungo termine 05/03/12 Perché comprare XML La natura epistemologica della codifica HTML Descrive

Dettagli

Prob(CCCCCCCCCC) = 1 2 10

Prob(CCCCCCCCCC) = 1 2 10 12. Contenuto di Informazione Algoritmico (AIC) - 17/05/12 Vogliamo adesso introdurre una nozione di contenuto di informazione di una stringa infinita, prodotta da una sorgente di informazione, che non

Dettagli

BriscoParse. Un linguaggio per descrivere partite di Briscola a 4 giocatori. Linguaggi e Modelli Computazionali LS. Marco D Alessandro

BriscoParse. Un linguaggio per descrivere partite di Briscola a 4 giocatori. Linguaggi e Modelli Computazionali LS. Marco D Alessandro BriscoParse Un linguaggio per descrivere partite di Briscola a 4 giocatori. Linguaggi e Modelli Computazionali LS Marco D Alessandro 1 Obiettivo del Progetto Sviluppare un Linguaggio semplice che permetta

Dettagli

LA RAPPRESENTAZIONE DELLE INFORMAZIONI

LA RAPPRESENTAZIONE DELLE INFORMAZIONI ISTITUTO TECNICO E LICEO SCIENTIFICO TECNOLOGICO ANGIOY LA RAPPRESENTAZIONE DELLE INFORMAZIONI Prof. G. Ciaschetti DATI E INFORMAZIONI Sappiamo che il computer è una macchina stupida, capace di eseguire

Dettagli

Università di Pisa Dipartimento di Informatica Programmazione in JavaScript

Università di Pisa Dipartimento di Informatica Programmazione in JavaScript Università di Pisa Dipartimento di Informatica Programmazione in JavaScript Vincenzo Ambriola Versione 3.2 ~~~ 30 gennaio 2013 Prefazione Per chi si avvicina alla programmazione gli ostacoli da superare

Dettagli

Corso Base. Liceo Norberto Rosa Bussoleno Prof. Angelo GIORGIO

Corso Base. Liceo Norberto Rosa Bussoleno Prof. Angelo GIORGIO Corso Base Liceo Norberto Rosa Bussoleno Prof. Angelo GIORGIO Java Java è un Linguaggio di Programmazione orientato agli oggetti. Un Linguaggio di Programmazione è un linguaggio ad alto livello, dotato

Dettagli

Linguaggi per il web oltre HTML: XML

Linguaggi per il web oltre HTML: XML Linguaggi per il web oltre HTML: XML Luca Console Con XML si arriva alla separazione completa tra il contenuto e gli aspetti concernenti la presentazione (visualizzazione). XML è in realtà un meta-formalismo

Dettagli

JAVASCRIPT. Tale file è associato alla pagina web mediante il tag