Variables and Unification

How do we say something like "What does Fred eat"? Suppose we had the following fact in our database:


eats(fred,mangoes).

How do we ask what fred eats. We could type in something like


?- eats(fred,what).

However Prolog will say no. The reason for this is that what does not match with mangoes. In order to match arguments in this way we must use a Variable. The process of matching items with variables is known as unification. Variables are distinguished by starting with a capital letter. Here are some examples:


X         /* a capital letter */

VaRiAbLe /* a word - it be made up or either case of letters */

My_name /* we can link words together via '_' (underscore) */

Thus returning to our first question we can find out what fred eats by typing


?- eats(fred,What).

What=mangoes

yes

As a result of this query, the variable What has matched (or unified) with mangoes. We say that the variable What now has the binding mangoes. When we pose a query, if the query is successful, Prolog prints both the variable and the variable name, as we see above.

Variable Examples 1

Let's consider some examples using facts. First consider the following database.


loves(john,mary).

loves(fred,hobbies).

Now let's look at some simple queries using variables


?- loves(john,Who).      /* Who does john love? */

Who=mary /* yes , Who gets bound to mary */

yes /* and the query succeeds*/

?- loves(arnold,Who) /* does arnold love anybody */

no /* no, arnold doesn't match john or fred */

?- loves(fred,Who). /* Who does fred love */

Who = hobbies /* Note the to Prolog Who is just the name of a variable, it */

yes /* semantic connotations are not picked up, hence Who unifies */

/* with hobbies */

Variable Examples 2

Here are some more difficult object/variable comparisons. Consider the following database showing a library of cassette tapes. Notice the final argument to tape, which is the name of a favourite song from the album.


tape(1,van_morrison,astral_weeks,madam_george).

tape(2,beatles,sgt_pepper,a_day_in_the_life).

tape(3,beatles,abbey_road,something).

tape(4,rolling_stones,sticky_fingers,brown_sugar).

tape(5,eagles,hotel_california,new_kid_in_town).

Let's now look at some queries.


?- tape(5,Artist,Album,Fave_Song).             /* what are the contents of tape 5 */

Artist=eagles

Album=hotel_california

Fave_Song=new_kid_in_town

yes

?- tape(4,rolling_stones,sticky_fingers,Song). /* find just song */

Song=brown_sugar /* which you like best from the album */

yes

Exercise 3 - Variable Exercise

Here are some problems for which unification sometimes succeeds and sometimes fails. The items to be compared are labelled with signs. Indicate the outcome of the proposed match using the yes/no buttons. If you think the unification succeeds, write down any bindings made e.g if (say) X gets bound to foo, then write X=foo as the substitution.


This is the end of the variables and unification topic.


Next Topic

Return to Introduction Menu