You are on page 1of 96

Prolog v.2.

PROLOG
(
)

2.0

, .
, &
,

: Prolog
:
:
: PROLOG.PDF
: 2.0
: 21/8/2006
: .
: () -
&

: 2.0: ISO-based, SWI-
Prolog.
1.x: Edinburgh-based.

-1-
Prolog v.2.0


Prolog
.

( 1990)
Prolog
(
), ( 31
) .

--

o o.

.
compiler interpreter Prolog.

2.0 Prolog Standard ISO


Prolog, Standard Edinburgh Prolog
. SWI-Prolog.

,
e-mail sgarbas@upatras.gr,
.

-2-
Prolog v.2.0

1. .......................................................................................................................................... 4
2. ..................................................................................................................... 6
3. o o o Prolog.................................................................................... 13
4. Facts Arguments.................................................................................................17
5. Prolog Objects............................................................................................................................... 21
6. o........................................................................................................................... 23
7. Prolog..............................................................................................................................25
8. Backtracking ()....................................................................................................30
9. Matching ()................................................................................................................... 33
10. I.............................................................................................................................. 36
11. Auto-Executable Goals ............................................................................................. 40
12. Recursion (o)...................................................................................................... 42
13. Cut (!).......................................................................................................................................... 50
14. .......................................................................................................................................... 54
15. Built-In ....................................................................................59
16. Debugging ()....................................................................................................64
17. Assert / Retract............................................................................................................................ 69
18. ...................................................................................................................................... 72
19. Streams ......................................................................................................................76
20. DCG-Rules.................................................................................................................................. 82
21. Prolog.......................................................................87
22. .......................................................................................................................89
o...................................................................................................................................... 96

-3-
Prolog v.2.0

1.

Prolog 1970 o
Alain Colmerauer o o
. Prolog
o oo o oo (Pascal, Basic, C,
FORTRAN, ). o o (
o), o oo
(o) oo o . , oo
( o) o o o o, o o o
o oo o o o oo
oo o, o o. o o o o
o oo o oo o o o,
"o" . o o o. o
o o o oo, o o o oo.

o o o oo o oo , o
o o oo. o o
o o oo o. o oo o oo
o .

Prolog o oo. o o o
o ,
o. depth-first
. o
o o oo, o o
o oo . o, o
o o oo.
o o o. o oo oo
o o o o o
. o o oo o o ooo
o o o, ooo Prolog.

Prolog o, o , "" o
o o
. o o ,
o o o o o o (
) o o. , o o
o o o o o ooo "" , o
o Prolog o
o o, ooo o o o oo
. o o o o o o
o: o o o "o" o o
o oo o. o o
o o o o () ( o
oo). o oo oo o , o

-4-
Prolog v.2.0

() "".

, o o Prolog
o o o ooo "" .
, -, . ISO
Standard SWI-Prolog1.
Prolog standards. Edinburgh-standard ISO-
standard. standards built-in
. compilers ISO-standard,
Edinburgh.

1 SWI-Prolog Prolog Amsterdam


site http://www.swi-prolog.org

-5-
Prolog v.2.0

2.

o o oo
oo o o manual.
o manual , o " o o"
o oo o oo,
oo o compiler Prolog
o .

o ooo o oo o o,
o ooo inputs o .

1 oo Prolog:

man(peter).
man(jimmy).
woman(helen).

o o o Peter (man), o Jimmy,


Helen (woman). o Prolog .
o . -o
o fact 2 o ( predicate
functor man woman) argument (peter, jimmy,
helen). o o o. o o o arity.
man o arity 1 oo3: man/1

o o o editor o Prolog o (
o 2 o ), o o o prompt Prolog:

?-

Prolog . oo o
o :

?- man(peter).
Yes

?- woman(helen).
Yes

Prolog "Yes" o o facts o


(o ). oo o o o o

1 o ooo o oo o o, o ooo inputs


o .
2 o v o o vv, o ooo vo 7.
3 Prolog o o o o functor o arities, o o
v o oo arity. , o func/1 func/2 o.

-6-
Prolog v.2.0

?- man(helen).
No

?- woman(jimmy).
No

?- woman(jenny).
No

Prolog "No". o ( Jenny)


oo : " ", o o
o o Jenny. o o Prolog o o:
o , Yes ( TRUE). o "No"
( FALSE). o o Prolog "no"
oo oo o: " o woman(helen) TRUE, o
man(helen) FALSE, o No", : " o man(helen)
TRUE. o man(helen) o oo; . o o
man(helen) FALSE No". o
o o man(helen) o, Prolog o "Yes" o
man(helen) o woman(helen).
. , o Prolog o man woman o oo
predicate-names, o oo . oo rpd001
qlx422 . o o o o o rpd001(helen)
o qlx422(helen) o TRUE.

oo ooo oo .
(NOT) Prolog 1 \+.

?- \+ man(peter).
No

?- \+ woman(peter).
Yes

Prolog o o oo o \+, o man(peter) o


woman(peter), o o .
o :

?- \+ woman(jenny).
Yes

?- \+ man(jenny).

1 Edinburgh standard not. : not woman(jenny). SWI-Prolog not ,


. not(woman(jenny)). ISO standard
\+ -
NOT . , Prolog
. 18 .

-7-
Prolog v.2.0

Yes

Prolog o o o "jenny" o
o . "jenny" "house", o
, Prolog o!

, \+ .
woman(jenny) ; . man(jenny) ;
.

oo AND OR oo Prolog "," ";" o:

?- man(peter), man(jimmy).
Yes

o man(peter) o man(jimmy).

?- man(peter), \+ man(jimmy).
No

"No", o not man(jimmy) FALSE.

?- man(peter); \+ man(jimmy).
Yes

o o man(peter) TRUE, o o
o OR.

o o "," AND o o o,
. . f(x,y). o ","
o x o y. o o x AND y.
o o o 4.

o o o oo o o o
oo o o o . oo:

\+ man(helen).
man(peter); man(jimmy).

o Prolog, o o oo . . helen
, !1

o , o Prolog . "Yes"

1 oo o. o vo Prolog
o o, .

-8-
Prolog v.2.0

"no" o o o . oo o
o o oo. , oo o
oo o :

?- man(X).
X = peter ;
X = jimmy ;
o

o o .
o (peter, jimmy, helen) . o
o o , Prolog . , o peter
, o Peter . o , o X o man(X)
o: " o X,
o man(X) TRUE". Prolog
( , o o) o ooo .
Prolog -. ,
. ';'
( 'No', ).
'Space' . ( ;), o X 'peter',
'jimmy' o o Prolog 'No', o o
X o ooo .

Prolog X=peter X=jimmy. o


oo o o . o
. o , o o 1:

?- man(X); woman(X).
X = peter ;
X = jimmy ;
X = helen ;
No

?- woman(X); man(X).
X = helen ;
X = peter ;
X = jimmy ;
No

Prolog o ,
. o o o oo Prolog o
o , o o. A AND B
Prolog o A o B, o o
o. o : , o o oo
o ; o o oo
! o o oo oo :

1 v, . o ov o woman(helen)
man(peter) man(jimmy), o .

-9-
Prolog v.2.0

?- man(X), \+ woman(X).
X = peter ;
X = jimmy ;
o

?- \+ woman(X), man(X).
o

o o , o ( o o o)
Prolog o ( ) o. Prolog
o oo o,
( o ). oo
Prolog o , o X o
ooo. o o o o Prolog,
o o :

?- \+ woman(X).
No

o X oo o woman(X) FALSE, o \+ woman(X)


TRUE; , o X=peter. Prolog o ,
"" :

oo o \+ woman(X).
o woman(X).
o o o oo o o o
() 'woman'.
o , o woman(helen).
o, o woman(X) TRUE X=helen (o ).
o \+ woman(X) FALSE X=helen o o X o woman(X)
o , o o \+ woman(X) o , o
FALSE "No".

o o o woman(X) o oo o o
o o ( -) \+
woman(X) o o o o. (o ) oo
ooo o o o o o o
( -).

, :

?- man(X), \+ woman(X).
X = peter ;
X = jimmy ;
No

man(X) - \+ woman(X) -. man(X)

- 10 -
Prolog v.2.0

'peter' 'jimmy' o X \+ woman(X) o


ooo. , :

?- \+ woman(X), man(X).
No

\+ woman(X) - o , o o X. oo
o o X oo . X
. o \+ woman(X) FALSE, Prolog o
man(X) o \+ woman(X) o AND ( TRUE
man(X) o, o o).

o OR:

?- \+ woman(X); man(X).
X = peter ;
X = jimmy ;
No

o o fail1 \+ woman(X) o ooo man(X).

o oo o o
NOT(NOT(A))=A, : o oo .

?- \+ \+ woman(helen).
es

o, o:

?- woman(helen).
es

o :

?- woman(X).
X = helen ;
o

... o , :

?- \+ \+ woman(X).
X = _G278 ;
No

... ; - o o o o "_G278" ( ooo


1 fail=o. : " v v fail", " fail" "v FALSE" ooov o v v
ov Prolog v o : " v v FALSE", v v v
v v v ov TRUE FALSE. o "v fail" ovo o: v
v, v v fail, v FALSE. v o "v FALSE" v v oov FALSE ' .

- 11 -
Prolog v.2.0

o o underscore1 oooo o )
" "2 Prolog, o ooo
oo, o .
X; o "" Prolog:

' , o o: o
o o o woman(X). \+
.
.

o woman(X) o o X (X=helen).
o o "_G278". o
\+ woman(X) TRUE X=helen. , o _G278
o X o TRUE \+ woman(X). o , \+
woman(X) FALSE. \+ \+ woman(X) oo
TRUE (o \+ woman(X) FALSE) o X o _G278.
_G278 Prolog o o X ,
o o o ' o X.

: o o oo o
Prolog I I o
o o o o . o o
o Prolog o
o "o" , o oo o .

o oo o ooo
o o Prolog. , o o :

man(peter).
man(jimmy).
woman(helen).

o o. o o o o o,
o o , o o o
o. ' Prolog.
Prolog, o o; . o
oo o built-in Prolog, o
ooo . , o o
. o oo o
Prolog o ooo o . H Prolog o
o o ,
oo o o o o.
o o, oo o oo o o
oo, oo o o o ,
o o "" o "" o .

