Prolog

llenguatge de programació

El Prolog (nom provinent dels mots francesos programation i logique[1]) és un llenguatge de programació bastant popular en el medi d'investigació en intel·ligència artificial.

Infotaula de llenguatge de programacióProlog
Tipusllenguatge de programació, llenguatge de programació declaratiu, deductive language (en) Tradueix i logic programming language (en) Tradueix Modifica el valor a Wikidata
Data de creació1972 Modifica el valor a Wikidata
DissenyAlain Colmerauer, Robert Kowalski i Philippe Roussel Modifica el valor a Wikidata
Paradigma de programacióprogramació lògica, Programació declarativa i programació modular Modifica el valor a Wikidata
Influenciat perplanificador Modifica el valor a Wikidata
Extensió dels fitxerspl, pro i P Modifica el valor a Wikidata
Etiqueta d'Stack ExchangeEtiqueta Modifica el valor a Wikidata

Història

modifica

Es tracta d'un llenguatge de programació ideat a principis dels anys setanta a la Universitat d'Aix-Marseille I (Marsella, França) per Alain Colmerauer i Philippe Roussel. Va néixer d'un projecte que no tenia com a objectiu la traducció d'un llenguatge de programació, sinó el tractament algorítmic de llenguatges naturals. Alain Colmerauer i Robert Pasero treballaven en el processament del llenguatge natural i Jean Trudel i Philippe Roussel en la deducció i inferència del sistema. Interessat pel mètode de resolució SL, Philippe Roussel va persuadir al seu autor, Robert Kowalski, per a col·laborar en el projecte. Aquest esdeveniment va donar lloc a una versió preliminar del llenguatge Prolog a finals de 1971,[2] sortint la versió definitiva a 1972.[3] La primera versió de Prolog va ser programada en ALGOL W.

Inicialment, es tractava d'un llenguatge totalment interpretat fins que, a mitjans dels setanta, David H.D. Warren va desenvolupar un compilador capaç de traduir Prolog en un conjunt d'instruccions d'una màquina abstracta denominada Warren Abstract Machine, o abreviadament, WAM. Des d'aquell moment, Prolog és un llenguatge semiinterpretat.

Tot i que en un principi era un llenguatge d'ús reduït, l'aparició d'intèrprets per microordinadors de 8 bits (ex: micro-PROLOG) i per ordinadors domèstics de 16 bits (ex: Turbo Prolog de Borland) va contribuir notòriament a la seva popularització[4] durant la dècada dels vuitanta. Un altre factor cabdal a la difusió fou l'adopció del mateix per al desenvolupament del projecte de la quinta generació d'ordinadors a principis dels anys vuitanta.[5] Paral·lelament, també es va desenvolupar la implementació paral·lelitzada del llenguatge anomenada KL1 (Kernel Language 1) i del qual deriva part de Prolog l'evolució moderna de Prolog.

Les primeres versions del llenguatge diferien, en les diferents implementacions, en molts aspectes de la seva sintaxi, emprant-se majoritàriament com a forma normalitzada el dialecte proposat per la Universitat d'Edimburg, fins que el 1995 es va establir un estàndard ISO (ISO/IEC 13211- 1), anomenat ISO-Prolog.

Descripció

modifica

El Prolog s'emmarca en el paradigma dels llenguatges declaratius, la qual cosa el diferencia enormement d'altres llenguatges més populars com Fortran, Pascal, C, etc.

En aquests darrers llenguatges, les instruccions s'executen normalment en ordre seqüencial, és a dir, una a continuació d'una altra, en el mateix ordre en el qual estan escrites, que només varia quan s'arriba a una instrucció de control (un bucle, una instrucció condicional o una transferència).

Els programes en Prolog es defineixen en termes de clàusules de Horn, que es poden veure com expressions lògiques de la forma "Si de veritat l'antecedent, llavors és veritat el conseqüent". No obstant això, en les clàusules de Horn primer s'escriu el conseqüent i després l'antecedent.

L'antecedent pot ser una única fórmula atòmica, una conjunció de diverses fórmules atòmiques o pot no haver-n'hi cap. Si no hi ha antecedent, tenim que la clàusula correspon a un fet. Això és, sabem que el conseqüent és cert.

L'execució en Prolog es basa a prendre una fórmula atòmica com a objectiu i intentar-la demostrar. Per aconseguir-ho se cercaran entre les clàusules del programa aquelles que són adequades i es prendran els objectes de l'antecedent com a nous objectius a demostrar.

Els objectes de l'antecedent estan separats per comes i es poden considerar, d'alguna manera, similars a una instrucció o crida a un procediment dels llenguatges imperatius.

En Prolog no existeixen instruccions de control. La seva execució es basa en dos conceptes: la unificació i el backtracking.

  • Gràcies a la unificació, cada objectiu determina un subconjunt de clàusules susceptibles d'ésser executades. Cadascuna d'elles es denomina punt d'elecció. El Prolog selecciona el primer punt d'elecció i segueix executant el programa fins a determinar si l'objectiu és vertader o fals. En cas de ser fals, entra en joc el backtracking.
  • El backtracking consisteix a desfer tot allò executat i en situar el programa en el mateix estat en el qual es trobava just abans d'arribar al punt d'elecció. Llavors es pren el següent punt d'elecció que estava pendent i es repeteix de nou el procés.

Tots els objectius terminen la seva execució bé sigui en vertader, bé sigui en fals.

Exemple de Codi Prolog

modifica
%%
%% declaracions
%%

parede('joan', 'maria'). % joan és pare de maria
parede('pau', 'joan'). % pau és pare de joan
parede('pau', 'marcela').
parede('carles', 'debora').

% A és fill de B si B és pare de A
fillde(A,B) :- parede(B,A).

% A és avi de B si A és pare de C i C és pare B
avide(A,B) :- 
 parede(A,C), 
 parede(C, B).

% A i B són germans si el pare de A és també el pare de B i si A i B no són el mateix
germade(A,B) :- 
 parede(C,A), 
 parede(C,B), 
 A \== B.

% A i B són familiars si A és pare de B o A és fill de B o A és germà de B
familiarde(A,B) :- 
 parede(A,B).

familiarde(A,B) :-
 fillde(A,B).

familiarde(A,B) :- 
 germade(A,B).

%%
%% consultes
%%

% joan és germà de marcela?
?- germade('joan', 'marcela').
yes

% carles és germà de joan?
?- germade('carles', 'joan').
no

% pau és avi de maria?
?- avide('pau', 'maria').
yes

% maria és avi de pau?
?- avide('maria', 'pau').
no

Altres llenguatges de programació lògica

modifica

Referències

modifica
  1. Colmerauer, Alain y Roussel, Philippe. La naissance de Prolog, juliol de 1992
  2. BERGIN, Thomas J.; GIBSON, Richard G. History of Programming Languages II. Nova York: ACM Press, Addison Wesley, 1996. ISBN ISBN 0-201-89502-1. 
  3. Kowalski, R. A. The early years of logic programming. 
  4. ABC. «El lenguaje Prolog», 12-10-1986.
  5. Rach-Hidin, Wendy B. Aplicaciones de la Inteligencia Artificial en la Actividad Empresarial, la Ciencia y la Industria, pàg. 644 i següents.

Enllaços externs

modifica