IlProlog (contrazione delfrancesePROgrammation enLOGique) è unlinguaggio di programmazione che adotta ilparadigma diprogrammazione logica.
È stato ideato daRobert Kowalski (aspetto teorico),Marten Van Emdem (dimostrazione sperimentale) e implementato daAlain Colmerauer neglianni settanta, e costituisce un tentativo di costruire un linguaggio di programmazione che consenta l'espressione del problema in forma logica, invece che in forma di unalgoritmo di soluzione eseguibile dalla macchina. L'attuale implementazione di Prolog è dovuta in gran parte all'efficiente codifica diDavid H.D. Warren, implementata tramite la suaWarren Abstract Machine (1983).
Il Prolog è impiegato in molti programmi diintelligenza artificiale; la sintassi e la semantica sono molto semplici e chiare, in quanto lo scopo per cui venne ideato era quello di fornire uno strumento di lavoro a linguisti privi di conoscenze informatiche.
Il Prolog si basa sulcalcolo dei predicati (precisamente il calcolo di predicati del primo ordine); tuttavia la sintassi è limitata a formule detteclausole di Horn che sono disgiunzioni diletterali del primo ordine, quantificate universalmente, con al più un letterale positivo.
L'esecuzione di unprogramma Prolog è comparabile alla dimostrazione di unteorema mediante laregola di inferenza dettarisoluzione (introdotta daRobinson nel1965). I concetti fondamentali sono l'unificazione, laricorsione in coda e ilbacktracking.
Molti linguaggi, comeDatalog oAnsProlog, sono basati su Prolog.
Nel Prolog, la logica del programma è espressa sotto forma di relazioni, e le attività di calcolo vengono attivate da un'interrogazione relativa a tali relazioni.
L'elemento generico del Prolog si chiamatermine. I termini possono esserecostanti (atomi onumeri),variabili otermini composti.
- Unatomo è un nome generico senza significato intrinseco, es.:
x,blu,'Taco','questo signore'. - Unnumero può essere intero o decimale.
- Unavariabile è indicata per mezzo di una stringa di lettere, numeri e underscore (_) che comincia con una maiuscola o un trattino basso.
- Untermine composto è formato da un atomo detto "funtore" e da uno o più argomenti - anch'essi termini - scritti tra parentesi e separati da virgole, p.es.
data(27,'marzo',1980)anno_modello_auto('Mazda','cx 5',1986) e'Amici'(zelda,[tom,jim]).
Casi speciali di termini composti:
- Unalista è una collezione ordinata di termini, separati da virgole; viene indicata per mezzo di parentesi quadre; è ammessa la lista vuota
[]. Esempi:[1,2,3] e[rosso,verde,blu]. - Unastringa è una sequenza di caratteri delimitata da doppi apici ("), p.es.
"essere o non essere".
Unaregola ha la forma:
che si legge: "Testa è vera se Corpo è vero." (Si noti che la regola termina con un punto.)
Un singolo termine (anche composto), senza il segno:-, viene chiamatofatto. I fatti equivalgono a regole senza corpo, che sono considerate automaticamente vere. Un esempio di fatto è:
Al di là dell'uso strettamente previsto dalla teoria, il Prolog offre anche dei predicati speciali che servono per input/output e altre attività accessorie. P.es.write/1 visualizza un termine sullo schermo.
Il seguente esempio stampa il testo "Hello world".
?-write('Hello World'),nl.La potenza di Prolog non risiede comunque nella sua gestione dell'input/output, quanto nella possibilità di rappresentare semplicemente concetti complessi, ad esempio algoritmicombinatori. Ecco un programma che calcola tutte le possibili permutazioni di una parola data come lista di caratteri:
permutation([],[]).permutation(Xs,[Z|Zs]):-select(Z,Xs,Ys),permutation(Ys,Zs).select(X,[X|Xs],Xs).select(Y,[X|Xs],[X|Ys]):-select(Y,Xs,Ys).
In Prolog è semplice scrivere interpreti e compilatori. Ad esempio, un meta-interprete di Prolog (cioè un interprete Prolog scritto in Prolog) è costituito da solo 3 linee di codice:
vanilla(true).vanilla((A,B)):-vanilla(A),vanilla(B).vanilla(X):-X\==true,clause(X,B),vanilla(B).
- Le basi logiche del Prolog (JPG), inLIST, anno 5, n. 8/9, Roma, EDICOMP, settembre/ottobre 1987, pp. 28-30,OCLC 955780660.
- Il Prolog strumento principe, inIntelligenza Artificiale, n. 1, Milano, Arcadia, 1988, pp. 8-12.
- (EN) Patrick Blackburn, Johan Bos, Kristina Striegnitz,Learn Prolog Now!Archiviato il 26 agosto 2007 inInternet Archive., College Publications, 2006,ISBN 1-904987-17-6
- (EN) J. A. Robinson,A Machine-Oriented Logic Based on the Resolution Principle, inJournal of the Association for Computing Machinery, 12(1), gennaio 1965.
- (EN) Leon Sterling e Ehud Y. Shapiro,The Art of Prolog Advanced Programming Techniques, MIT Press, 1994,ISBN 9780262193382.
- (EN) Ivan Bratko,Prolog Programming for Artificial Intelligence, Pearson Education (US), 2011,ISBN 9780321417466.