La volta scorsa abbiamo presentato in breve il Prolog, probabilmente il più usato tra i linguaggi di programmazione logica, nonché uno dei due linguaggi classici nel campo dell’intelligenza artificiale, assieme al LISP. Oggi proseguiremo il discorso, con una rapida descrizione delle sue caratteristiche principali e della sua particolare sintassi.
Per prima cosa, il Prolog è un linguaggio semplice. Più o meno. A livello sintattico, è molto più semplice di qualsiasi linguaggio procedurale, come C (e varianti), Smalltalk, Java, eccetera. Non ci sono molte regole, non ci sono innumerevoli tipi di variabili da ricordare e utilizzare, non ci sono differenti strutture di controllo del flusso: in fin dei conti, la filosofia del Prolog si basa proprio sull’idea che dovrebbe essere il computer a occuparsi di questi dettagli, mentre il programmatore dovrebbe pensare soltanto al cosa fare, non al come farlo. Questa è l’essenza di un linguaggio descrittivo. La realtà del Prolog è un poco diversa, come vedremo, ma è pur sempre un bel passo in questa direzione.
Come abbiamo già detto, un programma in Prolog è composto da due elementi: fatti e regole.
Un fatto afferma alcune proprietà di un oggetto, o relazioni tra due o più oggetti: è sempre vero. Un tipico fatto si presenta così:
maschio(tizio). traducibile come -> Tizio è maschio.
padre_di(tizio, caio). traducibile come -> Tizio è padre di Caio.
Una regola ci permette di dedurre nuove proprietà di un oggetto, analizzando le precondizioni che la compongono. Una regola infatti è composta da una testa, che costituisce il predicato da provare, e un corpo, che costituisce i predicati da dimostrare, per affermare la verità della testa. Testa e corpo sono separati da un :- , simbolo che corrisponde allo "if" di altri linguaggi. Se il corpo è composto da più predicati, i predicati possono essere separati da una virgola, se tutti devono essere verificati (la virgola corrisponde a una "e", oppure allo "and" di altri linguaggi). Se due predicati sono separati da un punto e virgola, invece , significa che sono alternativi: basta che soltanto uno dei due sia vero (corrisponde allo "or" di altri linguaggi). Per esempio:
zio_di(X, Y) :- padre_di(Z, Y), fratello(X, Z).
che, tradotto, significa "X è zio di Y, se ( :- ) esiste una persona Z che sia padre di Y e ( , ) fratello di X".
In concreto, i fatti si possono considerare come un caso speciale di regole, cioè regole che sono sempre vere: per questo non presentano alcuna precondizione da soddisfare.
Per motivi misteriosi, praticamente tutti i manuali di Prolog cominciano con esempi tratti dalla vita familiare, così ho scelto di rispettare la tradizione anche qui. A ogni modo, già da questi esempi, possiamo osservare alcuni aspetti tipici del Prolog. Tanto per cominciare, fatti e regole sono composti da strutture pressoché uguali: una parola (o due parole, collegate da una barra orizzontale), seguita da una parentesi tonda, che contiene a propria volta una o più parole, separate da una virgola. Questa struttura è chiamata "definizione di predicato". Il predicato è la parola che precede la parentesi e specifica il tipo di proprietà posseduta dai termini fra parentesi. I termini fra parentesi, invece, sono gli argomenti del predicato. Gli argomenti possono essere costanti, variabili o termini composti.
Le costanti possono essere:
numeri, sia interi che decimali;
simboli, cioè parole o sequenze di caratteri che cominciano per lettera minuscola, oppure singole lettere minuscole;
stringhe, ossia qualsiasi cosa sia racchiusa tra ‘ e ‘.
Le variabili, invece, possono essere parole, singole lettere o sequenze di caratteri, proprio come i simboli che abbiamo visto sopra: l’importante è che comincino con una lettera maiuscola o con una linea _ . Dunque,
costanti: a, 42, ciao, cu78abct7, roma;
variabili: A, Nonno, Caio, _rtuny.
Se vedete qualcosa che comincia con una lettera maiuscola, o con un _, sarà di sicuro una variabile, qualsiasi sia il suo significato (ammesso che ne abbia uno). Le variabili sono sempre locali, ossia hanno valore solo all'interno della regola in cui si trovano. Due variabile dallo stesso nome, poste in due regole diverse, avranno anche un valore diverso.
Un tipo particolare di variabile è la variabile anonima, che si indica con un semplice trattino basso, _. Questo simbolo sta a significare che in quel punto c’è una variabile, ma non ci interessa quale sia e non intendiamo usarla.
Continua la lettura...»