Soluzioni Introduzione

intro/es1

"Giovanni possiede una casa? "
?- possiede(giovanni,casa).
"Adriano possiede un ristorante?"
?- possiede(adriano,ristorante).
"Adriano e' fratello di Giovanni? "
?- fratelli(adriano,giovanni).
"Paolo e' fratello di Adriano?"
?- fratelli(paolo,adriano).
(spiegare per che nel primo caso la risposta è "si" mentre nel secondo è "no").

"Roma è in Italia ?"

 ?- in_italia(roma). 
"New York e' in Usa? "
?- in_usa(new_york).  
"Chicago è in Italia? "
?- in_italia(chicago).
"Cosa possiede Carlo"
?- possiede(carlo,Y).
"Chi e' fratello di paolo? "
 ?- fratelli(Y,paolo).
"Quali citta' ci sono in Italia? "
?- in_italia(X).

intro/es3

"Esistono due amiche, di cui una ha una sorella che si chiama Alice e l'altra ha una sorella che si chiama Paola? "
% ?- sorella(alice,X),sorella(paola,Y),amiche(X,Y).

intro/es4

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). 
Se si vuole evitare che una persona sia fratello di sè stessa la regola deve essere così modificata:
  fratello(X,Y) :- figlio(X,Z),figlio(Y,Z),X\=Z. 

Dopo aver definito la regola:

  nonno(X,Y) :- figlio(Z,X),figlio(Y,Z).
il risultato di
 ?- trace, nonno(pam,N). 
è il seguente:
GOAL: trace,nonno(pam,N),notrace.

N = bob
Yes

   
Call:  ( 14) nonno(pam, _G1961) ?    
Call:  ( 15) genitore(pam, _L158) ?    
Exit:  ( 15) genitore(pam, tom) ?    
Call:  ( 15) genitore(tom, _G1961) ?    
Exit:  ( 15) genitore(tom, bob) ?    
Exit:  ( 14) nonno(pam, bob) ? 

intro/es5

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, se il libro X è inventariato e non già stato concesso in prestito ad altri.
 puo_consultare_libro(Y,X):-
           tesserato(Y),
           in_schedario(X),
           non_in_prestito(X).
Scrivete ora la domanda: "Rossi puo' consultare Gorki Park? "
?- puo_consultare_libro(rossi,gorki_park).
Spiegare 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 "rossi", la variabile Y viene istanziata al valore "gorki_park ".
  3. L'obiettivo originario viene sostituito dal corpo della regola: tesserato(rossi),in_schedario(gorky_park),non_in_prestito(gorky_park). I nuovi obbiettivi verrano verificati nell'ordine da sistra a destra.
  4. Il primo obiettivo e' tesserato(rossi) che viene trovato nel database.
  5. L'obiettivo che viene testato successivamente e' in_schedario(gorki_park).
  6. L'ultimo obiettivo e' non_in_prestito(gorky_park).
  7. Poiche' tutti gli obiettivi generati dall'applicazione della regola sono stati soddisfatti il Prolog risponde si alla domanda originale.

 

Dario Bianchi
Last modified: Wed Apr 9 12:09:51 MET DST