1 '_'.
2 . 5..

- 12 -
Prolog v.2.0

3. o o o Prolog

o o o o Prolog,
oo editors, o oo. o o o
oo SWI-Prolog, o o Prolog
ISO Standard.

SWI-Prolog :

... o prompt1:

?-

o:

?- halt.

... .

o , o:

?- shell.

... Command line:

1 SWI-Prolog prompt (.. 4 ?-).


(history
file) . prompt '?- h.' Prolog
, .
- , prompt '?- !n.' ( n
).

- 13 -
Prolog v.2.0


exit.

SWI-Prolog on-line help. prompt:

?- help.

... manual :

Help > Online Manual SWI-


Prolog. Help .

(source files) Prolog extension *.pl *.pro *.swi.


ASCII files extension
. Prolog
editor.

Prolog ( ) built-in editor


o consult/1 argument user. ,
prompt - .
editor Ctrl-Z:

?- consult(user).
|: :
|: :
|: :
|:
|: :
|: :
|: :

- 14 -
Prolog v.2.0

|: ^Z
% user://1 compiled 0.01 sec, 516 bytes
Yes

o o o o ' o oo,
oo file. ,

.

, File>New File>Edit
editor ( Windows
notepad). SWI-Prolog SWI-Prolog-Editor (
site http://www.bildung.hessen.de/abereich/inform/skii/
material/swing/indexe.htm) ,
:

(
program.pl), oo Prolog File>Consult,
o o:

?- consult(program).
% program compiled 0.01 sec, 896 bytes
Yes

Prolog
. o extension o *.pl. o source file o
extension, o argument consult/1 o o o file
o :

?- consult('program.ext').
% program.ext compiled 0.01 sec, 896 bytes
Yes

- 15 -
Prolog v.2.0

, o source files, oo ooo o


format:

?- [program].
% program compiled 0.02 sec, 572 bytes
Yes

...o ooo oo o files o:

?- [program1,program2,program3,program4].
% program1 compiled 0.02 sec, 572 bytes
% program2 compiled 0.05 sec, 932 bytes
% program3 compiled 0.03 sec, 692 bytes
% program4 compiled 0.01 sec, 322 bytes
Yes

o o o o o ,
. oo,
o o "" o o .
Prolog, oo o oo, o .
o o 1. ,
o o oo, o
.o..

o o o , o:

?- listing.
man(peter).
man(jimmy).
woman(helen).
Yes

... o :

?- listing(man).
man(peter).
man(jimmy).
es

source
file , .
man(peter) man(jimmy), man/1
woman/1 ( Prolog,
).

1 auto-executable vo (. 11)

- 16 -
Prolog v.2.0

4. Facts Arguments

o o oo :

mother_of(helen,peter).
mother_of(helen,jimmy).
mother_of(jenny,george).

o o o o o. o o
o o o oo-AND. o oo
-. o mother_of o o (functor)
o o o (.
son_of) o o .
o o oo o . o o o
o o oo o .

o o oo :

?- mother_of(helen,peter).
Yes

oo, . "o helen;"

?- mother_of(helen,X).
X = jimmy ;
X = peter ;
No

"o o peter;"

?- mother_of(X,peter).
X = helen ;
No

Prolog o "" "". o


o o o o argument, o:

?- mother_of(X,Y).
X = helen
Y = peter ;

X = helen
Y = jimmy ;

X = jenny
Y = george;
No

- 17 -
Prolog v.2.0

"-" o o . o
o oo o o o
:

?- mother_of(X,X).
No

... Prolog : o o oo o o
o o o o o o.

oo o o o o Prolog
o . :

?- mother_of(X,_).
X = helen ;
X = helen ;
X = jenny ;
No

o o o underscore ("_").
o underscore o arguments, Prolog . .
o o o "-o",
o o, :

?- mother_of(_,_).
Yes

o o ooo ,
o o o . o , o
mother_of(_,_) o arguments o (
mother_of(X,X) o oo). Prolog o
.

, :

?- mother_of(_).
No

...o mother_of o o .

oo o o o o .
:

?- mother_of(X,Y1), mother_of(X,Y2).

" o (Y1 Y2) o o (X)"

- 18 -
Prolog v.2.0

o o o peter o jimmy, o oo o
oo:

?- mother_of(X,Y1), mother_of(X,Y2).
X = helen
Y1 = peter
Y2 = peter ;

X = helen
Y1 = peter
Y2 = jimmy ;

X = helen
Y1 = jimmy
Y2 = peter ;

X = helen
Y1 = jimmy
Y2 = jimmy ;

X = jenny
Y1 = george
Y2 = george ;
No

. o Prolog o o
o . o Y1 Y2 o .
o o o o! oo, o:

?- mother_of(X,Y1), mother_of(X,Y2), \+ Y1==Y2.


X = helen
Y1 = peter
Y2 = jimmy ;

X = helen
Y1 = jimmy
Y2 = peter ;
No

o oo == ( o o Prolog
oo 10).

o o helen , oo ooo
X:

?- mother_of(_,Y1), mother_of(_,Y2), \+ Y1==Y2.


Y1 = peter
Y2 = jimmy ;

- 19 -
Prolog v.2.0

Y1 = peter
Y2 = george ;

Y1 = jimmy
Y2 = peter ;

Y1 = jimmy
Y2 = george ;

Y1 = george
Y2 = peter ;

Y1 = george
Y2 = jimmy ;
No

o o o oo o X
o Y1 o Y2 o
.

- 20 -
Prolog v.2.0

5. Prolog Objects

, o o o o ooo Prolog o o
prolog objects o :

) CONSTANTS ()

o o atoms integers. atoms o o o


o o . strings1 oo
oo ( o ) sub-atoms.

o atoms:

john jOHN 'JOHN' b019 tell_mE 'c d'

o atoms:

18ab John _alpha tell-me

o integers o :

0 1 2 -41 6221

"" Prolog o o (reals). o . o o


o o o o o (integers). o o
o oo o oo, o Prolog o
ooo, o o o ( ,
o , oo .)

) VARIABLES ()

ooo o underscore
. :

Answer Tell_me WHAT _get _ _45E8

o . o o
underscore o " " Prolog. oo
o o o underscore oo o . o
Prolog (o ) ooo o
o o o o , o "" o oo
o o.

1 strings Prolog v o 14 .

- 21 -
Prolog v.2.0

) COMPOUND OBJECTS ( )

o o compound object, :

time(23,15,20)

o compound object oo o :

date(wednesday,16,8,2006)

compound objects:

now(date(wednesday,16,8,2006),time(23,15,20))

Prolog compound objects o o o


oo compound object:

X = now(date(wednesday,16,8,2006),time(23,15,20))

- 22 -
Prolog v.2.0

6. o

Prolog o o -o o o
oo o . , o (
), o ooo . 3
o o o oo oo-oo o o
o. o o
oo o.

- o write/1:

?- write(hello).
hello
es

?- write('hello there').
hello there
Yes

?- write(' ').

Yes

?- X=hello, write(X).
hello
X = hello ;
Yes

o o o argument,
(o "Yes" Prolog
). o write/1:

?- write(one), write(two), write(three).


onetwothree
Yes

, write/1:

?- write(one), write(' '), write(two), write(' three').


one two three
Yes

ooo tab/1: tab(X) " X ":

?- write(one), tab(4), write(two), tab(4), write(three).


one two three
Yes

- 23 -
Prolog v.2.0

nl/0:

?- write(one), nl, write(two), nl, write(three).


one
two
three
Yes

ooo o o o ,
true/0 o :

?- true.
Yes

... fail/0 o o :

?- fail.
No

oo
.

- 24 -
Prolog v.2.0

7. Prolog

o o oo o o (facts).
Prolog o o
o o. oo o o o
Prolog.

, Prolog o:
Head :- Body.
o (Head) o (Body) oo (:-) o
Head Body neck. .
o : "o Head , o Body". o o o neck
o o-IF. o Body o Head o .

o Body o oo oo , o
Head o . o o
Prolog Horn clauses o o. o Prolog oo
o Body (o Head , )
:
fact :- true.
11 o o "" Head, o ooo
o : o Body o (autoexecutable goals).
ooo o o oo Prolog o
"Head :- Body." o Head, Body o .

, o :

mother_of(helen,peter).
mother_of(helen,jimmy).
mother_of(jenny,george).
brothers(X,Y):- mother_of(Z,X), mother_of(Z,Y), \+ X==Y.
brothers2:- brothers(X,Y).
brothers3:- brothers(X,Y), write(X), nl, write(Y), nl.
brothers4:- brothers3.

o o o o o 5.
o o o "-", o o
brothers/2 o ooo o Body o 5.
"o X o Y o o ".
brothers2/0, brothers3/0 brothers4/0 o o o
brothers/2 o o o .

- o brothers/2:

?- brothers(X,Y).
X = peter
Y = jimmy ;

- 25 -
Prolog v.2.0

X = jimmy
Y = peter ;
No

, 5 Prolog o Body brothers/2


:

?- mother_of(Z,X), mother_of(Z,Y), \+ X==Y.


Z = helen
X = peter
Y = jimmy ;

Z = helen
X = jimmy
Y = peter ;
No

helen brothers(X,Y). o Prolog o


o o o. oo ,
o oo o oo
. brothers2/0. o o : " brothers2 TRUE
brothers(X,Y) TRUE". o o:

?- brothers2.
Yes

"Yes", o o Prolog .
Prolog o o
. , o:

?- brothers2(X,Y).
no

... , brothers2 o o
o brothers2 o o. o o o
brothers2 :

brothers2(X,Y):- brothers(X,Y).

... X Y oo .

o :

?- brothers3.
peter
jimmy
Yes

- 26 -
Prolog v.2.0

brothers3 o. o
o write/1. o o o Prolog o
"Yes" ( brothers2) o TRUE. o
o X peter o Y jimmy o,
brothers(X,Y), Prolog o
o o . o Prolog
brothers3 TRUE.

o, brothers4:

?- brothers4.
peter
jimmy
Yes

... brothers3 o .

o o Prolog: o
oo o oo. , o , Prolog
o TRUE ( oo ). o
o ooo o Head o oo o Body o.
o Body , .o.. o
o. o , o (o
oo TRUE) (o oo
- o oo o o Head o).
Prolog o o (o ) oo o
o o o.

