Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di...

27
Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)

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)

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)

© 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)

© 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)

© 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)

© 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)

© 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)

© 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)

© 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)

© 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)

© 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)

© 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)

© 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)

© 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)

© 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)

© 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)

© 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)

© 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)

© 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)

© 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)

© 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)

© 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)

© 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)

© 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)

© 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)

© 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)

© 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)

© 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