Fatti e Domande

Fatti

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? "

Uso delle variabili nelle domande

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? "

Domande complesse (Congiunzione di obiettivi)

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? "
Attenzione all'ordine degli argomenti nei fatti
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).

Regole

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.
  1. Il Prolog fa un'associazione fra la domanda e la testa della regola.
  2. La variabile X viene istanziata al valore "pam", la variabile Y viene accomunata alla variabile N della domanda.
  3. L'obiettivo originario viene sostituito dal corpo della regola:
     genitore(pam,Z),genitore(Z,N).
    I nuovi obbiettivi verrano verificati nell'ordine da sistra a destra.
  4. Il primo obiettivo e' genitore(pam,Z) che soddisfatto in quanto nel database compare il fatto
       genitore(pam,tom). 
    Z viene ad assumere il valore "tom".
  5. L'obiettivo che viene testato successivamente e' genitore(tom,X). In questo caso, per soddisfare l'obiettivo, viene utilizzato il fatto
     genitore(tom,bob) 
    che porta a dire N=Y=bob.
  6. Poiche' tutti gli obiettivi generati dall'applicazione della regola sono stati soddisfatti il Prolog risponde "si" alla domanda originale e mostra come sono state istanziate le variabili.
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).   

 

In biblioteca

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".