oo o o o o "o"
. o o o:

man(peter).
man(jimmy).
:
:
woman(helen).
woman(jenny).
:
:
parent_of(peter,jenny).
parent_of(helen,peter).
:
:

o o oo o o
o. o o o oo o o
relation(X,Y) : "o X relation o o Y".

- 27 -
Prolog v.2.0

father_of(X,Y):- parent_of(X,Y), man(X).


mother_of(X,Y):- parent_of(X,Y), woman(X).

" X o Y, o o Y ". o o
mother_of/2.

son_of(X,Y):- parent_of(Y,X), man(X).


daughter_of(X,Y):- parent_of(Y,X), woman(X).

" X o Y, o Y o o X o X ". o
o X o Y parent_of/2 son_of/2 o o o argument o
. o o daughter_of/2.

grandfather_of(X,Y):- parent_of(X,Z), parent_of(Z,Y), man(X).


grandmother_of(X,Y):- mother_of(X,Z), parent_of(Z,Y).

" X o o Y, o X o oo Z o ooo o o Y o X
". grandmother/2 o o: " X o Y, X
oo Z o ooo o o Y". o mother_of(X,Z) o
parent_of(X,Z), woman(X), o o grandfather_of/2 grandmother_of/2
o.

brother_of(X,Y):- parent_of(Z,X),parent_of(Z,Y),\+ X==Y,man(X).


sister_of(X,Y):- daughter_of(X,Z), parent_of(Z,Y), \+ X==Y.

oo o o. brother_of/2 o o facts: "o X


o Y, o X Y o o o, o o o o X ".
sister_of/2 o o o , o o o daughter_of/2: "
X o Y, X oo Z o ooo o o Y o X Y
o ".

uncle_of(X,Y):- parent_of(Z,Y), brother_of(X,Z).


aunt_of(X,Y):- sister_of(X,Z), (father_of(Z,Y); mother_of(Z,Y)).

" X o o Y, o o (Z) o Y". " X o Y,


oo (Z) o ooo o Y".

o o (locality) o o
. oo oo , o o, o o
, o o o o .
Prolog local . o X o Head o
o X o Body o o o
X o o ooo o o . o
o o o o o o o. o,
o o o .

o , ( 14)

- 28 -
Prolog v.2.0

o oo (
2) oo o Prolog
oo.

- 29 -
Prolog v.2.0

8. Backtracking ()

o o :

man(peter). man(jimmy). man(george).


woman(helen). woman(jenny). woman(mary).
goal0:- man(X).
goal1:- man(X), write(X), nl.
goal2:- man(X), write(X), nl, fail.
goal3:- man(X), write(X), nl, woman(X).
goal4:- man(X), woman(X), write(X), nl.

o o o o o o o o
o, . Prolog o o o o
new line. oo o o o o
o , o o o o o o.

o :

?- man(X).
X = peter ;
X = jimmy ;
X = george ;
No

..o o o, o o .

?- goal0.
Yes

o , goal0/0 arguments, Prolog o o


oo o o . o goal0/0 man/1 oo
TRUE oo o, o Yes Yes Yes Yes.

?- goal1.
peter
Yes

goal1/0 o o goal0/0 o oo.


o o o TRUE o o o
X (X=george) o .

?- goal2.
peter
jimmy
george
No

- 30 -
Prolog v.2.0

goal2/0 o o o
o "fail" o o o oo . o o. o
! o o .
o o No. , Prolog :

o oo goal2/0. man/1 o
X=peter, write(peter) nl/0 ( o o
o ) o fail, oo .
goal/2; . Prolog o
o X=peter o
TRUE. o o o ( o fail/0)
( nl/0) o
TRUE o o. nl/0 Prolog
o o o oo o
write/1. o oo o o (, o
, o ;) o o man/1.
oo o X=peter o TRUE o o:
X=jimmy. X o o
o o write(jimmy) nl/0
o fail. o o man/1 o
X=george . Prolog
oo oo,
goal2/0.

o o "o o " o ,
o Prolog oo backtracking.

o oo, o o oo
ooo oo o ( man/1) o ooo o
(. write/1, nl/0, fail/0). o (non-deterministic)
o (deterministic).

ooo o o backtracking, oo o
o o. o o oo
fail/0 oo o oo ,
woman/1 goal3/0. o o o o:

?- goal3.
peter
jimmy
george
No

, o o o oo o backtracking o o,
. oo o oo oo o
o oo o backtracking o ,
- o , o o o

- 31 -
Prolog v.2.0

o o. oo backtracking Prolog
o, o cut, o o ooo o o
13.

o, goal4/0 o fail o o backtracking o o


man/1 woman/1 o write/1.
:

?- goal4.
No

- 32 -
Prolog v.2.0

9. Matching ()

o o o o o o fact:

now(date(wednesday,16,august,2006),time(23,15,20)).

o o o o compound object TRUE. ,


oo o o :

?- now(X,time(Y,15,20)).
X = date(wednesday,16,august,2006)
Y = 23
No

Y 23 X :
date(wednesday,16,august,2006). Prolog o o
o . oo Prolog facts o
oo , matching. o matching (,
o) o o -o- o o . o
, o o o oo. oo ( o matched)
o o, ' o o o o functor o o arity. o
o o. o , o functor
o o o o (now) o arity (2). o o argument
o o date(wednesday,16,august,2006)
matched o o argument o fact, arguments o o o o
functor (time), o arity (3) arguments o oo -o- o Y
23. o :

?- now(date(X,16,_,2006),_).
X = wednesday ;
No

o , o o oo o oo matched
oooo o. oo o, o arity:

?- now(date(X,16,_,2006),_,_).
No

?- now(date(X,9,_,_),_).
No

...o 9 o matched o 16...

?- now(gate(X,16,_,_),_).
No

- 33 -
Prolog v.2.0

...o o gate o date.

o matching oo o o goal
facts o o , o
o o o oooo o.

o matching o-o o, o
o oo o o o:

o :

sum(5).

... :

?- sum(5).
Yes

..., Yes...:

?- sum(2+3).
No

: o o o! o 5 matched o 5 o 2+3.

o, o o:

sum(2+3).

... o:

?- sum(5).
No

... o, :

?- sum(X).
X = 2+3 ;
No

... o o o matched o fact . ,


o matching o oo o "" , :

?- sum(2+X).
X = 3 ;
No

- 34 -
Prolog v.2.0

... (o) :

?- sum(3+X).
No

- 35 -
Prolog v.2.0

10. I

oo ooo o oo = o
o , oo . Prolog
o o o o , o
o o "" o o. Prolog
4 o ( =, ==, =:=, is ), oo
o ooo:

?- 5=5.
Yes

o oo = o o o ( o matched).

?- hello = hello.
Yes

o :

?- X = hello.
X = hello ;
No

matching:

?- X=5.
X = 5 ;
No

..., , o matching o:

?- 5=X.
X = 5 ;
No

... :

?- X=4+1.
X = 4+1
No

o is o oo o o o:

?- X is 4+1.
X = 5 ;

- 36 -
Prolog v.2.0

No

... o o o:

?- 4+1 is X.
No

o :

?- 5 is 5.
Yes

... o ...

?- hello is hello.
No

... o o o.

oo, Prolog
o o :

?- is 5, X is 6.
No

?- X=5, X=6.
No

...o o o X=X+1 o ooo o


o o, o o FALSE.

o =:= oo o :

?- 4+5 =:= 3*3.


Yes

... :

?- X =:= 4+5.
ERROR: =:=/2: Arguments are not sufficiently instantiated

... o :

?- hello =:= hello.


No

o oo == o :

- 37 -
Prolog v.2.0

?- 5 == 5.
Yes

... :

?- hello == hello.
Yes

... oo:

?- 5 == 4+1.
No

...o :

?- X == 5.
No

o X==5 oo TRUE o o o X oo
, :

?- X=5, X == 5.
X = 5 ;
No

o == o o , o (unbound
ariables). unbound o o :

?- X == X.
X = _G224 ;
No

... :

?- X == Y.
No

o oo = o unbound . ooo
o o :

?- X = Y.
X = _G206
Y = _G206 ;
No

oo, o Prolog o o o o :

- 38 -
Prolog v.2.0


= matching.
, .
o .
is oo o o
.
o .
=:= oo o .
.
(
== ooo).
, o o.

- 39 -
Prolog v.2.0

11. Auto-Executable Goals

o o oo o Prolog o
o:
Head :- Body.

o o Head o Body oo
. o Prolog o o .
o , o o :

Head :- true.

o o true o:

Head.

o Head:-Body. o o Body,
o o Head. o o:

:- Body.

o o: o o o o Body
o consult. :

:- write('NOW LOADING PROGRAM'), nl.


:
:
: (o oo)
:
:
:- write('Ready to answer your questions'), nl.

o oo o o (auto-
executable goals). Prolog o file, o o goal o o
:

NOW LOADING PROGRAM

, - o o oo (o
Prolog Workspace, o ) o o o auto-executable goal
o o:

Ready to answer your questions

( o) o prompt:

- 40 -
Prolog v.2.0

?-

, auto-executable goals o .
oo built-it o Prolog o o o o
o o. o o:

:- consult(filename).

file, o o o o Prolog files (. o).

, Prolog
. o oo
/*, */ %:

/*
, /* */
o, .
*/

% o, o end-of-line

- 41 -
Prolog v.2.0

12. Recursion (o)

oo o o
( oo) o o o o. recursion
(o) Prolog.

o o :

parent(alex,bill).
parent(bill,charlie).
parent(charlie,don).
:
:
: % (n o)
:
:
parent(simon,timothy).

o o o o o-o. o o
o o o oo-oo. o
ancestor(X,Y) o "o X oo o Y". oo o :

ancestor(X,Y):- parent(X,Y);
( parent(X,Z), parent(Z,Y) );
( parent(X,Z), parent(Z,W), parent(W,Y) );
:
:
: % (n o)

" X o oo o Y o, o o, oo o ."
o o o o , n
o. , oo :

ancestor(X,Y):- parent(X,Y).
ancestor(X,Y):- parent(X,Z), parent(Z,Y).
ancestor(X,Y):- parent(X,Z), parent(Z,W), parent(W,Y).
:
:
: % (n )

