Costanti, variabili e strutture.

Costanti

Dire quali dei seguenti ternini sono atomi:
      1)       cane
      2)       Cane
      3)       x25
      4)       3x2
      5)       variabile_x
      6)       VariabileZ
      7)       varZ
      8)       ===>
      9)       :-
     10)       _aprile
     11)       'Mario'
     12)       'X' 
    

Variabili

Dire quali dei seguenti termini sono variabili:
       1)      X
       2)      Cognome
       3)      X_22
       4)      x_22
       5)      'ABC'
       6)      _3x
       7)      _
       8)      22 

Strutture

Una struttura è un oggetto costituito da un insieme di altri oggetti, detti componenti della struttura. La ragione per cui un certo numero di oggetti vengono raggruppati insieme a formare una struttura è dovuta in genere ad una certa analogia fra di essi ed alla convenienza, quindi, a trattare tali dati globalmente anzichè singolarmente. Una struttura si esprime in Prolog specificando un funtore e una serie di componenti. I componenti sono racchiusi fra parentesi rotonde e separati da virgole; il funtore precede i componenti. Un esempio di struttura è il seguente:
 in_prestito(rossi,libro(la_valle_dell_eden,autore(john,steinbeck))).
dove libro e autore sono funtori. Questo fatto codifica le informazioni relative a libri dati in prestito. Supponiamo di avere un fatto così strutturato per ogni prestito effettuato dalla biblioteca e di voler sapere quali libri sono stati dati in prestito al sig. Rossi; la domanda da porre sar la seguente:
 ?-in_prestito(rossi,libro(X,autore(Y,Z))).
Il meccanismo di matching. (o di unificazione) cercherà di rendere uguale questo goal con la struttura vista precedentemente. In risposta avremo che le variabili presenti nel goal verranno istanziate. Cioè avremo:
        X = la_valle_dell_eden,
        Y = john,
        Z = steinbeck.
Se ci fossero più fatti del tipo in_prestito in risposta otterremo (usando il meccanismo del punto e virgola per forzare il backtracking ) tutte le possibili istanze delle variabili X,Y,Z. Se invece volessimo sapere a chi sono stati dati in prestito i libri di Steinbeck, dovremmo chiedere:
 ?-in_prestito(X,libro(Y,autore(john,steinbeck))).
Siano dati i fatti:
% file: strutture/es1.pl

 in_prestito(rossi,libro(la_valle_dell_eden,autore(john,steinbeck))).
 in_prestito(verdi,libro(cime_tempestose,autore(emily,bronte))).
 in_prestito(verdi,libro(gente_di_dublino,autore(james,joyce))).
 in_prestito(rossi,libro(ulisse,autore(james,joyce))).
Sfruttando le regole di matching ed il meccanismo di backtracking rispondere alle seguenti domande:
  1. trovare chi ha in prestito il libro "Cime tempestose".
  2. trovare quali libri sono stati dati in prestito a Verdi.
  3. trovare quali libri di Joyce sono in prestito.

Rappresentazione delle strutture mediante alberi
Una delle possibilità per comprendere facilmente strutture complicate è quella di visualizzarle in termini di alberi.
Un albero abitualmente è costituito da una radice e da un insieme di rami; ogni ramo può a sua volta puntare ad altre strutture in modo che si possano avere strutture ricorsive.
Un predicato o una struttura Prolog possono essere espressi mediante un albero che ha per radice il funtore del predicato o della struttura stessa e per rami i suoi componenti.

Ad esempio, le strutture:

 studenti(roberto,anna,paolo).
 impiegato(rossi,indirizzo(via(ravecca),numero(12))).
possono essere rappresentati graficamente come segue:
  
                                        impiegato       
                                         /     \
       studenti                         /       \
        / | \                        rossi    indirizzo
       /  |  \                                 /     \
 roberto anna paolo                          via    numero
                                              |       |
                                           ravecca    12
È stato così introdotto il concetto molto importante di ricorsione, uno strumento molto potente che consente di: