Prolog

De Viquipèdia
Dreceres ràpides: navegació, cerca

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

Es tracta d'un llenguatge de programació ideat a principis dels anys 70 a la universitat d'Ais-Marsella pels professors Alain Colmerauer i Phillipe Roussel. Inicialment es tractava d'un llenguatge totalment interpretat fins que, a mitjans dels 70, 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 de llavors, Prolog és un llenguatge semi-interpretat.

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. Aìxò é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 es 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 | modifica el codi]

%%
%% 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

Enllaços externs[modifica | modifica el codi]

Altres llenguatges de programació lògica[modifica | modifica el codi]