... , n .

o o o:

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

- 42 -
Prolog v.2.0

... o o : "o X oo o Y o oo Z
o ooo oo o Y". o o o
o ancestor/2 o . o o ancestor/2,
oo o o ! o ooo o
o o ; o "" o ancestor/2 o
oo , .
, o "" o oo o o o
o o . o o o
o ooo o ancestor/2. o o o
oo oo "o": o ooo.

o o, o o o o oo oo
, o o oo o
o . o o, o
o ( ancestor/2) o o o
o o.

oo, o :

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

o o :

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

o:

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

o o o o,
o:

?- ancestor(stranger,bill).

... no, o, Prolog oo loop


ancestor/2 o stranger oo o oo1.
o o o Prolog o.
oo o oo oo o o, o o
, oo Prolog o
.

o , parent/2 o ancestor/2
. o , o o
o o .

o o o o; ,
o o o

1 v oov o o "oo oo".

- 43 -
Prolog v.2.0

o1.

o o :

% oo oo
paragontiko(1,1).
paragontiko(X,Y):- X2 is X-1,
paragontiko(X2,Y2),
Y is Y2*X.

"o o o 1 1 o o oooo o o X o
o o ooo o oo X."

o oo o oo :
o oo o o ( )
oo o o o +1. o o
o " " o .

oo o o :

?- paragontiko(4,X).
X = 24

o o o Prolog
o o o o o o
o o . o o step-
by-step debugging2 (-- )
Prolog. oo "" o "o
o o o 4;"

1 Prolog o o o o goal paragontiko(4,X) TRUE. o


o o o . o
o o match o 4 o 1
o o o argument o oo.

2 o o o
o o 4 o X o o X o Y o
. o X o ! Prolog
local o o o o. , ooo o
( ).

3 Prolog o o TRUE FALSE,


o . oo o
1 v o v o , oo v ooo ov o oo Kowalski: "o o
o v v, o o oo (v) v". vv oo o optimization
v oo Prolog. v o o oo v, o v o
.

2 . 16.

- 44 -
Prolog v.2.0

ooo o (3) o paragontiko(3,Y2).


Y is Y2*X , o
TRUE.

4 o o o . o
o o 3 o 1 o o
o .

5 oo o ooo o (2) o
paragontiko(2,Y2), o
o .

6 , o o , oo o
ooo o (1) oo o , paragontiko(1,Y2).

7 o o goal paragontiko(1,Y2) , o Y2
1 o TRUE. o o
paragontiko/2 TRUE.

8 o o paragontiko(2,Y2)
o (o 1),
. o Y is Y2*X ( X=2, Y2=1) o o (2)
o 2! o o .

9 o o o TRUE, o
o o : Y is Y2*X X=3 Y2=2. o o (6)
o 3! o TRUE.

10 o o o goal: Y is Y2*X,
o X=4 Y2=6. o Y 24 ( ) o goal
.

oo o o :

?- paragontiko(X,24).
ERROR: is/2: Arguments are not sufficiently instantiated

... o is/2 o oo o o 1.

o Prolog oo :

?- paragontiko(4,X).
X = 24

... No o X = 24. Prolog "o" o

1 ov o v o v ov ov o o. . 14 o v
v vv.

- 45 -
Prolog v.2.0

o . o "" o 7 o
oo. Prolog o .
o ooo, o 1 o matched o X
o Y2 o Y. , o backtracking,
Prolog o o oo o o
. loop, o oo o
o o 0 o -1, o -2, o -3,... o, o
, o o o o o 1.

o :

% loop Prolog
loop:- loop.

o o o o ooo o o. o:

?- loop.

... Prolog oo "o" loop o o o


loop TRUE. o o o loop o head o o
body. , o o body, loop. o body
loop, oo o o. o o o
o loop o head o o body o, o loop! o o
Prolog o oo o o
o o . o , ...

o o :

%
count(X):- write(X), nl,
NewX is X+1,
count(NewX).

o o, o count/1 oo o argument, o
o , , oo o o o
count/1 o oo o. :

?- count(15).
15
16
17
18
19
20
:

- 46 -
Prolog v.2.0

o, o .
goal, o oo o. o o o
o ( ) o o :

count(18).
count(X):- write(X), nl,
NewX is X+1,
count(NewX).

?- count(14).
14
15
16
17
Yes

o 17, o o :

?- count(19).
19
20
21
22
:
:

...o .

o () 'o o .
o o o o tail recursie. o
o , :

% ""
badcount1(X):- write(X), nl,
NewX is X+1,
badcount1(NewX),
nl.

o o ooo o o nl
o . o :

?- badcount1(1).
1
2
3
:
:

- 47 -
Prolog v.2.0

