%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Relazione scientifica sulla ricerca svolta
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Il lavoro svolto dall'Unità di Parma può articolarsi
nei seguenti due punti:
 (1) Analisi di linguaggi logici (con vincoli).
 (2) Definizione di linguaggi con vincoli insiemistici e loro impiego
nell'analisi di programmi basata su insiemi.

Per quanto riguarda il punto (1), ci si è concentrati sulla
definizione e dimostrazione di correttezza di domini di analisi atti a
caratterizzare alcune proprietà di sicurezza dei programmi logici,
come la finitezza dei termini elaborati (occur-check reduction e
finite-tree analysis).  Questa proprietà è un prerequisito
essenziale quando si vogliono integrare analisi statiche progettate
per domini di alberi finiti all'interno di implementazioni di sistemi
logici che di fatto calcolano su domini di alberi razionali
potenzialmente infiniti, pervenendo quindi ad una vera e propria
certificazione del programma (oppure identificando i punti in cui si
ha un potenziale problema di correttezza e/o sicurezza).  Questo
problema è particolarmente sentito nel caso di agenti mobili scritti
in un linguaggio logico (fase 1 del progetto).  La progettazione di
una estensione dell'analizzatore China in grado di operare in modo
incrementale e modulare (fase 2 del progetto) è tuttora in corso.
Molta attenzione è stata posta al miglioramento ed alla valutazione
sperimentale della precisione dell'analisi (fasi 1 e 3 del progetto).

- Finite-tree analysis.
L'analisi di finitezza dei termini, introdotta in [C4,RT5], è un
nuovo tipo di analisi statica che ha l'obiettivo di determinare a
tempo di compilazione se un dato termine razionale è sicuramente
finito.  Questa analisi rappresenta una generalizzazione dell'analisi
di occur-check ed è applicabile in tutti i casi in cui il programma
considerato effettua, intenzionalmente ed in modo controllato,
computazioni su alberi razionali potenzialmente infiniti.  Come per il
caso dell'occur-check reduction, la correttezza, la precisione e
l'efficienza della finite-tree analysis dipendono essenzialmente dalle
corrispondenti proprietà dell'analisi di sharing, che ne è una delle
componenti principali.

- Analisi di sharing.
Uno degli obiettivi dell'analisi di sharing per i programmi logici è
quello di determinare quali coppie di variabili possono condividere
una terza variabile.  Il dominio Sharing (Jacobs e Langen, 1989) è
una scelta pressoché standard per questo tipo di analisi e per
ulteriori studi teorici. A dispetto di ciò si è riscontrato che non
esistevano dimostrazioni soddisfacenti delle proprietà chiave,
commutatività ed idempotenza, che rendono Sharing ben
definito. Inoltre, le prove o congetture pubblicate circa la
correttezza dell'analisi basata su questo dominio presumono che il
linguaggio analizzato implementi l'unificazione con l'occur-check,
cosa che è falsa nella quasi totalità dei casi. Il lavoro [R4]
chiude queste falle, rimaste aperte per quasi un decennio. La
complementazione, e cioè l'operazione inversa del prodotto ridotto,
rappresenta una tecnica relativamente nuova per la determinazione
automatica di decomposizioni minimali dei domini astratti.  In [R5]
mostriamo la decomposizione per complementazione della versione non
ridondante di Sharing, denotata PSD, dando sostanza all'affermazione
che la complementazione, da sola, non è sufficiente per ottenere
decomposizioni veramente minimali: la giusta soluzione a questo
problema consiste prima nella rimozione delle ridondanze attraverso il
calcolo del quoziente del dominio rispetto al comportamento
osservabile, e poi nella decomposizione per complementazione.

