Soutenez-nous

Le langage Prolog


précédentsommairesuivant

2. Les bases du langage

Cette section vous permet d'acquérir les bases du langage, nécessaires pour comprendre la section suivante (la programmation).

Les commentaires

Les commentaires en Prolog se présentent sous deux formes :

  • les commentaires multilignes, comme en C, compris entre /* et */
 
Sélectionnez
/* Ceci est un commentaire sur
   plusieurs lignes */
  • les commentaires sur une seule ligne, introduits par le symbole %
 
Sélectionnez
% Un commentaire en fin de ligne

Les variables

En Prolog, les variables sont représentées par un identificateur commençant par une lettre majuscule (exemple: X, Machin, Liste, ...).

Tant qu'on n'affecte pas de valeur à une variable, on parle de « variable libre ». Une fois qu'une valeur est affectée, on parle de « variable liée ». On affecte une valeur une variable par ce que l'on appelle le principe d'« unification ».

En Prolog, une fois qu'une valeur est affectée à une variable, on ne peut plus en changer (sauf dans le cas des mutables, mais nous n'en parlerons pas ici). Pour effectuer de nouvelles opérations, il faut déclarer une nouvelle variable et lui affecter une nouvelle valeur.

Constantes et atomes

Une constante commence toujours par une lettre minuscule (ex: jean, belfort, celibataire...). Il est également possible de définir des chaînes de caractères en les entourant de guillemets simples (ex: 'Le lièvre et la tortue', 'Le Seigneur des Anneaux'...). Constantes et chaînes constituent des atomes.

Prédicats

En Prolog, on ne parle pas de fonction, mais de « prédicat ». Un prédicat s'organise en « clauses ».

Une clause ne retourne pas de valeur: soit elle s'exécute, soit elle échoue. On affecte les valeurs des variables passées en paramètres par « unification ». Par convention, les variables en entrée sont placées à gauche et les variables en sortie sont placées à droite, mais l'unification peut se faire dans les deux sens.

Voici un exemple de prédicat (1 clause):

 
Sélectionnez
habite(jean, belfort).

Cette clause exprime la phrase « Jean habite à Belfort ».

L'opération:

Execution
Sélectionnez
| ?- habite(jean, Ville).

nous renvoie:

 
Sélectionnez
Ville = belfort ?



Inversement, l'opération:

Execution
Sélectionnez
| ?- habite(Personne, belfort).

nous renvoie:

 
Sélectionnez
Personne = jean ?



Comme vous avez pu le remarquer, l'unification peut se faire dans les 2 sens. Après exécution d'une clause (réussie ou non), Prolog revient dans l'état précédent l'exécution de la clause et évalue la clause suivante, si elle existe (mécanisme de « backtracking », ou « retour sur trace » en Français). Ce méchanisme permet l'énumération de solutions. Exemple (5 clauses):

 
Sélectionnez
habite(jean, belfort).
habite(lucie, paris).
habite(christian, toulouse).
habite(adeline, paris).
habite(nicolas, paris).

L'opération:

Execution
Sélectionnez
| ?-  habite(Qui, paris).

Retourne:

 
Sélectionnez
Qui = lucie ? ;
Qui = adeline ? ;
Qui = nicolas ? ;
 
No

(il faut appuyer sur la touche ';' pour passer d'une solution à l'autre)



Maintenant, on force l'échec de la clause habite(adeline, paris). par l'utilisation du mot-clef fail. :

 
Sélectionnez
habite(jean, belfort).
habite(lucie, paris).
habite(christian, toulouse).
habite(adeline, paris) :- fail.
habite(nicolas, paris).

L'opération:

Execution
Sélectionnez
| ?-  habite(Qui, paris).

Retourne:

 
Sélectionnez
Qui = lucie ? ;
Qui = nicolas ? ;
 
No



