Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)
Controllare Tipi DatiDecomporre fatti
Controllare il database
Fabio Massimo Zanzotto
(slides di Andrea Turbati)
© A.Turbati, F.M.Zanzotto Logica 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.Zanzotto Logica 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.Zanzotto 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(_, [], 0).
count(A, [A|L], N):-
!,
count(A, L, N1),
N is N1 + 1.
count(A, [_|L], N):-
count(A,L,N).
Count: versione 1
© A.Turbati, F.M.Zanzotto Logica 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.Zanzotto Logica 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 N1 + 1.
count2(A, [_|L], N):-
count2(A,L,N).
Count: versione 2
© A.Turbati, F.M.Zanzotto Logica 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.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”
• 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.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”
• 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.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”
• 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.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”
• ?- 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.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”
• In Prolog esistono vari operatori per il confronto– =– is– =:= confronto espressioni aritmetiche uguali– =\= confronto espressioni aritmetiche diverse– == uguaglianza, ma non assegnazione– \== disuguaglianza– @< ordinamento lessicografico
Operatori di confronto
© A.Turbati, F.M.Zanzotto 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”
• 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.Zanzotto Logica 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.Zanzotto Logica 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.Zanzotto Logica 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.Zanzotto Logica 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– repeat ha sempre successo anche durante il
backtracking (utile per i loop)
Control facilities