![]() |
|
![]() |
Introduzione | ||
Il fascino dei linguaggi di programmazione logica è, a nostro avviso,
duplice. Da un lato, la loro base di tipo logico-deduttivo li rende strumenti
teorici potenti ed educativi, utili per approfondire i concetti di logica
formale, deduzione ed elaborazione simbolica.
Da un punto di vista metodologico, l'uso della programmazione logica,
grazie alle sue caratteristiche dichiarative, aiuta a concentrarsi sulle
specifiche del problema e a risolverlo, almeno in una prima versione,
senza preoccuparsi eccessivamente dei dettagli realizzativi.
D'altra parte, la realizzazione efficiente dei linguaggi logici ha fatto
sì che la programmazione logica (e il Prolog in particolare)
diventasse uno strumento effettivo per lo sviluppo di applicazioni complesse,
soprattutto nel campo dell'Intelligenza Artificiale.
La comunità scientifica che si occupa di programmazione logica
è molto attiva a livello sia nazionale sia internazionale,
come testimoniano le associazioni italiana (Gruppo Utenti Logic Programming,
GULP
http://rep1.iei.pi.cnr.it/people/asirelli/GULP.html) e internazionale
(Association for Logic Programming, ALP http://www.cs.mu.oz.au/~ad).
Il libro si rivolge a chiunque voglia avvicinarsi alla programmazione logica e al Prolog studiandone sia gli aspetti metodologici sia quelli realizzativi. Questa seconda edizione aggiorna ed estende la versione precedente soprattutto per ciò che riguarda gli aspetti applicativi di tale paradigma di programmazione e del linguaggio Prolog. In particolare, è stato esteso il capitolo relativo all'uso del Prolog per l'Intelligenza Artificiale, ampliandone la parte relativa alle tecniche di meta-programmazione con nuovi esempi e introducendo i problemi di soddisfacimento di vincoli e la loro soluzione mediante algoritmi di consistenza. Inoltre, sono stati aggiunti due capitoli riguardanti, rispettivamente, l'uso del Prolog per l'analisi sintattica dei linguaggi e la Programmazione Logica a Vincoli. Il contenuto del capitolo relativo alle tecniche di programmazione in Prolog è stato incluso negli altri capitoli relativi al linguaggio. Le estensioni del linguaggio Prolog (alcune delle quali erano descritte sinteticamente nell'ultimo capitolo dell'edizione precedente) sono oggi tanto numerose da non poter essere contenute in un solo capitolo. Abbiamo, quindi, preferito ometterne la descrizione, che sarebbe stata necessariamente molto limitata, e, invece, dedicare un capitolo a una particolare estensione (la Programmazione Logica a Vincoli) per le sue ricadute applicative. Presupposti necessari alla comprensione del libro sono la conoscenza di un linguaggio di programmazione e le basi matematiche acquisite alla scuola media superiore. La nuova edizione è composta da 15 capitoli e può essere considerata suddivisa in tre parti strettamente correlate. La prima parte, composta dai capitoli 1, 2, 3, 4 e 5, introduce in modo sintetico la logica dei predicati del primo ordine, la risoluzione e le basi della programmazione logica. Lo scopo è quello di guidare il lettore attraverso i passi effettuati per fare sì che la logica diventasse un vero e proprio, potente linguaggio di programmazione. La seconda parte, composta dai capitoli 6, 7, 8, 9, 10 e 11, discute le caratteristiche del linguaggio Prolog come caso particolare dello schema generale di programmazione logica definito nella prima parte. La terza parte, composta dai capitoli 12, 13, 14 e 15, è dedicata, invece, alla discussione di tecniche di programmazione logica, alle applicazioni di Prolog nel campo dell'analisi sintattica e dell'Intelligenza Artificiale e all'introduzione della Programmazione Logica a Vincoli. Con riferimento alla prima parte, poichè non si presuppone la conoscenza dei fondamenti di logica classica, nel capitolo 1 si richiamano i concetti base della logica dei predicati del primo ordine. Nel capitolo 2 si presenta il principio di risoluzione, la regola di inferenza utilizzata nella programmazione logica. Nel capitolo 3 si introduce la programmazione logica come particolare teoria della logica dei predicati del primo ordine. L'interpretazione procedurale, presentata alla fine del capitolo, mostra come alla programmazione logica possa essere data un'interpretazione in termini di un linguaggio di programmazione tradizionale. Nel capitolo 4 si presenta la semantica di un linguaggio di programmazione logica, dopo aver richiamato le nozioni di semantica operazionale, a modelli e di punto fisso e i relativi concetti matematici. Si passa poi a denotare la programmazione logica in termini delle tre semantiche elencate precedentemente e si enunciano i teoremi (di correttezza e completezza) che garantiscono l'equivalenza fra le differenti semantiche introdotte. Nel capitolo 5 si discutono i problemi dovuti all'introduzione della negazione in linguaggi logici. Il capitolo 4 e gran parte del capitolo 5 possono essere ignorati se il lettore non è interessato ad approfondire la semantica della programmazione logica. Nella seconda parte del libro vengono introdotte le caratteristiche del linguaggio Prolog, il più diffuso tra i linguaggi di programmazione logica. In particolare, nel capitolo 6 viene introdotta la sintassi del Prolog e vengono analizzati i meccanismi di risoluzione del linguaggio. Nel capitolo 7 vengono introdotti i metodi per la valutazione di espressioni e per il calcolo di funzioni; vengono quindi presentati semplici esempi di funzioni aritmetiche per analizzare il concetto di ricorsione e le differenze tra valutazione iterativa e valutazione ricorsiva. Nel capitolo 8 viene introdotta la struttura dati delle liste e diversi usi di tale struttura dati. Nei capitoli 9, 10 e 11 vengono quindi analizzati i principali predicati predefiniti forniti dal linguaggio Prolog. Nel capitolo 9 si presentano i predicati che permettono di influenzare la strategia di controllo dell'interprete: in primo luogo si introduce un modello astratto dell'esecuzione di un programma Prolog che viene quindi utilizzato per discutere tali predicati (e in particolare il predicato "cut"). Si dedica inoltre attenzione particolare alla forma di negazione per fallimento definita in Prolog. Nel capitolo 10 si discute la struttura dei termini e si analizzano i predicati predefiniti per la definizione di operatori funzionali e per la manipolazione di termini. Nel capitolo 11 si evidenzia lÕuniformità tra dati e programmi e si introducono i predicati predefiniti di "meta-livello", ossia quei predicati che consentono di trattare i programmi come dati; in conclusione, si presenta un semplice meta-interprete per il Prolog (ossia un interprete Prolog scritto in Prolog) e altri esempi, più complessi, di meta-interpretazione. La terza parte del libro è dedicata all'analisi di tecniche di programmazione logica. Nel capitolo 12 si discute la realizzazione in Prolog di strutture dati complesse quali alberi e grafi e gli algoritmi per la loro manipolazione. Nel capitolo 13 si mostra l'utilizzo del Prolog per la costruzione di analizzatori di linguaggi e si introduce il formalismo delle Definite Clause Grammars utile per l'analisi sintattica di linguaggi. Nel capitolo 14 si discutono alcune applicazioni del Prolog all'Intelligenza Artificiale, in particolare nelle aree di risoluzione automatica di problemi, della costruzione di motori inferenziali e interpreti. In questo capitolo si presenta anche la soluzione di problemi di soddisfacimento di vincoli mediante algoritmi di consistenza realizzati in Prolog. Nel capitolo 15 si presenta la Programmazione Logica a Vincoli, un'estensione della programmazione logica che affianca al risolutore Prolog un risolutore di vincoli. Il capitolo è completato da alcuni esempi applicativi. Ringraziamenti per la prima edizione Il nostro ringraziamento va a tutti coloro che hanno contribuito alla messa a punto del materiale contenuto in questo libro. Alcuni degli argomenti trattati costituiscono una rielaborazione di quanto presentato nel corso di seminari introduttivi ed avanzati sulla programmazione logica organizzati dal Gruppo Utenti Logic Programming (GULP). In particolare i seminari tenuti da Catuscia Palamidessi sulla semantica della programmazione logica e da Paolo Mancarella sul trattamento della negazione sono stati fondamentali per la stesura dei relativi capitoli di questo libro. Un ringraziamento particolare va a Maurelio Boari, Leonardo Lesmo, Alberto Martelli, Maurizio Martelli, Antonio Natali, Gianfranco Rossi, Daniele Theseider Duprè e Pietro Torasso per i suggerimenti sulle varie parti del libro. Vorremmo inoltre ringraziare tutto il Gruppo Utenti Logic Programming ed in particolare il suo presidente Giorgio Levi poichè senza di loro questo lavoro non sarebbe stato possibile. Ringraziamenti per la seconda edizione Il nostro ringraziamento va a tutti coloro che hanno contribuito, con suggerimenti e materiale a cui ci siamo ispirati, alla realizzazione di questa seconda edizione. Un ringraziamento particolare va a Michele Bariani, Andrea Omicini e Fabrizio Riguzzi. Vorremmo, inoltre, ringraziare gli studenti dei nostri corsi che hanno contribuito alla revisione del contenuto del libro segnalando errori e inesattezze. Ci scusiamo per inevitabili errori ancora presenti e ringraziamo anticipatamente tutti coloro che vorranno darne segnalazione. A tale proposito, segnalazioni e suggerimenti possono essere inviati, elettronicamente, all'indirizzo: libro_pl@deis.unibo.it. Luca Console, Evelina Lamma, Paola Mello, Michela Milano Febbraio, 1997 | |||
![]() |
Errata Corrige | ||
![]() About this Server |
![]() DocMaster |
![]() LIA WebMaster |
|