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

Post on 02-May-2015

214 views 0 download

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

Controllare Tipi DatiDecomporre 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

© 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