6.3 Variables

What is a variable?

A variable is a piece of the computer's memory which can hold a value, and which we have given a name.

For example, the variable L might have the value Romeo, which is an atom.

The variable G1 might have the value [Cat]-ON->[Mat], which is a CG.

These are just examples.

Bound and free variables

A variable's value can change as the program runs. This is known as binding the variable to different values.

A variable that is bound is a variable that has a value.

A variable is is free is a variable that does not have a value.

Variable syntax

Variables have to follow a number of rules.


A variable:

  • Must consist of letters, underscores, or digits,
  • Must start with a letter or an underscore,
  • Must not start with two letters.

Examples of variables

So for example, the following are all variables:

  • A
  • G
  • _c3p0
  • _my_CG


The following are not variables:

  • AB (because the first two are letters)
  • ABC (because the first two are letters)
  • graph1 (because the first two are letters)
  • A.C (because it does not consist solely of letters, underscores, or digits)
  • 3PO (because it does not start with a letter or an underscore)

Thus variables have a specific syntax, which follows three simple rules.

Writing CGs

When writing CGs, you can use variables as almost any part of a CG. This includes:


We have already seen many examples of variables being used in writing CGs.

Here is one more:

// Type hierarchy
Entity > Animal, Act.
Animal > Cat, Dog.

// Catalog of instances
Act = Talk, Bark, Kick.
Cat = Garfield.
Dog = Odie.

// "A cat is talking to itself."
// Note how the same variable, "C" is used as the referent of
// both Cat concepts.  This means that they are coreferents.
gr(graph1, [Cat: C]<-AGNT-[Act: Talk]-RCPT->[Cat: C]).

// "Odie is barking at Garfield".
gr(graph2, [Dog: Odie]<-AGNT-[Act: Bark]-RCPT->[Cat: Garfield]).

// "Garfield is kicking Odie"
gr(graph3, [Cat: Garfield]<-AGNT-[Act: Kick]-PTNT->[Dog: Odie]).

// Rule: Animal A1 acts on Animal A2 with relation R
acts_on(A1, R, A2, L) :- gr(L, G), subsume([Animal: A1]<-AGNT-[Act]-R->[Animal: A2], G).


If we now ask the following query:

?- acts_on(Garfield, PTNT, Odie, L).

we get the following answer:

{L = graph3}

This is because in graph3, Garfield acts on Odie with the relation PTNT.

Similarly, if we ask the following query:

?- acts_on(Odie, RCPT, Garfield, L).

we get the following answer:

{L = graph2}

This is because in graph2, Odie acts on Garfield with the relation RCPT.


Thus variables are pieces of the computer's memory which can hold values, and which we have given a name.

Variables can be free or bound. A free variable does not have a value, whereas a bound variable does.

Variables must follow three simply syntax rules, or they are not variables.

You can use variables to represent almost any part of a CG.

PrevLite: 6.2 Structures, relationships and terms
NextLite: 6.4 Facts

Prev: 6.2 Structures, relationships and terms
Up: 6 Prolog for CG users
Next: 6.4 Facts