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
Scarica

Controllare Tipi Dati. Decomporre fatti. Controllare il database