1514
:
:
50778
ERROR: (user://1:47):
Out of local stack

Out of local stack; o ; o nl/0 !


o nl/0. nl/0 o body o . o
o . o o Prolog pointer nl/0
o . o pointer
! o o . o Prolog
o , bytes o o o o o
stack1.

o o o tail recursion o ,
o . ,o o o
, ...

, . oo o tail recursie.
o o o o oo . ,
o o argument paragontiko/2 Out of local stack2.

% o ""
badcount2(X):- write(X), nl,
NewX is X+1,
badcount2(NewX).
badcount2(X):- X<0,
write('X is negatie'),nl.

?- badcount2(1).
1
2
3
:

1 Prolog oo v o v stack () ov ooo o ov vv o


backtracking.

2 v paragontiko/2 v "o" o v v tail recursive. :

parag(X,1):- 1 =:= X.
parag(X,Y):- X2 = X-1, Y = Y2*X, parag(X2,Y2).

paragontiko(X,Y):- parag(X,Y1), Y is Y1.

?- paragontiko(4,X).
X = 24

?- parag(4,X).
X = 1 * (4 - 1 - 1) * (4 - 1) * 4

- 48 -
Prolog v.2.0

:
1704
:
:
29870
ERROR: (user://2:50905):
Out of local stack

o o ,
o o o. oo o .
o o o . o
Prolog oo pointer ,
o o o fail. pointers o o o o
stack .

% E o ""
badcount3(X):- write(X), nl,
NewX is X+1,
check(NewX),
badcount3(NewX).
check(Z):- Z>0.
check(Z):- Z<0, write('X is negatie'),nl.

?- badcount3(1).
1
2
3
:
:
:
19530
ERROR: (user://3:80820):
Out of local stack

o oo o
o o. check/1 oo o o o o
o. pointers o...

o oo o o tail recursie,
o . o "o ' o", o o
, o .

- 49 -
Prolog v.2.0

13. Cut (!)

o cut -o Prolog o o backtracking. o


"!" o o ' :

man(peter). man(jimmy). man(george).


a:- man(X), write(X), nl, fail.
b:- man(X), !, write(X), nl, fail.
c:- man(X), write(X), nl, !, fail.
d:- !, man(X), write(X), nl, fail.
e:- man(X), write(X), nl, fail, !.

?- a.
peter ;
jimmy ;
george ;
No

o o o o backtracking o fail, oo
o ooo man/1.

?- b.
peter ;
No

b/0 a/0 o cut o oo man/1. o ! o : man(X)


o (X=peter). oo o cut, (o ooo
TRUE) write(X) peter. nl/0 o fail.
Prolog o backtracking, o -
o oo o o . nl/0 , o
write/1 o backtracking o cut. o cut -
man/1, o cut o backtracking o goal b/0
o. o cut o o oo o . o
oo (o o = o
) o cut TRUE o o ( ). o backtracking,
, o cut o "" o o.

, a/0 o backtracking o fail o man(X), b/0 o fail o !


c/0 o fail o ! o o , o o o
o:

?- c.
peter ;
No

d/0 o backtracking - man/1 o !,

- 50 -
Prolog v.2.0

o o a/0:

?- d.
peter ;
jimmy ;
george ;
No

o, e/0, o ! o fail, o 1.

?- e.
peter ;
jimmy ;
george ;
No

o o o o !, o o o
o o:

o cut (!) o body , o :

() o o backtracking o o, o : o
o o o o o ( o o) o !
o o o o backtracking. o o
o o oo o, o o ! o
TRUE.

() o Prolog o o functor o head.


o o o cut, oooo pointers
o o (pointers o o )
o o o .

oo o (). o o oo o o ():

not1/1 o TRUE o FALSE, FALSE


o TRUE2.

not1(X):- X, !, fail.
not1(_).

o o: " o not1(X), o X". FALSE o


o o Prolog o o, o ooo TRUE
. o X TRUE, o o o ! o : "
oooo o , not1(X) " fail. oo

1 v, fail/0 oo vo v body. v v v v o fail


o o v o oo .

2 not1/1 \+, built-in not/1.

- 51 -
Prolog v.2.0

o o backtracking o ! not1(X) FALSE.

?- not1(1=2).
Yes

?- not1(2=2).
No

o o o !, o o o :

?- not1(2=2).
Yes

"oo" oo o o ! o o
o: o tail recursion o o o .
, :

1 x < 10
f ( x) =
2 x 10

o Prolog ' 2 arguments: oo


oo. Prolog ( '
oo) o (. f(15)=2), o
o TRUE FALSE. oo o o:

f(X,Y):- X<10, !, Y=1.


f(_,2).

" o X <10, o o . o Y 1. ooo o X,


o Y 2".

?- f(4,X).
X = 1 ;
No

?- f(14,X).
X = 2 ;
No

- 52 -
Prolog v.2.0

o ! Prolog oo o o X<10
o :

?- f(4,X).
X = 1 ;
X = 2 ;
No

o :

a:- (b;c), !, fail.


b:- write(b),nl.
c:- write(c),nl.

?- a.
b ;
No

o cut o o backtracking o c o (b;c) o b true.

o oo o o cut o o o
oo , o cut o o cut red. o cut o
o o efficient o o o o o
(. o oo), o cut
o o cut green. Green cuts ooo o
o . oo o !
, oo o ooo backtracking. o o, o backtracking
o oo loop, o o oo
(. 12). , o :

paragontiko(1,1).

:
paragontiko(1,1):- !.

o o o o
o backtracking.

- 53 -
Prolog v.2.0

14.

(list) o o o Prolog o LISP1.


-, o o o ([]).
:

[1,2,3] [abc,'JOHN',4711,date(10,june,2006)]

, o o oo. oo
:

[4,[yet,f(2,a(1,4))],[4,3,f,2,[0]],end]

, o oo o o o o o oo:

[bill] bill

o (empty list) o o :

[]

o : o "o" , o o o
oo o. o o oo head o
o tail. . [1,2,3] o head o oo 1 o tail [2,3]. Prolog
o , o
. o o head o tail unbound2 .
matching o o o
o [Head|Tail], o Head, Tail o | o
oo o oo (o "").

, ( o ) head
tail. o tail , o head oo .
o o :

chop(LIST,HEAD,TAIL):- LIST = [HEAD|TAIL].

?- chop([1,2,3],H,T).
H = 1
T = [2,3] ;
No

?- chop([2,3],H,T).
H = 2
T = [3] ;
1 LISP o o vo : LISP = LISt Processing

2 o v

- 54 -
Prolog v.2.0

No

?- chop([3],H,T).
H = 3
T = [] ;
No

?- chop([],H,T).
No

o o head [] , o oo
( head).

?- chop([[1,2,3],4,5],H,T).
H = [1,2,3]
T = [4,5] ;
No

o head ; , o o oo o .

chop/3 oo o o o matching ( oo o =)
:

chop([H|T],H,T).

o o o chop/3 o o!!

?- chop(L,5,[10,20]).
L = [5,10,20] ;
No

o chop/3 o o
arguments o o ooo oo, chop/3 ! o
o . o mother_of/2
o o oo ooo o
o . Prolog oo o
o o o "o" "o" arguments.
ooo , o oo o o o
o o ( oo oo).

o "o" oo o
arguments oo o . o. o
( o-o), .
, o body cut o
o . o ( cut)
o , o o green cut
. o o o o
o ( o ). o o

- 55 -
Prolog v.2.0

o o ooo .
o o 1 oo
o o o o o. . paragontiko(X,Y)
o oo o X oo o Y oo
o oo o o oo o X oo o Y
oo. o o o o o 15.


+, -, ? . ..:

function(+Arg1,-Arg2,?Arg3)

o oo + o argument o oo .
oo o unbound
o .

o oo - o argument o oo. oo
o unbound bound
oo .

o oo ? o argument o oo o oo
oo oo .

o manuals Prolog o
ooo .
chop/3 :

chop(?List,?Head,?Tail)

... .
?, .
paragontiko/2 :

paragontiko(+Number,-Result)

... .
.

o :

' member/2. o o oo
.

1 v o v v . . v 3 o o v (i,i,o)
(input-input-output, 2 o ov o v o o o o
), (i,o,i), (o,o,i), ... , 9 .

- 56 -
Prolog v.2.0

member(X,[X|_]).
member(X,[_|T]):- member(X,T).

o o oo "o X oo o X o head
, o o oo ". o o o: "o X
oo , oo o tail , o ( o
head) o ".

?- member(2,[1,2,3,4]).
Yes

?- member(5,[1,2,3,4]).
No

chop/3, o o ""
:

?- member(X,[1,2,3,4]).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
No

o oo o o
o o "o" "-o",
o o oo . o o oo. oo
o , Prolog
oo o oo o ,
o .

o append/3. append o
o , o :

[1,2,3] + [4,5] = [1,2,3,4,5]

(o o argument o o):

append([],L,L).
append([H|T],L1,[H|L2]):- append(T,L1,L2).

" ooo , ". o


append([],L,L) append(L,[],L), o o o, o
o o o (o o )
.

o : " o o , o head (H) { o [H|

- 57 -
Prolog v.2.0

T] }, o o tail (T) (L1) { append(T,L1,L2) }


o o (L2) o o head o , o o [H|L2]".

?- append([a,b,c],[d,e],X).
X = [a,b,c,d,e] ;
No

?- append(X,[d,e],[a,b,c,d,e]).
X = [a,b,c] ;
No

?- append([a,b,c],X,[a,b,c,d,e]).
X = [d,e] ;
No

o o ooo o o "" append/3:

take(L,X,L2):- append(B,[X|A],L),
append(B,A,L2).

o L oo X, append o
o: o [X|A] o o oo o X o B o o oo o
X. append B A , o o argument take/3.
o , :

?- take([a,b,c,d,e],c,L).
L = [a,b,d,e] ;
No

take/3 oo . o o o
o . o o o o o
o, o oo o o.

Prolog strings ( ). String Prolog


o , : "ABCD". o Prolog
o string:

?- X = "ABCD".
X = [65, 66, 67, 68] ;
No

Prolog o o strings. o o . o
oo ASCII o o string.

- 58 -
Prolog v.2.0

15. Built-In

o :

man(peter). man(jimmy). man(george).

, o:

?- man(X).
X = peter ;
X = jimmy ;
X = george ;
No

Prolog . o:

?- once(man(X)).
X = peter ;
No

o , o , . once/1 o
o o .
Prolog :

once(Goal):- Goal, !.

o repeat/0. repeat/0
o o o o :

repeat.
repeat:- repeat.

o, o oo loop o
. , o o o o o backtracking.
oo :

?- repeat, write('HELLO'), nl, fail.


HELLO
HELLO
HELLO
HELLO
:
:
:

o , o repeat/0 fail/0. fail oo o


backtracking repeat TRUE o .

- 59 -
Prolog v.2.0

, member/2 append/3 ,
Prolog , built-in 1.

Prolog, o, o oo
oo ( o). o o o
oo , . " o ":

woman(X), truck_driver(X)

... o o forall/2 o o o argument


(o ) o o argument o o
o o o o . o :

?- forall(member(X,[1,2,3]),(write(X),tab(3))).
1 2 3
X=_G455 ;
No

o o side-effect o X=_G455, ooo forall/2


o X argument. "o" o o
o : (write(X),tab3)). o o oo (o o
o o functor) oo tuple.

o o
:

woman(helen). woman(jenny). woman(mary).

?- findall(X,woman(X),L).
X = _G320
L = [helen, jenny, mary] ;
No

o o argument findall/3 o o ( X). o o argument


- o o oo. o, o o
o o o .

o write/1 (output o). o o input


o oo read/1. o argument read/1 unbound
o o o oo:

?- read(Term).
|: test.
Term = test ;
No

1 member/2 Prolog o o o o "on", o


.

- 60 -
Prolog v.2.0

o o o input. oo o read/1
oo o argument. o :

?- read(password).
|: hello.
No

?- read(password).
|: password.
Yes

Input -o- o get/1 get_code/1. get_code/1


ASCII o o ooo.

?- get_code(X).
|: P{ENTER}
X = 80
Yes

?- get0(81).
|: Q{ENTER}
Yes

?- get0(81).
|: P{ENTER}
No

get/1 o o, o o o o blank ( ASCII 32


o).

?- get(80).
|: P{ENTER}
Yes

o o o o,
compound object . o o Prolog
o o o arity 1. o argument o o o o o o
o TRUE FALSE o.

var( +X)
TRUE o X unbound .

nonvar( +X)
TRUE o X o,o o unbound .

atom( +X)

- 61 -
Prolog v.2.0

TRUE, o X , .

integer( +X)
TRUE, X o.

atomic( +X)
atom/1 integer/1. TRUE o X , o.

compound( +X)
TRUE, o X compound object ( argument).

o o o o, o ooo
o o o o . o arg/3, functor/3 =../2
o o o.

arg( ?N, +Term, ?Arg)


o N-o argument o o Term. o Term o compound object
. compound object 2 arguments. o o o head
o o o tail . :

?- arg(2,append([1],[2,3],A),X).
A = _G379
X = [2, 3] ;
No

?- arg(1,[a,b,c],X).
X = a ;
No

?- arg(2,[a,b,c],X).
X = [b, c] ;
No

functor( ?Term, ?Functor, ?Arity)


o o o o functor o o arity o. o
oo o o:

?- functor(f(x,y,z),A,B).
A = f
B = 3 ;
No

?- functor(X,g,2).
X = g(_G339, _G340) ;
No

- 62 -
Prolog v.2.0

?Term =.. ?List


=.. univ (o o o o Prolog),
o object (compound ) o. o head
o o functor o object o tail o tuple arguments. :

?- X =.. [likes,paul,prolog].
X = likes(paul,prolog) ;
No

?- X =.. [12].
X = 12 ;
No

?- f(a,b) =.. X.
X = [f,a,b] ;
No

?- f(a,g(b)) =.. X.
X = [f,a,g(b)] ;
No

?- likes(a,b) =.. [X|Y].


X = likes
Y = [a,b] ;
No

?- likes =.. [likes].


Yes

?- likes =.. likes.


ERROR: =../2: Type error: `list' expected, found `likes'

- 63 -
Prolog v.2.0

16. Debugging ()

.
(debugging) . Prolog
debugging tracing o
oo - o o: o
, o matching, o o , o backtracking .
oo o o tracing o
o o "" . o o tracing o oo :

o o o o. oo o
o call redo o oo exit fail. /
ports1. o -:

exit: oo oo .
, o ,
o TRUE, oo exit.

fail: oo oo o ( FALSE).
o fail exit ooo .

call: oo o . o
oo ( o o redo) "
". o o o , o
o o ooo , oooo
pointers o .

redo: oo o .
o . o redo
o oo o fail.

oo ( o o body )
:

1 SWI-Prolog ports unify exception.


. unify call, exception
fail. on-line manual SWI-Prolog.

- 64 -
Prolog v.2.0

g:- g1, g2, g3.

o exit oo o call o fail


oo o redo oo. , call-exit o o o
, fail-redo o backtracking.
o oo o redo . , oo o fail ,
fail o o . o
o o.

, o o:

brothers(X,Y):- mother_of(Z,X), mother_of(Z,Y), \+ X==Y.

... :

brothers(X,Y) call mother_of(Z,X). fail


fail brothers(X,Y) .
mother_of(Z,X) , exit , call
mother_of(Z,Y) . fail,
redo mother_of(Z,X) .
exit mother_of(Z,X) call mother_of(Z,Y)
exit brothers(X,Y) fail .
brothers(X,Y) prompt
';' redo
brothers(X,Y) redo \+X==Y fail
redo mother_of(Z,Y) Y.

o o , o debugging.

