0% found this document useful (0 votes)
96 views

Brief Introduction To Prolog: CSC384: Intro To Artificial Intelligence

This document provides an introduction to Prolog syntax and concepts including: - Terms can be constants, variables, or structures - A Prolog program consists of facts and rules - Facts are predicates terminated by a period, rules use ":-" to relate a head to body - Queries are proved using facts and rules through matching and backtracking - Variables allow more flexible matching and computing multiple answers to queries

Uploaded by

wityamit
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
96 views

Brief Introduction To Prolog: CSC384: Intro To Artificial Intelligence

This document provides an introduction to Prolog syntax and concepts including: - Terms can be constants, variables, or structures - A Prolog program consists of facts and rules - Facts are predicates terminated by a period, rules use ":-" to relate a head to body - Queries are proved using facts and rules through matching and backtracking - Variables allow more flexible matching and computing multiple answers to queries

Uploaded by

wityamit
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 29

Fahiem Bacchus, University of Toronto

CSC384: Intro to Artificial Intelligence


Brief Introduction to
Prolog
Prolog Programming for Artificial
Intelligence by Ivan Bratko.
Prolog is a language that is useful for doing
symbolic and logic based computation.
Fahiem Bacchus, University of Toronto
Syntax of Prolog
Terms
Predicates
Facts and Rules
Programs
Queries
Fahiem Bacchus, University of Toronto
Syntax of Prolog: Terms
Constants:
Identifiers
sequences of letters, digits, or underscore _ that start with
lower case letters.
mary, anna, x25, x_25, alpha_beta
Numbers
1.001, 2, 3.03
Strings enclosed in single quotes
Mary, 1.01, string
Note can start with upper case letter, or can be a number
now treated as a string.
Variables
Sequence of letters digits or underscore that start with an
upper case letter or the underscore.
_x, Anna, Successor_State,
Undescore by itself is the special anonymous variable.
Fahiem Bacchus, University of Toronto
Syntax of Prolog: Terms
Constants:
Variables
Structures (like function applications)
<identifier>(Term1, ..., Termk)
date(1, may, 1983)
point(X, Y, Z)
Note that the definition is recursive. So each term
can itself be a structure
date(+(0,1), may, +(1900,-(183,100)))
Structures can be represented as a tree
Fahiem Bacchus, University of Toronto
Syntax of Prolog: Terms
Structures as trees
date(+(0,1), may, +(1900,-(183,100)))
date
+
may
+
0 1
1900
+
0 1
Fahiem Bacchus, University of Toronto
Syntax of Prolog: Terms
Structures
Rather than represent the arithmetic term
+(1900,-(183,100))
in this format (prefix form) Prolog will represent it in
more standard infix form
1900 + (183 100)
Note that since Prolog is a symbolic language it will
treat this arithmetic expression as a symbol. That is, it
will not evaluate this expression to 1983.
To force the evaluation we use is
X is 1900 + (183 100).
Fahiem Bacchus, University of Toronto
Syntax of Prolog: Predicates
Predicates are syntactically identical to
structured terms
<identifier>(Term1, ..., Termk)
elephant(mary)
taller_than(john, fred)
Fahiem Bacchus, University of Toronto
Syntax of Prolog: Facts and Rules
A prolog program consists of a collection of facts
and rules.
A fact is a predicate terminated by a period .
<identifier>(Term1, ..., Termk).
Facts make assertions:
elephant(mary). Mary is an elephant.
taller_than(john, fred). J ohn is taller than Fred.
parent(X). Everyone is a parent.
Note that X is a variable. X can take on any term as its value
so this fact asserts that for every value of X, parent is true.
Fahiem Bacchus, University of Toronto
Syntax of Prolog: Facts and Rules
Rules
predicateH:- predicate1, ..., predicatek.
First predicate is RULE HEAD. Terminated by a period.
Rules encode ways of deriving or computing a new fact.
animal(X) :- elephant(X).
We can show that X is an animal if we can show that it is an
elephant.
taller_than(X,Y) :- height(X,H1), height(Y,H2), H1 > H2.
We can show that X is taller than Y if we can show that H1 is the
height of X, and H2 is the height of Y, and H1 is greater than H2.
taller_than(X,J ane) :- height(X,H1), H1 > 165
We can show that X is taller than J ane if we can show that H1 is the
height of X and that H1 is greater than 165
father(X,Y) :- parent(X,Y), male(X).
We can show that X is a father of Y if we can show that X is a parent
of Y and that X is male.
Fahiem Bacchus, University of Toronto
Operation Of Prolog
A query is a sequence of predicates
predicate1, predicate2, ..., predicatek
Prolog tries to prove that this sequence of
predicates is true using the facts and rules in the
Prolog Program.
In proving the sequence it performs the
computation you want.
Fahiem Bacchus, University of Toronto
Example
elephant(fred).
elephant(mary).
elephant(joe).
animal(fred) :- elephant(fred).
animal(mary) :- elephant(mary).
animal(joe) :- elephant(joe).
QUERY
animal(fred), animal(mary), animal(joe)
Fahiem Bacchus, University of Toronto
Operation
Starting with the first predicate P1 of the query
Prolog examines the program from TOP to BOTTOM.
It finds the first RULE HEAD or FACT that matches P1
Then it replaces P1 with the RULE BODY.
If P1 matched a FACT, we can think of FACTs as having
empty bodies (so P1 is simply removed).
The result is a new query.
E.g.
P1 :- Q1, Q2, Q3
QUERY = P1, P2, P3
P1 matches with rule
New QUERY = Q1, Q2, Q3, P2, P3
Fahiem Bacchus, University of Toronto
Example
elephant(fred).
elephant(mary).
elephant(joe).
animal(fred) :- elephant(fred).
animal(mary) :- elephant(mary).
animal(joe) :- elephant(joe).
QUERY
animal(fred), animal(mary), animal(joe)
1. elephant(fred), animal(mary), animal(joe)
2. animal(mary),animal(joe)
3. elephant(mary), animal(joe)
4. animal(joe)
5. elephant(joe)
6. EMPTY QUERY
Fahiem Bacchus, University of Toronto
Operation
If this process reduces the query to the empty
query, Prolog returns yes.
However, during this process each predicate in
the query might match more than one fact or
rule head.
Prolog always choose the first match it finds. Then if
the resulting query reduction did not succeed (i.e.,
we hit a predicate in the query that does not match
any rule head of fact), Prolog backtracks and tries a
new match.
Fahiem Bacchus, University of Toronto
Example
ant_eater(fred).
animal(fred) :- elephant(fred).
animal(fred) :- ant_eater(fred).
QUERY
animal(fred)
1. elephant(fred).
2. FAIL BACKTRACK.
3. ant_eater(fred).
4. EMPTY QUERY
Fahiem Bacchus, University of Toronto
Operation
Backtracking can occur at every stage as the
query is processed.
p(1) :- a(1).
p(1) :- b(1).
a(1) :- c(1).
c(1) :- d(1).
c(1) :- d(2).
b(1) :- e(1).
e(1).
d(3).
Query: p(1)
p(1)
a(1)
c(1)
d(1) d(2)
b(1)
e(1)
Fahiem Bacchus, University of Toronto
Operation
With backtracking we can get more answers by
using ;
p(1) :- a(1).
p(1) :- b(1).
a(1) :- c(1).
c(1) :- d(1).
c(1) :- d(2).
b(1) :- e(1).
b(1) :- d(3).
e(1).
d(3).
Query: p(1)
p(1)
a(1)
c(1)
d(1) d(2)
b(1)
e(1) d(3)
Fahiem Bacchus, University of Toronto
Variables and Matching
Variables allow us to
Compute more than yes/no answers
Compress the program.
elephant(fred).
elephant(mary).
elephant(joe).
animal(fred) :- elephant(fred).
animal(mary) :- elephant(mary).
animal(joe) :- elephant(joe).
The three rules can be replaced by the single rule
animal(X) :- elephant(X).
When matching queries against rule heads (of facts)
variables allow many additional matches.
Fahiem Bacchus, University of Toronto
Example
elephant(fred).
elephant(mary).
elephant(joe).
animal(X) :- elephant(X).
QUERY
animal(fred), animal(mary), animal(joe)
1. X=fred, elephant(X), animal(mary), animal(joe)
2. animal(mary),animal(joe)
3. X = mary, elephant(X), animal(joe)
4. animal(joe)
5. X= joe, elephant(X)
6. EMPTY QUERY
Fahiem Bacchus, University of Toronto
Operation with Variables
Queries are processed as before (via rule and
fact matching and backtracking), but now we
can use variables to help us match rule heads or
facts.
A query predicate matches a rule head or fact
(either one with variables) if
The predicate name much match. So elephant(X)
can match elephant(fred), but can never match
ant_eater(fred).
Once the predicates names the arity of the
predicates much match (number of terms). So
foo(X,Y) can match foo(ann,mary), but cannot
match foo(ann) or foo(ann,mary,fred).
Fahiem Bacchus, University of Toronto
Operation
A query predicate matches a rule head or fact
(either one with variables) if
If the predicate names and aritiesmatch then each
of the k-terms much match. So for foo(t1, t2, t3) to
match foo(s1, s2, s3) we must have that t1 matches
s1, t2 matches s2, and t3 matches t3.
During this matching process we might have to
bind some of the variables to make the terms
match.
These bindings are then passed on into the new
query (consisting of the rule body and the left over
query predicates).
Fahiem Bacchus, University of Toronto
Variable Matching (Unification)
Two terms (with variables match if):
If both are constants (identifiers, numbers, or strings)
and are identical.
If one or both are bound variables then they match
if what the variables are bound to match.
X and mary where X is bound to the value mary will match.
X and Y where X is bound to mary and Y is bound to mary
will match,
X and ann where X is bound to mary will not match.
Fahiem Bacchus, University of Toronto
Variable Matching (Unification)
If one of the terms is an unbound variable then
they match ANDwe bind the variable to the
term.
X and mary where X is unbound match and make X
bound to mary.
X and Y where X is unbound and Y is bound to mary
match and make X bound to mary.
X and Y where both X and Y are unbound match
and make X bound to Y (or vice versa).
Fahiem Bacchus, University of Toronto
Variable Matching (Unification)
If the two terms are structures
t = f(t1, t2, ..., tk)
s = g(s1, s2, ..., sn)
Then these two terms match if
the identifiers f and g are identical.
They both have identical arity (k=n)
Each of the terms ti, si match (recursively).
E.g.
date(X, may, 1900) and date(3, may, Y) match and make X bound
to 3 and Y bound to 1900.
equal(2 + 2, 3 + 1) and equal(X + Y, Z) match and make X bound to
1, Y bound to 2, and Z bound to 3+1.
Note that to then evaluate Z by using is.
date(f(X,a), may, g(a,b)) and date(Z, may, g(Y,Q)) match and
make Z bound to f(X,a), Y bound to a, and Q bound to b.
Note we can bind a variable to a term containing another variable!
The predicate = shows what Prolog unifies!
Fahiem Bacchus, University of Toronto
Example
Family Tree.
Fahiem Bacchus, University of Toronto
Lists
Lists are a very useful data structure in Prolog.
Lists are structured terms represented in a
special way.
[a,b,c,d]
This is actually the structured term
[a | [c | [b | [d | []]]]]
Where [] is a special constant the empty list.
Each list is thus of the form [<head> | <rest_of_list>]
<head> an element of the list (not necessarily a list itself).
<rest_of_list> is a list (a sub-list).
This structure has important implications when it
comes to matching variables against lists!
Fahiem Bacchus, University of Toronto
Lists
E.g.
[X | Z] = [a, b, c, d] binds X to a, and Z to the sublist
[b, c, d]
This structure naturally leads to recursive rules on
lists.
size([],0).
size([ _| T],N) :- size(T,N1), N is N1+1.
sumlist([],0)
sumlist([H| T],N) :- sumlist(T,N1), N is N1+H.
member(X,[X| _]).
member(X,[_| T]) :- member(X,T).
Fahiem Bacchus, University of Toronto
Lists
Selecting from a list
select(_, [], []).
select(L, [Head| Tail], [Head | Rest]) :-
member(Head, L), select(L, Tail, Rest).
select(L, [_| Tail], Rest) :-
select(L, Tail, Rest).
note order of rules!
Fahiem Bacchus, University of Toronto
Structures and accessing Structures
Matching against structured terms using
variables is a very powerful way of accessing
members of a data structure.
date(Day, Month, Year)
event(Date, Event)

You might also like