- Miglioramenti della precisione delle analisi.
Relativamente alla precisione delle analisi basate su combinazioni di
domini che includono il dominio Sharing, esiste un piccolo nucleo di
tecniche, quali la combinazione standard con informazioni di
linearità e di freeness, che sono oramai ampiamente accettate ed
utilizzate. Esistono però diverse altre proposte che sono circolate
nella comunità scientifica per anni, accomunate dal fatto che nessuna
di esse sembra essere stata sottoposta ad una adeguata validazione
sperimentale. Per questa ragione, come parte del nostro sforzo per
spingere la precisione dell'analisi oltre i limiti attuali, in [C1,S1]
ci siamo posti il problema di verificare se e quanto dette proposte
possono contribuire ad un effettivo miglioramento della precisione. In
particolare abbiamo discusso e/o valutato sperimentalmente utilizzando
l'analizzatore China le seguenti possibilità: l'effetto della
propagazione su Sharing delle variabili ground identificate da Pos;
l'incorporazione di informazione strutturale esplicita nel dominio di
analisi; tecniche più sofisticate per integrare Sharing e Pos; la
questione del riordinamento dei binding nel calcolo dell'mgu astratto;
una proposta originale concernente l'aggiunta di informazioni
sull'insieme di variabili che sono ground o free; tecniche più
precise per l'integrazione delle informazioni di linearità e di
freeness; la possibilità di migliorare la precisione dell'analisi
mantenendo informazioni sulla compoundness delle variabili.

In [C2,RT3] abbiamo presentato la costruzione razionale di un dominio
generico con informazione strutturale per l'analisi di programmi CLP.
Il dominio proposto, Pattern(D), ha come parametro un qualsiasi
dominio astratto D, che deve soddisfare alcuni requisiti assolutamente
ragionevoli. La nostra definizione del dominio suddetto prende
ispirazione da un analogo dominio parametrico per l'analisi di
programmi logici introdotto da A. Cortesi e colleghi. D'altra parte,
la nostra formalizzazione, oltre ad applicarsi all'analisi di un
qualunque linguaggio CLP, è indipendente dalla tecnica di
implementazione: il dominio di Cortesi, opportunamente esteso per
trattare correttamente i linguaggi CLP che omettono l'occur-check
nella procedura di unificazione, è una delle possibili
implementazioni.  Ragionando ad un più alto livello di astrazione
siamo in grado di riferirci a nozioni classiche della teoria
dell'unificazione e di consentire all'implementatore una notevole
libertà d'azione. Infatti, come dimostriamo in [C2,RT3], un
analizzatore che incorpori informazione strutturale basandosi sul
nostro approccio può essere estremamente competitivo, sia dal punto
di vista della precisione (cosa largamente scontata) sia dal punto di
vista dell'efficienza (cosa non scontata ed in contrasto con alcune
considerazioni, non supportate da sperimentazioni, recentemente
apparse in letteratura).

Allo scopo di aumentare la precisione della finite-tree analysis, in
[C5,RT6] abbiamo studiato l'integrazione del dominio proposto in
[C4,RT5] con il dominio Bfun delle le funzioni booleane definite sulle
variabili del programma. In questo modo è possibile catturare le
dipendenze di finitezza tra le variabili stesse, in particolare
rendendo possibile una più accurata approssimazione dei built-in.  La
novità di questa analisi, rispetto all'analoga analisi delle
dipendenze di groundness basata sui domini Pos e Def, consiste nella
possibilità di sfruttare adeguatamente anche l'informazione fornita
dalle funzioni booleane negative.  In [C5,RT6] sono anche mostrate le
interconnessioni esistenti tra le dipendenze di groundness (Pos), le
dipendenze di finitezza (BFun) e la proprietà di finitezza
caratterizzata in [C4,RT5], dimostrando come ed in che misura i tre
tipi di informazione possono interagire durante l'analisi.  Da una
prima valutazione sperimentale con China è possibile notare come i risultati
della finite-tree analysis, sebbene già caratterizzati da un buon
livello di precisione, sono sensibilmente migliorati grazie al dominio
delle dipendenze di finitezza.

Sempre mirando ad un aumento della precisione delle varie analisi, si
è provveduto a sviluppare una libreria per la manipolazione di
poliedri convessi [A3]. Il dominio dei poliedri convessi è utilizzato
in moltissime applicazioni dell'analisi statica (non solo per i
linguaggi logici, ma anzi principalmente per i linguaggi imperativi),
tra le quali spiccano le analisi per identificare eventuali problemi
di sicurezza causati dai buffer-overflow delle applicazioni di rete:
è stato calcolato che essi costituiscono più del 50% di tutti gli
attacchi informatici via rete. La libreria è già utilizzata
all'interno dell'analizzatore China.

Per quanto riguarda il punto (2) del lavoro svolto dall'Unità di
Parma ci si è in particolare concentrati sugli obiettivi: (a) di
migliorare ed estendere la definizione e l'implementazione del
linguaggio logico a vincoli con insiemi CLP(SET) (fasi 1 e 2); (b) di
analizzare come le possibilità specifiche presenti in questo
linguaggio possano essere vantaggiosamente impiegate nell'analisi di
programmi basata su insiemi (fasi 2 e 3).

