fmz sistemi basati su conoscenza esercizi prolog dott. fabio massimo zanzotto a.a. 2001-2002
TRANSCRIPT
FMZ
Sistemi basati su conoscenzaEsercizi Prolog
Dott. Fabio Massimo Zanzotto
a.a. 2001-2002
FMZ
Esercizi
FATTI:male(…).
female(…).
father(Father,Son).
mother(Mother,Son).
FMZ
Esercizio
part_of_parent(X,Y).
X è uno dei genitori di Y.
part_of_parent(X,Y):-father(X,Y).
part_of_parent(X,Y):-mother(X,Y).
FMZ
Esercizio
parents(X,Y,Z). X,Y sono i genitori di Z.
parents(X,Y,Z):-father(X,Z),mother(Y,Z).
parents(X,Y,Z):- mother(X,Z), father(Y,Z).
FMZ
Esercizio
brother(X,Y).
X è fratello di Y.
brother(X,Y):-mother(Z,X),
mother(Z,Y),
male(X).
FMZ
Esercizio
aunt(X,Y). X è zia di Y.
aunt(X,Y):-female(X),mother(Z,Y), sister(X,Z).
aunt(X,Y):-female(X),father(Z,Y), sister(X,Z).
FMZ
Esercizio
a,b,c,d… sono punti in un piano e i fatti sono del tipo
line(X,Y).
Definire una regola che stabilisca se quello in memoria è un triangolo.
triangle:-line(A,B),
line(B,C),
line(C,A).
Proviamo sui fatti:line(a,b).line(a,c).line(c,b).
FMZ
Esercizio
a,b,c,d… sono punti in un piano e i fatti sono del tipo
line(X,Y).
Definire una regola che stabilisca se quello in memoria è un triangolo.
triangle:-connected(A,B),
connected(B,C),
connected(C,A).
connected(A,B):-line(B,A).
connected(A,B):-line(A,B).
FMZ
Esercizio
path(A,P,B):-line(A,P),line(P,B).
a,b,c,d… sono punti in un piano e i fatti sono del tipo line(X,Y).Definire una regola path(X,P,Y).che sia vera quando esiste un percorso di due passi che tocchi il punto P.
FMZ
Eserciziopath(A,P,B):-
line(A,P),line(P,B).
a
c
b
d
Ci sono due soluzioni possibili!!
FMZ
Tipi di dato: associate ai termini
• Caratteri
• Interi
• Reali
• Stringhe
• Liste
FMZ
Funzioni built-in
• Gestione I/Owrite(predicate)
tell(file_name)
told
• Gestione Regoleassert(fatto)
retract(fatto)
FMZ
Operatori
• Operatori matematiciis : assegnamento
+ - * \
A is B + C.
• Comparazione=/= non uguale
FMZ
Le liste
• Definizione [a1,a2,…,an]
• Accedere ad una lista [Head¦Tail]• Esempi di head-tail
LIST Head Tail[a,b,c] a [b,c][[a,b,c],d,e] [a,b,c] [d,e][a] a [][] nessun valore
FMZ
Esercizi sulle liste
• Contare gli elementi di una lista
• member
• append: unire due liste
• rivoltare una lista
• Usiamo la lista per modellare gli insiemi:– unione– intersezione
FMZ
Esercizi
Lunghezza
lenght(Lista,N).
vera se N è il numero di elementi della lista.
lenght([],0).
lenght([Elemento|Resto],N):-
lenght(Resto,M),
N is M + 1.
FMZ
Esercizi
Membro della lista
member(Elemento,Lista).
vera se Elemento è un elemento della lista.
member(Elemento,[Elemento|_]).
member(Elemento,[_|Resto]):-
member(Elemento,Resto).
FMZ
Esercizi
Concatenazione tra liste
append(L1,L2,L12).
vera se L12 è la concatenazione di L1 e L2.
append([],L2,L2).
append([El|Resto],L2,[El|L12]):-
append(Resto,L2,L12).
FMZ
Esercizi
Restanti Ultimo elemento
last_element(List,Rest,LastEl).
vera se List è una lista e LastEl il suo ultimo elemento e Rest il resto rella lista.
last_element([El],[],El).
last_element([El|Rest],[El|RestB],Last):-
last_element(Rest,RestB,Last).
FMZ
Esercizi
Reverse di una lista
reverse(A,A_Reversed).
vera se A è rivoltata rispetto a A_Reversed.
reverse([],[]).
reverse([A|ARest],B):-
last_element(B,BRest,A),
reverse(ARest,BRest).
FMZ
Esercizi
Reverse di una lista
reverse(A,A_Reversed).
vera se A è rivoltata rispetto a A_Reversed.reverse([],[]).
reverse(A,B):-
reverse(A,[],B).
reverse([],A,B).
reverse([A|ARest],C,B):-
reverse(ARest,[A|C],B).
FMZ
Esercizi
Intersezione di due insiemi
intersect(A,B,AIB).
vera se AIB è l’intersezione di A e B.intersect(A,[],[]).
intersect([],B,[]).
intersect(A,[B|BR],[B|AIB]):-
memeber(B,A),
intersect(A,BR,AIB).
FMZ
Esercizi
Unione di due insiemi
union(A,B,AUB).
vera se AUB è l’unione di A e B.union(A,[],A).
union(A,[B|BR],[B|AIB]):-
intersect(A,BR,AIB).
FMZ
Esercizi
Verifica se una lista è un insieme
set(A).
vera se A è un insieme, ovvero A non contiene elementi duplicati.
set([]).
set([A|B]):-
\+member(A,B),
set(B).
FMZ
Esercizi
Lista equivalente senza duplicati
duplicates(A,B).
vera se A contiene una sola volta tutti gli elementi di B.
FMZ
Riflessioni
\+ not
Implica la ricerca in tutto lo spazio delle soluzioni per affermare che sia vero.
FMZ
Esercizi
Media
average(ListaDiNumeri,Media).
vera se Media è la lista dei numeri in ListaDiNumeri.
average(ListaDiNumeri,Media):-
somma(ListaDiNumeri,N),
lenght(ListaNumeri,M),
Media is N/M.
FMZ
Esercizi
somma([],0).
somma([El|Rest],N):-
lenght(Rest,M),
N is El + M.