12 13:

?- listing(paragontiko).
paragontiko(1,1):- !.
paragontiko(X,Y):- X2 is X-1,
paragontiko(X2,Y2),
Y is Y2*X.
es

- 65 -
Prolog v.2.0

o o tracing oo o trace/0,
:

?- trace, paragontiko(4,X).
Call: (9) paragontiko(4, _G336) ?

Prolog debug-mode.
""
. mode Prolog
.
'?'. 'Enter'
'c' creep,
. , 'Enter'
:

Call: (9) paragontiko(4, _G336) ? creep


^ Call: (10) _L160 is 4-1 ? creep
^ Exit: (10) 3 is 4-1 ? creep
Call: (10) paragontiko(3, _L161) ? creep
^ Call: (11) _L179 is 3-1 ? creep
^ Exit: (11) 2 is 3-1 ? creep
Call: (11) paragontiko(2, _L180) ? creep
^ Call: (12) _L198 is 2-1 ? creep
^ Exit: (12) 1 is 2-1 ? creep
Call: (12) paragontiko(1, _L199) ? creep
Exit: (12) paragontiko(1, 1) ? creep
^ Call: (12) _L180 is 1*2 ? creep
^ Exit: (12) 2 is 1*2 ? creep
Exit: (11) paragontiko(2, 2) ? creep
^ Call: (11) _L161 is 2*3 ? creep
^ Exit: (11) 6 is 2*3 ? creep
Exit: (10) paragontiko(3, 6) ? creep
^ Call: (10) _G336 is 6*4 ? creep
^ Exit: (10) 24 is 6*4 ? creep
Exit: (9) paragontiko(4, 24) ? creep

X = 24 ;

No

port . '^'
(built-in) Prolog
.
. 9 1
10, ... 1 neck
. 1 .
1 1 .
shell Prolog ( prompt)
Prolog 1.

- 66 -
Prolog v.2.0

-
.

trace, Prolog debug mode.


debug prompt:

[debug] ?-

Prolog mode nodebug/0:

[debug] ?- nodebug.
Yes

?-

, SWI-Prolog debugging.
gtrace/0 trace/0. ..:

?- gtrace, paragontiko(4,X).
% The graphical front-end will be used for subsequent tracing


tracing1

'Space':

, ,
-
. Prolog
, trace .
spy/1 nospy/1.

, :
1 , debugger prompt '?- noguitracer.'

- 67 -
Prolog v.2.0

?- spy( +Predicate_Name).

... o o call o o
Predicate_Name, o o tracing. Prolog
spy-point Predicate_Name. oo o spy-points
o.

spy-point :

?- nospy( +Predicate_Name).

o spy-points o:

?- nospyall.
Yes

- 68 -
Prolog v.2.0

17. Assert / Retract

o , o o text file. o file


consulted, o o Prolog o oo o oo (o
Prolog Workspace). o Workspace
assert/1, retract/1 . :

assert( +Prolog_Clause)
o o Prolog_Clause (o o ) o Prolog Workspace.
o clauses o o o, oo o oo .

asserta( +Prolog_Clause)
assert/1. assert/1, o
o clauses o o o Prolog Workspace, o ,
I . o a o o o o o
o.

assertz( +Prolog_Clause)
o assert/1. oo o clause o o oo
. o z o o o o .

retract( +Prolog_Clause)
o Prolog Workspace o Prolog_Clause.

retractall( +Head_Description)
retract clauses o Prolog Workspace o heads o o matched
Head_Description (o o unbound ).

; o father(bill,jack)
assert(father(bill,jack)) brother(X,Y):- father(Z,X), father(Z,Y)
assert(brother(X,Y):- father(Z,X), father(Z,Y)); ;

o o o Prolog_Clause o o
o o . o o oo ,
compound object o o o o o o o
o . o assert/1 retract/1 ooo
o1 o oo o learning "o"
. . ooo
paragontiko/2:

paragontiko(1,1):- !.
paragontiko(X,Y):- X2 is X-1,
paragontiko(X2,Y2),
Y is Y2*X.
1 o: ov vv o ooov o (data).
o interpreters compilers oov ov ov. oo
oo v oo v ov o o.

- 69 -
Prolog v.2.0

o o o o 5, o oo:

?- paragontiko(5,X).
X = 120 ;
No

o o o o 4 o oo (, o o
oo o o 5!) Prolog o oo.
assert/1 (
asserta/1). o o :

:- dynamic paragontiko/2.
paragontiko(1,1):- !.
paragontiko(X,Y):- X2 is X-1,
paragontiko(X2,Y2),
Y is Y2*X,
asserta(paragontiko(X,Y):- !).

asserta/1 clause !
Prolog.

:- dynamic paragontiko/2.

ISO Standard dynamic paragontiko/2,


asserta/1 .

. :

?- paragontiko(5,X).
X = 120 ;
No

... o 1:

?- listing.
paragontiko(5,120):- !.
paragontiko(4,24):- !.
paragontiko(3,6):- !.
paragontiko(2,2):- !.
paragontiko(1,1):- !.
paragontiko(A,B):-
C is A-1,

1 listing/0. .
source file Prolog Workspace.
Prolog Workspace _G340. listing/0
.

- 70 -
Prolog v.2.0

paragontiko(C,D),
B is D*A,
asserta((paragontiko(A,B):-!)).
Yes

oooo o o o 5 ' fact,


o o . o, o o o
o paragontiko(5,120) paragontiko(1,1).
, o o ooo o , ''
o . o
o "o" o oo o
learning, o o o o oo.

- 71 -
Prolog v.2.0

18.

o o:

father(alex,bill).
father(bill,charlie).
father(charlie,don).

o oo o ;

alex is_father_of bill.


bill is_father_of charlie.
charlie is_father_of don.

Prolog . o is_father_of
(operator). o o o o o functor, o o o
o o o o1. o o oo, o
o o o o o ( predicates), o o o.
o , o o oo
, oo o ooo oo oooo o o
o . o , o o father is_father_of
oo :

X is_father_of Y :- father(X,Y).

o o oo op/3 o o format:

op( +Priority, +Type, +Symbol)

o o oo auto-executable goal. ..:

:- op(700,xfx,is_father_of).

o o o . o
o arguments op/3:

Symbol: o oo (o o) o . ooo "oo"


"o" o o oo o o o -o
.

Priority: o 1 1200 o o o
o oo o o (1200 o
1 ). , o o oo
o o :
3+5*2 3+(5*2) (3+5)*2.

1 vo v o v v: +,-,*,/.

- 72 -
Prolog v.2.0

Type: o o o o o o o o
(o - association). ,
1-2-3 (1-2)-3, 1-(2-3) ;

o o . o
o. o o o o.

o 1 :

fx o oo o o o -oo oo
(non-associative prefix operators). o (.
man george ) oo o (
o man man george).

xf o oo o o o -oo o
(non-associative postfix operators). o (.
10%) oo o ( o
10%%).

fy o o o o oo
o (right-associative prefix operators). o
(. not X ) o o : not not X =
not(not(X)).

yf o o o o o
o (left-associative postfix operators). o
(. 5!) o o : 5!! = (5!)!

o 2 o:

xfx o oo o o o -oo o
(non-associative infix operators). o (.
alex is_father_of bill, head :- body) oo o:
head :- body :- body2.

yfx o o o o (left-
associative infix operators). o (. A-B)
o o : 3-2-1 = (3-2)-1

xfy o o o o o
o (right-associative infix operators).
o (. A^B) o o : 3^4^5 =
3^(4^5)

o : o f x, y o o, o o

- 73 -
Prolog v.2.0

o. fx "o o o ", xfy = "o


o". y o o o o o o
oo ( o f). x o o .
, yfx : "o ", xf = "o o".

o o o , o oo o .
..:

:- op(0,xfx,is_father_of).

current_op/3, format: current_op( ?Priority, ?Type, ?Symbol),


oo o o o o. ..:

?- current_op(X,Y,*).
X = 400
Y = yfx ;
No

?- current_op(X,Y,:-).
X = 1200
Y = fx ;

X = 1200
Y = xfx ;
No

?- current_op(X,Y,Z).

... o o o Prolog o o o
o, :

?- current_op(X,Y,Z), write(Z), tab(2), write(X),


tab(2), write(Y), nl, fail.

oo, oo , ooo o op/3 oo


o oo o o. ,
o greater :

:- op(800,xfx,greater).
X greater Y:- X>Y.

?- 5 greater 2.
Yes

?- 4 greater 7.

- 74 -
Prolog v.2.0

No

o ooo oo
o o . , oo o / o oo
, o o:

vowel_list([''/'',''/'',''/'',''/'','o'/'',
''/'',''/'']).
stress(X,Y):- vowel_list(L), member(X/Y,L).

( o is
) o o / o/o
stress/2 :

?- stress(,X).
X = ;
No

?- stress(X,).
X = ;
No

- 75 -
Prolog v.2.0

19. Streams

Prolog o o stream. o stream (o) o o.


o o,o: o oo, buffer, o, .
streams o o o o. o o o
o, oo o o o . o o o
stream . o o-o o o (write, read,
get0, .) oo streams, oo o argument o
o stream. .:.

o:

?- write('Message').

... o o, :

?- write('$stream'(34018),'Message').

... o o stream (stream identifier) '$stream'(34018),


. ,
stream.

/stream open/3:

?- open('myfile.txt',read,X).
X = '$stream'(67892) ;
No

open/3 o file . .
, keywords: read, write, append update. keywords
:
read

write
append
(
)
update

, o ooo :

?- open('newfile.txt',write,X).
X = '$stream'(60238) ;

- 76 -
Prolog v.2.0

No

open/3 open/3
'$stream'(xxxxx). stream identifier

. close/1 . .
newfile.txt , :

?- close('$stream'(60238)).
es

... close/1 o .

, stream identifier Prolog


. Prolog
. , ,
, , :

?- open('myfile.txt',read,StrID), process(StrID), close(StrID).


Yes

... process/1
( , read).
StrID open/3, process/1
close/ .

process/1; /
. / ooo read/2 write/2.
o o read/1 write/1, o o o o o
argument o stream identification o o oo:

read( +StreamID, +Term_to_read)


write(+StreamID, +Term_to_write)

