Nel precedente articolo si è mostrato come la tipica sessione di lavoro con un interprete Prolog si svolga in due fasi, con l’iniziale caricamento della teoria (o base della conoscenza) nella memoria di lavoro del sistema e la successiva valutazione di uno o più goals. L’interprete tuProlog dispone di una interfaccia grafica, e per tal motivo l’operazione di caricamento della teoria comporta la semplice pressione di un bottone sullo schermo; non è tuttavia infrequente imbattersi in implementazioni classiche di Prolog dotate della sola linea di comando (qualcosa di molto simile alla shell del sistema operativo, solo che in questo caso il sistema si aspetta un goal da valutare e non un comando da eseguire) e vedremo successivamente come lavorare in simili contesti.
Escludendo i commenti e gli spazi (o le righe vuote) una teoria Prolog si compone esclusivamente di formule logiche, chiamate clausole, ciascuna delle quali terminata dal simbolo del punto. Nel programma logico:
cane(fido).
animale(X) :- cane(X).
si riconoscono due clausole, la prima (nello specifico un fatto) che afferma che “fido è un cane” e la seconda (una regola) che afferma che “per ogni possibile X: X è un animale se X è un cane” (o anche che “ogni cane è un animale”).
I tipi di dato e le strutture che Prolog riconosce sono chiamati termini e fino ad ora ne abbiamo implicitamente utilizzati molti, come fido, cane(fido), X, animale(X). Formalmente però un termine può essere un numero (ad esempio 123, -12, 1.223), un atomo (una costante non numerica che inizia con una lettera minuscola ed è eventualmente racchiusa tra apici singoli, ad esempio antonio e ‘maria rossi’), una variabile (una costante non numerica che inizia con una lettera maiuscola, ad esempio X e Y) oppure un termine composto nella forma funtore(argomento1,…,argomentoN) nella quale il funtore è un atomo e gli argomenti sono a loro volta termini e dove il numero degli argomenti è chiamato arità. Sono quindi esempi di termini composti con arità rispettivamente di 1, 1 e 5 i seguenti:
cane(fido)
animale(X)
persona(‘mario rossi’,X,medico,roma,coord(12,13,1.123))
Un termine composto esprime l’esistenza di una relazione tra i propri argomenti, mentre una regola (guardando oltre la pura interpretazione formale di causa-effetto) esprime l’esistenza di una relazione tra i propri termini. Uno sviluppatore proveniente dal mondo della Object Oriented Programming potrebbe infatti interpretare la teoria citata in apertura come l’espressione di una relazione instance-of (“l’oggetto fido è una istanza della classe cane”) e di una relazione is-a (“ogni istanza della classe cane è anche una istanza della classe animale”, quindi “la classe cane è una specializzazione della classe animale”).



Gennaio 4, 2012
Linguaggi di Programmazione