(a) Le precedenti versioni di CLP(SET) sono state opportunamente
estese con l'aggiunta di nuovi vincoli insiemistici (operazioni di
unione e di non-intersezione) ed il conseguente ampliamento delle
procedure per il controllo di soddisfacibilità dei vincoli. La
disponibilità di queste operazioni come vincoli primitivi del
linguaggio è indispensabile per l'utilizzo del linguaggio di vincoli
insiemistici per l'analisi di programmi basata su insiemi. Di
fondamentale importanza, in particolare, è l'operazione di
unificazione insiemistica, studiata approfonditamente in [S2]. La
nuova versione del linguaggio CLP(SET) è descritta per esteso in [R1].

Un altro aspetto che si è ritenuto importante analizzare -- anche se
non esplicitamente previsto nella proposta originaria -- riguarda il
trattamento della negazione nel linguaggio CLP(SET) e la stretta
connessione tra questa e la possibilità di fornire definizioni
intensionali (e cioè per proprietà) degli insiemi. La disponibilità
di queste forme di astrazione insiemistica si dimostra infatti di
fondamentale importanza per permettere un uso più ampio del
linguaggio di vincoli insiemistici nell'analisi di programmi basata su
insiemi. In [R2] viene fornita un'analisi approfondita delle
problematiche relative all'aggiunta della negazione (ed in particolare
della Negazione Costruttiva) al linguaggio CLP(SET), e quindi viene
presentata una possibile soluzione per il trattamento di insiemi
intensionali. In [R3] viene evidenziato però un risultato negativo in
cui si mostra come la Negazione Costruttiva non sia in grado di
funzionare correttamente con qualsiasi programma CLP(SET) e, più in
generale, con qualsiasi linguaggio CLP basato su una struttura non
decidibile.  Un altro importante arricchimento del linguaggio di
vincoli insiemistici che si è analizzato (vedi [RT1][RT4][S3])
riguarda l'introduzione di altre forme di aggregato, quali i
multi-insiemi e le liste. A differenza degli insiemi, queste
astrazioni permettono di tener conto dell'ordine e della molteplicità
degli elementi nell'aggregato. Considerazioni e proposte sull'utilizzo
dei multi-insiemi nel contesto di un linguaggio CLP sono presentate in
[R6] e [C3].

(b) Parallelamente alla realizzazione ed ampliamento di CLP(SET) si è
approfondito lo studio relativo all'utilizzo del linguaggio di vincoli
insiemistici fornito da CLP(SET) per l'analisi di programmi basata su
insiemi ("set-based analysis"), senza tuttavia arrivare ad una
completa pubblicazione dei risultati ottenuti.  In particolare si è
potuto verificare come il nostro linguaggio di vincoli insiemistici
costituisca una valida alternativa ai linguaggi di set-constraints
considerati in letteratura e tuttora frequentemente impiegati nel
campo dell'analisi di programmi (si veda a proposito, ad esempio,
l'articolo di A. Aiken "Introduction to Set Constraint-Based Program
Analysis").  Se, da una parte, CLP(SET) non è in grado di trattare
adeguatamente i vincoli su insiemi infiniti gestibili invece con i
set-constraints, dall'altra, la possibilità di annidamento di
insiemi, la presenza di un'operazione di appartenenza insiemistica, la
possibilità di trattare insiemi intensionali, nonché quella di
estendere il dominio del discorso ad altre forme di aggregati, quali i
multi-insiemi, rende il linguaggio a vincoli insiemistici di CLP(SET)
un interessante strumento per la realizzazione di forme di "set-based
analysis" possibilmente più generali e flessibili di quelle
attualmente descritte in letteratura.  A scopo d'esempio si è
verificato l'utilizzo di una tecnica di analisi di programmi basata su
CLP(SET) sul problema dell'analisi di groundness di programmi logici,
concludendo che la maggior flessibilità e potenza espressiva di
CLP(SET) rispetto ai linguaggi di set-constraints solitamente usati in
letteratura permettono di risolvere facilmente problemi non risolti
con quest'ultimi (in particolare l'interdipendenza tra le variabili).

I risultati preliminari ottenuti su queste specifiche tematiche sono
documentati dai lavori [A1] e [A2]. Esempi di analisi di semplici
programmi Prolog con i relativi vincoli insiemistici CLP(SET) prodotti
e le definizioni CLP(SET) aggiuntive atte alle loro verifica sono
disponibili  qui.
Questi programmi CLP(SET) possono vedersi come un primo prototipo
degli strumenti di analisi di programmi basata sulle tecniche da noi
sviluppate e che costituivano uno degli obiettivi del progetto.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Pubblicazioni
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


In riviste internazionali

[R1] A. Dovier, C. Piazza, E. Pontelli, and G. Rossi.
Sets and Constraint Logic Programming.
ACM Transaction on Programming Language and Systems, 
Vol. 22 (5), Sept. 2000, 861-931.

[R2] A. Dovier, E. Pontelli, and G. Rossi.
Constructive negation and constraint logic programming with sets.
New Generation Computing, Springer Verlag and Ohmsha Ltd,
19(3)209--255, May 2001.

[R3] A. Dovier, E. Pontelli, and G. Rossi.
A Necessary Condition for Constructive Negation in Constraint Logic
Programming. Information Processing Letters, Vol. 74 (3-4) (2000), 
Elsevier, North Holland, 147-156.

[R4] P. M. Hill, R. Bagnara, E. Zaffanella.
Soundness, idempotence and commutativity of set-sharing.
To appear in Theory and Practice of Logic Programming.

[R5] E. Zaffanella, P. M. Hill, R. Bagnara.
Decomposing non-redundant sharing by complementation.
To appear in Theory and Practice of Logic Programming.

[R6] A. Dovier, C. Piazza,  and G. Rossi. 
Multiset rewriting by multiset constraint solving 
Romanian Journal of Information Science and Technology, 
Vol. 4(1--2):59--76, 2001.


In atti di Conferenze internazionali

[C1] R. Bagnara, E. Zaffanella, P. M. Hill.
Enhanced sharing analysis techniques: A comprehensive evaluation.
In Proc. 2nd Int. ACM SIGPLAN Conf. on Principles and Practice of
Declarative Programming (PPDP 2000) (Montreal, Canada, 2000),
M. Gabbrielli and F. Pfenning, Eds., ACM, 103-114.

[C2] R. Bagnara, P. M. Hill, E. Zaffanella.
Efficient structural information analysis for real CLP languages.
In Proc. 7th Int. Conf. on Logic for Programming and Automated Reasoning
(LPAR 2000) (Reunion Island, France, 2000), M. Parigot and A. Voronkov, Eds.,
vol. 1955 of LNCS, Springer-Verlag, Berlin, 189-206.

[C3] A. Dovier, C. Piazza,  and G. Rossi. Multiset Constraints and P Systems.
To appear in: Multisets Processing (C.S. Calude, Gh. Paun, 
G. Rozenberg, A. Salomaa, eds.), Lecture Notes in Computer Science, 
Springer Verlag.

[C4] R. Bagnara, R. Gori, P. M. Hill ed E. Zaffanella.
Finite-Tree Analysis for Constraint Logic-Based Languages.
In Proc. of the 8th Int. Symp. on Static Analysis
(SAS 2001) (Paris, France, July 2001), vol. 2126 of LNCS,
P. Cousot, Ed., pp. 165-184.

[C5] R. Bagnara, E. Zaffanella, R. Gori e P. M. Hill.
Boolean Functions for Finite-Tree Dependencies.
In Proc. of the 8th Int. Conf. on Logic for Programming, Artificial
Intelligence and Reasoning (LPAR 2001) (Havana, Cuba, December 2001),
vol. 2250 of LNCS, R. Nieuwenhuis and A. Voronkov, Eds., pp. 575-589


Rapporti Tecnici

[RT1] A. Dovier, C. Piazza, and G. Rossi.
A uniform approach to constraint-solving for lists, multisets,
compact lists, and sets. 
Rapporto di Ricerca, Dipartimento di Matematica, Università di Parma, n.235, 
September 2000.

[RT2] G. Rossi.
{log} User's Manual - Version 3.3. 
Rapporto di Ricerca, Dipartimento di Matematica, Università di Parma, n.233, 
September 2000.

[RT3] R. Bagnara, P. M. Hill, E. Zaffanella.
Efficient structural information analysis for real CLP languages.
Quaderno 229, Dipartimento di Matematica, Università di Parma, 2000.

