Sistemi basati su conoscenza Esercizi Prolog Dott. Fabio Massimo Zanzotto a.a. 2001-2002
Esercizi FATTI: male(…). female(…). father(Father,Son). mother(Mother,Son).
Esercizio X è uno dei genitori di Y. part_of_parent(X,Y). father(X,Y). mother(X,Y).
Esercizio X,Y sono i genitori di Z. parents(X,Y,Z). parents(X,Y,Z):- father(X,Z), mother(Y,Z). mother(X,Z), father(Y,Z).
Esercizio X è fratello di Y. brother(X,Y). brother(X,Y):- mother(Z,X), mother(Z,Y), male(X).
Esercizio X è zia di Y. aunt(X,Y). aunt(X,Y):- female(X), mother(Z,Y), sister(X,Z). father(Z,Y),
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).
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). line(A,B).
Esercizio 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. path(A,P,B):- line(A,P), line(P,B).
Esercizio b a d c Ci sono due soluzioni possibili!! path(A,P,B):- line(A,P), line(P,B). b a d c Ci sono due soluzioni possibili!!
Tipi di dato: associate ai termini Caratteri Interi Reali Stringhe Liste
Funzioni built-in Gestione I/O Gestione Regole write(predicate) tell(file_name) told Gestione Regole assert(fatto) retract(fatto)
Operatori Operatori matematici Comparazione =/= non uguale is : assegnamento + - * \ A is B + C. Comparazione =/= non uguale
Le liste Definizione Accedere ad una lista [Head¦Tail] [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
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
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.
member(Elemento,Lista). Esercizi Membro della lista member(Elemento,Lista). vera se Elemento è un elemento della lista. member(Elemento,[Elemento|_]). member(Elemento,[_|Resto]):- member(Elemento,Resto).
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).
last_element(List,Rest,LastEl). 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).
reverse(A,A_Reversed). 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).
reverse(A,A_Reversed). 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).
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).
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).
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).
Esercizi Lista equivalente senza duplicati duplicates(A,B). vera se A contiene una sola volta tutti gli elementi di B.
Riflessioni \+ not Implica la ricerca in tutto lo spazio delle soluzioni per affermare che sia vero.
average(ListaDiNumeri,Media). 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.
Esercizi somma([],0). somma([El|Rest],N):- lenght(Rest,M), N is El + M.