Une clause est généralement composée de plusieurs buts, séparées par des virgules (qui constituent ce que l'on appelle le « corps » de la clause) :

 
Sélectionnez
memeVille(X, Y) :-
  habite(X, VilleX),
  habite(Y, VilleY),
  X \= Y,
  VilleX == VilleY.

Si l'un des buts échoue, la clause échoue et les buts suivants ne sont pas évalués. Si l'exécution se fait jusqu'au bout, la clause réussit et le prédicat renvoie une solution (par unification).



Un prédicat est identifié à la fois par son nom et par le nombre de ses arguments. Ainsi, le prédicat predicat/2 (2 arguments) est fondamentalement différent du prédicat predicat/3 (3 arguments). Le nombre d'arguments s'appelle l'« arité ».

Anatomie d'un prédicat Prolog

Le diagramme suivant résume ce qui a été dit précédemment :

Image non disponible



Voici un récapitulatif des définitions importantes :

  • Un prédicat est caractérisé par son nom et son arité, représenté par la notation prédicat/arité
  • L'arité est le nombre de paramètres que compte un prédicat
  • Un prédicat est généralement composé d'une tête et d'un corps
  • La tête est l'ensemble des paramètres du prédicat
  • Le corps est composé de buts
  • Les buts sont le plus souvent séparés par des virgules (opérateur de conjonction entre les buts)



Bon à savoir:

Dans la documentation Prolog :
- les paramètres en entrée sont précédés d'un +
- les paramètres en sortie sont précédés d'un -
- les paramètres qui peuvent être soit en entrée, soit en sortie (suivant le sens de l'unification) sont précédées d'un ?

Unification

L'unification peut se faire de plusieurs manières:

  • à l'aide de l'opérateur =
 
Sélectionnez
habite(jean, Lieu) :- Lieu = belfort.
  • au niveau des noms de variables (peut poser problème avec les variables libres, nous y reviendrons plus tard) :
 
Sélectionnez
memeVille(X, Y) :-
  habite(X, VilleX),
  habite(Y, VilleX),
  X \= Y.

Arithmétique

L'opérateur = sert exclusivement à l'unification. Pour effectuer des opérations arithmétiques, il faut utiliser l'opérateur is. Les variables à droite du is doivent avoir été unifiées.

 
Sélectionnez
N1 is N - 1.

Les principaux opérateurs arithmétiques sont listés en fin de didacticiel.

Listes

En Prolog, on ne connait que deux choses d'une liste:

  • son premier élément (la tête, ou head)
  • le reste de la liste (la queue, ou tail)

Le parcours d'une liste se fait de manière récursive sur la queue.

La liste vide se note: [].

Une liste constituée d'au moins un élément se note [T|Q]. Ici, T représente la tête et Q représente la queue. C'est aussi grâce à [T|Q] que l'on ajoute un élément en début de liste (par unification).

Les tuples

En Prolog, il est possible d'utiliser des tuples. Un tuple est un ensemble de champs, réunis dans une seule variable. On construit un tuple de cette manière:

 
Sélectionnez
Jean = (jean, 25, belfort, celibataire).


Les tuples sont donc pratiques pour organiser ses données en structures, que l'on peut alors facilement passer en paramètre à un prédicat:

 
Sélectionnez
retourneAge( (_, Age, _, _), Age ).

Le caractère _

Lorsque, dans le corps d'une clause, on n'a pas besoin de faire référence à l'un des paramètres, on remplace celui-ci par le caractère _ .

De même, si dans une liste ou un tuple on n'a pas besoin de faire référence à l'un des éléments, on remplace celui-ci par le caractère _ .

Ce mécanisme est extrêmement intéressant car il nous évite d'introduire des variables qui ne seront pas unifiées. En effet, l'interprêteur/compilateur Prolog signalera par des warning toute variable du programme qui ne sera pas unifiée. De tels messages d'avertissements sont généralement le signe annonciateur d'erreurs dans le programme (faute de frappe, erreur de copier/coller), il est donc important de faire attention à de tels messages.

Si toutefois vous désirez préciser que la variable ne sera pas unifiée tout en donnant le nom du paramètre auquel elle correspond, il suffit de concatener ce nom au caractère _ (ex: _Liste, _Ville, etc.).

Le coupe-choix, ou Cut (« ! »)

Le coupe-choix est un mécanisme fondammental de la programmation en Prolog. Il permet, lors de l'évaluation d'une clause, d'indiquer que l'on ne souhaite pas évaluer les autres clauses pour ne garder que la clause courante. Vous comprendrez l'intérêt du Cut, et apprendrez à l'utiliser correctement dans la section suivante.




Bravo, à ce stade vous maîtrisez toutes les bases qui feront de vous un programmeur Prolog !





précédentsommairesuivant

  

Copyright © 2006 pcaboche. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.