3. Unification, arithmétique et comparaison
3.1 Unifier des structures
Unifier deux termes consiste à trouver une substitution qui les rend identiques. Une variable déjà liée doit rester compatible avec sa liaison; = ne la réaffecte pas. Une liaison d’une même variable se propage à toutes ses occurrences dans le but courant.
Code (prolog) · sélectionner pour copier
?- homme(X) = homme(socrate).
X = socrate.
?- a(X,p(X),q(Y)) = a(2,Z,q(3)).
X = 2, Z = p(2), Y = 3.
?- p(X) = p(a,b).
false.
Dans le deuxième exemple, X=2 impose aussi le 2 de p(2). Le troisième échoue car p/1 et p/2 sont des prédicats distincts. Il faut vérifier la structure entière et les contraintes répétées, pas seulement faire correspondre des positions isolées.
Dans les exemples imprimés, ?- marque une requête. Dans le champ Swish, cette invite est déjà affichée : on saisit le but avec son point final, comme l’a confirmé l’enseignante sur le forum. Le point fait partie de la syntaxe. Pour les exercices d’unification, la vidéo conseille de prévoir le résultat sur papier puis de le tester dans Swish.
3.2 Évaluer avec is/2
Les quatre requêtes suivantes sont indépendantes, avec des variables fraîches :
Code (prolog) · sélectionner pour copier
?- A = p(a,b). % A est lié au terme p(a,b)
?- B = 1+1. % B est lié au terme 1+1
?- A = a+b. % A est lié au terme a+b
?- B is 1+1. % B = 2
L’unification ne déclenche aucun calcul de 1+1 ni de a+b. is/2 évalue l’expression de droite puis unifie son résultat à gauche. La notation is(B,1+1) est une autre écriture du même prédicat que B is 1+1.
Code (prolog) · sélectionner pour copier
?- A = 2, B is 5+8*A.
A = 2, B = 21.
?- B is 2+A, A = 2.
% Erreur d’instanciation : A est encore libre au moment du calcul.
Les variables n’ont pas de valeur numérique par défaut. Une erreur d’évaluation se distingue d’une preuve qui échoue et renvoie false. Cette dépendance explique l’ordre des buts de longueur/2 et de nb_occ/3 : obtenir le compte de la queue avant de lui ajouter 1.
3.3 Trois familles de comparaison
| Famille | Positif | Négatif | Ce qui est testé |
|---|---|---|---|
| Unification | = |
\= |
Les termes peuvent-ils être rendus identiques? Le positif peut lier des variables. |
| Identité | == |
\== |
Les termes sont-ils déjà identiques, sans nouvelle liaison? |
| Égalité arithmétique | =:= |
=\= |
Les valeurs calculées sont-elles égales? Les expressions doivent être évaluables. |
Tous les cas du tableau du diaporama sont repris ci-dessous. Chaque cellule est une requête indépendante; les variables A et B y sont fraîches, et distinctes quand leurs noms diffèrent.
| Deux termes comparés | = |
\= |
== |
\== |
=:= |
=\= |
|---|---|---|---|---|---|---|
1 et 1 |
vrai | faux | vrai | faux | vrai | faux |
1 et 2 |
faux | vrai | faux | vrai | faux | vrai |
1+1 et 2 |
faux | vrai | faux | vrai | vrai | faux |
a et a |
vrai | faux | vrai | faux | erreur | erreur |
a et b |
faux | vrai | faux | vrai | erreur | erreur |
A et A, même variable libre |
vrai | faux | vrai | faux | erreur | erreur |
A et B, variables libres distinctes |
liaison A=B |
faux | faux | vrai | erreur | erreur |
1+1 est une structure syntaxique différente de 2, tout en ayant la même valeur arithmétique. Deux variables libres peuvent s’unifier sans être identiques avant cette opération. \= teste la non-unifiabilité actuelle : X \= a échoue si X est libre, car l’unification avec a reste possible; ce test ne dépose pas une contrainte de différence pour plus tard.
Les atomes a et b ne sont pas des expressions arithmétiques, et une variable libre n’est pas encore une valeur calculable. L’enseignante insiste surtout sur l’unification et relativise le poids de certaines confusions d’opérateurs dans la correction, sans barème chiffré. La vidéo n’exige pas d’utiliser tous ces opérateurs; le tableau sert à comprendre leurs différences de comportement.