[RT4] A. Dovier, C. Piazza, and G. Rossi.
A uniform approach to constraint-solving for
lists, multisets, compact lists, and sets
In Pre-Proceedings of the Workshop on Multiset
Processing WMP2000 (C.S.Calude, M.J.Dinnen, Gh.Paun, eds),
Curtea de Arges (Romania), Research Report CDMTCS-140, Centre
for Discrete Mathematics and Theoretical Computer Science,
University of Auckland, New Zealand, Agosto 2000.

[RT5] R. Bagnara, R. Gori, P. M. Hill ed E. Zaffanella.
Finite-Tree Analysis for Constraint Logic-Based Languages.
Quaderno 251, Dipartimento di Matematica, Università di Parma, 2001.

[RT6] R. Bagnara, E. Zaffanella, R. Gori e P. M. Hill.
Boolean Functions for Finite-Tree Dependencies.
Quaderno 252, Dipartimento di Matematica, Università di Parma, 2001.


Sottomessi 

[S1] R. Bagnara, E. Zaffanella, P. M. Hill.
Enhanced Sharing Analysis Techniques: a Comprehensive Evaluation.
Submitted to Theory and Practice of Logic Programming.

[S2] A. Dovier, E. Pontelli, and G. Rossi.
Set Unification. versione sottomessa.

[S3] A. Dovier, C. Piazza, and G. Rossi.
A uniform approach to constraint-solving for lists, multisets,
compact lists, and sets. versione sottomessa.


Altre

[A1] A. Dovier, C. Piazza, and G. Rossi. Set-based constraints
In preparazione. 
Versione preliminare ("draft")

[A2] A. Morini. 
Una proposta per l'analisi di "groundness" di programmi logici basata su insiemi (in Italian),
Tesi di Laurea, Dipartimento di Matematica, Università di Parma, Ottobre 2000.

[A3] R. Bagnara, S. Bonini, P. M. Hill, A. Pescetti, E. Ricci,
A. Stazzone, E. Zaffanella, T. Zolo.
The Parma Polyhedra Library User's Manual



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Prodotti software sviluppati
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

L'attività svolta ha portato alle seguenti realizzazioni:

1) Ampliamento e miglioramento di China, un analizzatore per linguaggi
logici con vincoli scritto in C++ da R. Bagnara e E. Zaffanella. Tutti
i domini di analisi studiati sono stati implementati ed integrati in
China. Per la valutazione sperimentale dell'analizzatore si è
provveduto alla ricerca e raccolta sistematica dei programmi logici
disponibili sulla rete Internet. In questo modo è stata costituita
una estesa "benchmark suite" che garantisce la significatività
della sperimentazione stessa.

2) Parma Polyhedra Library: libreria C++ per la
manipolazione di poliedri convessi (vedere Appendice A).

3) Ampliamento e miglioramento di CLP(SET), un linguaggio logico con
vincoli insiemistici [R1]. L'interprete del linguaggio, scritto in 
SICStus Prolog, è disponibile qui (vedere Appendice B).


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Altre attività
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Partecipazione a conferenze/workshop/scuole
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- Workshop on Multiset Processing (WMP), Curtea de Arges, Romania
  Agosto 2000 (G. Rossi).
- 2nd Int. ACM SIGPLAN Conf. on Principles and Practice of Declarative
  Programming, Montreal (Canada), Settembre 2000 (R. Bagnara e E. Zaffanella).
- 7th Int. Conf. on Logic for Programming and Automated Reasoning (LPAR
  2000), Reunion Island (Francia), Novembre 2000 (R. Bagnara).
- POPL01 - Principles of Programming Languages, Londra, Gennaio 2001 (G. Rossi).
- European Joint Conferences on Theory and Practice of Software (ETAPS 2001),
  Genova, Italia, Aprile 2001 (E. Zaffanella).
- 8th International Static Analysis Symposium (SAS 2001), Paris, France,
  Luglio 2001 (R. Bagnara e E. Zaffanella).
- 2001 Joint Conference on Declarative Programming (APPIA-GULP-PRODE 2001),
  Evora, Portugal, Settembre 2001 (R. Bagnara).


Seminari
^^^^^^^^

- Seminario su "Efficient Structural Information Analysis
  for Real CLP Languages", tenuto da R. Bagnara presso la
  Facultad de Informatica, Universidad Politecnica di Madrid,
  gennaio 2001.
- Seminario su "Widening Sharing", tenuto da R. Bagnara presso la
  Facultad de Informatica, Universidad Politecnica di Madrid,
  gennaio 2001.
