Introduzione alla programmazione logica e Prolog
Transcript
Introduzione alla programmazione logica e Prolog
Introduzione alla Programmazione Logica ed al linguaggio PROLOG Esercitazioni per il corso di Logica ed Intelligenza Artificiale a.a. 2014/15 Paolo Tomeo http://sisinflab.poliba.it/tomeo Programmazione logica Paradigma di programmazione basato su logica formale Una logica formale (Es. Clausole di Horn) definisce le regole sintattiche per descrivere lo schema di ragionamenti e problemi, indipendentemente dal loro contenuto. Nella programmazione logica un problema viene descritto con un insieme di formule della logica, dunque in forma dichiarativa Differenza fra forma procedurale e dichiarativa Linguaggi procedurali (o imperativi): sono composti da una serie di istruzioni (algoritmo) che indicano al calcolatore come deve essere svolto un certo compito. (Es. C, Java, Python) Linguaggi dichiarativi: dicono al calcolatore cosa deve fare, ma non come farlo. Quindi non specificano esplicitamente l'algoritmo. Sono inclusi fra questi i linguaggi di query dei database (Es. SQL), le espressioni regolari, alcuni linguaggi di markup (Es. HTML), i linguaggi funzionali e i linguaggi logici. Non tutti i linguaggi logici però sono strettamente dichiarativi 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. logica = rappresentazione del problema deduzione = risoluzione del problema Esempio Tutti gli uomini sono mortali Socrate è un uomo Si deduce che: Socrate è mortale Prolog PROLOG sta per PROgramming in LOGic Nato nel 1973, si fonda sulle idee di programmazione logica di R. Kowalski. È il più noto linguaggio di programmazione logica. È un linguaggio di altissimo livello. È largamente utilizzato per applicazioni di Intelligenza Artificiale (Planning, Sistemi Esperti, Natural Language Processing, ecc.). Non adatto per applicazioni numeriche o real-time. Ottima dispensa in inglese: www.boklm.eu/prolog/prolog.ps 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. Programmare in Prolog equivale a descrivere il dominio del problema tramite fatti e regole sotto forma di clausole di Horn. 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. Fatti I fatti Prolog sono clausole di Horn non condizionali, cioè esprimono un'affermazione (compiuta) che non è vincolata alla preventiva verifica di un insieme di condizioni. Il Prolog assume implicitamente che tutti i fatti presenti nella base di conoscenza siano veri. Esempio. colore(neve, bianco). colore(sangue, rossa). colore(cielo, nero). Regole Le regole, in Prolog, indicano situazioni di carattere generale servendosi di oggetti e relazioni tra essi. Sono utili per evitare ridondanza e spreco di risorse nella base di conoscenza. Esempio 1 uomo(socrate). mortale(X) :- uomo(X). Esempio 2 book(title, author1, author2). coauthor(X, Y) :- book(_, X, Y). coauthor(X, Y) :- book(_, Y, X). L'underscore ('_') è usato per indicare qualsiasi variabile. Nell'esempio 2, sfruttando l'underscore, possiamo verificare se due individui sono coautori di un qualsiasi libro Query Per interrogare un programma in Prolog, che praticamente equivale ad eseguirlo, vengono utilizzate le query, che in Prolog sono dette goal e corrispondono a clausole di Horn da dimostrare. Esempio 1 ?- uomo(X). X = socrate. ?- mortale(X). X = socrate ?- mortale(socrate). true Esempio 2 ?- coauthor(author2, Y). Y=author1. Query composte Semplici query possono essere combinate per formare query composte. Utilizzando la virgola per la composizione, si definisce un and logico di goal. Esempio ?- coauthor(author2, Y), coauthor(author3, Y). In questo caso si verifica se c'è un autore che è stato coautore sia di author2 che author3. Variabili Le variabili sono utilizzate per indicare una entità generica e consentono di esprimere un'affermazione riguardo una considerazione generale Costanti Le costanti indicano un entità particolare e consentono di esprimere un'affermazione specifica Sintassi - 1 I nomi di predicati ed entità devono necessariamente iniziare con una lettera minuscola I nomi delle variabili devono necessariamente iniziare con una lettera Maiuscola Una variabile anonima è indicata dall'underscore _ Ogni asserzione termina con un punto. Sintassi - 2 Il nome di un predicato o di un argomento non deve contenere degli spazi padre di( Y, Y) va sostituito con padre_di( Y, Y) o padredi( Y, Y) I commenti in Prolog iniziano con % Esempio % questo è un commento a(X) :- b(X), c(X). % questo è un altro commento Disgiunzione È possibile definire una disgiunzione mediante il simbolo ; Tuttavia questa pratica è fortemente sconsigliata perché potrebbe rendere il programma difficile da comprendere. Quindi per la disgiunzione è consigliato definire un'altra regola con la stessa testa ma corpo diverso genitore(X, Y) :- padre(X, Y). genitore(X, Y) :- madre(X, Y). In questo caso, se la prima regola dovesse risultare falsa, il Prolog passerà alla regola successiva.
Documenti analoghi
Introduzione alla Programmazione Logica e al linguaggio PROLOG
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,..)