270 likes | 439 Views
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.
E N D
Controllare Tipi DatiDecomporre fattiControllare 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
Controllare i termini • 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).
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.
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).
Count: versione 1 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 0 e 1 • ?- count(a, [a,b,a,a],N). • N = 3 • ?- count(a, [a,b,X,Y], N). • X=aY=a N=3 • ?- L=[a,b,X,Y], count(a, L,Na), count(b,L,Nb). • X=a Y=a Na=3 Nb=1
Count: versione 2 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 • ?- 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). • Na=1 Nb=1
Fatti sul prolog Non controllo sui tipi e sulle definizione dei predicati Quindi, i termini e i predicati possono essere decomposti in liste.
Costruire e decomporre i termini • 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
=.. • 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)
functor • Restituisce il funtore di un termine complesso • functor(?Term, ?Name, ?Arity) • ?- functor(t(f(X), Y, a), Fun, Arity ). • Fun = t Arity = 3
arg • 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)
Esempio functor e arg • ?- functor(D, date, 3), arg(1, D, 15), arg(2, D, july), arg(3, D, 1950). • D= date(15, july, 1950).
Fatti sul prolog Il principio fondamentale per il funzionamento è l’unificazione Ma esistono operatori binari?
Operatori di confronto • 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 • Sono realizzabili attraverso dei predicati?
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
Controllare la conoscenza del prolog • 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
Aggiunta fatti • 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
Rimozione fatti • 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
Esempio assertz/retract • ?- friend(tom, jerry). • false • ?- assertz(friend(tom, jerry)). • true • ?- friend(tom, jerry). • true • ?-retract(friend(tom, jerry)). • true • ?- friend(tom, jerry). • false
Controlfacilities • Esistono alcune controlfacilities 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)