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

Controllare Tipi Dati Decomporre fatti Controllare il database

  • Upload
    flo

  • View
    76

  • Download
    0

Embed Size (px)

DESCRIPTION

Controllare Tipi Dati Decomporre fatti Controllare il database. Fabio Massimo Zanzotto ( slides di Andrea Turbati). Fatti sul Prolog. Linguaggio dichiarativo Non ha definizioni di tipi Non è possibile definire una specifica dei predicati. Occorrono . Predicati per controllare i tipi. - PowerPoint PPT Presentation

Citation preview

Page 1: Controllare Tipi Dati Decomporre fatti Controllare il database

Controllare Tipi DatiDecomporre fatti

Controllare il databaseFabio Massimo Zanzotto(slides di Andrea Turbati)

Page 2: Controllare Tipi Dati Decomporre fatti Controllare il database

© 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

Page 3: Controllare Tipi Dati Decomporre fatti Controllare il database

© 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

© 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

© 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

© 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

© 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

© 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

© 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

© 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

© 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

© 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

© 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

© 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

© 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

© 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

© 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

© 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

© 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

© 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

© 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

© 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

© 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

© 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

© 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

© 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

© 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