Professional Documents
Culture Documents
Η γλώσσα προγραμματισμού Prolog - Μέθοδος ταχείας εκμάθησης βάσει παραδειγμάτων
Η γλώσσα προγραμματισμού Prolog - Μέθοδος ταχείας εκμάθησης βάσει παραδειγμάτων
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.
,
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.
-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 editor o Prolog o (
o 2 o ), o o o prompt Prolog:
?-
Prolog . oo o
o :
?- man(peter).
Yes
?- woman(helen).
Yes
-6-
Prolog v.2.0
?- man(helen).
No
?- woman(jimmy).
No
?- woman(jenny).
No
oo ooo oo .
(NOT) Prolog 1 \+.
?- \+ man(peter).
No
?- \+ woman(peter).
Yes
?- \+ woman(jenny).
Yes
?- \+ man(jenny).
-7-
Prolog v.2.0
Yes
Prolog o o o "jenny" o
o . "jenny" "house", o
, Prolog o!
, \+ .
woman(jenny) ; . man(jenny) ;
.
?- man(peter), man(jimmy).
Yes
o man(peter) o man(jimmy).
?- man(peter), \+ man(jimmy).
No
?- 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 .
?- 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
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
- 10 -
Prolog v.2.0
?- \+ 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 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
- 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.
- 13 -
Prolog v.2.0
exit.
?- help.
... manual :
?- 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
?- [program].
% program compiled 0.02 sec, 572 bytes
Yes
?- [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
?- mother_of(helen,X).
X = jimmy ;
X = peter ;
No
"o o peter;"
?- mother_of(X,peter).
X = helen ;
No
?- 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).
- 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:
X = helen
Y1 = jimmy
Y2 = peter ;
No
o oo == ( o o Prolog
oo 10).
o o helen , oo ooo
X:
- 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 atoms:
o atoms:
o integers o :
0 1 2 -41 6221
) VARIABLES ()
ooo o underscore
. :
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))
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/1:
- 23 -
Prolog v.2.0
nl/0:
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
Z = helen
X = jimmy
Y = peter ;
No
?- 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
" X o Y, o o Y ". o o
mother_of/2.
" 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.
" 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.
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 :
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
?- goal1.
peter
Yes
?- 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.
?- 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)).
?- 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
?- now(gate(X,16,_,_),_).
No
- 33 -
Prolog v.2.0
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
?- 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 =:= oo o :
... :
?- X =:= 4+5.
ERROR: =:=/2: Arguments are not sufficiently instantiated
... o :
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
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. :
o oo o o (auto-
executable goals). Prolog o file, o o goal o o
:
, - o o oo (o
Prolog Workspace, o ) o o o auto-executable goal
o o:
( 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).
, Prolog
. o oo
/*, */ %:
/*
, /* */
o, .
*/
% o, o end-of-line
- 41 -
Prolog v.2.0
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 :
o o :
o:
o o o o,
o:
?- ancestor(stranger,bill).
o , parent/2 o ancestor/2
. o , o o
o o .
o o o o; ,
o o o
- 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;"
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
( ).
2 . 16.
- 44 -
Prolog v.2.0
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
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.
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
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
:
parag(X,1):- 1 =:= X.
parag(X,Y):- X2 = X-1, Y = Y2*X, parag(X2,Y2).
?- 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
?- a.
peter ;
jimmy ;
george ;
No
o o o o backtracking o fail, oo
o ooo man/1.
?- b.
peter ;
No
?- c.
peter ;
No
- 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 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.
oo o (). o o oo o o ():
not1(X):- X, !, fail.
not1(_).
- 51 -
Prolog v.2.0
?- 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
?- 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 ;
No
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.
[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([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 :
(o o argument o o):
append([],L,L).
append([H|T],L1,[H|L2]):- append(T,L1,L2).
- 57 -
Prolog v.2.0
?- 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
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.
?- 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 :
, 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 :
- 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)
?- forall(member(X,[1,2,3]),(write(X),tab(3))).
1 2 3
X=_G455 ;
No
o o
:
?- findall(X,woman(X),L).
X = _G320
L = [helen, jenny, mary] ;
No
?- read(Term).
|: test.
Term = test ;
No
- 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
?- get_code(X).
|: P{ENTER}
X = 80
Yes
?- get0(81).
|: Q{ENTER}
Yes
?- get0(81).
|: P{ENTER}
No
?- 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(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(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
?- 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
- 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 )
:
- 64 -
Prolog v.2.0
, o o:
... :
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'
:
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
-
.
[debug] ?-
[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
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.
. :
?- 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
- 71 -
Prolog v.2.0
18.
o o:
father(alex,bill).
father(bill,charlie).
father(charlie,don).
o oo o ;
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(700,xfx,is_father_of).
o o o . o
o arguments op/3:
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 o o , o oo o .
..:
:- op(0,xfx,is_father_of).
?- 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, :
:- 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
o:
?- write('Message').
... o o, :
?- write('$stream'(34018),'Message').
/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 .
... 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:
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 :
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('$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
read/2 :
?- read('$stream'(67892),Data).
Data = abcd ;
No
?- seek('$stream'(67892),2,current,NewPos).
NewPos = 8 ;
No
?- read('$stream'(67892),Data).
Data = gh ;
No
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
.
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.
o DCG:
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
oo ooo ooo o o . o
oo o o noun_phrase o o oo
o ( ), o verb_phrase o o determiner o o.
:
o "oo o o 'the'", o o
"o o 'boy', 'house'" o o o
o o o , o 'likes'. :
o terminals. terminals o o oo o o ,
o o o . terminals o
rewrite-rules o o .
phrase/2 o format:
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
?- 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 :
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
?- 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:
, 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:
?- 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:
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.
o goal :
) 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
-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) 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 .
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]
, 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
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
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.
- 95 -
Prolog v.2.0
[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.
[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.
- 96 -