| Liste Articles: [0-A] [A-C] [C-F] [F-J] [J-M] [M-P] [P-S] [S-Z] | Liste Catégories | Une page au hasard | Pages liées | ||||||
Le concept d'unification est une notion centrale de la logique des prédicats ainsi que d'autres systèmes de logique et est sans doute ce qui distingue le plus prolog des
autres langage de programmation.
L'unification de deux termes et consiste à trouver (quand il en existe) un troisième terme tel qu'on puisse passer de à et à en instanciant certaines variables. est alors appelé un unificateur de et . Intuitivement, l'unification est le fait d'attribuer une valeur à certaines variables de et et peut être regardé comme un genre d'assignation qui ne pourrait s'effectuer qu'une seule fois. Lorsqu'on résout une équation algébrique, une inconnue peut avoir une, plusieurs ou aucune solutions, mais sa valeur ne change pas durant les opérations; c'est pareil pour l'unification. En fait on peut voir la résolution d'une équation comme un cas particulier d'unification.
En prolog, cette opération est dénotée par symbole « = ». Les règles de l'unification sont les suivantes:
En raison de sa nature déclarative, l'ordre dans suite d'unifications ne joue (habituellement) aucun rôle.
Lorsqu'on raisonne en logique du premier ordre, où les variables ne peuvent être unifiées qu'à des constantes, les choses se passent bien: savoir si deux termes et sont unifiables est décidable (grâce par exemple à l'algorithme ci-dessus). De plus, s'ils le sont, il existe un unificateur le plus général (most general unifier ou mgu en anglais), c'est-à-dire un terme tel que tous les autres unificateurs de et soient dérivables par instantiation de variables de .
Cette situation idéale ne se retrouve hélas pas dans tous les systèmes logiques. En particulier, si on se place en logique d'ordre supérieur, c'est-à-dire qu'on s'autorise à utiliser des variables comme symboles de fonction ou comme prédicats, on perd la décidabilité et l'unicité de l'unificateur quand il existe. Au pire, deux termes peuvent même avoir une infinité d'unificateurs tous différents.
On supposera que toute les variables (en majuscules) sont non-instanciées.
A = A
A = B, B = abc
xyz = C, C = D
abc = abc
abc = xyz
f(A) = f(B)
f(A) = g(B)
f(A) = f(B, C)
f(g(A)) = f(B)
f(g(A), A) = f(B, xyz)
A = f(A)
A = abc, xyz = X, A = X