- Seminario su "Correctness, Precision and Efficiency in the Sharing
  Analysis of Real Logic Languages", tenuto da E. Zaffanella
  presso il Dipartimento di Informatica dell'Università di Pisa,
  novembre 2001.


Materiale inventariabile acquisito nell'ambito del progetto
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- 2 PC HIBIT Biostar M7MKA con processore AMD K7 Athlon 700MHz,
  memoria RAM da 256 MByte, HD da 20 GByte e Monitor 17''
- 1 Modem V.90 K56Flex
- 1 Masterizzatore WAITEC "TITAN"
- 1 Masterizzatore SONY CRX1611-82E
- 3 Banchi DIMM PC133 da 512MB
- Libri.


Personale a contratto
^^^^^^^^^^^^^^^^^^^^^
È stato stipulato un contratto per prestazione occasionale della durata di
3 mesi con la Dott.ssa Angela Stazzone (vedere Allegato C).


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Appendici
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


Appendice A - Parma Polyhedra Library
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

La "Parma Polyhedra Library" (PPL) è una libreria C++ per la
manipolazione di poliedri convessi.  Più precisamente, PPL tratta
poliedri convessi che possono essere definiti come intersezione di un
numero finito di iperspazi chiusi, ognuno descritto da un uguaglianza
o disuguaglianza a coefficienti razionali.

La libreria PPL usa la rappresentazione della doppia descrizione
introdotta da T. S. Motzkin e colleghi: la descrizione basata
sull'intersezione di iperspazi è accompagnata da una descrizione
basata sull'enumerazione dei vertici e dei raggi estremali del
poliedro.  In altre parole, nella prima descrizione il poliedro è
descritto da un insieme finito di vincoli; nella seconda descrizione,
il poliedro è descritto da un insieme finito di generatori.  Alcune
operazioni sui poliedri si possono eseguire più convenientemente sulla
prima rappresentazione.  Ad esempio, l'intersezione di due poliedri
può essere caratterizzata dall'unione dei rispettivi insiemi di
vincoli.  Il calcolo dell'inviluppo convesso di due poliedri, invece,
può essere facilmente visto come l'unione dei rispettivi insiemi di
generatori.

La libreria PPL esegue, automaticamente ed in modo totalmente trasparente
all'utilizzatore, le conversioni da una rappresentazione all'altra.
Le conversioni vengono posposte quanto più  possibile; quando queste
non possono essere ulteriormente dilazionate, le conversioni vengono
effettuate in modo da massimizzarne il beneficio (ad esempio, alcuni
risultati intermedi vengono salvati in modo da poter essere riutilizzati
nelle computazioni successive).
Per eseguire le conversioni, la libreria usa un algoritmo originariamente
proposto da T. S. Motzkin e colleghi, poi riscoperto e migliorato da 
N. V. Chernikova, H. Le Verge, D. K. Wilde, K. Fukuda, A. Prodon,
N. Halbwachs, Y.-E. Proy, P. Roumanoff e B. Jeannet.
La libreria include anche algoritmi di widening derivati da quelli
di N. Halbwachs e P. Cousot.

Alcune caratteristiche peculiari della Parma Polyhedra Library sono:

