Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Fatti sul Prolog Linguaggio dichiarativo Non ha definizioni di tipi Non è possibile definire una specifica dei predicati Occorrono Predicati per controllare i tipi
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Il Prolog fornisce dei predicati per avere informazioni sui termini: –var(X). –nonvar(X). –atom(X). –integer(X). –float(X). –number(X). –atomic(X). vero sia per atomi che per numeri –compound(X). Controllare i termini
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Esempio di uso Definire la clausola /*count(X,L,NUM_VOLTE)*/ vera X è un atomo, L è una lista, e NUM_VOLTE è il numero di volte per cui C appare in L.
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Count: versione 0 count(_,[],0). count(A,[A|L],N):- count(A,L,N1), N is N count(A,[B|L],N):- A \= B, count(A,L,N).
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” count(_, [], 0). count(A, [A|L], N):- !, count(A, L, N1), N is N count(A, [_|L], N):- count(A,L,N). Count: versione 1
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” ?- count(a, [a,b,a,a],N). –N = 3 ?- count(a, [a,b,X,Y], N). –X=a Y=a N=3 ?- L=[a,b,X,Y], count(a, L,Na), count(b,L,Nb). Count: versione 0 e 1 X=a Y=a Na=3 Nb=1
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” count2(_, [], 0). count2(A, [B|L], N):- atom(B), A=B, !, count2(A, L, N1), N is N count2(A, [_|L], N):- count2(A,L,N). Count: versione 2
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” ?- count2(a, [a,b,a,a],N). –N = 3 ?- count2(a, [a,b,X,Y], N). –N=1 ?- L=[a,b,X,Y], count2(a, L,Na), count2(b,L,Nb). Count: versione 2 Na=1 Nb=1
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” SEGNO
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Fatti sul prolog Non controllo sui tipi e sulle definizione dei predicati Quindi, i termini e i predicati possono essere decomposti in liste.
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Prolog permette di scomporre un termine complesso (struttura dati) in una lista formata dal funtore e dai suoi argomenti. I tre predicati che permettono ciò sono: –=.. –functor –arg Costruire e decomporre i termini
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Si legge univ Viene usato come un operatore infisso ?Term =.. ?List f(a,b) =.. [f,a,b] ?- member(a,[a,b,c]) =.. List. –List=[member, a, [a,b,c]] ?- T =.. [rectangle,3,5]. –T = rectangle(3,5) =..
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Restituisce il funtore di un termine complesso functor(?Term, ?Name, ?Arity) ?- functor(t(f(X), Y, a), Fun, Arity ). –Fun = t Arity = 3 functor
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Esercizio: realizzare functor
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Restituisce l’argomento che si trova in una data posizione (a partire da 1) di un termine complesso arg(?Arg, +Term, ?Value) ?- arg(1, t(f(X), Y, a), Value). –Arg = f(X) arg
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Esercizio: realizzare arg
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” ?- functor(D, date, 3), arg(1, D, 15), arg(2, D, july), arg(3, D, 1950). D= date(15, july, 1950). Esempio functor e arg
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Fatti sul prolog Il principio fondamentale per il funzionamento è l’unificazione Ma esistono operatori binari?
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” In Prolog esistono vari operatori per il confronto –= –is –=:=confronto espressioni aritmetiche uguali –=\=confronto espressioni aritmetiche diverse –==uguaglianza, ma non assegnazione –\==disuguaglianza lessicografico Operatori di confronto
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Operatori di confronto Sono realizzabili attraverso dei predicati?
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Richiamo Un programma prolog è un: Insieme di regole e di fatti che Risponde alle query con o true o false e assegna dei valori alle variabili
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Prolog permette di aggiungere o rimuovere a runtime fatti e regole ATTENZIONE: i nuovi fatti vengo aggiunti solo in memoria e non al file che contiene i fatti di partenza Affinché sia possibile aggiungere un fatto bisogna indicare che questo è “dimamico”: –:-dynamic Fatto/Arity Controllare la conoscenza del prolog
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Per aggiungere i fatti esistono due predicati: –assertz(+Term) –asserta(+Term) assertz aggiunge il fatto alla fine del database asserta aggiunge il fatto all’inizio del database Aggiunta fatti
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Per rimuovere i fatti esistono due predicati: –retract(+Term) –retractall(+Head) retract rimuove il fatti dal databse retractall rimuove TUTTI i fatti e le regole che hanno la head indicata Rimozione fatti
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” ?- friend(tom, jerry). –false ?- assertz(friend(tom, jerry)). –true ?- friend(tom, jerry). –true ?-retract(friend(tom, jerry)). –true ?- friend(tom, jerry). –false Esempio assertz/retract
© A.Turbati, F.M.ZanzottoLogica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Esistono alcune control facilities che facilitano la realizzazione dei programmi: –! (cut) –fail –true –not –call(P)ha successo se il predicato P ha successo –repeatha sempre successo anche durante il backtracking (utile per i loop) Control facilities