o o o o o o o; o o
, file o file pointer o o o o
/. pointer open/3
o o read/2 write/2 o o. o pointer o
o seek/4. o format seek/4 :

seek( +StrID, +Offset, +From, -NewLoc)

o o o stream-id o, o o o o Offset
bytes file pointer, (From)
( current
pointer, eof bof ),
NewLoc o file pointer, bytes
.

- 77 -
Prolog v.2.0

. myfile.txt :

abcd.
efgh.
ijkl.

?- open('myfile.txt',read,StrID).
StrID='$stream'(67892) ;
No

read/2:

?- read('$stream'(67892),Data).
Data = abcd ;
No

read/2 (terms) Prolog, read/1.


1. :

?- read('$stream'(67892),Data).
Data = efgh ;
No

?- read('$stream'(67892),Data).
Data = ijkl ;
No

?- read('$stream'(67892),Data).
Data = end_of_file ;
No

, file pointer ,
read/2 . , end_of_file
,
.

file pointer,
(
) .
. :

1 , (. get/2 -).

- 78 -
Prolog v.2.0

?- seek('$stream'(67892),0,bof,NewPos).
NewPos = 0 ;
No

seek/4 file pointer 0 bytes (bof) .


NewPos pointer: 0 Prolog
bytes 0.

read/2 :

?- read('$stream'(67892),Data).
Data = abcd ;
No

file pointer read/2


efgh. :

?- seek('$stream'(67892),2,current,NewPos).
NewPos = 8 ;
No

?- read('$stream'(67892),Data).
Data = gh ;
No

seek/4 pointer 2 bytes . , read/2


e, g .

pointer ;
:

?- seek('$stream'(67892),0,current,NewPos).
NewPos = 12 ;
No

pointer 0 bytes
: 13 byte ( 0).

pointer; :

?- S='$stream'(67892), seek(S,0,current,SavePos),
read(S,Data), seek(S,SavePos,bof,NewPos).
S = '$stream'(67892)
SavePos = 12
Data = ijkl
NewPos = 12 ;
No

- 79 -
Prolog v.2.0

SavePos. Data
pointer SavePos bytes ,
, SavePos NewPos.
: S stream-id
.

?- seek('$stream'(67892),0,eof,NewPos).
NewPos = 21 ;
No

pointer 0 bytes end-of-file NewPos 21.


21 bytes. ! 5
. 21;

.
ASCII 13 (return) 10 (new line).
hex-editor:

... 21 bytes .

. write/2:

