Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati) 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.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Controllare i termini • Il Prolog fornisce dei predicati per avere informazioni sui termini: – – – – – – – – © A.Turbati, F.M.Zanzotto var(X). nonvar(X). atom(X). integer(X). float(X). number(X). atomic(X). vero sia per atomi che per numeri compound(X). Logica 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.Zanzotto Logica 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 N1 + 1. count(A,[B|L],N):A \= B, count(A,L,N). © A.Turbati, F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Count: versione 1 count(_, [], 0). count(A, [A|L], N):!, count(A, L, N1), N is N1 + 1. count(A, [_|L], N):count(A,L,N). © A.Turbati, F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Count: versione 0 e 1 • ?- 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). X=a Y=a Na=3 Nb=1 © A.Turbati, F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Count: versione 2 count2(_, [], 0). count2(A, [B|L], N):atom(B), A=B, !, count2(A, L, N1), N is N1 + 1. count2(A, [_|L], N):count2(A,L,N). © A.Turbati, F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Count: versione 2 • ?- 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). Na=1 Nb=1 © A.Turbati, F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” SEGNO © A.Turbati, F.M.Zanzotto Logica 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.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Costruire e decomporre i termini • 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 © A.Turbati, F.M.Zanzotto Logica 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.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” functor • Restituisce il funtore di un termine complesso • functor(?Term, ?Name, ?Arity) • ?- functor(t(f(X), Y, a), Fun, Arity ). – Fun = t Arity = 3 © A.Turbati, F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Esercizio: realizzare functor © A.Turbati, F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” arg • 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) © A.Turbati, F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Esercizio: realizzare arg © A.Turbati, F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Esempio functor e arg • ?- functor(D, date, 3), arg(1, D, 15), arg(2, D, july), arg(3, D, 1950). • D= date(15, july, 1950). © A.Turbati, F.M.Zanzotto Logica 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.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Operatori di confronto • In Prolog esistono vari operatori per il confronto – – – – – – – © A.Turbati, F.M.Zanzotto = is =:= =\= == \== @< confronto espressioni aritmetiche uguali confronto espressioni aritmetiche diverse uguaglianza, ma non assegnazione disuguaglianza ordinamento lessicografico Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Operatori di confronto • Sono realizzabili attraverso dei predicati? © A.Turbati, F.M.Zanzotto Logica 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.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Controllare la conoscenza del prolog • 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 © A.Turbati, F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Aggiunta fatti • 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 © A.Turbati, F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Rimozione fatti • 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 © A.Turbati, F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Esempio assertz/retract • ?- friend(tom, jerry). – false • ?- assertz(friend(tom, jerry)). – true • ?- friend(tom, jerry). – true • ?-retract(friend(tom, jerry)). – true • ?- friend(tom, jerry). – false © A.Turbati, F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Control facilities • Esistono alcune control facilities che facilitano la realizzazione dei programmi: – – – – – – © A.Turbati, F.M.Zanzotto ! (cut) fail true not call(P) ha successo se il predicato P ha successo repeat ha sempre successo anche durante il backtracking (utile per i loop) Logica per la Programmazione e la Dimostrazione Automatica