- facilità d'uso: sfruttando i meccanismi di overloading degli operatori
  del C++ un vincolo può essere scritto, ad esempio, `x + 2*y + 5*z <= 7';

- totale dinamicità: la disponibilità di memoria virtuale è l'unica
  limitazione alla dimensione di ogni oggetto;

- scritta in C++ standard, e dunque portabile, ma interfacciabile
  con altri linguaggi (un'interfaccia per Prolog è già disponibile);

- sicura rispetto alle eccezioni: anche nel caso in cui venga superato
  il limite di memoria virtuale disponibile, non vengono sprecate risorse
  né si lasciano in esistenza oggetti invalidi (questo supporta tecniche
  di analisi miste: si tenta l'analisi poliedrale e si ripiega su un'analisi
  basata su intervalli nel caso di risorse insufficienti);

- piuttosto efficiente: grazie a tecniche implementative (alcune esposte sopra)
  particolarmente sofisticate;

- interamente documentata: nello stile noto come "literate programming"
  (ad esempio, tutta la matematica necessaria a giustificare il funzionamento
  della libreria è parte della documentazione);

- software libero: distribuito nei termini della "GNU General Public License"
  (e dunque liberamente disponibile, in perpetuo, a chiunque voglia usarla,
  studiarla e modificarla).



Appendice B - Interprete per il linguaggio CLP(SET)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
CLP(SET) è un linguaggio logico a vincoli che fornisce varie forme
generali e flessibili di costrutti insiemistici con le relative
operazioni di base per la loro manipolazione. Gli insiemi in CLP(SET)
sono visti come oggetti primitivi del linguaggio, precisamente termini
della logica del prim'ordine, mentre tutti i predicati predefiniti che
hanno a che fare con insiemi sono visti come vincoli ("constraint")
primitivi del linguaggio. Il linguaggio CLP(SET) descritto in [R1]
rappresenta un'evoluzione e revisione in termini di una visione CLP
("Constraint Logic Programming") del linguaggio logico esteso {log}
descritto in A.Dovier, E.Omodeo, E.Pontelli, G.Rossi. "{log}: A
Language for Programming in Logic with Finite Sets", Journal of Logic
Programming, Vol.28(1).

Nell'ambito di questo progetto è stato portata a termine
l'implementazione di un interprete per l'intero linguaggio descritto
in [R1], comprensivo dei constraint di unione e di
disgiunzione. L'interprete è implementato in SICStus Prolog ed è
disponibile al sito WEB www.math.unipr.it/~gianfr/setlog.Home.html.

A questa stessa pagina è anche disponibile altro materiale di ausilio
all'utilizzo del linguaggio CLP(SET), e precisamente:
 - il manuale utente del linguaggio (disponibile anche come [RT2]);
 - un file contenente la definizione CLP(SET) di varie operazioni
   insiemistiche di base non fornite come constraint primitivi dal
   linguaggio, ma facilmente definibili in termini di questi;
 - vari file contenenti esempi di programmi CLP(SET) funzionanti.

L'interprete di CLP(SET) è scritto in SICStus Prolog e quindi per
poterlo eseguire è richiesta la disponibilità di interprete SICStus
Prolog. In realtà l'interprete di CLP(SET) utilizza pochissime
possibilità specifiche del SICStus Prolog e quindi può essere fatto
funzionare con poco sforzo su qualsiasi altro sistema Prolog.


Appendice C - Contratto Dott.ssa Angela Stazzone
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Lavoro svolto (in breve):

1) studio del formato rpm (Red Hat Package Manager) e
   realizzazione di una distribuzione, in tale formato, 
   dell'analizzatore statico China;

2) raffinamento dell'implementazione (in C++) di un occurs-check 
   reducer accoppiato al suddetto analizzatore;

3) raffinamento, auditing e documentazione di alcune parti
   della Parma Polyhedra Library.

Lavoro svolto (per esteso):

1) Red Hat Package Manager

Red Hat Package Manager (RPM) è un sistema per la gestione di
pacchetti software che ne facilita enormemente la distribuzione e
l'installazione. Questo sistema gestisce un data-base di tutti i
pacchetti installati e dei rispettivi file, in modo da poter
automatizzare l'installazione, la disinstallazione e la verifica di
integrità di ogni pacchetto.
 
China è un analizzatore data-flow/control-flow per programmi logici
con vincoli su domini simbolici e numerici. Utilizzando Red Hat
Package Manager, è stata creata una versione RPM dell'analizzatore
China che può quindi essere distribuito ed installato anche da persone
non esperte.

2) Occurs-Check Reducer

È stato raffinato un "occurs-check reducer" (OCR), in grado di
eseguire, in modo automatico, un numero minimale di modifiche su un
programma logico sufficienti ad assicurarne la correttezza.  L'OCR,
interagendo con l'analizzatore statico China, controlla tutte le
unificazioni (implicite ed esplicite) presenti in un programma ed
eventualmente le trasforma in unificazioni con occurs-check. La regola
generale prevede di lasciare inalterate le unificazioni non soggette
al problema dell'occurs-check e di trasformare quelle potenzialmente
pericolose in unificazioni con occurs-check. Questo tipo di controllo
riguarda anche alcuni built-in che, implicitamente o esplicitamente,
effettuano unificazioni.

3) Parma Polyhedra Library

La documentazione della PPL è stata estesa e migliorata; le principali
funzionalità della libreria sono state illustrate nel modo più chiaro
possibile, facendo riferimento ai risultati utilizzati durante
l'implementazione ed eventualmente fornendone la dimostrazione.