Introduzione alla Programmazione Logica e al linguaggio PROLOG

Transcript

Introduzione alla Programmazione Logica e al linguaggio PROLOG
Introduzione alla Programmazione
Logica ed al linguaggio PROLOG
Esercitazioni per il corso di
Logica ed Intelligenza Artificiale
a.a. 2013-14
Vito Claudio Ostuni
Linguaggi procedurali e dichiarativi
• linguaggi procedurali (o imperativi): sono composti da una serie
di istruzioni (algoritmo) che indicano al calcolatore come deve
essere svolto un certo compito. Si parte da un insieme di dati, e si
applicano una serie di operazioni da eseguire in sequenza che
li elaborano per produrre il risultato finale. (Es.: C, Java,..)
• linguaggi dichiarativi: dicono al calcolatore cosa deve fare,
lasciando al computer stesso la scelta di come farlo. Questo avviene
solo in teoria, in pratica anche i linguaggi dichiarativi devono
inserire alcuni suggerimenti su quale sia la strada migliore.
(Es.: Prolog, SQL, Lisp,..)
Programmazione logica
Il concetto di base della programmazione logica è di descrivere la
conoscenza generale che si ha sul problema, piuttosto che
uno specifico procedimento di soluzione.
Si tratta di trovare la rappresentazione più adeguata alla
specifica area applicativa ed esprimerla in un linguaggio
logico.
Un problema è caratterizzato dall'esistenza di oggetti discreti, o
individui, da relazioni tra essi, e da proposizioni che
esprimono proprietà logiche su queste relazioni.
Per rappresentare simbolicamente la conoscenza relativa ad un
problema, occorre fare uso di un linguaggio formale,
assegnando innanzi tutto dei nomi sia agli oggetti che alle
relazioni.
In programmazione logica un problema viene descritto con un
insieme di formule della logica, dunque in forma dichiarativa.
Un comune programma in programmazione logica è composto
da una serie di fatti, che descrivono cose e situazioni sempre
vere, e una serie di regole, che permettono di dedurre nuove
situazioni vere sulla base dei fatti a disposizione.
Noi forniamo al programma una serie di informazioni vere,
aggiungiamo un’altra serie di regole che descrivono il modo in
cui le informazioni si combinano tra loro e infine
interroghiamo il programma.
logica = rappresentazione del problema
deduzione = risoluzione del problema
Es:
Tutti gli uomini sono mortali
Socrate è un uomo
Si deduce che: Socrate è mortale
Programmazione classica
• Algoritmi + Strutture dati = Programmi
Dati e algoritmo sono interdipendenti.
Programmazione logica
• Algoritmo = Logica + Controllo
Dati e controllo sono indipendenti. Il programmatore deve “solo”
preoccuparsi di definire la parte logica (fatti+regole), ovvero deve
solo definire il problema.
Non bisogna specificare come risolverlo (il controllo è compito del
calcolatore).
Prolog
PROLOG: PROgramming in LOGic
Nato nel 1973, si fonda sulle idee di programmazione logica di
R. Kowalski.
È il più noto linguaggio di programmazione logica.
È basato sulla logica dei Predicati del Primo Ordine (prova
automatica di teoremi e risoluzione).
È un linguaggio di altissimo livello.
È un manipolatore di stringhe e non di numeri.
È largamente utilizzato per applicazioni di Intelligenza
Articiale (Planning, Sistemi Esperti, Sistemi a Regole di
Produzione,..).
Non adatto per applicazioni numeriche o real-time.
Prolog
Il Prolog è un linguaggio di programmazione logica basato
sulle clausole di Horn.
h :- b1, b2, .. bn
h rappresenta la testa della clausola e b1, b2, .. bn sono i
letterali (atomi) che compongono il corpo.
h è vera se è solo se il corpo è vero, ovvero se sono veri tutti i
letterali nel corpo.
La testa della clausola è detta anche conseguente, mentre il
corpo antecedente.
Un programma logico consiste in un insieme di procedure
espresse in clausole di Horn ed attivate da una asserzione
iniziale d'obiettivo.
Considerando le clausole espresse secondo due categorie che
sono i fatti e le regole
Un programma Prolog è costituito da:
• un insieme di fatti, che dichiarano un certo stato di cose
• da un insieme di regole, che definiscono relazioni fra stati di
cose
• da obiettivi (o domande) a cui rispondere.
Fatti + regole = Base di conoscenza
L'interprete Prolog possiede un meccanismo di inferenza che tenta
di rispondere alle domande ponendole in relazione con i fatti e
le regole della base di conoscenza e tentando di eseguire delle
deduzioni.
Oggetti
Un programma Prolog è costituito da un insieme di termini ognuno
dei quali è costituito da un insieme di caratteri.
Un oggetto può essere semplice, come una costante, oppure
composto, ossia formato da altri oggetti componenti e sono detti
strutture.
Ci sono 3 tipologie di termini:
Oggetti
• Costanti
• Variabili
Oggetti semplici
Strutture
• Strutture
Variabili
Costanti
Atomi
Numeri
Costanti
I nomi semplici di oggetti sono detti costanti. Essi denotano
oggetti elementari definiti. In Prolog esistono due tipi di
costanti: gli atomi e gli interi.
- Gli atomi possono essere di due tipi:
• sequenza di lettere e cifre che inizia con lettera minuscola oppure che
inizia con lettera maiuscola, ma in questo caso la sequenza va messa fra
apici. Si può usare il carattere speciale _ inserito nel corpo di un atomo
per migliorarne la leggibilità.
Es:
tavolo
‘Tavolo’
tavolo_di_legno
a113
• simboli.
Es:
:-
?-
- Gli interi sono utilizzati per rappresentare numeri, sono
costituiti da sole cifre e non possono contenere il punto
decimale.
Variabili
Le variabili, cioè i termini utilizzati per indicare una entità che al
momento sono ancora da determinate o da identificare, sono
rappresentati dalle lettere maiuscole o dal carattere _
(underscore) che indica la variabile anonima.
Strutture
Una struttura è un oggetto costituito da un insieme di termini,
chiamati componenti. Una struttura è una entità del tipo:
Es:
mangia(gianni,mela).
dove il predicato “mangia” è chiamato funtore e gli argomenti
“gianni” e “mela” sono chiamati componenti.
Il funtore deve essere necessariamente un atomo. Una variabile
non può esser usata come funtore. Gli argomenti invece possono
esser termini di qualsiasi tipo.
Un funtore con n componenti è detto funtore n-ario (o ad n posti, o
ad n argomenti, o di molteplicità n). Se più funtori hanno lo stesso
nome ma molteplicità diverse, sono a tutti gli effetti funtori diversi.
Le convenzioni di scrittura dei funtori sono le stesse di quelle degli
atomi. Si noti che le costanti possono essere considerate come
funtori 0-ari, cioè senza argomenti.
Strutture
I nomi che costituiscono la n-pla di argomenti di un funtore
possono a loro volta essere strutture. Ciò consente la
costituzione di nomi arbitrariamente complessi, a vari livelli di
composizione.
Es:
acquisto(mario_rossi,album(viva_la_vida,band(coldplay))).
Questo fatto codifica l’acquisto di un album. Si può notare che
band e album sono funtori.
Sintassi
Come detto un termine è un insieme di caratteri.
I caratteri riconosciuti dal Prolog sono divisi in 4 categorie:
•
•
•
•
insieme delle lettere maiuscole: A B C D ... X Y Z;
insieme delle lettere minuscole: a b c ... x y z;
insieme dei caratteri numerici: 0 1 2 3 4 5 6 7 8 9;
insieme dei caratteri speciali: ! " # $ % & ' ( ) = - ~ ^ \ | { } [ ] _ ` @
+;*<>,.?/
Sintassi
• I nomi di predicati e oggetti devono necessariamente iniziare
con una lettera minuscola
Es:
genitore
gianni
tommaso
• I nomi di variabili devono iniziare con una lettera maiuscola o
con _ per le variabili anonime
Es:
X
• Un'asserzione è composta dal nome del predicato e dagli
argomenti espressi tra parentesi tonde separati da virgole.
Es:
tommaso”
genitore(gianni, tommaso)
si legge “gianni è genitore di
• Ogni asserzione termina con un punto. Questo è il simbolo che
indica al Prolog la fine di un elemento di conoscenza.
Relazioni
Una relazione è l'attribuzione di una qualità comune a più oggetti.
Ad esempio, una relazione di parentela, come l'essere genitore
correla ogni genitore ai suoi figli.
Naturalmente, una relazione può valere tra più di un gruppo di
oggetti; per esempio, la relazione "padre di" vale tra molte
coppie di persone.
Analogamente, un singolo gruppo di oggetti può soddisfare più di
una relazione, ad esempio, Mario Rossi è “compagno di lavoro”
di Mario Bianchi, ed anche suo “vicino di casa”.
Una relazione collega tra loro gli elementi di una n-pla. È un
insieme di asserzioni con uguale predicato e numero di
argomenti.
In Prolog una relazione è denotata da un nome, detto predicato,
seguito (in parentesi) dalla n-pla dei nomi degli oggetti
correlati (separati da virgola).
Perciò ogni predicato, come ogni funtore, ha la sua molteplicità;
in particolare, si dice binario se ha 2 argomenti, ternario se ha
3 argomenti, e così via.
Es:
genitore(gianni,tommaso).
È un predicato binario
Proposizioni
Come visto i termini indicano gli oggetti e i predicati le relazioni
tra gli stessi, quindi le proposizioni indicano le proprietà
logiche che sussistono tra le relazioni. Ogni proposizione
termina con un punto. Ci sono due tipi di proposizioni:
• Atomiche o asserzioni ( o anche fatti)
genitore(gianni,tommaso).
• Regole
figlio(Y,X) :- genitore(X,Y).
Sono proposizioni non atomiche condizionali
Le proposizioni prive di variabili vengono dette chiuse (ground
sentences).
Es: padre(gianni)
Fatti
Sono clausole di Horn non condizionali. Esprimono
un'affermazione non vincolata alla preventiva verifica di un
insieme di condizioni.
h:-b h è vera se b è vero (non è un fatto, è una regola)
h
h è vera a prescindere (è un fatto)
Un fatto è una frase riguardante qualcosa o qualcuno, che
stabilisce una relazione fra gli argomenti. Questa relazione
può esser vera o falsa. Il Prolog assume implicitamente che
tutti i fatti presenti nella base di conoscenza siano veri.
Es:
caldo(agosto).
genitore( gianni, tommaso).
Regole
Sono clausole di Horn condizionali. Proposizioni non atomiche
costituite da più predicati connessi da operatori (o connettivi)
logici, denotati da simboli speciali.
Il connettivo :- indica l’implicazione, detto anche condizionale. I
predicati a destra del simbolo condizionale sono detti
premesse, a sinistra ci può esser un unico predicato detto
conclusione.
Il connettivo , indica la congiunzione (AND logico) tra due
predicati.
Es:
batteria(guasta) :- luci(spente), motorino_avviamento(muto).
Disgiunzione
Una relazione può essere definita da più proposizioni condizionali
aventi lo stesso predicato come conclusione (o da più
proposizioni atomiche con lo stesso predicato).
In questo caso esse vengono considerate in alternativa tra loro,
cioè implicitamente connesse dall'operatore logico di
disgiunzione (OR logico).
genitore(X, Y) :- padre(X, Y).
genitore(X, Y) :- madre(X, Y).
Oppure si può usare il simbolo ;
genitore(X, Y) :- padre(X, Y) ; madre(X, Y).
In entrambi i casi si legge: X è genitore di Y se è padre o è
madre di Y
Query
Sono clausole di Horn senza conclusione. Le query prolog si
basano su un meccanismo di pattern matching chiamato
unificazione.
Es:
acquisto(mario_rossi,album(viva_la_vida,band(coldplay))).
Vogliamo sapere quali siano gli album acquistati dal sig. mario rossi,
allora poniamo all’interprete la seguente query:
?-acquisto(mario_rossi,album(X,band(Y))).
Tramite unificazione l’interprete prolog cerca di unificare i termini
nella query con quelli nell’ asserzione. Le variabili X e Y presenti nel
goal (query) vengono sostituite con gli atomi presenti nell’ asserzione.
X = viva_la_vida, Y = coldplay
Unificazione
L’unificazione può esser applicata ad una coppia qualsiasi di
termini. Dati la coppia di termini, essi unificano se vale una delle
seguenti condizioni:
•sono identici
•le variabili in essi possono essere istanziate con oggetti in
modo che dopo la sostituzione delle variabili i termini
diventano identici
L’unificazione è un processo che prende due termini e verifica se
unificano. Se non unificano, il processo di unificazione fallisce. Se
unificano, il processo di unificazione ha successo e istanzia le
variabili.
persona(antonio)
unifica con
persona(antonio)
persona(gianni)
non unifica con persona(antonio)
persona(X)
unifica con persona(gianni) grazie alla sostituzione X/gianni
Regole di Unificazione
Valutiamo le possibili unificazioni tra T1 e T2
• Se T1 e T2 sono entrambi delle costanti, possono essere unificati se e
solo se sono lo stesso termine costante.
• Se T1 è un termine diverso da una variabile (ovvero è una costante
od una struttura) e T2 è una variabile non istanziata, T1 e T2 possono
venire unificati, istanziando T2 a T1.
• Se T1 e T2 sono entrambi strutture, possono essere unificati se e solo
se hanno lo stesso funtore principale e lo stesso numero di argomenti,
e gli argomenti che si corrispondono per posizione
possono essere a loro volta unificati.
• Se T1 e T2 sono entrambi variabili non istanziate, vengono unificate
l'una con l'altra, non appena una di esse viene istanziata ad un termine
secondo le regole precedenti, anche l'altra assume lo stesso termine.
Riassumendo…
Le componenti fondamentali
di un programma Prolog sono:
• dichiarazioni di fatti sugli oggetti e le loro relazioni
• dichiarazioni di regole sugli oggetti e le loro relazioni
• domande sugli oggetti e le loro relazioni.
genitore(gianni,tommaso).
genitore(tommaso,andrea).
figlio(Y,X) :- genitore(X,Y).
?- figlio(X,Y).
X = tommaso
Y = gianni