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'
Dire quali dei seguenti termini sono variabili:
1) X
2) Cognome
3) X_22
4) x_22
5) 'ABC'
6) _3x
7) _
8) 22
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:
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: