PROGRAMMAZIONE LOGICA E PROLOG

Seconda Edizione

Luca Console, Evelina Lamma, Paola Mello, Michela Milano

Copertina
.

Indice

.

Introduzione

.

Errata Corrige

.

Esercizi Risolti


Indice

LA PROGRAMMAZIONE LOGICA

INTRODUZIONE

Capitolo 1 LA LOGICA DEI PREDICATI DEL PRIMO ORDINE
1.1 Sintassi
1.2 Interpretazione
1.3 Teorie del primo ordine
1.4 La logica proposizionale come teoria assiomatica

Capitolo 2 IL PRINCIPIO DI RISOLUZIONE
2.1 Le clausole
2.1.1 Trasformazione in clausole
2.2 Il principio di risoluzione
2.2.1 Unificazione
2.2.2 Il principio di risoluzione per le clausole generali
2.2.3 Dimostrazione per contraddizione attraverso la risoluzione
2.2.4 Strategie e semplificazioni

Capitolo 3 LA PROGRAMMAZIONE LOGICA
3.1 Le clausole di Horn
3.2 Risoluzione SLD
3.2.1 Regola di calcolo
3.2.2 Alberi SLD
3.2.3 Strategie di ricerca
3.3 Interpretazione procedurale

Capitolo 4 LA SEMANTICA DELLA PROGRAMMAZIONE LOGICA
4.1 La semantica di un linguaggio di programmazione
4.2 La semantica operazionale della programmazione logica
4.3 La semantica a modelli della programmazione logica
4.3.1 Interpretazioni e modelli di Herbrand
4.3.2 Proprietà dei modelli di Herbrand
4.4 La semantica di punto fisso della programmazione logica
4.4.1 Richiami sulla teoria dei punti fissi
4.4.2 Semantica di punto fisso per programmi logici
4.4.3 Equivalenza tra semantica di punto fisso e a modelli
4.5 Correttezza e completezza

Capitolo 5 IL PROBLEMA DELLA NEGAZIONE
5.1 L'ipotesi di mondo chiuso
5.2 La negazione per fallimento
5.2.1 Caratterizzazione di punto fisso
5.2.2 Caratterizzazione operazionale
5.2.3 Caratterizzazione dichiarativa
5.2.4 Risoluzione SLDNF
5.2.5 Restrizioni sui programmi logici
5.2.6 Programmi logici normali
5.3 Semantiche alternative per programmi logici normali

Capitolo 6 DALLA PROGRAMMAZIONE LOGICA AL PROLOG
6.1 Sintassi
6.2 Interpretazione dichiarativa
6.3 Esecuzione di un programma Prolog
6.4 Algoritmo di unificazione
6.5 Soluzioni multiple e disgiunzione
6.6 Interpretazione procedurale
6.7 Alcuni semplici programmi
6.8 Dalla risoluzione a un linguaggio di programmazione
6.9 I predicati di I/O
6.10 I predicati di caricamento del codice

Capitolo 7 ARITMETICA E RICORSIONE
7.1 Aritmetica
7.1.1 Predicati predefiniti per la valutazione di espressioni
7.1.2 Operatori relazionali
7.1.3 Calcolo di funzioni
7.2 Ricorsione e iterazione
7.2.1 Ricorsione tail
7.2.2 Ricorsione non-tail
7.2.3 Forme più complesse di ricorsione

Capitolo 8 LISTE
8.1 Definizioni
8.1.1 Unificazione su liste
8.2 Operazioni sulle liste
8.3 Reversibilità delle procedure Prolog
8.4 Operazioni su insiemi
8.5 Liste differenza
8.6 Algoritmi di ordinamento

Capitolo 9 CONTROLLO DI UN PROGRAMMA
9.1 Un modello di esecuzione per il Prolog
9.2 Il predicato cut (!)
9.2.1 Specifica del determinismo
9.2.2 Efficienza
9.3 Il predicato call
9.3.1 Strutture Condizionali
9.4 Il predicato fail
9.5 La negazione in Prolog
9.6 I predicati setof, bagof e findall

Capitolo 10 STRUTTURE DATI
10.1 Operatori e loro definizione
10.2 I termini e la loro manipolazione
10.2.1 Relazioni tra termini
10.2.2 Verifica del tipo di un termine
10.2.3 Accesso alle componenti di un termine
10.3 Stringhe

Capitolo 11 PREDICATI DI META-LIVELLO
11.1 Accesso alle clausole di un programma
11.2 Modifiche del database
11.2.1 I predicati di modifica
11.2.2 Alcuni problemi nell'uso di assert e retract
11.2.3 Alcuni usi interessanti di assert e retract
11.3 Meta-interpreti

Capitolo 12 STRUTTURE DATI COMPLESSE: ALBERI E GRAFI
12.1 Alberi
12.1.1 Rappresentazione in Prolog di alberi
12.1.2 Operazioni su alberi binari
12.1.3 Alberi binari di ricerca
12.1.4 La scelta della rappresentazione
12.2 Grafi
12.2.1 Rappresentazione in Prolog di grafi
12.2.2 Operazioni su grafi

Capitolo 13 PROLOG E ANALISI SINTATTICA DEI LINGUAGGI
13.1 Analizzatori Sintattici in Prolog
13.2 Definite Clause Grammars

Capitolo 14 PROLOG E INTELLIGENZA ARTIFICIALE
14.1 Risoluzione di problemi
14.1.1 Risoluzione nello spazio degli stati
14.1.1.1 Rappresentazione in Prolog dello spazio degli stati
14.1.1.2 Ricerca in profondità
14.1.1.3 Ricerca in ampiezza
14.1.1.4 Ricerca euristica
14.1.2 Risoluzione per scomposizione in sottoproblemi
14.1.2.1 Soluzione in Prolog
14.2 Soluzione di giochi
14.3 Sistemi basati sulla conoscenza
14.3.1 Sistemi a regole di produzione
14.3.1.1 Il Prolog come sistema di regole di produzione
14.3.1.2 Meta-interpreti per regole di produzione
14.3.2 Ragionamento abduttivo
14.4 Problemi di Soddisfacimento di Vincoli
14.4.1 Definizioni
14.4.2 Algoritmi di backtracking
14.4.3 Algoritmi di Propagazione
14.4.3.1 Euristiche
14.4.4 Algoritmi di Consistenza

Capitolo 15 LA PROGRAMMAZIONE LOGICA A VINCOLI
15.1 La Programmazione Logica come linguaggio a vincoli
15.2 Limiti della programmazione logica
15.2.1 Unificazione sintattica
15.2.2 Vincoli come test
15.2.3 Dipendenza dall'ordine testuale dei goal
15.2.4 Inefficienza nell'esplorazione dello spazio delle soluzioni
15.3 Lo schema generale CLP
15.3.1 La macchina astratta per PL e CLP
15.3.2 Un meta interprete per CLP
15.4 Il linguaggio CLP(R)
15.5 Il linguaggio CLP(Q)
15.6 Il linguaggio CLP(B)
15.6.1 Risolutori non completi CLP(B)
15.7 Il linguaggio CLP(FD)
15.7.1 Applicazioni dei risolutori CLP(FD)
15.8 Per saperne di più

BIBLIOGRAFIA


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
About this Server
Mail to DocMaster
DocMaster
Mail to WebMaster
LIA WebMaster
[LIA Home] [DEIS Staff] [DEIS Home] [Alma Mater Home]