?- write('$stream'(67892),mnop).
ERROR: write/2: No permission to output stream
`$stream(67892)'

...
. :

?- open('myfile.txt',update,X).
X = '$stream'(67892) ;
No

file pointer 1 :

1 append, pointer ,
, .

- 80 -
Prolog v.2.0

?- seek('$stream'(67892),0,eof,NP).
NP = 21 ;
No

?- write('$stream'(67892),'mnop.').
Yes

Yes,
. editor .
. :

?- seek('$stream'(67892),-19,eof,NP).
NP = 7 ;
No

19 bytes , :

?- write('$stream'(67892),'qrst.').
Yes

... qrst.
:

?- close('$stream'(67892)).
Yes

editor :

abcd.
qrst.
ijkl.
mnop.

- 81 -
Prolog v.2.0

20. DCG-Rules

Prolog o parsers1
( ). Prolog
DCG-rules.

DCG-rules; DCG oo : Definite Clause Grammar.


Definite Clause Grammar oo . oo o
o o (o) o o oo o
o "". oo o oo
. , o oo
o oo o o. ,
o o o oo
o o 2. , o oo o o
o oo o o oo o o o o.
, o oo
. .
. oo o oo o
, o o o ( , oo
.) o o o ( o, o), o
o o , o o . o
o o , ooo
. o o o, o o.
o o o parser .
o o o o o o oo
. o ooo
ooo . o o ( o
oo) o ooo o DCG.
o o o o o o oo
o (computational linguistics).
o oo o o o oo DCG.

o DCG:

sentence --> noun_phrase, verb_phrase.


noun_phrase --> determiner, noun.
verb_phrase --> verb; verb, noun_phrase.
determiner --> [the].
noun --> [boy]; [house].
verb --> [likes].

o o o o o
o. o o Prolog o

1 parser = v ov ( )
2 o ooov v vv ovv (v, , ), v
v o v ov vo v ovv o (v
oo . FORTRAN, C, Prolog)

- 82 -
Prolog v.2.0

o ":-" o "-->". o o DCG- o rewrite rules (


) oo "" o o o (head),
oo o (body). o , o o rewrite rule "
oo oo o oo oo". o
" oo oo o oo o".
o DCG-rule oo o o o o: "o o
o oo oo oo".

oo ooo ooo o o . o
oo o o noun_phrase o o oo
o ( ), o verb_phrase o o determiner o o.
:

sentence, noun_phrase, erb_phrase, determiner, noun, erb

o oo, o non-terminals. non-terminals o o


o .

o "oo o o 'the'", o o
"o o 'boy', 'house'" o o o
o o o , o 'likes'. :

the, boy, house, likes

o terminals. terminals o o oo o o ,
o o o . terminals o
rewrite-rules o o .

o Prolog consult o DCG-, ooo built-


in phrase/2 phrase/3 o .

phrase/2 o format:

phrase( +Non_terminal, ?List_of_terminals)

o o o argument o (terminals) o oo o
o o o o argument o o o o non-terminal o o ooo
o . , o "the boy likes the house"
sentence, o:

?- phrase(sentence,[the,boy,likes,the,house]).
Yes

?- phrase(sentence,[the,boy,likes]).
Yes

- 83 -
Prolog v.2.0

...:

?- phrase(sentence,[the,girl,likes]).
No

... "girl" terminals . :

?- phrase(sentence,[the,likes,boy]).
No

... DCG.

oo o o oooo non-terminal:

?- phrase(noun_phrase,[the,house]).
Yes

?- phrase(determiner,[the]).
Yes

phrase/3 o, argument :

phrase( +Non_terminal, ?List_of_terminals, ?Rest_of_terminals)

o o argument o o o
o o o Non_terminal. :

?- phrase(noun_phrase,[the,boy,likes,the,house],R).
R = [likes,the,house] ;
No

o noun_phrase o [the,boy]. o oo R.

?- phrase(erb_phrase,[the,boy,likes,the,house],R).
No

..."No", erb_phrase.

?- phrase(verb_phrase,[likes,the,house],R).
R = [the,house] ;
R = [] ;
No

o format phrase/2 phrase/3, .


(parsing) (generation):

?- phrase(sentence,S).
S = [the,boy,likes] ;

- 84 -
Prolog v.2.0

S = [the,boy,likes,the,boy] ;
S = [the,boy,likes,the,house] ;
S = [the,house,likes] ;
S = [the,house,likes,the,boy] ;
S = [the,house,likes,the,house] ;
No

'' .
:

?- phrase(verb_phrase,V).
V = [likes] ;
V = [likes,the,boy] ;
V = [likes,the,house] ;
No

, o 1. ,
. o o o non-terminals
arguments:

sentence(N) --> noun_phrase(N), verb_phrase(N).


noun_phrase(N) --> determiner(N), noun(N).
verb_phrase(N) --> verb(N); verb(N), noun_phrase(_).
determiner(_) --> [the].
noun(singular) --> [boy]; [house].
noun(plural) --> [boys]; [houses].
verb(singular) --> [likes].
verb(plural) --> [like].

, o o " oo oo o
oo N ( ), o oo o
N." ( N Prolog.)
:

?- phrase(sentence(X),[the,boy,likes,the,houses]).
X = singular ;
No

?- phrase(sentence(plural),[the,boys,like]).
Yes

?- phrase(sentence(plural),[the,boy,likes]).
No

?- phrase(sentence(X),[the,boys,likes]).
No
1 v v o o "v" o parser v ov vo. v o
o vv o oo v v o v ov o. ooo
parsers oo v o o o v.

- 85 -
Prolog v.2.0

oo oo arguments, o o, ,
o . arguments. oo o
o o (o o, o ),
non-terminals:

sentence(sentence(N,V)) --> noun_phrase(N),verb_phrase(V).


noun_phrase(noun_phrase(D,N)) --> determiner(D), noun(N).
verb_phrase(verb_phrase(V)) --> verb(V).
verb_phrase(verb_phrase(V,N)) --> verb(V), noun_phrase(N).
determiner(determiner(the)) --> [the].
noun(noun(boy)) --> [boy].
noun(noun(house)) --> [house].
verb(verb(likes)) --> [likes].

o non-terminal o head argument o o o o


o o o o body o. o o :

?- phrase(sentence(X),[the,boy,likes,the,house]).
X = sentence(noun_phrase(determiner(the), noun(boy)),
verb_phrase(verb(likes), noun_phrase(determiner(the),
noun(house)))) ;
No

X compound object .
functor ,

:

- 86 -
Prolog v.2.0

21. Prolog

oo o Prolog. oo
.
oo . o ""
, o o o
,
. o ,
Prolog,
, o .
Prolog o o
"o" oo .
,
.
Prolog 20 Prolog.
, . Prolog
top-down top-level

(data) , , .


, o o "Logic Programming and Knowledge Engineering" o Tore
Amble:

% Prolog interpreter written in Prolog


:- op(1199,xfx,'<-').
prove(true).
prove((X,Y)):- prove(X), prove(Y).
prove(H):- (H<-B), prove(B).

logic_programming:- % is
logic, % as long as we don't use the
!, % which brings us irrevocably into
programming. % with no way of backtracking.

interpreter Prolog ,
, cut
.


"o oo". oo o o,
o . ,
( )
;

o Prolog compiler
o o o , o .

- 87 -
Prolog v.2.0

optimization
, C.
, Prolog.
Prolog C,
C Prolog
Prolog C.

Prolog '70 ,
. SWI-Prolog
modular programming, multi-threaded , constraint
programming, ,
.

Prolog
manual compiler
.
"Programming in Prolog" Clocksin & Mellish.
Prolog, "Prolog
Programming for A.I." I. Bratko. ,
. , sites: http://www.freeprogrammingresources.com/
prologbook.html http://www.amzi.com/articles/prolog_books_tutorials.htm

- 88 -
Prolog v.2.0

22.

-1-
o ;

what.
what :- what.

) :- what, write('ONE'), nl, fail.

o goal :

) :- !, what, write('TWO'), nl, fail.


) :- what, !, write('THREE'), nl, fail.
) :- what, write('FOUR'), nl, !, fail.
) :- what, write('FIVE'), nl, fail, !.

) ONE
ONE
ONE
:
:

) TWO
TWO
TWO
:
:

) THREE
No

) FOUR
No

) FIVE
FIVE
FIVE
:
:

- 89 -
Prolog v.2.0

-2-
Prolog , addlist(LIST1,LIST2,RESULTS), oo
o (LIST1 LIST2) (RESULTS)
o o . o LIST1 LIST2 o.
: ?- addlist([4,1,3,2],[5,6,1,0],X).
X = [9,7,4,2]

addlist([],[],[]).
addlist([H1|T1],[H2|T2],[H3|T3]):- H3 is H1+H2,
addlist(T1,T2,T3).

-3-
o Prolog:
f(X,Y,_):- assert(g(X,Y)), fail.
f(_,_,Y):- retract(g(X,Z)), Y is X+Z.
Prolog :
?- f(11,8,X).
(5-10 ).

X = 19

f(11,8,X) o o o oo g(11,8) assert. o o


o, oo o o o o g(11,8) o Prolog Workspace.
o X 11 o Z 8, Y=19 o o o.

-4-
o ;

f(1,one).
f(s(1),two).
f(s(s(1)),three).
f(s(s(s(X))),N) :- f(X,N).

:- f(s(1),A), write(A), nl,


f(s(s(s(s(s(s(1)))))),B), write(B), nl,
f(C,three), write(C), nl, A=B.

f(s(1),A) o A oo o two.
write(A) one nl .

o f(s(s(s(s(s(s(1)))))),B), o fact 6 s , o o
s(s(s(X))). , o X oo o 3 s: s(s(s(1))) o N o B.
oo o o . o , o o

- 90 -
Prolog v.2.0

f(s(s(s(s(s(s(1)))))),B) o o f(s(s(s(1))),B) o
. o ooo o f(s(s(s(1))),B). o o fact
o o o : o f(s(s(s(1))),B) o o o o
o f(1,B). o f(1,B) o fact B=one.
write(B) o one nl .

o f(C,three) o C=s(s(1)) o fact.


write(C) s(s(1)) nl .

o A=B. o A two o B one, two=one fail.


Prolog backtracking . f(C,three),
oo o : oo C=s(s(1)) o fact.
o oo o , N=three C=s(s(s(X))).
o X. o body o , o f(X,three), oo ( o
fact) X=s(s(1)). o C s(s(s(s(s(1))))).

write(C) o A=B o fail: backtracking o


oo, f(X,three), o oo o .
.

two
one
s(s(1))
s(s(s(s(s(1)))))
s(s(s(s(s(s(s(s(1))))))))
:
:
:

-5-
Prolog o o oo ( o o
o, .. "p :- p."). o, , o : o
o o o o o, o:
p :- q.
q :- p.

o o :

a(32,20):-!.
a(X,Y):- f1(X,Z), b(Z,Y).
b(X,Y):- f2(X,Z), a(Z,Y).
f1(N,NewN):- NewN is N+4.
f2(N,NewN):- NewN is N*2.

) Prolog queries:

- 91 -
Prolog v.2.0

) ?- a(2,Reply).
) ?- a(12,Reply).
) ?- a(22,Reply).

) () o , o query:
?- a(,20).
TRUE (o atom Prolog, o
oo o).

A)
) o o :
a(2,Reply)
f1(2,6), b(6,Reply)
f2(6,12), a(12,Reply)
f1(12,16), b(16,Reply)
f2(16,32), a(32,Reply)
Reply = 20

) a(12,Reply) o oo o
o Reply=20.

) a(22,Reply)
f1(22,26), b(26,Reply)
f2(26,52), a(52,Reply)
o o o a/2 32 o
a(32,20). o, , o o f1/2 f2/2
o . , Prolog o loop.

) TRUE o o o 2,12,32. o
oo o : xi +1 = 2 xi + 8

o o o o o o 2, o:
28
2 2x + 8 x = x = 3
2

-6-
Prolog o
o atoms o o , oooo o.
.:
?- function([a,b,c,d],X).
X = [a,b,c,d]

?- function([a,[b,c],d],X).
X = [a,b,c,d]

?- function([[a],[[b]],[c,[d]]],X).
X = [a,b,c,d]

- 92 -
Prolog v.2.0

o oo o oo o o oo:

function([],[]):- !.
function([H|T],[H|R]):- \+ lst(H), !, function(T,R).
function([H|T],L):- function(H,L1), function(T,L2),
append(L1,L2,T).

o append/3 o :

append([],L,L).
append([H|F],B,[H|L]):- append(F,B,L).

-7-
:
function([],[]):- !.
function([H|T],[|R]):- \+ member(H,T), !, function(T,R).
function([_|T],R):- function(T,R).

() Prolog :
?- function([8,2,1,7,1,4,5,5,8,9],X).

() o :
?- [8,2,1,7,1,4,5,5,8,9] gies X.
o ()

() X = [2,7,4,5,8,9]

2 3 o o 2o argument function/2 o head o 1o


argument, o o tail o 1o argument. o o
function/2 o o o o,
o o o .

, o o 8 o 8 . o 2
o, o 1 o, o 7 , o 1 o oo
o 1 , o 4 , o o 5 o o o 8
9 o. o: [2,7,4,5,8,9].

() :- op(700,xfx,gies). % o o
A gies B :- function(A,B). % o o

-8-
o o order, :

order([],[]).

- 93 -
Prolog v.2.0

order([H|T],[H|R]):- order(T,L), reverse(L,R).

reverse , .:

?- reverse([1,2,3,4],X).
X = [4,3,2,1]

() o X :

?- order([1,2,3,4,5,6],X).

() o X ,
[1,2,3,4,5,6] o o o 1 o 100 o
o ;

()
o o reverse/2.
reverse/2 o order/2.

, trace :

?- trace, order([1,2,3,4,5,6],X).
Call: (8) order([1, 2, 3, 4, 5, 6], _G381) order/2
Call: (9) order([2, 3, 4, 5, 6], _L163) o head
Call: (10) order([3, 4, 5, 6], _L184)
Call: (11) order([4, 5, 6], _L205)
Call: (12) order([5, 6], _L226)
Call: (13) order([6], _L247)
Call: (14) order([], _L268) ...o .
Exit: (14) order([], []) order/2 true
Call: (14) lists:reverse([], _G482) reverse/2.
Exit: (14) lists:reverse([], []) o o
Exit: (13) order([6], [6]) head true "parent" order/2.
Call: (13) lists:reverse([6], _G479) order/2
Exit: (13) lists:reverse([6], [6]) o reverse/2
Exit: (12) order([5, 6], [5, 6]) o ooo o,
Call: (12) lists:reverse([5, 6], _G476) .o..
Exit: (12) lists:reverse([5, 6], [6, 5])
Exit: (11) order([4, 5, 6], [4, 6, 5])
Call: (11) lists:reverse([4, 6, 5], _G473)
Exit: (11) lists:reverse([4, 6, 5], [5, 6, 4])
Exit: (10) order([3, 4, 5, 6], [3, 5, 6, 4])
Call: (10) lists:reverse([3, 5, 6, 4], _G470)
Exit: (10) lists:reverse([3, 5, 6, 4], [4, 6, 5, 3])
Exit: (9) order([2, 3, 4, 5, 6], [2, 4, 6, 5, 3]) ...o
Call: (9) lists:reverse([2, 4, 6, 5, 3], _G467)
Exit: (9) lists:reverse([2, 4, 6, 5, 3], [3, 5, 6, 4, 2])

- 94 -
Prolog v.2.0

Exit: (8) order([1, 2, 3, 4, 5, 6], [1, 3, 5, 6, 4, 2]) .

o output :

X = [1, 3, 5, 6, 4, 2]

o order/2 o o o o
oo o o o (o) .

()
oo oo , oo o :

?- order([100,99,98,......,3,2,1],X).

X = [100,98,96,94,....,4,2,1,3,....,93,95,97,99]

-9-
I I I
Prolog , count(FROM,TO,STEP), oo
o o o FROM o TO STEP. . o count(5,12,3)
: 5,8,11. o TO o o FROM,
o. . count(17,11,2) 17,15,13,11.

count(FROM,TO,STEP):- FROM=<TO, write(FROM), nl,


NEW_FROM is FROM+STEP,
again_if_lower(NEW_FROM,TO,STEP).
count(FROM,TO,STEP):- FROM>=TO, write(FROM), nl,
NEW_FROM is FROM-STEP,
again_if_higher(NEW_FROM,TO,STEP).

again_if_lower(FROM,TO,STEP):- FROM=<TO, !, count(FROM,TO,STEP).


again_if_lower(_,_,_).

again_if_higher(FROM,TO,STEP):- FROM>=TO,!, count(FROM,TO,STEP).


again_if_higher(_,_,_).

- 95 -
Prolog v.2.0

[1] Amble T. "Logic Programming and Knowledge Engineering", Addison-Wesley


Publishing Company, Inc., 1987.

[2] Bratko I. "Prolog Programming for Artificial Intelligence" 3rd edition, Addison-
Wesley Publishing Company, Inc., 2000.

[3] Clocksin W.F. & Mellish C.S. "Programming in Prolog Using the ISO Standard"
5th edition, Springer-Verlag 2003.

[4] Deransart P., Ed-Dbali A., Cervoni L. "Prolog: The Standard - Reference Manual",
Springer-Verlag, 1996.

[5] Kowalski R. "Logic for Problem Solving", Elsevier North-Holland, 1984.

[6] Logic Programming Associates Ltd. "LPA Prolog Professional (Programming and
Language Reference Manual)", 1990.

[7] Walker A., McCord M., Sowa J.F. & Wilson W.G. "Knowledge Systems and
Prolog", Addison-Wesley Publishing Company, Inc., 1987.

[8] Wielemaker J. "SWI-Prolog Reference Manual" (Updated for version 5.6.7),


http://www.swi-prolog.org, University of Amsterdam, March 2006.

- 96 -

You might also like