Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di...
-
Upload
giuseppina-mosca -
Category
Documents
-
view
214 -
download
0
Transcript of Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di...
![Page 1: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/1.jpg)
Controllare Tipi DatiDecomporre fatti
Controllare il database
Fabio Massimo Zanzotto
(slides di Andrea Turbati)
![Page 2: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/2.jpg)
© 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
![Page 3: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/3.jpg)
© 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
![Page 4: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/4.jpg)
© 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.
![Page 5: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/5.jpg)
© 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).
![Page 6: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/6.jpg)
© 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
![Page 7: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/7.jpg)
© 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
![Page 8: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/8.jpg)
© 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
![Page 9: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/9.jpg)
© 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
![Page 10: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/10.jpg)
© A.Turbati, F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica
University of Rome “Tor Vergata”
SEGNO
![Page 11: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/11.jpg)
© 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.
![Page 12: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/12.jpg)
© 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
![Page 13: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/13.jpg)
© 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)
=..
![Page 14: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/14.jpg)
© 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
![Page 15: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/15.jpg)
© A.Turbati, F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica
University of Rome “Tor Vergata”
Esercizio: realizzare functor
![Page 16: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/16.jpg)
© 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
![Page 17: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/17.jpg)
© A.Turbati, F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica
University of Rome “Tor Vergata”
Esercizio: realizzare arg
![Page 18: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/18.jpg)
© 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
![Page 19: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/19.jpg)
© 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?
![Page 20: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/20.jpg)
© 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
![Page 21: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/21.jpg)
© 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?
![Page 22: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/22.jpg)
© 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
![Page 23: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/23.jpg)
© 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
![Page 24: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/24.jpg)
© 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
![Page 25: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/25.jpg)
© 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
![Page 26: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/26.jpg)
© 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
![Page 27: Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)](https://reader036.fdocument.pub/reader036/viewer/2022081602/5542eb74497959361e8dccc7/html5/thumbnails/27.jpg)
© 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