Linguaggi di Programmazione (AA 2005/2006) Corso di Laurea in Informatica Introduzione al linguaggio PROLOG
Programmazione logica La programmazione logica nasce all’inizio degli anni settanta da studi sulla deduzione automatica: il Prolog costituisce il suo primo prodotto. La programmazione logica NON è soltanto rappresentata dal Prolog: essa costituisce infatti un settore molto ricco che cerca di utilizzare la logica matematica come base dei linguaggi di programmazione. Prolog è l’esempio più noto. Obiettivi e ragioni di successo: - semplicità del formalismo - linguaggio ad alto livello - semantica chiara
Logica matematica Logica matematica: formalizzazione del ragionamento Con l'avvento dell'informatica: Logica Matematica Dimostrazione automatica di teoremi interpretazione procedurale di formule logica come linguaggio di programmazione Programmazione logica la logica matematica Utilizzata in varie applicazioni: dalle prove di correttezza dei programmi alle specifiche, da linguaggio per la rappresentazione della conoscenza in IA a formalismo per DB.
Stile dichiarativo della programmazione logica orientato ad utenti non programmatori grande potere espressivo programma come insieme di formule goalcomputazione come costruzione di una dimostrazione di una affermazione (goal) BASE FORMALE unificazione e risoluzione BASE FORMALE: calcolo dei predicati del primo ordine ma con limitazione nel tipo di formule (clausole di Horn) e utilizzo di particolari tecniche per la dimostrazione di teoremi (unificazione e risoluzione)
PROLOG Acronimo per PROgramming in LOGic. Nato nel Basato su una restrizione della logica del primo ordine Stile dichiarativo Prolog è usato per determinare se una certa affermazione è vera o no e, se è vera, quali variabili hanno vincolato la risposta
Prolog – Linguaggio dichiarativo Non contiene istruzioni Contiene solo fatti e regole (clausole) – I fatti Asserzioni vere nel contesto che stiamo descrivendo – Regole Ci danno gli strumenti per dedurre nuovi fatti da quelli esistenti Un programma Prolog ci da informazioni su un sistema ed è normalmente chiamato base di conoscenza Un programma Prolog non si esegue ma si interroga – Ci si chiede: questi fatti sono veri? – Il Programma risponderà solo SI o NO alla domanda.
Termini Le espressioni del Prolog sono chiamate TERMINI. Esistono diversi tipi di termini: – Atomi – Variabili – Numeri – Una composizione di termini termine composto (simbolo di funtore + uno o piu’ argomenti)
ATOMI un atomo è: – Una sequenza di caratteri alfanumerici, che inizia con un carattere minuscolo (può contenere il carattere “_” underscore); – Qualsiasi cosa racchiusa tra apici (‘ ‘);
Le variabili Una variabile è una sequenza alfanumerica che inizia con un carattere maiuscolo o con il simbolo _ (underscore). Le variabili composte solo dal simbolo _ sono chiamate indifferenza o anonime. Le variabili vengono istanziate (legate a un valore) con il procedere del programma (nella dimostrazione del teorema)
Composizione di termini Una composizione di termini (formula atomica) consiste in: un funtore (simbolo di funzione o di predicato definito come atomo); Una sequenza di termini racchiusi tra parentesi tonde e separati da virgole. Questi sono chiamati argomenti del predicato (non ci deve mai essere uno spazio tra il funtore e la parentesi di sinistra).
VALIDI foo hello Hello sam Sam hello_Sam ‘hello’’Hello’ ’Hello Sam’ _ a1 ’1a’ X _hello _234 hello(X) f(a) f(a,b,c) f(hello,Sam) f( a, b, c ) p(f(a),b) hello(1,hello(x,X,hello(sam))) t(a,t(b,t(c,t(d,[])))) NON VALIDI hello Sam Hello Sam hello-sam 1a f(a, b f(a, f a,b) f (a, b) X(a,b) 1(a,b) Esempi
Prolog – I Fatti Un fatto consiste in: – Un nome di predicato, ad esempio genitore, uomo e animale. Deve iniziare con una lettera minuscola. – Zero o più argomenti come maria, wirth o cane. Da notare che i fatti (e le regole e le domande) devono essere chiusi da un punto “.”.
FATTI - ESEMPI libro(kowalski, prolog). libro(yoshimoto, kitchen). donna(yoshimoto). uomo(kowalski). animale(cane). animale(trota). ha_le_squame(trota).
Le regole In prolog si usano le regole quando si vuole esprimere che un certo fatto dipende da un insieme di altri fatti. Per esprimere in linguaggio naturale questa dipendenza usiamo la parola “se” – Uso l’ombrello se piove – Gino compra il vino se è meno caro della birra.
Regole per le definizioni Le regole sono anche usate per esprimere definizioni: – X è un pesce se: X è un animale X ha le squame oppure – X è sorella di Y se: X è di sesso femminile X e Y hanno gli stessi genitori
Le regole pesce(X) :- animale(X), ha_le_squame(X). – L’ operatore Prolog ”:-'' esprime il “se” – implicazione - – “,” equivale a “e” (AND). La regola dice che X è un pesce se X è un animale e ha le squame Gli argomenti che iniziano con una lettera maiuscola sono variabili
Regole In Prolog una regola consiste di una testa e di un corpo. Testa e corpo sono collegati dal simbolo “:-” La frase: Gigi ama chiunque ami il vino In prolog diventa: ama(gigi,X):-ama(X,vino). Gigi ama le donne a cui piace il vino In prolog sarà: ama(gigi,X):-donna(X),ama(X,vino).
Le relazioni definite da più regole Una relazione (ad esempio genitore) può essere definita da più regole aventi lo stesso predicato come conclusione. Esempio: – genitore(X,Y) :- padre(X,Y). – genitore(X,Y) :- madre(X,Y). In questo caso esse vengono considerate come in alternativa tra loro, cioè implicitamente connesse dall’operatore logico di disgiunzione (“o”).
Regole – La ricorsione Una relazione può anche essere definita ricorsivamente. In questo caso la definizione richiede almeno due proposizioni: una è quella ricorsiva che corrisponde al caso generale, l’altra esprime il caso particolare più semplice. – antenato(X,Y) :- genitore(X,Y). – antenato(X,Y) :- genitore(Z,Y),antenato(X,Z).
Operatori logici L’operatore logico AND inserito in una regola viene espresso mediante ”,” L’operatore logico OR viene invece espresso mediante “;”
Sintassi Ricordatevi che : ➔ ogni fatto o regola o funzione DEVE terminare con un punto “.” ➔ ogni variabile DEVE iniziare con una maiuscola ➔ I commenti si inseriscono dopo un “%” (commento di linea) o tra “/*” e “*/” % Questa è una linea di commento f(a,b). % Solo questa parte di riga è un commento % Ecco un commento % su più righe. % Anche questo è un commento. /* Questo commento può essere scritto su più righe */
Le interrogazioni (query o goal) Una volta che le regole ed i fatti sono scritte e caricate nell’interprete, eseguire un programma Prolog significa interrogare l’interprete, per esempio ?- libro(kowalski,prolog). Il prolog risponde “SI” (anzi “YES”). Interrogare il programma equivale a richiedere la dimostrazione di un teorema.
SINTASSI SINTASSI: un programma Prolog e’ costituito da un insieme di clausole della forma FATTO o ASSERZIONE (cl1) A. FATTO o ASSERZIONE REGOLA (cl2) A :- B1, B2,…,Bn. REGOLA GOAL G1, G2,…,Gn. GOAL In cui A, Bi, Gi sono formule atomiche A : testa della clausola B1,B2,…,Bn : corpo della clausola Il simbolo “,” indica la congiunzione; il simbolo “:-” l’implicazione logica in cui A e’ il conseguente e B1,B2,…,Bn l’antecedente Prolog: programmi
Fatti Fatti (DB) padre (giovanni, maria). padre (carlo, giulio). madre(maria, ettore). Interrogazioni Interrogazioni (domande) anche dette “goal” ?-padre (giovanni, maria). risposta: Yes (cons. logica del DB) ?-padre (giovanni, carlo). risposta: No (fallimento nella dimostrazione) Programma Prolog: esempio
Una regola Una regola: due individui sono colleghi se lavorano per la stessa ditta Programma Prolog: esempio
Le variabili delle interrogazioni Le interrogazioni possono contenere variabili – Le variabili sono istanziate quando il Prolog prova a rispondere alla domanda – Tutte le variabili istanziate vengono mostrate nella risposta. Esempi: ?- libro (kowalski, LINGUAGGIO). LINGUAGGIO = prolog ?- libro (AUTORE, prolog). AUTORE = kowalski Prompt dell’interprete Prolog
Domande esistenziali Domande esistenziali (con variabili logiche) ?-padre(X, maria). risposta: X=giovanni ?-padre(X, Y). risposte: X=giovanni, Y= maria X=carlo, Y= giulio Query Prolog: esempi
INTERROGAZIONI ESTESE Possiamo scoprire chi ha scritto cosa facendo la seguente query: ?- libro(Qualcuno, Qualcosa). Qualcuno = kowalski Qualcosa = prolog Qualcuno = yoshimoto Qualcosa = kitchen
Le liste in Prolog Si definisce una lista in Prolog racchiudendo gli elementi della lista tra parentesi quadre “[]” e separandoli da virgole. Gli elementi di una lista in prolog possono essere termini qualsiasi o liste [] indica la lista vuota.
Le liste: testa e coda Ogni lista non vuota può essere divisa in due parti: una testa ed una coda. La testa è il primo elemento della lista La coda rappresenta tutto il resto ed è sempre una lista [a,b,c] : “a” è la testa e [b,c] la coda [a,b] : “a” è la testa e [b] la coda [a] : “a” è la testa e [] la coda
L’operatore “|” Prolog possiede uno speciale operatore usato per distinguere tra testa e coda di una lista. L’operatore “|” -? [X|Y] = [mia, vincent, jules, yolanda]. X = mia Y = [vincent,jules,yolanda] yes
[] La lista vuota [] in prolog viene gestita come una lista speciale. ?- [X|Y] = []. no
liste ?- [X1,X2,X3 | Tail] = [a,b,c,d,e] X1 = a X2 = b X3 = c Tail = [d,e] ?- [X1,_,X3 | _ ] = [a,b,c,d] X1 = a X3 = c
L’interprete Prolog Si accede sempre tramite l’interfaccia di interrogazione (prompt: “?-”) La base di conoscenza è nascosta ed è accessibile solo tramite opportuni comandi o tramite ambiente di programmazione) Per caricare dati nella base di conoscenza del Prolog si deve fare una CONSULT (consultazione di un testo da valutare)