I seguenti fatti dichiarano uno stato di cose:
% file: intro/es1.pl possiede(adriano,ristorante). % Adriano possiede un ristorante possiede(giovanni,casa). % Giovanni possiede una casa fratelli(adriano,paolo). % Adriano e Paolo sono fratelli in_italia(roma). % Roma e' in Italia in_italia(genova). % Genova e' in Italia in_usa(new_york). % New York e' in Usa in_usa(los_angeles). % Los Angeles e' in Usa
Se si immettono questi fatti nel database del Prolog è possibile porre delle domande (obiettivi).
Possiamo chiedere: "Adriano possiede un ristorante ?"
?- possiede(adriano,ristorante).
L'interprete Prolog in questo caso risponderà"si". Se invece l'obiettivo fosse
?- possiede(adriano,casa).
otterremmo come risposta "no".
Quando sei in "LAB" puoi provare ad usare il programma e vedere cosa risponde l'interprete Prolog. Se non sai come usare il Prolog consulta l'help che troverai nel "LAB".
Dopo aver caricato i fatti nel database scrivi in Prolog le seguenti domande e controlla la risposta dell' interprete:
"Giovanni possiede una casa? "
"Adriano possiede un ristorante?"
"Adriano e' fratello di Paolo? "
"Paolo e' fratello di Adriano?"
(spiegare per che nel primo caso la risposta è "si" mentre nel secondo è "no").
"Roma è in Italia ?"
"New York e' in Usa? "
"Chicago è in Italia? "
La domanda "Cosa possiede Adriano? " può essere espressa come un obiettivo che contiene una variabile.
?- possiede(adriano,X).X
rappresenta ciò che Adriano possiede.
Formulate come obiettivi Prolog le seguenti domande:
"Cosa possiede Carlo"
"Chi e' fratello di paolo? "
"Quali citta' ci sono in Italia? "
Considerate i seguenti fatti:
% file: intro/es2.pl eta(giovanni,30). eta(andrea,20). eta(giovanni,32). eta(paolo,32). eta(anna,25).
Possiamo formulare la domanda "Esistono due persone che si chiamano rispettivamente Giovanni e Paolo e che hanno la stessa eta? " in questo modo:
?- eta(giovanni,X),eta(paolo,X).
La virgola rappresenta la congiunzione, la X rappresenta sia l'età di Giovanni che quella di Paolo (in quanto compare sempre all'interno dello stesso obiettivo).
Considerate ora questo esempio:
% file: intro/es3.pl sorella(alice,franco). sorella(paola,franco). sorella(alice,anna). sorella(anna,alice). sorella(alice,giulia). sorella(giulia,alice). sorella(paola,michela). sorella(michela,paola). sorella(gianna,paola). sorella(paola,gianna). amiche(paola,giulia). amiche(giulia,paola). amiche(anna,michela). amiche(michela,anna).
e formulate la seguente domanda: "Esistono due amiche, di cui una ha una sorella che si chiama Alice e l'altra ha una sorella che si chiama Paola? "
L'ordine degli argomenti nei fatti è importante. Dire che sorella(alice,anna) non equivale a dire sorella(anna,alice). La stessa considerazione vale per i fatti amiche(paola,giulia) e amiche(giulia,paola).
Una regola è una affernazione condizionale riguardo certi oggetto e le relazioni che li legano.
% file: intro/es4.pl % definisce il fatto genitore genitore(pam,tom). genitore(tom,bob). genitore(tom,jim). % definisce una regola figlio(Y,X) :- genitore(X,Y).
Questa regola stabilisce che Y è figlio di X se X è padre di Y. Ora possiamo formulalare delle domande. La domanda "Chi è figlio di tom? " puo' essere espressa in Prolog come
?- figlio(X,tom).
Provate a formulare le seguenti domande: "di chi e' figlio bob? "
?- figlio(bob,X).
"trova un X e un Y tali che X sia figlio di Y"
?- figlio(X,Y).
Scrivete una regola fratello(X,Y) tenendo conto che X è fratello di Y se X e Y hanno un genitore comune.
fratello(X,Y) :- figlio(X,Z),figlio(Y,Z).Attenzione:
la nuova regola deve essere scritta nell'area di testo del "Prolog Lab". Scritta la regola usare il comando "Consult".
Se provate questa regola vi accorgerete che "bob" e "jim" oltre a essere
fratelli fra di loro, sono anche fratelli di sè stessi. Provate a dare
una spiegazione.
Potete usare il predicato X\=Y che si può leggere come
X è diverso da Y per dire che X
e Y non sono la stessa persona. (Vedi
matching
per la definizione di \=).
Scrivete una regola nonno(X,Y). Potete esprimere questa regola dicendo che X è nonno di Y se X è padre di un qualche Z e Z è a sua volta padre di Y.
nonno(X,Y) :- genitore(X,Z),genitore(Z,Y).
Supponiamo ora di fare la domanda
nonno(pam,N).
Quali passi compie il Prolog per rispondere alla domanda precedente.
genitore(pam,Z),genitore(Z,N).I nuovi obbiettivi verrano verificati nell'ordine da sistra a destra.
genitore(pam,tom).Z viene ad assumere il valore "tom".
genitore(tom,bob)che porta a dire N=Y=bob.
Puoi controllare l'ordine con cui il Prolog cerca di soddisfare gli obiettivi utilizzando la direttiva "trace" che va scritta prima della domanda:
?- trace, nonno(pam,N).
Questi fatti descrivono la situazione di una biblioteca:
%file: intro/es5.pl % le persone tesserate tesserato(bianchi). tesserato(rossi). % i libri in inventario in_schedario(moby_dick). in_schedario(la_valle_dell_eden). in_schedario(gorki_park). % i prestiti non_in_prestito(moby_dick). non_in_prestito(gorki_park).
Scrivete una regola che esprima il concetto che il signor Y puo consultare il libro X se Y ha la tessera di accesso alla biblioteca, e se il libro X è inventariato e non già stato concesso in prestito ad altri.
Scrivete ora la domanda: "Rossi puo' consultare Gorki Park? "
Spiegare quali passi compie il Prolog per rispondere alla domanda precedente. Aiutatevi provando ad eseguire l'obiettivo con il "trace".