Recent Articles



































Prolog



         


Prolog is a logical programming language. The name Prolog is taken from programmation en logique ("logic programming"). It was created by Alain Colmerauer around 1972. It was an attempt to make a programming language that enabled the expression of logic instead of carefully specified instructions on the computer.

Prolog is used in many artificial intelligence programs and in computational linguistics (especially natural language processing). Its syntax and semantics are considered very simple and clear. (The original goal was to provide a tool for computer-illiterate linguists.) A lot of the research leading up to modern implementations of prolog came from spin-off effects caused by the fifth generation computer systems project (FGCS) which chose to use a variant of Prolog named Kernel Language for their operating system.

Prolog is based on predicate calculus (more precisely first-order predicate calculus); however it is restricted to allow only Horn clauses. Execution of a Prolog program is effectively an application of theorem proving by first-order resolution. Fundamental concepts are unification, tail recursion, and backtracking.

[Top]

Data types

Prolog does not employ data types in the way usual in the common programming languages. We may rather speak about Prolog lexical elements instead of data types.

[Top]

Atoms

The text constants are introduced by means of atoms. An atom is a sequence consisting of letters, numbers and underscores, which begins with a lower-case letter. Usually, if non-alphanumeric atom is needed, it is surrounded with apostrophes (e.g. '+' is an atom, + is an operator).

[Top]

Numbers

Most Prolog implementations don't distinguish integers from real numbers.

[Top]

Variables

Variables are denoted by a string consisting of letters, numbers and underscore characters, and beginning with an upper-case letter. In the Prolog environment, a variable is not a container, which can be assigned to (unlike procedural programming languages). Its behaviour is closer to a pattern, which is increasingly specified by unification.

The so called anonymous variable is written as a single underscore (_).

[Top]

Terms

Terms are the only way Prolog can represent complex data. A term consists of a head, also called functor (which must be an atom) and parameters (unrestricted types). The number of parameters, so called arity of term, is significiant. A term is identified by its head and arity, usually written as functor/arity.

[Top]

Lists

A list isn't a standalone data type, because it is defined by a recursive construction (using term '.'/2):

  1. atom [] is an empty list
  2. if T is a list and H is an element, then the term '.'(H, T) is a list.

The first element, called the head, is H, which is followed by the contents of the rest of the list, designated T or tail. The list [1, 2, 3] would be represented internally as '.'(1, '.'(2 , 3 )) A syntactic shortcut is [H | T], which is mostly used to construct rules. The entirety of a list can be processed by processing the first element, and then the rest of the list, in a recursive manner.

For programmer's convenience, the lists can be constructed and deconstructed in a variety of ways.

[Top]

Strings

Strings are usually written as a sequence of characters surrounded by quotes. They are often internally represented as lists of ASCII codes.


[Top]

Facts

Programming in Prolog is very different from programming in a procedural language. In Prolog you supply a database of facts and rules; you can then perform queries on the database. The basic unit of Prolog is the predicate, which is defined to be true. A predicate consists of a head and a number of arguments. For example:

cat(tom).

Here 'cat' is the head, and 'tom' is the argument. Here are some sample queries you could ask a Prolog interpreter basing on this fact:

?- cat(tom). yes.
?- cat(X). X = tom; no.

Predicates are usually defined to express some fact the program knows about the world. In most of the cases, the usage of predicates requires a certain convention. Thus, which version of the two below would signify that Pat is the father of Sally?

father(sally,pat). father(pat,sally).

In both cases 'father' is the head and 'sally' and 'pat' are arguments. However in the first case, Sally comes first in the argument list, and in the second, Pat comes first (the order in the argument list matters). The first case is an example of a definition in Verb Subject Object order, and the second of Verb Object Subject order. Since Prolog does not understand English, both versions are fine so far as it is concerned; however it is good programming style to stick to either convention during the writing of a single program, so that to avoid writing something like

father(pat,sally). father(jessica,james).

Some predicates are built in into the language, and allow a Prolog program to perform routine activities (such as input/output, using graphics and otherwise communicating with the operating system). For example, the predicate write can be used for output to the screen. Thus,

write('Hello')

will display the word 'Hello' on the screen.

[Top]

Rules

The second type of statements in Prolog is rules. An example of a rule is

light(on) :- switch(on).

The ":-" means "if"; this rule means light(on) is true if switch(on) is true. Rules can also make use of variables; variables begin with capital letters while constants begin with lower case letters. For example,

father(X,Y) :- parent(X,Y),male(X).

This means "if someone is a parent of someone and he's male, he is a father". The ancedent and consequent are in reverse order to that normally found in logic. It is possible to place multiple predicates in a consequent, joined with conjunction, for example:

a,b,c :- d.

which is simply equivalent to three separate rules:

a :- d. b :- d. c :- d.

What is not allowed are rules like:

a;b :- c.

that is "if c then a or b". This is because of the restriction to Horn clauses.

[Top]

Evaluation

When the interpreter is given a query, it tries to find facts that match the query. If no outright facts are available, it attempts to satisfy all rules that have the fact as a conclusion. For example given the prolog code

sibling(X,Y) :- parent(Z,X), parent(Z,Y). father(X,Y) :- parent(X,Y), male(X). mother(X,Y) :- parent(X,Y), female(X). parent(X,Y) :- father(X,Y). parent(X,Y) :- mother(X,Y). mother(trude, sally). father(tom, sally). father(tom, erica). father(mike, tom). male(tom). female(trude). male(mike).

This results in the following query being evaluated as true:

?- sibling(sally, erica) yes.

The interpreter arrives at this result at matching the rule sibling(X, Y) by binding (colloquially; substituting) sally to X and erica to Y. This means the query can be expanded to parent(Z,sally), parent(Z,erica). Matching this conjunction is done by looking at all possible parents of sally. However, parent(trude,sally) doesn't lead to a viable solution, because if 'trude' is substituted for Z, parent(trude,erica) would have to be true, and no such fact (or any rule that can satisfy this) is present. So instead, tom is substituted for Z, and erica and sally turn out to be siblings none the less.

The code

mother(X,Y) :- parent(X,Y), female(X). parent(X,Y) :- father(X,Y).

Might seem suspicious. After all, not every parent is a father. But it is true that any father is a parent. On the other hand, someone is only someone's mother if she is both that person's parent and female.

To infer that all fathers are male, you'd need to code

male(X) :- father(X,_).

which simply doesn't care whoever the child is (the underscore is an anonymous variable).

[Top]

Negation

Typically, a query is evaluated to false by merit of not finding any positive rules or facts that support the statement. This is called the Borland, now unsupported

[Top]

Extensions

[Top]

References







  View Live Article   This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License