How to: Unification
Note: This is a work in progress. When it is complete these notes will be removed.
Note: Do not reply to this topic, questions, concerns, comments, etc. are to handled in
Wiki Discussion: How to - Unification
Note: This is just to get the topic started and hopefully others to jump in and make this useful. Even if you are brand new to Prolog, this is such a basic and fundamental concept that you can and should join in to help improve the value of this Wiki. Join the discussion at Wiki Discussion: How to - Unification
Note: This is a wiki and if you have Trust level: Basic you can edit this by clicking on the pencil icon in the lower right.
These topics also have history so they can be rolled-back if needed.
While there are ways of unifying, e.g. e-unification, this is only going to talk about syntactic unification as used in Prolog.
For unification of syntax there is basically only three things to be aware of
- Values
- Variables
- Structures that have a name as a value and are made up of values, variables and structures.
A value is a constant that will not change.
A variable can change but only once, hence the words unbound and bound as opposed to assigned.
A structure will have name called a functor and one or more arguments. While some things may not seem like structures such as list, [a,b,c] they really are in concept. See write_canonical/1
Unification Examples
Based on Wikipedia
| Symbols | |
|---|---|
| Variables | Constants |
| In Prolog: Start with upper case letter | In Prolog: Start with lower case letter |
| X Y Z | a b f g |
| Ξ Ξ¦ Ξ© | Ο Ξ» Ξ΅ |
| β β β | β β β |
| Rectangles | Ovals |
| a = a | Ο = Ο | β = β |
|
Unify: true MGU: {} |
Unify: true MGU: {} |
Unify: true MGU: {} |
|
SWI-Prolog: ?- =(a,a). true. |
SWI-Prolog: ?- =(Ο,Ο). true. |
SWI-Prolog: ?- =(β,β). true. |



| a = b | Ο = Ξ» | β = β |
| Unify: false | Unify: false | Unify: false |
|
SWI-Prolog: ?- =(a,b). false. |
SWI-Prolog: ?- =(Ο,Ξ»). false. |
SWI-Prolog: ?- =(β,β). false. |



| X = X | Ξ = Ξ | β = β |
|
Unify: true MGU: {} |
Unify: true MGU: {} |
Unify: true MGU: {} |
|
SWI-Prolog: ?- =(X,X). true. |
SWI-Prolog: ?- =(Ξ,Ξ). true. |
SWI-Prolog: ?- =(β,β). true. |



| a = X | Ο = Ξ | β = β |
|
Unify: true MGU: { X β¦ a } |
Unify: true MGU: { Ξ β¦ Ο } |
Unify: true MGU: { β β¦ β } |
|
SWI-Prolog: ?- =(a,X). X = a. |
SWI-Prolog: ?- =(Ο,Ξ). Ξ = Ο. |
SWI-Prolog: ?- =(β,β). β = β. |



| X = Y | Ξ = Ξ¦ | β = β |
|
Unify: true MGU: { X β¦ Y } |
Unify: true MGU: { Ξ β¦ Ξ¦ } |
Unify: true MGU: { β β¦ β } |
|
SWI-Prolog: ?- =(X,Y). X = Y. |
SWI-Prolog: ?- =(Ξ,Ξ¦). Ξ = Ξ¦. |
SWI-Prolog: ?- =(β,β). β = β. |



| f(a,X) = f(a,b) | Ξ»(Ο,Ξ¦) = Ξ»(Ο,Ξ΅) | β(β,β) = β(β,β) |
|
Unify: true MGU: { X β¦ b } |
Unify: true MGU: { Ξ¦ β¦ Ξ΅ } |
Unify: true MGU: { β β¦ β } |
|
SWI-Prolog: ?- =(f(a,X),f(a,b)). X = b. |
SWI-Prolog: ?- =(Ξ»(Ο,Ξ¦),Ξ»(Ο,Ξ΅)). Ξ¦ = Ξ΅. |
SWI-Prolog: ?- =(β(β,β),β(β,β)). β = β. |



| f(a) = g(a) | Ξ΅(Ξ») = Ο(Ξ») | β(β) = β(β) |
| Unify: false | Unify: false | Unify: false |
|
SWI-Prolog: ?- =(f(a),g(a)). false. |
SWI-Prolog: ?- =(Ξ΅(Ξ»),Ο(Ξ»)). false. |
SWI-Prolog: ?- =(β(β),β(β)). false. |



| f(X) = f(Y) | Ο(Ξ©) = Ο(Ξ) | β(β) = β(β) |
|
Unify: true MGU: { X β¦ Y } |
Unify: true MGU: { Ξ© β¦ Ξ } |
Unify: true MGU: { β β¦ β } |
|
SWI-Prolog: ?- =(f(X),f(Y)). X = Y. |
SWI-Prolog: ?- =(Ο(Ξ©),Ο(Ξ)). Ξ© = Ξ. |
SWI-Prolog: ?- =(β(β),β(β)). β = β. |



| f(X) = g(Y) | Ξ΅(Ξ©) = Ο(Ξ¦) | β(β) = β(β) |
| Unify: false | Unify: false | Unify: false |
|
SWI-Prolog: ?- =(f(X),g(Y)). false. |
SWI-Prolog: ?- =(Ξ΅(Ξ©),Ο(Ξ¦)). false. |
SWI-Prolog: ?- =(β(β),β(β)). false. |



