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)

Upload: giuseppina-mosca

Post on 02-May-2015

214 views

Category:

Documents


0 download

TRANSCRIPT

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