Programmazione Logica Bob Kowalski: "Algoritmo = Logica + Controllo" nella programmazione tradizionale: il programmatore deve occuparsi di entrambi gli aspetti nella programmazione dichiarativa: il programmatore si occupa solo della struttura logica del problema, la parte di controllo e' demandata all'interprete. Programmazione Dichiarativa Il compito del programmatore e' solo quello di specificare il problema da risolvere: cosa si vuole ottenere (dichiarativo) e non anche come lo si vuole ottenere (operazionale) PROLOG SICStus PROLOG Il primo ed il più diffuso linguaggio reale basato sulla programmazione logica è il PROLOG (Programming in logic). Il compilatore PROLOG che utilizzeremo per le esercitazioni è stato sviluppato da un gruppo di ricercatori dello Swedish Institute of Computer Science Il primo interprete PROLOG è stato ideato e sviluppato da Colmerauer e Russel nel 1972. ultima release: 3.9.1 del 28 Giugno 2002 maggiori informazioni (e download di prova) http://www.sics.se/sicstus/
Dalla Deduzione Automatica alla Programmazione Logica Le origini della programmazione logica si trovano nei lavori sulla dimostrazione automatica di teoremi. La programmazione logica è un sottoinsieme della logica del primo ordine (FOL: first order logic), e si compone delle cosidette Clausole di Horn (dal nome del loro inventore). Programmazione logica: sintassi L' alfabeto è composto da: Var un insieme di simboli di variabili: x, y, z Costr un insieme di simboli di costruttori, ciascuno con una determinata arietà (numero di argomenti), che distinguamo in Const le costanti, i costruttori di arietà 0: a,b,c, Fun le funzioni, i costruttori di arietà > 0: f, g, h, Pred un insieme di simboli di predicato, ciascuno con una determinata arietà: p,q,r, Spec due simboli speciali: e and corrispondenti alla implicazione a sinistra e alla congiunzione L' insieme Term dei termini è definito da sintassi - 2 Term ::= Var Const Fun(Term,,Term) sintassi - 3 L' insieme Atom degli atomi (A, B, H, ) è definito da Atom ::= Pred(Term,, Term) es. x, a, f(x,a), f(g(x),y), g(f(a,a)) es. p(a,x), q(f(g(a),y)), p(a,f(x,a)) termine ground: se non contiene variabili Universo di Herbrand: l'insieme di tutti i termini ground (su di un prefissato alfabeto) atomo ground: se non contiene variabili Base di Herbrand: l'insieme di tutti gli atomi ground (su di un prefissato alfabeto)
L' insieme delle Clausole di Horn è definito da sintassi - 4 HClause ::= Atom Atom and and Atom Atom and and Atom sintassi - 5 Un Programma Logico è un insieme di clausole definite volo_diretto(venezia, londra) volo_diretto(roma, atene) volo_diretto(roma, venezia) volo(x,y) volo_diretto(x,z) and volo(z,y) H B Head (testa) Body (corpo) H (se Body è True) volo(x,y) volo_diretto(x,y) Un goal è una clausola con testa vuota (False) volo(roma, londra) volo(roma, y) Sintassi PROLOG Semantica dichiarativa logica PROLOG :- (nelle clausole definite)?- (nei goal) Un programma logico viene interpretato come una teoria della FOL, che definisce il significato dei predicati che compaiono nelle teste delle clausole definite. and, (virgola). (punto) alla fine di ogni clausola Computare consiste nel provare (deduzione logica) che la proprietà espressa dal corpo del goal è conseguenza logica del programma.
esempio: voli esempio: somma x,y. volo(x,y) volo_diretto(x,y) x,y. volo(x,y) volo_diretto(x,z) and volo(z,y) volo(venezia,londra) volo_diretto(venezia,londra) volo(roma,londra) volo_diretto(roma,venezia) and volo(venezia,londra) y.?- volo(roma,y) z.?- volo(z,roma) somma(x,y,z) := z è la somma di x ed y sum(0,y,y) sum(s(x),y,s(z)) sum(x,y,z)?- somma(s(s(0)), s(0), y)?- somma(x, s(0), s(s(0)))?- somma(x, y, s(s(0))) esempio: numero misterioso Esiste un numero (AB) di 2 cifre tale che il suo quadrato e' di 4 cifre (XYZW) e è uguale alla somma del numero che corrisponde alle prime due cifre del quadrato più quello che corrisponde alle ultime due (AB = XY + ZW) N.B. supponiamo di aver definito tutte le operazioni aritmetiche necessarie numero di 2 cifre esempio: numero misterioso due_c(n) maggiore(n,9) and maggiore(100,n) il suo quadrato e' di 4 cifre quattro_c(m) maggiore(n,999) and maggiore(10000,n) quattro_sq(n) square(n,m) and quattro_c(m) è uguale alla somma.... prime due cifre prime(m,x) div(m,100,x). ultime due cifre ultime(m,x) mod(m,100,x) somma_cifre(m,z) somma(prime(m,x), ultime(m,x), Z) somma_cifre_sq(n) square(n,m) and somma_cifre(m,n) soluzione(n) due_c(n) and quattro_sq(n) and somma_cifre_sq(n)
Conseguenza logica ed insoddisfacibilità FOL e clausole (generali) Proposizione Una formula F è conseguenza logica di una teoria T se e solo se T not(f) è insoddisfacibile (non ha modelli). Una clausola(generale) è della forma A1 or or Am B1 and and Bn Teorema Una qualsiasi teoria FOL T si può riscrivere in un in sieme di clausole generali T' tali che T e T' sono equivalenti dal punto di vista della soddisfacibilità. FOL e Clausole di Horn Esistono teorie che non si possono formulare con clausole di Horn insetto(x) or uccello(x) or pipistrello(x) vola(x) ma è possibile definire un metodo di prova per le clausole di Horn molto più efficiente di quanto sia possibile fare per la FOL in generale.