Prolog Declarative/logic paradigm Functional paradigm No - - PowerPoint PPT Presentation

prolog
SMART_READER_LITE
LIVE PREVIEW

Prolog Declarative/logic paradigm Functional paradigm No - - PowerPoint PPT Presentation

Prolog Declarative/logic paradigm Functional paradigm No assignment statement Declarative paradigm No program! Specification without implementation. Prolog Declarative/logic paradigm Functional paradigm No


slide-1
SLIDE 1

Prolog

  • Declarative/logic paradigm
  • Functional paradigm – No assignment

statement

  • Declarative paradigm – No program!

Specification without implementation.

slide-2
SLIDE 2

Prolog

  • Declarative/logic paradigm
  • Functional paradigm – No assignment

statement

  • Declarative paradigm – No program!

Specification without implementation.

slide-3
SLIDE 3

Prolog

  • Declarative/logic paradigm
  • Functional paradigm – No assignment

statement

  • Declarative paradigm – No program!

Specification without implementation.

slide-4
SLIDE 4

Using Prolog

  • Two shells
  • vi to edit and save the database, or more

to view it

  • Prolog to query the database
slide-5
SLIDE 5

ânn

4 Chapter 1 lntroduction to Prolog

Figure 1.1 A family tree.

This program consists of six clauses. Each of these clauses declares one fact about

the parent relation. For example, parent( tom, bob) is a particular instqnce of the

parent relation. In general, a relation is defined as the set of all its instances.

When this program has been communicated to the Prolog system, Prolog can

be posed some questions about the parent relation. For example: Is Bob a parent

  • f Pat? This question can be communicated to the Prolog system by typing:

?- parent( bob, pat).

Having found this as an asserted fact in the program, Prolog will answer:

yes

A further query can be:

?- parent( liz, pat),

t'îi

answers: because the program does not mention anything aboutLiz being a parent of Pat. It also answers 'no' to the question:

?- parent( tom, ben).

More interesting questions can also be asked. For example: Who is Liz's parent?

?- parent( X, liz).

Prolog will now tell us what is the value of X such that the above statement is true.

So the answer is:

X=tom

,,t

...:

,l

ii

5:

ã

*

*

ç

4 # ä

â

ã

s

ã

s

ã

ê

*

,.Ê

'9.

*

æ

e

d ,*

I

:t

ç

t:

t:

The question

