Controllare Tipi Dati Decomporre fatti Controllare il database
description
Transcript of Controllare Tipi Dati Decomporre fatti Controllare il database
Controllare Tipi DatiDecomporre fatti
Controllare il databaseFabio 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 tipiNon è 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