| f(X) = f(Y,Z) | Ξ»(Ξ©) = Ξ»(Ξ¦,Ξ) | β(β) = β(β,β) |
| Unify: false | Unify: false | Unify: false |
|
SWI-Prolog: ?- =(f(X),f(Y,Z)). false. |
SWI-Prolog: ?- =(Ξ»(Ξ©),Ξ»(Ξ¦,Ξ)). false. |
SWI-Prolog: ?- =(β(β),β(β,β)). false. |



| f(g(X)) = f(Y) | Ο(Ξ»(Ξ¦)) = Ο(Ξ) | β(β(β)) = β(β) |
|
Unify: true MGU: { Y β¦ g(X) } |
Unify: true MGU: { Ξ β¦ Ξ»(Ξ¦) } |
Unify: true MGU: { β β¦ β(β) } |
|
SWI-Prolog: ?- =(f(g(X)),f(Y)). Y = g(X). |
SWI-Prolog: ?- =(Ο(Ξ»(Ξ¦)),Ο(Ξ)). Ξ = Ξ»(Ξ¦). |
SWI-Prolog: ?- =(β(β(β)),β(β)). β = β(β). |



| f(g(X),X) = f(Y,a) | Ξ΅(Ξ»(Ξ¦),Ξ¦) = Ξ΅(Ξ,Ο) | β(β(β),β) = β(β,β) |
|
Unify: true MGU: { X β¦ a, Y β¦ g(a) } |
Unify: true MGU: { Ξ¦ β¦ Ο, Ξ β¦ Ξ»(Ο) } |
Unify: true MGU: { β β¦ β, β β¦ β(β) } |
|
SWI-Prolog: ?- =(f(g(X),X),f(Y,a)). X = a, Y = g(a). |
SWI-Prolog: ?- =(Ξ΅(Ξ»(Ξ¦),Ξ¦),Ξ΅(Ξ,Ο)). Ξ¦ = Ο, Ξ = Ξ»(Ο). |
SWI-Prolog: ?- =(β(β(β),β),β(β,β)). β = β, β = β(β). |



| X = f(X) | Ξ¦ = Ο(Ξ¦) | β = β(β) |
|
Unify: false Occurs check: fails |
Unify: false Occurs check: fails |
Unify: false Occurs check: fails |
|
SWI-Prolog: ?- =(X,f(X)). X = f(X). |
SWI-Prolog: ?- =(Ξ¦,Ο(Ξ¦)). Ξ¦ = Ο(Ξ¦). |
SWI-Prolog: ?- =(β,β(β)). β = β(β). |
|
SWI-Prolog: ?- unify_with_occurs_check(X,f(Y,X)) false. |
SWI-Prolog: ?- unify_with_occurs_check(Ξ¦,Ο(Ξ¦)). false. |
SWI-Prolog: ?- unify_with_occurs_check(β,β(β)). false. |



|
X = Y, Y = a |
Ξ© = Ξ, Ξ = Ξ΅ |
β = β, β = β |
|
Unify: true MGU: { Y β¦ a, X β¦ a } |
Unify: true MGU: { Ξ β¦ Ξ΅, Ξ© β¦ Ξ΅ } |
Unify: true MGU: { β β¦ β, β β¦ β } |
|
SWI-Prolog: ?- X=Y,Y=a. X = Y, Y = a. or ?- =(X,Y),=(Y,a). X = Y, Y = a. |
SWI-Prolog: ?- Ξ©=Ξ,Ξ=Ξ΅. Ξ© = Ξ, Ξ = Ξ΅. or ?- =(Ξ©,Ξ),=(Ξ,Ξ΅). Ξ© = Ξ, Ξ = Ξ΅. |
SWI-Prolog: ?- β=β,β=β. β = β, β = β. or ?- =(β,β),=(β,β). β = β, β = β. |



| a = Y, X = Y |
Ξ» = Ξ¦, Ξ = Ξ¦ |
β = β, β = β |
|
Unify: true MGU: { Y β¦ a, X β¦ a } |
Unify: true MGU: { Ξ¦ β¦ Ξ», Ξ β¦ Ξ» } |
Unify: true MGU: { β β¦ β, β β¦ β } |
|
SWI-Prolog: ?- a=Y,X=Y. Y = X, X = a. or ?- =(a,Y),=(X,Y). Y = X, X = a. |
SWI-Prolog: ?- Ξ»=Ξ¦,Ξ=Ξ¦. Ξ¦ = Ξ, Ξ = Ξ». or ?- =(Ξ»,Ξ¦),=(Ξ,Ξ¦). Ξ¦ = Ξ, Ξ = Ξ». |
SWI-Prolog: ?- β=β,β=β. β = β, β = β. or ?- =(β,β),=(β,β). β = β, β = β. |



| X = a, b = X |
Ξ = Ξ», Ξ΅ = Ξ |
β = β, β = β |
| Unify: false | Unify: false | Unify: false |
|
SWI-Prolog: ?- X=a,b=X. false. or ?- =(X,a),=(b,X). false. |
SWI-Prolog: ?- Ξ=Ξ»,Ξ΅=Ξ. false. or ?- =(Ξ,Ξ»),=(Ξ΅,Ξ). false. |
SWI-Prolog: ?- β=β,β=β. false. or ?- =(β,β),=(β,β). false. |



For a visual representation that shows the unification/substitutions durning the executation of simple Prolog programs see: Prolog Visualizer