?- parent( tr,

This time thel

solution:

X=ann

We may now

find:

X=pat

If we request f

the solutions .

Our progra

whom? That i Find X and

This is express

?- parent( X,

Prolog now flr displayed one

the solutions I

x=pam

Y = bob;

X=tom

Y = bob;

X=tom

Y =liz;

We can alwa¡

semicolon.

Our exampJ

is a grandparr

illustrated by ì

(1) Who is a 1 (2) Who is a I

parent parent

ì t

I I gr

Figure 1.2 The ¡

slide-6
SLIDE 6

ânn

4 Chapter 1 lntroduction to Prolog

Figure 1.1 A family tree.

This program consists of six clauses. Each of these clauses declares one fact about

the parent relation. For example, parent( tom, bob) is a particular instqnce of the

parent relation. In general, a relation is defined as the set of all its instances.

When this program has been communicated to the Prolog system, Prolog can

be posed some questions about the parent relation. For example: Is Bob a parent

  • f Pat? This question can be communicated to the Prolog system by typing:

?- parent( bob, pat).

Having found this as an asserted fact in the program, Prolog will answer:

yes

A further query can be:

?- parent( liz, pat),

t'îi

answers: because the program does not mention anything aboutLiz being a parent of Pat. It also answers 'no' to the question:

?- parent( tom, ben).

More interesting questions can also be asked. For example: Who is Liz's parent?

?- parent( X, liz).

Prolog will now tell us what is the value of X such that the above statement is true.

So the answer is:

X=tom

,,t

...:

,l

ii

5:

ã

*

*

ç

4 # ä

â

ã

s

ã

s

ã

ê

*

,.Ê

'9.

*

æ

e

d ,*

I

:t

ç

t:

t:

The question

?- parent( tr,

This time thel

solution:

X=ann

We may now

find:

X=pat

If we request f

the solutions .

Our progra

whom? That i Find X and

This is express

?- parent( X,

Prolog now flr displayed one

the solutions I

x=pam

Y = bob;

X=tom

Y = bob;

X=tom

Y =liz;

We can alwa¡

semicolon.

Our exampJ

is a grandparr

illustrated by ì

(1) Who is a 1 (2) Who is a I

parent parent

ì t

I I gr

Figure 1.2 The ¡

Defining relations by facts

parent( pam, bob). parent( tom, bob). parent( tom, liz). parent( bob, ann). parent( bob, pat). parent( pat, jim).

slide-7
SLIDE 7

Demo

  • ?- consult( ‘ch1.pl’).
  • ?- halt. % to quit
  • ; % next solution
  • a % all solutions
  • <ret> % stop
slide-8
SLIDE 8

auses declares one fact about

is a particular instønce of the : set of all its instances.

he Prolog system, Prolog can

For example: Is Bob a parent

rolog system by Çping:

Prolog will answer:

ut Liz being a parent of Pat. It mple: Who is Liz's parent? tt the above statement is true.

1.1 Defining relations by facts 5

The question Who are Bob's children? can be communicated to Prolog as:

?- parent( bob, X).

This time there is more than iust one possible answer. Prolog frrst answers with one

solution:

X=ann

We may now request another solution (by Wping a semicolon), and Prolog will ñnd:

X=pat

If we request further solutions (semicolon again), Prolog will answer'no'because all

the solutions have been exhausted.

Our program can be asked an even broader question: Who is a parent of

whom? That is: Find X and Y such that X is a parent of Y.

This is expressed in Prolog by:

?- parent( X, Y).

Prolog now finds all the parent-child pairs one after another. The solutions will be displayed one at a time as long as we tell Prolog we want more solutions, until all

the solutions have been found. The answers are output as:

x=pam

Y = bob;

X=tom

Y = bob;

X=tom

Y = liz;

We can always stop the stream of solutions by typing a return instead of a

semicolon.

Our example program can be asked still more complicated questions like: Who

is a grandparent of Jim? This query has to be broken down into two steps, as

illustrated by Figure 1.2.

(1) \Âfho is a parent of Jim? Assume that this is some Y. (2) Who is a parent of Y? Assume that this is some X.

parent parent

Figure 1.2 The grandparent relation expressed as a composition of two parent relations.

I

I I

I

grandparent

Who is a grandparent of jim?

  • 1. Who is a parent of jim? Y
  • 2. Who is a parent of Y? X

Query:

?- parent( Y, jim), parent( X, Y).

slide-9
SLIDE 9

Who are tom’s grandchildren?

?- parent( tom, X), parent( X, Y).

slide-10
SLIDE 10

Who are tom’s grandchildren?

?- parent( tom, X), parent( X, Y).

slide-11
SLIDE 11

| ?- parent( tom, X), parent( X, Y). 1 1 Call: parent(tom,_273) ? 1 1 Exit: parent(tom,bob) ? 2 1 Call: parent(bob,_277) ? 2 1 Exit: parent(bob,ann) ? X = bob Y = ann ? ; 2 1 Redo: parent(bob,ann) ? 2 1 Exit: parent(bob,pat) ? X = bob Y = pat ? ; 1 1 Redo: parent(tom,bob) ? 1 1 Exit: parent(tom,liz) ? 2 1 Call: parent(liz,_277) ? 2 1 Fail: parent(liz,_277) ? (1 ms) no

Demo trace

slide-12
SLIDE 12

| ?- parent( tom, X), parent( X, Y). 1 1 Call: parent(tom,_273) ? 1 1 Exit: parent(tom,bob) ? 2 1 Call: parent(bob,_277) ? 2 1 Exit: parent(bob,ann) ? X = bob Y = ann ? ; 2 1 Redo: parent(bob,ann) ? 2 1 Exit: parent(bob,pat) ? X = bob Y = pat ? ; 1 1 Redo: parent(tom,bob) ? 1 1 Exit: parent(tom,liz) ? 2 1 Call: parent(liz,_277) ? 2 1 Fail: parent(liz,_277) ? (1 ms) no

Demo trace Exits one goal, and calls the next goal. Exit means “success”.

slide-13
SLIDE 13

| ?- parent( tom, X), parent( X, Y). 1 1 Call: parent(tom,_273) ? 1 1 Exit: parent(tom,bob) ? 2 1 Call: parent(bob,_277) ? 2 1 Exit: parent(bob,ann) ? X = bob Y = ann ? ; 2 1 Redo: parent(bob,ann) ? 2 1 Exit: parent(bob,pat) ? X = bob Y = pat ? ; 1 1 Redo: parent(tom,bob) ? 1 1 Exit: parent(tom,liz) ? 2 1 Call: parent(liz,_277) ? 2 1 Fail: parent(liz,_277) ? (1 ms) no

Demo trace The invocation number. Unique for every invocation.

slide-14
SLIDE 14

| ?- parent( tom, X), parent( X, Y). 1 1 Call: parent(tom,_273) ? 1 1 Exit: parent(tom,bob) ? 2 1 Call: parent(bob,_277) ? 2 1 Exit: parent(bob,ann) ? X = bob Y = ann ? ; 2 1 Redo: parent(bob,ann) ? 2 1 Exit: parent(bob,pat) ? X = bob Y = pat ? ; 1 1 Redo: parent(tom,bob) ? 1 1 Exit: parent(tom,liz) ? 2 1 Call: parent(liz,_277) ? 2 1 Fail: parent(liz,_277) ? (1 ms) no

Demo trace The index number. The number of direct ancestors of the goal, i.e., the current depth of the goal.

slide-15
SLIDE 15

| ?- parent( tom, X), parent( X, Y). 1 1 Call: parent(tom,_273) ? 1 1 Exit: parent(tom,bob) ? 2 1 Call: parent(bob,_277) ? 2 1 Exit: parent(bob,ann) ? X = bob Y = ann ? ; 2 1 Redo: parent(bob,ann) ? 2 1 Exit: parent(bob,pat) ? X = bob Y = pat ? ; 1 1 Redo: parent(tom,bob) ? 1 1 Exit: parent(tom,liz) ? 2 1 Call: parent(liz,_277) ? 2 1 Fail: parent(liz,_277) ? (1 ms) no

Demo trace The invocation number increases. Now working off of invocation 1.

slide-16
SLIDE 16

| ?- parent( tom, X), parent( X, Y). 1 1 Call: parent(tom,_273) ? 1 1 Exit: parent(tom,bob) ? 2 1 Call: parent(bob,_277) ? 2 1 Exit: parent(bob,ann) ? X = bob Y = ann ? ; 2 1 Redo: parent(bob,ann) ? 2 1 Exit: parent(bob,pat) ? X = bob Y = pat ? ; 1 1 Redo: parent(tom,bob) ? 1 1 Exit: parent(tom,liz) ? 2 1 Call: parent(liz,_277) ? 2 1 Fail: parent(liz,_277) ? (1 ms) no

Demo trace The index number remains 1. No direct ancestors of the goal, i.e., the current depth of the goal is 1.

slide-17
SLIDE 17

| ?- parent( tom, X), parent( X, Y). 1 1 Call: parent(tom,_273) ? 1 1 Exit: parent(tom,bob) ? 2 1 Call: parent(bob,_277) ? 2 1 Exit: parent(bob,ann) ? X = bob Y = ann ? ; 2 1 Redo: parent(bob,ann) ? 2 1 Exit: parent(bob,pat) ? X = bob Y = pat ? ; 1 1 Redo: parent(tom,bob) ? 1 1 Exit: parent(tom,liz) ? 2 1 Call: parent(liz,_277) ? 2 1 Fail: parent(liz,_277) ? (1 ms) no

Demo trace

slide-18
SLIDE 18

| ?- parent( tom, X), parent( X, Y). 1 1 Call: parent(tom,_273) ? 1 1 Exit: parent(tom,bob) ? 2 1 Call: parent(bob,_277) ? 2 1 Exit: parent(bob,ann) ? X = bob Y = ann ? ; 2 1 Redo: parent(bob,ann) ? 2 1 Exit: parent(bob,pat) ? X = bob Y = pat ? ; 1 1 Redo: parent(tom,bob) ? 1 1 Exit: parent(tom,liz) ? 2 1 Call: parent(liz,_277) ? 2 1 Fail: parent(liz,_277) ? (1 ms) no

Demo trace Redo indicates backtracking.

slide-19
SLIDE 19

| ?- parent( tom, X), parent( X, Y). 1 1 Call: parent(tom,_273) ? 1 1 Exit: parent(tom,bob) ? 2 1 Call: parent(bob,_277) ? 2 1 Exit: parent(bob,ann) ? X = bob Y = ann ? ; 2 1 Redo: parent(bob,ann) ? 2 1 Exit: parent(bob,pat) ? X = bob Y = pat ? ; 1 1 Redo: parent(tom,bob) ? 1 1 Exit: parent(tom,liz) ? 2 1 Call: parent(liz,_277) ? 2 1 Fail: parent(liz,_277) ? (1 ms) no

Demo trace

slide-20
SLIDE 20

Do ann and pat have a common parent?

?- parent( X, ann), parent( X, pat).

slide-21
SLIDE 21

Do ann and pat have a common parent?

?- parent( X, ann), parent( X, pat).

slide-22
SLIDE 22

Bratko vs. gprolog In gprolog, identical functors must be contiguous. Bratko

female( pam). male( tom). male( bob). female( liz). female( ann). female( pat). male( jim). gprolog female( pam). female( liz). female( ann). female( pat). male( tom). male( bob). male( jim).

slide-23
SLIDE 23
  • 10 Chapter 1 lntroduction to Prolog

female parent

1, mother

parent

parent

Figure 1.3 Definition graphs for the relations mother and grandparent in terms of

relations parent and female.

Relations such as parent and mother can be illustrated by diagrams such as

those in Figure 1.3. These diagrams conform to the following conventions.

Nodes in the graphs correspond to obiects - that is, arguments of relations. Arcs

between nodes correspond to binary relations. The arcs are oriented so as to

point from the first argument of the relation to the second argument. Unary

relations are indicated in the diagrams by simply labelling the corresponding

  • biects with the name of the relation. The relations that are being defined are

represented by dashed arcs. So each diagram should be understood as follows: if

the relations shown by solid arcs hold, then the relation shown by a dashed arc

also holds.

Such graphical illustrations may be very helpfuI when we think about how to

define new relations. Consider the grandparent relation. It can be, according to

Figure 1.3, immediately written in Prolog as:

grandparent( X, Z) i parent( X, Y), parent( Y, Z).

At this point it will be useful to make a comment on the layout of our programs.

Prolog gives us almost full freedom in choosing the layout of the program. So we

can insert spaces and new lines as it best suits our taste. In general we want to make

  • ur programs look nice and tidy, and easy to read. To this end we will often choose

to write the head of a clause and each goal of the body on a separate line. When doing this, we will indent the goals in order to make the difference between the

head and the goals more visible. For example, the grandparent rule would be,

according to this convention, lvritten as:

grandparent( X, Z) t parent( X, Y), parent( Y, Z).

Figure 1.4 illustrates the sister relation:

Fo¡ all X and Y,

X is a sister ofY if

(1) both X and Y have the same parent, and (2) Xisafemale.

grandparent

I I

I

I

,

t I parent female

siste

Figure 1.4 Definin¡

The graph in Figu:

sister( X, Y) :-

parent( Z, X),

parent(Z,Y),

female( X).

Notice the way in been expressed. T pafent of x, and t

way would be to s

Z2.We can now a

?- sister( ann, pa

The answer will br

that the sister rêlat flaw in our progra

?- sister( X, pat).

Prolog will find tv X = anni

X=pat

So, Pat is a sister'

sister relation. Hc

perfectly logical. different if they ar

that X and Y can I

has a parent is a s

To correct our

  • ent. We can stat(

can then be:

sister( X, Y) :-

parent( Z, X),

parent(2, Y),

female( X),

X\=Y'

Defining relations by rules

slide-24
SLIDE 24
  • 10 Chapter 1 lntroduction to Prolog

female parent

1, mother

parent

parent

Figure 1.3 Definition graphs for the relations mother and grandparent in terms of

relations parent and female.

Relations such as parent and mother can be illustrated by diagrams such as

those in Figure 1.3. These diagrams conform to the following conventions.

Nodes in the graphs correspond to obiects - that is, arguments of relations. Arcs

between nodes correspond to binary relations. The arcs are oriented so as to

point from the first argument of the relation to the second argument. Unary

relations are indicated in the diagrams by simply labelling the corresponding

  • biects with the name of the relation. The relations that are being defined are

represented by dashed arcs. So each diagram should be understood as follows: if

the relations shown by solid arcs hold, then the relation shown by a dashed arc

also holds.

Such graphical illustrations may be very helpfuI when we think about how to

define new relations. Consider the grandparent relation. It can be, according to

Figure 1.3, immediately written in Prolog as:

grandparent( X, Z) i parent( X, Y), parent( Y, Z).

At this point it will be useful to make a comment on the layout of our programs.

Prolog gives us almost full freedom in choosing the layout of the program. So we

can insert spaces and new lines as it best suits our taste. In general we want to make

  • ur programs look nice and tidy, and easy to read. To this end we will often choose

to write the head of a clause and each goal of the body on a separate line. When doing this, we will indent the goals in order to make the difference between the

head and the goals more visible. For example, the grandparent rule would be,

according to this convention, lvritten as:

grandparent( X, Z) t parent( X, Y), parent( Y, Z).

Figure 1.4 illustrates the sister relation:

Fo¡ all X and Y,

X is a sister ofY if

(1) both X and Y have the same parent, and (2) Xisafemale.

grandparent

I I

I

I

,

t I parent female

siste

Figure 1.4 Definin¡

The graph in Figu:

sister( X, Y) :-

parent( Z, X),

parent(Z,Y),

female( X).

Notice the way in been expressed. T pafent of x, and t

way would be to s

Z2.We can now a

?- sister( ann, pa

The answer will br

that the sister rêlat flaw in our progra

?- sister( X, pat).

Prolog will find tv X = anni

X=pat

So, Pat is a sister'

sister relation. Hc

perfectly logical. different if they ar

that X and Y can I

has a parent is a s

To correct our

  • ent. We can stat(

can then be:

sister( X, Y) :-

parent( Z, X),

parent(2, Y),

female( X),

X\=Y'

Defining relations by rules

mother( X, Y) :- % X is the mother of Y if parent( X, Y), % X is a parent of Y and female( X). % X is female

slide-25
SLIDE 25
  • 10 Chapter 1 lntroduction to Prolog

female parent

1, mother

parent

parent

Figure 1.3 Definition graphs for the relations mother and grandparent in terms of

relations parent and female.

Relations such as parent and mother can be illustrated by diagrams such as

those in Figure 1.3. These diagrams conform to the following conventions.

Nodes in the graphs correspond to obiects - that is, arguments of relations. Arcs

between nodes correspond to binary relations. The arcs are oriented so as to

point from the first argument of the relation to the second argument. Unary

relations are indicated in the diagrams by simply labelling the corresponding

  • biects with the name of the relation. The relations that are being defined are

represented by dashed arcs. So each diagram should be understood as follows: if

the relations shown by solid arcs hold, then the relation shown by a dashed arc

also holds.

Such graphical illustrations may be very helpfuI when we think about how to

define new relations. Consider the grandparent relation. It can be, according to

Figure 1.3, immediately written in Prolog as:

grandparent( X, Z) i parent( X, Y), parent( Y, Z).

At this point it will be useful to make a comment on the layout of our programs.

Prolog gives us almost full freedom in choosing the layout of the program. So we

can insert spaces and new lines as it best suits our taste. In general we want to make

  • ur programs look nice and tidy, and easy to read. To this end we will often choose

to write the head of a clause and each goal of the body on a separate line. When doing this, we will indent the goals in order to make the difference between the

head and the goals more visible. For example, the grandparent rule would be,

according to this convention, lvritten as:

grandparent( X, Z) t parent( X, Y), parent( Y, Z).

Figure 1.4 illustrates the sister relation:

Fo¡ all X and Y,

X is a sister ofY if

(1) both X and Y have the same parent, and (2) Xisafemale.

grandparent

I I

I

I

,

t I parent female

siste

Figure 1.4 Definin¡

The graph in Figu:

sister( X, Y) :-

parent( Z, X),

parent(Z,Y),

female( X).

Notice the way in been expressed. T pafent of x, and t

way would be to s

Z2.We can now a

?- sister( ann, pa

The answer will br

that the sister rêlat flaw in our progra

?- sister( X, pat).

Prolog will find tv X = anni

X=pat

So, Pat is a sister'

sister relation. Hc

perfectly logical. different if they ar

that X and Y can I

has a parent is a s

To correct our

  • ent. We can stat(

can then be:

sister( X, Y) :-

parent( Z, X),

parent(2, Y),

female( X),

X\=Y'

Defining relations by rules

grandparent( X, Z) :- % X is a grandparent of Z if parent( X, Y), % X is a parent of Y and parent( Y, Z). % Y is a parent of Z

slide-26
SLIDE 26

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

goal goal body head A Prolog clause

slide-27
SLIDE 27

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

goal goal body head A Prolog clause Exit in a trace (success)

slide-28
SLIDE 28

Recursive rules

.::i ta 4!.-.t

.;,fii*Ë

' 1::::t:::::t!'l

1.3 Recursive rules 13

Recursive rules

Let us add one more relation to our family program, the ancestor relation. This

relation will be defined in terms of the parent relation. The whole definition can

be expressed with two rules. .The first rule will define the direct (immediate)

ancestors and the second rule the indirect ancestors. We say that some X is an

indirect ancestor of some Z if there is a chain of parents between X and Z, as

illustrated in Figure 1.5. In our example of Figure 1.1, Tom is a direct ancestor of

Liz and an indirect ancestor of Pat.

The first rule is simple and can be written in Prolog as:

ancestor( X, Z\ - parent( X, Z).

The second rule, on the other hand, is more complicated. The chain of parents may present some problems because the chain can be arbitrarily long. One attempt to

deflne indirect ancestors could be as shown in Figure 1.6. According to this, the

ancestor relation would be defined by a set of clauses as follows: ancestor( X, Z) t parent( X, Z). ancestor( X, Z) t parent( X, Y), parent( Y, Z). ancestor( X, Z) i parent( X, Yl), parent( Yl, Y2),

patent(Y2, Z).

ancestor( X, Z\ ¡ parent( X, Yl), parent( Yl, Y2), parent( Y2, Y3), parent( Y3, Z).

pârent

\ ancestor parent

,

rg new clauses.

uestions.

rlly, true. given condition.

n what things are true.

rc body. The body is a list

een goals are understood as

  • rody. Questions only have the

tty) body. substituted by another object.

ied and are read as 'for all'.

riables that appear only in the

uce a one-argument relation X has two children (introduce

:ion. Hint: It will be similar to

: relations parent and sister.

rle of Figure 1.3 for the aunt

I I I I I I

I I I

I I I

, t

I I parent parent

(a)

  • )

Figure 1".5 Examples of the ancestor relation: (a) X is a direct ancestor of Z; (b) X is an

indirect ancestor of Z.

âncestor

slide-29
SLIDE 29

Recursive rules

14 Chapter 1 lntroduction to Prolog

parent parent parent parent parent

parent pârent

parent

pârent

Figute 1,6 Ancestor-successor pairs at various distances.

This program is lengthy and, more importantly, it only works to some extent. It would only discover ancestors to a certain depth in a family tree because the length

  • f the chain of people between the ancestor and the successor would be limited by

the length of our ancestor clauses.

There is, however, a much more elegant and correct formulation of the

ancestor relation. It will work for ancestors at aîy depth. The key idea is to define

the ancestor relation in terms of itself. Figure 1.7 illustrates the idea:

For all X andZ,

X is an ancestor ofZlf

there is a Y such that

(1) X is a parent of Y and (2) Y is an ancestor of Z.

parent ancestor

I I

I

I t I

ancestor

I I I I I I

I I

I I I

,

t

I t I I I t I t

I I I I

I I

I

I I

, t t

I

A Prolog claus

ancestor( X, parent( X,

ancestor('

We have thus

consists of tw( rules are rewri

ancestor( X, parent( X, ancestor( X, parent( X, ancestor( ì

The key to thi

definition ma¡ can we use tl

defrnitions are understandabl the Prolog sysl Prolog can in(

fact, one of t

possible to sol

recursion.

Going back

That is: Who i

?- ancestor( 1

X = bob;

X = anni

X=paq

X=iim

Prolog's answ

definition of t important qu(

answers?

An informai

But first let u

extended grad

in Figure 1.8.

first will intror

programs.

The prograr

ancestor, etc. T

that these two to consider the

is called a proc(

ancestor ancestor

I I I I I I I I t

I I I I

I

¡

I I I t

,

I

ancestor

Figute 1.7 Recursive formulation of the ancestor relation.

slide-30
SLIDE 30

Recursive rules

14 Chapter 1 lntroduction to Prolog

parent parent parent parent parent

parent pârent

parent

pârent

Figute 1,6 Ancestor-successor pairs at various distances.

This program is lengthy and, more importantly, it only works to some extent. It would only discover ancestors to a certain depth in a family tree because the length

  • f the chain of people between the ancestor and the successor would be limited by

the length of our ancestor clauses.

There is, however, a much more elegant and correct formulation of the

ancestor relation. It will work for ancestors at aîy depth. The key idea is to define

the ancestor relation in terms of itself. Figure 1.7 illustrates the idea:

For all X andZ,

X is an ancestor ofZlf

there is a Y such that

(1) X is a parent of Y and (2) Y is an ancestor of Z.

parent ancestor

I I

I

I t I

ancestor

I I I I I I

I I

I I I

,

t

I t I I I t I t

I I I I

I I

I

I I

, t t

I

A Prolog claus

ancestor( X, parent( X,

ancestor('

We have thus

consists of tw( rules are rewri

ancestor( X, parent( X, ancestor( X, parent( X, ancestor( ì

The key to thi

definition ma¡ can we use tl

defrnitions are understandabl the Prolog sysl Prolog can in(

fact, one of t

possible to sol

recursion.

Going back

That is: Who i

?- ancestor( 1

X = bob;

X = anni

X=paq

X=iim

Prolog's answ

definition of t important qu(

answers?

An informai

But first let u

extended grad

in Figure 1.8.

first will intror

programs.

The prograr

ancestor, etc. T

that these two to consider the

is called a proc(

ancestor ancestor

I I I I I I I I t

I I I I

I

¡

I I I t

,

I

ancestor

Figute 1.7 Recursive formulation of the ancestor relation.

ancestor( X, Z) :- %rule a1 parent( X, Z).

slide-31
SLIDE 31

Recursive rules

14 Chapter 1 lntroduction to Prolog

parent parent parent parent parent

parent pârent

parent

pârent

Figute 1,6 Ancestor-successor pairs at various distances.

This program is lengthy and, more importantly, it only works to some extent. It would only discover ancestors to a certain depth in a family tree because the length

  • f the chain of people between the ancestor and the successor would be limited by

the length of our ancestor clauses.

There is, however, a much more elegant and correct formulation of the

ancestor relation. It will work for ancestors at aîy depth. The key idea is to define

the ancestor relation in terms of itself. Figure 1.7 illustrates the idea:

For all X andZ,

X is an ancestor ofZlf

there is a Y such that

(1) X is a parent of Y and (2) Y is an ancestor of Z.

parent ancestor

I I

I

I t I

ancestor

I I I I I I

I I

I I I

,

t

I t I I I t I t

I I I I

I I

I

I I

, t t

I

A Prolog claus

ancestor( X, parent( X,

ancestor('

We have thus

consists of tw( rules are rewri

ancestor( X, parent( X, ancestor( X, parent( X, ancestor( ì

The key to thi

definition ma¡ can we use tl

defrnitions are understandabl the Prolog sysl Prolog can in(

fact, one of t

possible to sol

recursion.

Going back

That is: Who i

?- ancestor( 1

X = bob;

X = anni

X=paq

X=iim

Prolog's answ

definition of t important qu(

answers?

An informai

But first let u

extended grad

in Figure 1.8.

first will intror

programs.

The prograr

ancestor, etc. T

that these two to consider the

is called a proc(

ancestor ancestor

I I I I I I I I t

I I I I

I

¡

I I I t

,

I

ancestor

Figute 1.7 Recursive formulation of the ancestor relation.

ancestor( X, Z) :- %rule a1 parent( X, Z). ancestor( X, Z) :- %rule a2 parent( X, Y), ancestor( Y, Z).

slide-32
SLIDE 32

ancestor( X, Z) :- parent( X, Z). (1,1) ancestor( X, Z) :- parent( X, Y), ancestor( Y, Z). | ?- ancestor( tom, pat). 1 1 Call: ancestor(tom,pat) ? 2 2 Call: parent(tom,pat) ? 2 2 Fail: parent(tom,pat) ? 2 2 Call: parent(tom,_336) ? 2 2 Exit: parent(tom,bob) ? 3 2 Call: ancestor(bob,pat) ? 4 3 Call: parent(bob,pat) ? 4 3 Exit: parent(bob,pat) ? 3 2 Exit: ancestor(bob,pat) ? 1 1 Exit: ancestor(tom,pat) ? parent( pam, bob). parent( tom, bob). parent( tom, liz). parent( bob, ann). parent( bob, pat). parent( pat, jim).

slide-33
SLIDE 33

ancestor( X, Z) :- parent( X, Z). (1,1) (2,2) ancestor( X, Z) :- parent( X, Y), ancestor( Y, Z). | ?- ancestor( tom, pat). 1 1 Call: ancestor(tom,pat) ? 2 2 Call: parent(tom,pat) ? 2 2 Fail: parent(tom,pat) ? 2 2 Call: parent(tom,_336) ? 2 2 Exit: parent(tom,bob) ? 3 2 Call: ancestor(bob,pat) ? 4 3 Call: parent(bob,pat) ? 4 3 Exit: parent(bob,pat) ? 3 2 Exit: ancestor(bob,pat) ? 1 1 Exit: ancestor(tom,pat) ? parent( pam, bob). parent( tom, bob). parent( tom, liz). parent( bob, ann). parent( bob, pat). parent( pat, jim).

slide-34
SLIDE 34

ancestor( X, Z) :- parent( X, Z). (1,1) (2,2) ancestor( X, Z) :- parent( X, Y), ancestor( Y, Z). | ?- ancestor( tom, pat). 1 1 Call: ancestor(tom,pat) ? 2 2 Call: parent(tom,pat) ? 2 2 Fail: parent(tom,pat) ? 2 2 Call: parent(tom,_336) ? 2 2 Exit: parent(tom,bob) ? 3 2 Call: ancestor(bob,pat) ? 4 3 Call: parent(bob,pat) ? 4 3 Exit: parent(bob,pat) ? 3 2 Exit: ancestor(bob,pat) ? 1 1 Exit: ancestor(tom,pat) ? parent( pam, bob). parent( tom, bob). parent( tom, liz). parent( bob, ann). parent( bob, pat). parent( pat, jim).

slide-35
SLIDE 35

ancestor( X, Z) :- parent( X, Z). ancestor( X, Z) :- parent( X, Y), ancestor( Y, Z). (1,1) (2,2) | ?- ancestor( tom, pat). 1 1 Call: ancestor(tom,pat) ? 2 2 Call: parent(tom,pat) ? 2 2 Fail: parent(tom,pat) ? 2 2 Call: parent(tom,_336) ? 2 2 Exit: parent(tom,bob) ? 3 2 Call: ancestor(bob,pat) ? 4 3 Call: parent(bob,pat) ? 4 3 Exit: parent(bob,pat) ? 3 2 Exit: ancestor(bob,pat) ? 1 1 Exit: ancestor(tom,pat) ? parent( pam, bob). parent( tom, bob). parent( tom, liz). parent( bob, ann). parent( bob, pat). parent( pat, jim).

slide-36
SLIDE 36

ancestor( X, Z) :- parent( X, Z). ancestor( X, Z) :- parent( X, Y), ancestor( Y, Z). (1,1) (2,2) | ?- ancestor( tom, pat). 1 1 Call: ancestor(tom,pat) ? 2 2 Call: parent(tom,pat) ? 2 2 Fail: parent(tom,pat) ? 2 2 Call: parent(tom,_336) ? 2 2 Exit: parent(tom,bob) ? 3 2 Call: ancestor(bob,pat) ? 4 3 Call: parent(bob,pat) ? 4 3 Exit: parent(bob,pat) ? 3 2 Exit: ancestor(bob,pat) ? 1 1 Exit: ancestor(tom,pat) ? parent( pam, bob). parent( tom, bob). parent( tom, liz). parent( bob, ann). parent( bob, pat). parent( pat, jim).

slide-37
SLIDE 37

ancestor( X, Z) :- parent( X, Z). ancestor( X, Z) :- parent( X, Y), ancestor( Y, Z). (1,1) (2,2) (3,2) | ?- ancestor( tom, pat). 1 1 Call: ancestor(tom,pat) ? 2 2 Call: parent(tom,pat) ? 2 2 Fail: parent(tom,pat) ? 2 2 Call: parent(tom,_336) ? 2 2 Exit: parent(tom,bob) ? 3 2 Call: ancestor(bob,pat) ? 4 3 Call: parent(bob,pat) ? 4 3 Exit: parent(bob,pat) ? 3 2 Exit: ancestor(bob,pat) ? 1 1 Exit: ancestor(tom,pat) ? parent( pam, bob). parent( tom, bob). parent( tom, liz). parent( bob, ann). parent( bob, pat). parent( pat, jim).

slide-38
SLIDE 38

ancestor( X, Z) :- parent( X, Z). (4,3) ancestor( X, Z) :- parent( X, Y), ancestor( Y, Z). (1,1) (2,2) (3,2) | ?- ancestor( tom, pat). 1 1 Call: ancestor(tom,pat) ? 2 2 Call: parent(tom,pat) ? 2 2 Fail: parent(tom,pat) ? 2 2 Call: parent(tom,_336) ? 2 2 Exit: parent(tom,bob) ? 3 2 Call: ancestor(bob,pat) ? 4 3 Call: parent(bob,pat) ? 4 3 Exit: parent(bob,pat) ? 3 2 Exit: ancestor(bob,pat) ? 1 1 Exit: ancestor(tom,pat) ? parent( pam, bob). parent( tom, bob). parent( tom, liz). parent( bob, ann). parent( bob, pat). parent( pat, jim).

slide-39
SLIDE 39

ancestor( X, Z) :- parent( X, Z). (4,3) ancestor( X, Z) :- parent( X, Y), ancestor( Y, Z). (1,1) (2,2) (3,2) | ?- ancestor( tom, pat). 1 1 Call: ancestor(tom,pat) ? 2 2 Call: parent(tom,pat) ? 2 2 Fail: parent(tom,pat) ? 2 2 Call: parent(tom,_336) ? 2 2 Exit: parent(tom,bob) ? 3 2 Call: ancestor(bob,pat) ? 4 3 Call: parent(bob,pat) ? 4 3 Exit: parent(bob,pat) ? 3 2 Exit: ancestor(bob,pat) ? 1 1 Exit: ancestor(tom,pat) ? parent( pam, bob). parent( tom, bob). parent( tom, liz). parent( bob, ann). parent( bob, pat). parent( pat, jim).

slide-40
SLIDE 40

ancestor( X, Z) :- parent( X, Z). ancestor( X, Z) :- parent( X, Y), ancestor( Y, Z). (1,1) (2,2) (3,2) | ?- ancestor( tom, pat). 1 1 Call: ancestor(tom,pat) ? 2 2 Call: parent(tom,pat) ? 2 2 Fail: parent(tom,pat) ? 2 2 Call: parent(tom,_336) ? 2 2 Exit: parent(tom,bob) ? 3 2 Call: ancestor(bob,pat) ? 4 3 Call: parent(bob,pat) ? 4 3 Exit: parent(bob,pat) ? 3 2 Exit: ancestor(bob,pat) ? 1 1 Exit: ancestor(tom,pat) ? parent( pam, bob). parent( tom, bob). parent( tom, liz). parent( bob, ann). parent( bob, pat). parent( pat, jim).

slide-41
SLIDE 41

ancestor( X, Z) :- parent( X, Z). ancestor( X, Z) :- parent( X, Y), ancestor( Y, Z). (1,1) | ?- ancestor( tom, pat). 1 1 Call: ancestor(tom,pat) ? 2 2 Call: parent(tom,pat) ? 2 2 Fail: parent(tom,pat) ? 2 2 Call: parent(tom,_336) ? 2 2 Exit: parent(tom,bob) ? 3 2 Call: ancestor(bob,pat) ? 4 3 Call: parent(bob,pat) ? 4 3 Exit: parent(bob,pat) ? 3 2 Exit: ancestor(bob,pat) ? 1 1 Exit: ancestor(tom,pat) ? true ? ; 1 1 Redo: ancestor(tom,pat) ? 3 2 Redo: ancestor(bob,pat) ? 4 3 Call: parent(bob,_385) ? parent( pam, bob). parent( tom, bob). parent( tom, liz). parent( bob, ann). parent( bob, pat). parent( pat, jim).

slide-42
SLIDE 42

ancestor( X, Z) :- parent( X, Z). ancestor( X, Z) :- parent( X, Y), ancestor( Y, Z). | ?- ancestor( tom, pat). 1 1 Call: ancestor(tom,pat) ? 2 2 Call: parent(tom,pat) ? 2 2 Fail: parent(tom,pat) ? 2 2 Call: parent(tom,_336) ? 2 2 Exit: parent(tom,bob) ? 3 2 Call: ancestor(bob,pat) ? 4 3 Call: parent(bob,pat) ? 4 3 Exit: parent(bob,pat) ? 3 2 Exit: ancestor(bob,pat) ? 1 1 Exit: ancestor(tom,pat) ? true ? ; 1 1 Redo: ancestor(tom,pat) ? 3 2 Redo: ancestor(bob,pat) ? 4 3 Call: parent(bob,_385) ? parent( pam, bob). parent( tom, bob). parent( tom, liz). parent( bob, ann). parent( bob, pat). parent( pat, jim).

slide-43
SLIDE 43

| ?- ancestor( tom, pat). 1 1 Call: ancestor(tom,pat) ? 2 2 Call: parent(tom,pat) ? 2 2 Fail: parent(tom,pat) ? 2 2 Call: parent(tom,_336) ? 2 2 Exit: parent(tom,bob) ? 3 2 Call: ancestor(bob,pat) ? 4 3 Call: parent(bob,pat) ? 4 3 Exit: parent(bob,pat) ? 3 2 Exit: ancestor(bob,pat) ? 1 1 Exit: ancestor(tom,pat) ? true ? ; 1 1 Redo: ancestor(tom,pat) ? 3 2 Redo: ancestor(bob,pat) ? 4 3 Call: parent(bob,_385) ? parent( pam, bob). parent( tom, bob). parent( tom, liz). parent( bob, ann). parent( bob, pat). parent( pat, jim). ancestor( X, Z) :- parent( X, Z). ancestor( X, Z) :- parent( X, Y), ancestor( Y, Z). (1,1)

slide-44
SLIDE 44

| ?- ancestor( tom, pat). 1 1 Call: ancestor(tom,pat) ? 2 2 Call: parent(tom,pat) ? 2 2 Fail: parent(tom,pat) ? 2 2 Call: parent(tom,_336) ? 2 2 Exit: parent(tom,bob) ? 3 2 Call: ancestor(bob,pat) ? 4 3 Call: parent(bob,pat) ? 4 3 Exit: parent(bob,pat) ? 3 2 Exit: ancestor(bob,pat) ? 1 1 Exit: ancestor(tom,pat) ? true ? ; 1 1 Redo: ancestor(tom,pat) ? 3 2 Redo: ancestor(bob,pat) ? 4 3 Call: parent(bob,_385) ? parent( pam, bob). parent( tom, bob). parent( tom, liz). parent( bob, ann). parent( bob, pat). parent( pat, jim). ancestor( X, Z) :- parent( X, Z). ancestor( X, Z) :- parent( X, Y), ancestor( Y, Z). (1,1) (2,2) (3,2)

slide-45
SLIDE 45

| ?- ancestor( tom, pat). 1 1 Call: ancestor(tom,pat) ? 2 2 Call: parent(tom,pat) ? 2 2 Fail: parent(tom,pat) ? 2 2 Call: parent(tom,_336) ? 2 2 Exit: parent(tom,bob) ? 3 2 Call: ancestor(bob,pat) ? 4 3 Call: parent(bob,pat) ? 4 3 Exit: parent(bob,pat) ? 3 2 Exit: ancestor(bob,pat) ? 1 1 Exit: ancestor(tom,pat) ? true ? ; 1 1 Redo: ancestor(tom,pat) ? 3 2 Redo: ancestor(bob,pat) ? 4 3 Call: parent(bob,_385) ? parent( pam, bob). parent( tom, bob). parent( tom, liz). parent( bob, ann). parent( bob, pat). parent( pat, jim). ancestor( X, Z) :- parent( X, Z). (4,3) ancestor( X, Z) :- parent( X, Y), ancestor( Y, Z). (1,1) (2,2) (3,2)

slide-46
SLIDE 46

| ?- ancestor( tom, pat). 1 1 Call: ancestor(tom,pat) ? 2 2 Call: parent(tom,pat) ? 2 2 Fail: parent(tom,pat) ? 2 2 Call: parent(tom,_336) ? 2 2 Exit: parent(tom,bob) ? 3 2 Call: ancestor(bob,pat) ? 4 3 Call: parent(bob,pat) ? 4 3 Exit: parent(bob,pat) ? 3 2 Exit: ancestor(bob,pat) ? 1 1 Exit: ancestor(tom,pat) ? true ? ; 1 1 Redo: ancestor(tom,pat) ? 3 2 Redo: ancestor(bob,pat) ? 4 3 Call: parent(bob,_385) ? parent( pam, bob). parent( tom, bob). parent( tom, liz). parent( bob, ann). parent( bob, pat). parent( pat, jim). ancestor( X, Z) :- parent( X, Z). (4,3) ancestor( X, Z) :- parent( X, Y), ancestor( Y, Z). (1,1) (2,2) (3,2)

  • etc. ... eventually fails
slide-47
SLIDE 47

parent( bob, pat) ancestor( t ob, pat) parent( tom, Y) ancestor( Y, pat) parent( tom, pat) ancestor( tom, pat)

20 Chapter 1 lntroduction to Prolog

by rule a1 by rule a2

by fact parent(tom,bob), Y = bob

by rule al

yes, by fact parent(bob,pat)

Figure 1.9 The complete execution trace to satisfy the goal ancestor( tom, pat). The

left-hand branch fails, but the right-hand branch proves the goal is satisfiable. The original goal ancestor( tom, pat) is then replaced by a new goal:

parent( tom, pat)

There is no clause in the program whose head matches the goal parent(tom,pat), therefore this goal fails. This means the flrst alternative with rule ø1lnas failed. Now Prolog backtracks to the original goal in order to try the alternative way to derive the

top goal ancestor(tom,pat). The rule ø2 is thus tried:

ancestor( X, Z\ :- parent( X, Y), ancestor( Y, Z).

As before, the variables X and Z become instantiated as:

X : tom, 2: pat

But Y is not instantiated yet. The top goal ancestor( tom, pat) is replaced by two

goals: parent( tom, Y), ancestor( Y, pat)

Prolog tries to satisfy the two goals in the order in which they appear. The first goal matches two facts in the program: parent(tom,bob) and parent(tom,liz). Prolog frrst

tries to use the fact that appears first in the program. This forces Y to become instantiated to bob. Thus the first goal has been satisfied, and the remaining goal

has become: ancestor( bob, pat)

To satisfy this goal the rule ø1 is used again. Note that this (second) application of

the same rule has nothing to do with its previous application. Therefore, Prolog

no

uses a new set (

we shall renam

ancestor( X, parent( X',

The head has tr

X':bob,Z'=

The current goi

parent( bob, :

This goal is imr

completes the r Here is a su

the trace in Fig

tree correspon(

between the nr

that transform

is satisfied wht

labelled 'yes'. I

programs is tht unsuccessful bl

backtracks to tl

  • node. Automatit

EXERCISE

1.7 Try to understa

program of Fig

style of Figure

(a) ?- parent( p (b) ?- mother( 1 (c) ?- grandpar (d) ?- grandpar

t-:.:-;

,4,.i# Declarative

In our exampl

the program w

It therefore m¿

programs; nam

' the declarøtit . tlre procedurt

þå