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
Documenti analoghi
Introduzione alla programmazione logica e Prolog
situazioni sempre vere, e una serie di regole, che
permettono di dedurre nuove situazioni vere sulla base
dei fatti a disposizione.
logica
= rappresentazione del problema
deduzione = risoluzione de...