Prolog
Prolog linguaggio di programmazione | |
---|---|
Autore | Alain Colmerauer |
Data di origine | 1972 |
Utilizzo | linguaggio general-purpose |
Paradigmi | Programmazione logica |
Tipizzazione | non esistono tipi di dati |
Specifiche di linguaggio | ISO/IEC 13211-1 (1995) |
Estensioni comuni | .pl .pro .P |
Influenzato da | Planner |
Il Prolog (contrazione del francese PROgrammation en LOGique) è un linguaggio di programmazione che adotta il paradigma di programmazione logica.
È stato ideato da Robert Kowalski (aspetto teorico), Marten Van Emdem (dimostrazione sperimentale) e implementato da Alain Colmerauer negli anni 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 un algoritmo di soluzione eseguibile dalla macchina. L'attuale implementazione di Prolog è dovuta in gran parte all'efficiente codifica di David H.D. Warren, implementata tramite la sua Warren Abstract Machine (1983).
Il Prolog è impiegato in molti programmi di intelligenza 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 sul calcolo dei predicati (precisamente il calcolo di predicati del primo ordine); tuttavia la sintassi è limitata a formule dette clausole di Horn che sono disgiunzioni di letterali del primo ordine, quantificate universalmente, con al più un letterale positivo.
L'esecuzione di un programma Prolog è comparabile alla dimostrazione di un teorema mediante la regola di inferenza detta risoluzione (introdotta da Robinson nel 1965). I concetti fondamentali sono l'unificazione, la ricorsione in coda e il backtracking.
Molti linguaggi, come Datalog o AnsProlog, sono basati su Prolog.
Sintassi
[modifica | modifica wikitesto]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.
Tipi di dati
[modifica | modifica wikitesto]L'elemento generico del Prolog si chiama termine. I termini possono essere costanti (atomi o numeri), variabili o termini composti.
- Un atomo è un nome generico senza significato intrinseco, es.:
x
,blu
,'Taco'
,'questo signore'
. - Un numero può essere intero o decimale.
- Una variabile è indicata per mezzo di una stringa di lettere, numeri e underscore (_) che comincia con una maiuscola o un trattino basso.
- Un termine 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:
- Una lista è 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]
. - Una stringa è una sequenza di caratteri delimitata da doppi apici ("), p.es.
"essere o non essere"
.
Regole e fatti
[modifica | modifica wikitesto]Una regola ha la forma:
Testa :- Corpo.
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 chiamato fatto. I fatti equivalgono a regole senza corpo, che sono considerate automaticamente vere. Un esempio di fatto è:
gatto(tommaso).
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.
Programma di esempio
[modifica | modifica wikitesto]Il seguente esempio stampa il testo "Hello world".
?- write('Hello World'), nl.
Permutazioni
[modifica | modifica wikitesto]La potenza di Prolog non risiede comunque nella sua gestione dell'input/output, quanto nella possibilità di rappresentare semplicemente concetti complessi, ad esempio algoritmi combinatori. 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).
Meta-Interpretazione
[modifica | modifica wikitesto]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).
Implementazioni
[modifica | modifica wikitesto]- Amzi! Prolog
- Ciao Prolog
- ECLiPSe, su eclipseclp.org.
- GNU Prolog
- JIProlog, su jiprolog.com.
- Lpa Prolog
- Prolog.NET
- SICStus Prolog
- Strawberry Prolog
- SWI-Prolog
- tuProlog
- Visual Prolog (ex Turbo Prolog)
- XSB
- YAP Prolog
Bibliografia
[modifica | modifica wikitesto]- Le basi logiche del Prolog (JPG), in LIST, anno 5, n. 8/9, Roma, EDICOMP, settembre/ottobre 1987, pp. 28-30, OCLC 955780660.
- Il Prolog strumento principe, in Intelligenza Artificiale, n. 1, Milano, Arcadia, 1988, pp. 8-12.
- (EN) Patrick Blackburn, Johan Bos, Kristina Striegnitz, Learn Prolog Now! Archiviato il 26 agosto 2007 in Internet Archive., College Publications, 2006, ISBN 1-904987-17-6
- (EN) J. A. Robinson, A Machine-Oriented Logic Based on the Resolution Principle, in Journal of the Association for Computing Machinery, 12(1), gennaio 1965.
Voci correlate
[modifica | modifica wikitesto]Altri progetti
[modifica | modifica wikitesto]Collegamenti esterni
[modifica | modifica wikitesto]- (EN) Prolog: The ISO standard documents, su pauillac.inria.fr.
- (EN) Prolog.info Notizie e risorse sul Prolog e AI.
Controllo di autorità | LCCN (EN) sh85107397 · BNF (FR) cb11970224v (data) · J9U (EN, HE) 987007538888605171 |
---|