Hưng dn SWI-Prolog
Lp trình Logic
HƯNG DN SWI-PROLOG (Version 5.6.64)
1. Bài hưng dn 1: Cài ñt SWI-Prolog . Vào trang Web ca SWI-Prolog: http://www.swi-prolog.org/ http://www.swi-prolog.org/.. Ti file cài
Bưc 1
ñt
SWI-Prolog
cho
Windows
(version
5.6.64):
http://www.swi-
prolog.org/download/stable/bin/w32pl5664.exe,, dung lưng khong 6.79 MB. prolog.org/download/stable/bin/w32pl5664.exe Lưu ý là ti ñúng bn cài ñt cho Windows vì SWI-Prolog còn nhiu bn cài ñt cho các platform khác na. . Chy file cài ñt w32pl5664.exe ñ bt ñu cài ñt SWI-Prolog cho
Bưc 2
Windows.
. Nhn I Agree, sau ñó nhn Next trong hp thoi k. Dung lưng ñĩa trng
Bưc 3
yêu cu khong 23.3 MB. Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 1
Hưng dn SWI-Prolog
Lp trình Logic
. Trong hp thoi chn thư mc cài ñt ta chn C:\Program Files\SWI-
Bưc 4
Prolog (thay vì mc ñnh là C:\Program Files\pl ), ñơn gin vì mt tên ñy ñ thì tt hơn.
. Nhn Next. Trong hp thoi này ta chn ñuôi cho file ngun Prolog (là pl
Bưc 5
hay pro). Ta chn pl nu như không có file type nào ñăng kí ñuôi này (file ngun ca Perl cũng dùng ñuôi pl), nu không thì chn pro. ñây chn pl.
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 2
Hưng dn SWI-Prolog
Lp trình Logic
. Trong hp thoi chn thư mc cài ñt ta chn C:\Program Files\SWI-
Bưc 4
Prolog (thay vì mc ñnh là C:\Program Files\pl ), ñơn gin vì mt tên ñy ñ thì tt hơn.
. Nhn Next. Trong hp thoi này ta chn ñuôi cho file ngun Prolog (là pl
Bưc 5
hay pro). Ta chn pl nu như không có file type nào ñăng kí ñuôi này (file ngun ca Perl cũng dùng ñuôi pl), nu không thì chn pro. ñây chn pl.
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 2
Hưng dn SWI-Prolog
Lp trình Logic
. Nhn Install và ñi SWI-Prolog cài ñt xong.
Bưc 6
ð thun tin, chúng ta gi {SWI-Prolog} là thư mc cài ñt SWI-Prolog (là thư mc ñã chn Bưc 4). Sau khi cài ñt thì thư mc này cha toàn b chương trình, dll và các file khác ca SWI-Prolog. Sau ñây là mt s file và thư mc quan trng: •
{SWI-Prolog}\bin: cha các file thc thi, dll ca SWI-Prolog. Trong ñó file {SWI-Prolog}\bin\plwin.exe là file chương trình thc thi ca SWIProlog. File {SWI-Prolog}\bin\plcon.exe là file chương trình chy trong Console.
•
{SWI-Prolog}\library: cha các file ngun ca các thư vin SWI-Prolog.
•
{SWI-Prolog}\doc: cha tài liu hưng dn dng Web. Khi chy SWIProlog, ta có th truy nhp Help
→
Online manual… ñ nhn ñưc giúp
ñ vi ni dung tương t nhưng trong ca s Help ca SWI-Prolog. Ta cũng có th download dng pdf ca tài liu hưng dn này trên trang Web ca SWI-Prolog (http://www.swi-prolog.org/download/stable/doc/SWI( http://www.swi-prolog.org/download/stable/doc/SWIProlog-5.6.59.pdf ). ). •
{SWI-Prolog}\demo: cha các file ngun demo ca SWI-Prolog. Trong ñó có file {SWI-Prolog}\demo\likes.pl là mt file ngun demo.
File ngun SWI-Prolog có ñuôi pl (như ñã chn Bưc 5), cha khai báo ca các s kin cũng như các lut, … cho Knowledge Base (trong Phn hưng dn tip chúng ta vit tt là KB). Các file này ñưc gn vi plwin.exe. Khi m file ngun Prolog thì plwin.exe s chy, SWI-Prolog s ñt thư mc làm vic là thư mc cha file này và np các s kin, các lut, … trong file này vào KB.
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 3
Hưng dn SWI-Prolog
Lp trình Logic
2. Bài hưng dn 2: Truy vn Chy chương trình SWI-Prolog (file thc thi plwin.exe) chúng ta có giao din chính ca SWI-Prolog như hình sau
Sau li chào mng và gii thiu là du nhc ñi truy vn. Chúng ta gõ câu truy vn vào sau du nhc truy vn ca SWI-Prolog. Du nhc ca Prolog có dng ?-
n
vi n là s th t ca câu truy vn hin ti. Chúng ta gõ câu truy vn, ri ñn
du chm ‘.’ và nhn Enter ñ thc hin truy vn. Nu câu truy vn sai cú pháp hay có li thi gian chy thì SWI-Prolog s ñưa ra thông báo li. Nu không, SWI-Prolog s tr li truy vn. Nu mt truy vn có nhiu li gii thì bn gõ ‘ ;’ ñ xem các li gii khác. Nu không thì nhn Enter ñ kt thúc tr li truy vn và sang câu truy vn khác. Chúng ta có th chia các truy vn SWI-Prolog ra làm hai loi:
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 4
Hưng dn SWI-Prolog •
Lp trình Logic
Loi truy vn mà chúng ta trông ñi vào kt qu hp nht (hay tìm kim li gii ca) SWI-Prolog. Thưng thì truy vn loi này có cha các bin và có th có nhiu giá tr hp nht cho bin.
•
Loi truy vn mà chúng ta trông ch vào các hiu ng l (side-effect) ñ SWI-Prolog thc hin mt công vic nào ñó. Thưng thì truy vn loi này không cha bin và ta có th gi nó là lnh. . Nhp ñúp file {SWI-Prolog}\demo\likes.pl ñ chy SWI-Prolog và np
Bưc 1
các s kin, lut trong file ngun này vào KB. . Truy vn listing ñ xem các s kin và lut trong KB.
Bưc 2
1 ?- listing. italian(pizza). italian(spaghetti). likes(sam, A) :indian(A), mild(A). likes(sam, A) :chinese(A). likes(sam, A) :italian(A). likes(sam, chips). mild(dahl). mild(tandoori). mild(kurma). chinese(chow_mein). chinese(chop_suey). chinese(sweet_and_sour). indian(curry). indian(dahl). indian(tandoori).
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 5
Hưng dn SWI-Prolog
Lp trình Logic
indian(kurma). true.
. Truy vn mild(dahl).
Bưc 3
2 ?- mild(dahl). true.
. Truy vn mild(curry) .
Bưc 4
3 ?- mild(curry). false.
. Truy vn indian(X).
Bưc 5
4 ?- indian(X). X = curry
. Gõ ‘;’ ñ xem li gii khác.
Bưc 6
4 ?- indian(X). X = curry ; X = dahl
. Gõ Enter ñ dng truy vn hin ti.
Bưc 7
4 ?- indian(X). X = curry ; X = dahl .
. Truy vn likes(sam,
Bưc 8
5 X X X X X X
X). Và dùng ‘;’ ñ xem tt c các li gii.
?- likes(sam, X). = dahl ; = tandoori ; = kurma ; = chow_mein ; = chop_suey ; = sweet_and_sour ;
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 6
Hưng dn SWI-Prolog
Lp trình Logic
X = pizza ; X = spaghetti ; X = chips. 6 ?-
. Truy vn !!. ñ gi li truy vn trưc ñó. Sau ñó nhn Enter ñ dng các
Bưc 9
hp nht khác. 6 ?- !!. likes(sam, X). X = dahl .
. Truy vn h. ñ hin th danh sách các truy vn ñã gi.
Bưc 10
7 ?- h. 1 2 3 4 5 6
listing. mild(dahl). mild(curry). indian(X). likes(sam, X). likes(sam, X).
. Truy vn !2. ñ gi li truy vn th 2.
Bưc 11
7 ?- !2. mild(dahl). true.
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 7
Hưng dn SWI-Prolog
Lp trình Logic
3. Bài hưng dn 3: Thao tác file ngun SWI-Prolog . Chy chương trình SWI-Prolog t file plwin.exe (ñ không có file ngun
Bưc 1
nào ñưc np vào KB). Nhp lnh ñơn File → New… ñ son mt file ngun mi. Trong hp thoi Create new Prolog source ñt tên file là hello.pl, SWI-Prolog s triu gi Editor ca mình (gi là PceEmacs) ñ bn son file ngun hello.pl. . Gõ vào lut duy nht sau ñây trong file hello.pl
Bưc 2
hello :- write('Hello World').
Sau ñó lưu file và ñóng Editor. . Nhp lnh ñơn File
Bưc 3
→
Consult… ñ np mt file ngun. Trong hp thoi
Load file into Prolog chn np file hello.pl. SWI-Prolog s np các s kin và lut trong file này vào KB. . Truy vn listing ñ thy rng lut trong file hello.pl ñã ñưc thêm vào
Bưc 4
KB. 1 ?- listing. %
Foreign: tcp_debug/1
hello :write('Hello World'). true.
. Truy vn hello ñ thy công vic ca v t hello/0. V t này in ra dòng
Bưc 5
ch Hello World . 2 ?- hello. Hello World true.
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 8
Hưng dn SWI-Prolog
Lp trình Logic
. Nhp lnh ñơn File → Edit… ñ sa mt file ngun. Trong hp thoi Edit
Bưc 6
existing file chn file hello.pl ñ sa file này. Trong Editor sa ni dung file này thành như sau hello(X) :- write('Hello '), write(X).
Sau ñó lưu li và ñóng Editor. . Nhp lnh ñơn File
Bưc 7
→
Reload modified files ñ np li file ngun vì
SWI-Prolog không t np li. Truy vn
listing ñ thy nhng thay ñi này.
3 ?- listing. hello(A) :write('Hello '), write(A). true.
. Truy vn hello(nam) ñ thy công vic ca v t hello/1. V t này in
Bưc 8
ra dòng ch Hello ri ñn ñi s ta gi vào. 4 ?- hello(nam). Hello nam true.
. Nhp lnh ñơn File
Bưc 9
→
Navigator… ñ m ca s Prolog Navigator . Tìm
ñn nút ca file ngun hello.pl (file phi ñ trong ñĩa cài ñt SWI-Prolog, có th dùng nút mũi tên lên bên trái ca thanh toolbar ñ duyt thư mc). Ta thy trong nút này cha nút hello/1 cho lut ca chúng ta, chúng ta cũng thy rng nút này có nút con write/1 ñ ch hello/1 ph thuc vào write/1.
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 9
Hưng dn SWI-Prolog
Lp trình Logic
Lưu ý:
- Khi np file ngun bng lnh ñơn File
→
Consult… thì SWI-Prolog s
thêm các lut và s kin ca file mi vào KB hin ti ch không xóa ni dung ca KB và SWI-Prolog s thêm file này vào danh sách các file mà nó ñã np. Do ñó khi nhp lnh ñơn File
→
Reload modified files thì toàn b
các file này s ñưc np li vào KB. Nu ñang có ca s SWI-Prolog mà m thêm file ngun mi bng cách nhp ñúp thì SWI-Prolog s m file này trong mt tin trình khác (ca s khác) và duy trì các KB riêng l trong tng tin trình. - Có các v t trong SWI-Prolog làm các công vic tương ñương vi các lnh trong trình ñơn File. Các bn xem trong tài liu tham kho ca SWI-Prolog ñ bit cn k vì ñây là các v t rt hay dùng và s ñưc dùng trong các Bài hưng dn dưi. + make/0 ñ np li các file ñã np.
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 10
Hưng dn SWI-Prolog
Lp trình Logic
+ edit/0, edit/1 ñ sa file ngun. + edit(file(File)) ñ to mi file ngun. + consult/1 hay dng vit gn [File] ñ np mt file ngun.
- Lnh ñơn Edit
→
Copy và Edit
→
Paste dùng ñ copy hay dán ni dung
(bôi xanh) vào hay t Clipboard. Chú ý là phím tt Ctrl + V làm vic tt nhưng Ctrl + C không ñưc dùng cho Copy (Ctrl + C là phím tt ca lnh ñơn Run → Interrupt dùng ñ ngt lnh ñang chy).
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 11
Hưng dn SWI-Prolog
Lp trình Logic
4. Bài hưng dn 4: Run và Debug . Chy chương trình SWI-Prolog t file thc thi plwin.exe (ñ không có
Bưc 1
file ngun nào ñưc np vào KB). Nhp lnh ñơn File
→
New… ñ son mt file
ngun mi. ðt tên file là descendant.pl vi ni dung sau child(martha,charlotte). child(charlotte,caroline). child(caroline,laura). child(laura,rose). descend(X,Y) :- child(X,Y). descend(X,Y) :- child(X,Z), descend(Z,Y).
. Truy vn consult(descendant) ñ np file này vào KB.
Bưc 2
1 ?- consult(descendant). % descendant compiled 0.00 sec, 984 bytes true.
. Truy vn trace ñ theo vt quá trình tìm kim li gii ca câu truy vn
Bưc 3
k. 2 ?- trace. Unknown message: query(yes) [trace] 2 ?-
. Truy vn descend(martha,
Bưc 4
X).
2 ?- trace. Unknown message: query(yes) [trace] 2 ?- descend(martha, X). Call: (7) descend(martha, _G476) ?
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 12
Hưng dn SWI-Prolog
Lp trình Logic
. Nhn Enter các du nhc tip theo ñ SWI-Prolog tip tc quá trình theo
Bưc 5
vt, cho ñn khi mt li gii ñưc ñưa ra. 2 ?- trace. Unknown message: query(yes) [trace] 2 ?- descend(martha, X). Call: (7) descend(martha, _G476) ? creep Call: (8) child(martha, _G476) ? creep Exit: (8) child(martha, charlotte) ? creep Exit: (7) descend(martha, charlotte) ? creep X = charlotte
. Ti ñây chúng ta nhn Enter ñ kt thúc truy vn hoc nhn ‘ ;’ ñ SWI-
Bưc 6
Prolog tip tc theo vt các li gii khác. Nhn ‘ ;’ và sau ñó là Enter cho ñn khi thy li gii th hai thì nhn Enter ñ kt thúc truy vn. 2 ?- trace. Unknown message: query(yes) [trace] 2 ?- descend(martha, X). Call: (7) descend(martha, _G476) ? creep Call: (8) child(martha, _G476) ? creep Exit: (8) child(martha, charlotte) ? creep Exit: (7) descend(martha, charlotte) ? creep X = charlotte ; Redo: (7) descend(martha, _G476) ? creep Call: (8) child(martha, _L174) ? creep Exit: (8) child(martha, charlotte) ? creep Call: (8) descend(charlotte, _G476) ? creep Call: (9) child(charlotte, _G476) ? creep Exit: (9) child(charlotte, caroline) ? creep Exit: (8) descend(charlotte, caroline) ? creep Exit: (7) descend(martha, caroline) ? creep X = caroline . [debug] 3 ?-
. Kí hiu [debug] trưc du nhc truy vn cho bit SWI-Prolog ñang trong
Bưc 7
ch ñ debug. ch ñ debug, SWI-Prolog s dng các spy-point, break-point Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 13
Hưng dn SWI-Prolog
Lp trình Logic
hay trace-point và bơm thông tin vào các cng, giúp ích cho quá trình debug. Chúng ta ñt mt ñim spy bng cách dùng v t spy/1. Truy vn spy(child) ñ ñt ñim spy v t child. [debug] 3 ?- spy(child). % Spy point on child/2 true.
. Bây gi truy vn descend(X,
caroline) ñ
Bưc 8
thy tác dng ca v t
spy/1. Nhn Enter liên tip ñn khi xong truy vn này.
[debug] 4 ?- descend(X, caroline). Call: (8) child(_G487, caroline) ? creep Exit: (8) child(charlotte, caroline) ? creep Exit: (7) descend(charlotte, caroline) ? creep X = charlotte .
. Như vy ta thy SWI-Prolog dng các v t child. Vi v t trace/0
Bưc 9
SWI-Prolog theo vt tt c các v t dùng trong quá trình hp nht goal tip sau trace và ch goal này mà thôi. Vi spy/1, chúng ta ñt các ñim spy trên các v t
và SWI-Prolog s luôn dng các v t này khi ñi sánh mi goal sau ñó. ðương nhiên SWI-Prolog ch dng khi ñang trong ch ñ debug. ð kim tra, ta thoát khi ch ñ debug bng v t nodebug/0. [debug] 5 ?- nodebug. true. 6 ?-
. Truy vn
Bưc 10
descend(X, Y)
ñ thy rng SWI-Prolog không dng
các ñim spy khi không ch ñ debug. Nhn ‘;’ ñ xem tt c các hp nht. 6 ?- descend(X, Y). X = martha, Y = charlotte ;
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 14
Hưng dn SWI-Prolog
Lp trình Logic
X = charlotte, Y = caroline ; X = caroline, Y = laura ; X = laura, Y = rose ; X = martha, Y = caroline ; X = martha, Y = laura ; X = martha, Y = rose ; X = charlotte, Y = laura ; X = charlotte, Y = rose ; X = caroline, Y = rose ; false.
. Truy vn
Bưc 11
gtrace
ñ vào ch ñ debug nhưng dùng giao din ñ ha
thay vì các dòng thông tin dng text. Chúng ta cũng có th dùng lnh ñơn Debug →
Graphical debugger vi cùng công dng. 7 ?- gtrace. % The graphical subsequent tracing true.
front-end
will
be
used
for
[debug] 8 ?-
. Bây gi gõ truy vn
Bưc 12
descend(X, Y).
SWI-Prolog s hin công c
thc hin debug trên giao din ñ ha.
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 15
Hưng dn SWI-Prolog
Lp trình Logic
. Các bn nên t nghiên cu nhiu v debugger này vì nó là mt công c
Bưc 13
rt mnh và rt có ích. Bây gi chúng ta c vic nhn nút có hình mũi tên xung (Show unification) cho ñn khi thy SWI-Prolog ñưa ra mt li gii. Nhp chut vào ca s chính và nhn ‘ ;’ ñ SWI-Prolog tìm li gii k tip và do ñó nó li triu gi debugger này vi thông tin ñi sánh mi.
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 16
Hưng dn SWI-Prolog
Lp trình Logic
. Tip tc nhn nút có hình mũi tên xung ( Show unification) cho ñn khi
Bưc 14
SWI-Prolog ñưa ra li gii th hai. Nhp chut vào ca s chính và nhn Enter ñ kt thúc truy vn. [debug] 8 ?- descend(X, Y). X = martha, Y = charlotte ; X = charlotte, Y = caroline . [debug] 9 ?-
. Chúng ta xóa các ñim spy trên v t child bng nospy(child). Hay
Bưc 15
ñơn gin dùng nospyall/0 ñ xóa tt c các ñim spy. [debug] 9 ?- nospyall.
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 17
Hưng dn SWI-Prolog
Lp trình Logic
% Spy point removed from child/2 true.
. Chúng ta thc hin truy vn
Bưc 16
descend(X, Y)
và thy rng không có
thông tin debug nào ñưc in ra cũng như debugger ñ ha không ñưc triu gi na. [debug] 10 ?- descend(X, Y). X = martha, Y = charlotte ; X = charlotte, Y = caroline . [debug] 11 ?-
Bây gi chúng ta s cùng tìm hiu hai lnh có ích khác trong trình ñơn Run là Interrupt và New thread. . Chy chương trình SWI-Prolog t file thc thi plwin.exe (ñ không có
Bưc 1
file ngun nào ñưc np vào KB). Truy vn
edit(file(‘loop.pl’))
ñ to
mi file ngun loop.pl. 1 ?- edit(file('loop.pl')). true.
. Trong Editor, gõ ni dung ca file ngun loop.pl như sau:
Bưc 2
p(X) :- q(X). q(X) :- p(X).
. Truy vn [loop] ñ np file ngun loop.pl vào KB.
Bưc 3
2 ?- [loop]. % loop compiled 0.00 sec, 684 bytes true.
. Truy vn p(X).
Bưc 4
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 18
Hưng dn SWI-Prolog
Lp trình Logic
3 ?- p(X).
. Vì ñnh nghĩa vòng ca v t p/1 nên SWI-Prolog s rơi vào vòng lp
Bưc 5
không kt thúc khi ñi tìm li gii cho truy vn trên. ð ngt quá trình tìm li gii cho truy vn trên, chúng ta chn lnh ñơn Run → Interrupt. 3 ?- p(X). Action (h for help) ?
. Chúng ta có mt s tùy chn lnh khác nhau ñ ngt chương trình. Nhn
Bưc 6
h
ñ thy các tùy chn lnh này. 3 ?- p(X). Action (h for help) ? Options: a: abort b: c: continue e: g: goals t: h (?): help Action (h for help) ?
. Nhp lnh
Bưc 7
t
break exit trace
(trace) ñ theo vt quá trình tìm li gii cho truy vn ca
SWI-Prolog. Action (h for help) ? trace continue (trace mode) Call: (3,265,194) q(_G548) Call: (3,265,195) p(_G548) Call: (3,265,196) q(_G548) Call: (3,265,197) p(_G548) Call: (3,265,198) q(_G548) Call: (3,265,199) p(_G548) Call: (3,265,200) q(_G548) Call: (3,265,201) p(_G548) Call: (3,265,202) q(_G548)
Vũ Quc Hoàng
Tp. HCM, 2/2009
? ? ? ? ? ? ? ? ?
creep creep creep creep creep creep creep creep
Page 19
Hưng dn SWI-Prolog
Lp trình Logic
. Ta thy v t q/1 và p/1 c thay phiên nhau ñưc gi. Ta có nhn Enter
Bưc 8
hoài thì dãy li gi trên cũng không kt thúc. Ta nhp lnh
a
(abort) ñ ngt b
truy vn. Action (h for help) ? trace continue (trace mode) Call: (3,265,194) q(_G548) Call: (3,265,195) p(_G548) Call: (3,265,196) q(_G548) Call: (3,265,197) p(_G548) Call: (3,265,198) q(_G548) Call: (3,265,199) p(_G548) Call: (3,265,200) q(_G548) Call: (3,265,201) p(_G548) Call: (3,265,202) q(_G548) % Execution Aborted 4 ?-
? ? ? ? ? ? ? ? ?
creep creep creep creep creep creep creep creep abort
. Truy vn q(a). Chúng ta bit rng SWI-Prolog tip tc rơi vào vòng lp
Bưc 9
không kt thúc. 4 ?- q(a).
. Nhp lnh ñơn Run
Bưc 10
→
New thread, SWI-Prolog s hin mt ca s
mi (Thread 2) chy cùng vi ca s chính (Thread main).
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 20
Hưng dn SWI-Prolog
Lp trình Logic
. Trong ca s thread mi này thc hin truy vn listing.
Bưc 11
1 ?- listing. %
Foreign: tcp_debug/1
p(A) :q(A). q(A) :p(A). true.
. Ta thy rng KB này ging ht như KB ca thread main. Thc cht,
Bưc 12
trong trưng hp này ch có mt KB. Các thread khác nhau s thc hin các truy vn ñc lp nhưng chia s cùng KB. Như vy trong khi thread main vn ñang còn bn tìm li gii thì chúng ta có th dùng thread 2 cho các công vic khác. ðây là cách dùng có ích ca thread. Lưu ý rng vic dùng nhiu thread khác vi vic chúng ta m nhiu chương trình SWI-Prolog khác nhau (bng file thc thi
plwin.exe hay chy t ñng các file ngun SWI-Prolog) vì khi này các KB là ñc lp cho tng process. Bây gi truy vn halt trong thread 2.
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 21
Hưng dn SWI-Prolog
Lp trình Logic
2 ?- halt. ERROR: [Thread 2] halt/1: No permission thread `2' (Only from thread `main') 3 ?-
to
halt
. Chúng ta thy rng mt li thi gian chy ñưc ñưa ra cho truy vn
Bưc 13
halt/0. Li này là do thread 2 không ñ quyn dùng lnh halt/0, ch có thread
main mi ñ quyn. Chúng ta nhp chut vào ca s ca thread main và nhn Ctrl + C (phím tt ca lnh ñơn File
→
Interrupt) ñ ngt chương trình. Nhn tip
lnh e (exit) ñ thoát SWI-Prolog. SWI-Prolog s ñóng c ca s thread main ln thread 2.
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 22
Hưng dn SWI-Prolog
Lp trình Logic
5. Bài hưng dn 5: Setting và Customise . Chy chương trình SWI-Prolog t file thc thi plwin.exe. Nhp lnh ñơn
Bưc 1
Settings
→
Font… ñ chn font hin th cho ca s chính ca SWI-Prolog.
. Trong hp thoi chn Font, chúng ta chn font Courier New , style
Bưc 2
Regular, size 12. Font Courier New là font ch có ñ rng c ñnh, rt thích hp cho hin th ni dung trong ca s chính ca SWI-Prolog. Sau khi chn font, SWIProlog ngay lp tc hin th ca s chính theo font ñã chn.
. Nhp lnh ñơn Settings
Bưc 3
→
User init file… ñ to mt file cu hình,
customise các tùy chn SWI-Prolog. Nu bn chưa có file này (mc ñnh là chưa có) thì mt thông báo ñưc ñưa ra
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 23
Hưng dn SWI-Prolog
Lp trình Logic
. Nhn OK ñ to mt file cài ñt như th.
Bưc 4
. Trong ca s editor bn duyt ñn phn nói v DEBUGGING.
Bưc 5
. Theo hưng dn ca phn này, bn kh ghi chú cho dòng lnh
Bưc 6
% :- (current_prolog_flag(gui, true).
true)
->
guitracer
;
Bng cách xóa du % ñu (% là du bt ñu ghi chú trên mt dòng ca Prolog). Editor s t ñng tô màu li ñ bn bit ñây là mt dòng lnh ch không phi là mt ghi chú na.
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 24
Hưng dn SWI-Prolog
Lp trình Logic
. Lưu file (Ctrl + S) và ñóng ca s editor này li.
Bưc 7
. Truy vn
Bưc 8
[descendant]
ñ Consult file ngun descendant.pl phn
trưc. 1 ?- [descendant]. % descendant compiled 0.00 sec, 1,328 bytes true.
. Truy vn trace ñ vào ch ñ trace.
Bưc 9
2 ?- trace. Unknown message: query(yes) [trace] 2 ?-
. Truy vn descend(X,
Bưc 10
Y).
Chúng ta thy rng SWI-Prolog s dùng
ca s ñ ha ñ chy ch ñ trace thay vì ca s chính ca SWI-Prolog như trưc.
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 25
Hưng dn SWI-Prolog
Lp trình Logic
. Truy vn halt ñ ñóng SWI-Prolog.
Bưc 11
3 ?- halt.
. Khi ñng li SWI-Prolog t file thc thi plwin.exe.
Bưc 12
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 26
Hưng dn SWI-Prolog
Lp trình Logic
. T nhng dòng ñu chúng ta thy SWI-Prolog t ñng np file cu hình
Bưc 13
ca chúng ta (file pl.ini) cũng như dùng ca s ñ ha ñ trace. Như vy file cu hình là mt file ngun SWI-Prolog, ñưc SWI-Prolog np ngay sau khi chy (nh tên và v trí lưu tr ñc bit ca nó). Do ñó các khai báo, các lnh, … trong file này s có tác dng ngay sau khi SWI-Prolog chy. Các bn có toàn quyn thêm các khai báo, các lnh, … mi (dĩ nhiên bn phi bit rõ v nó) hay kh ghi chú mt s khai báo có sn trong file mu này.
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 27
Hưng dn SWI-Prolog
Lp trình Logic
6. Bài hưng dn 6: S dng mt s v t có ích khác . Chy SWI-Prolog t file thc thi plwin.exe. Các tham chiu file tương
Bưc 1
ñi (trong edit/1, consult/1, …) ñu ly thư mc làm vic ca SWI-Prolog làm gc. Chúng ta dùng truy vn pwd ñ kim tra thư mc này. 1 ?- pwd. c:/program files/swi-prolog/bin true.
Như vy nu chy SWI-Prolog t file thc thi plwin.exe thì thư mc làm vic là
{SWI-Prolog}\bin như trên cho thy. Lưu ý là nu to shortcut cho file plwin.exe và chy t shortcut này (chng hn shortcut trên Desktop) thì thư mc làm vic s khác. . Truy vn ls ñ xem danh sách file trong thư mc làm vic. Lnh này có
Bưc 2
ích cho consult/1, edit/1, … 2 ?- ls. descendant.pl true.
hello.pl
loop.pl
. ðóng SWI-Prolog và nhp ñúp file {SWI-Prolog}\demo\likes.pl ñ chy
Bưc 3
SWI-Prolog và np file ngun này. . Truy vn pwd ñ kim tra thư mc làm vic.
Bưc 4
1 ?- pwd. c:/program files/swi-prolog/demo true.
Chúng ta thy rng thư mc làm vic ñưc ñt thành thư mc cha file ngun ñã khi ñng SWI-Prolog.
Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 28
Hưng dn SWI-Prolog
Lp trình Logic
. Truy vn help/0 ñ hin th hp thoi Help ca SWI-Prolog (ging như
Bưc 5
dùng lnh Help
→
Online manual…). Chúng ta truy vn help(write) ñ hin
th Help v v t write. 2 ?- help(write). true.
SWI-Prolog s hin th hi thoi Help ngay mc ca v t write, như hình dưi.
. Truy vn write(‘Hello
Bưc 6
World’) ñ in chui
Hello World .
3 ?- write('Hello World'). Hello World true.
. Khác vi v t write dùng ñ in ra dng thân thin ca ñi tưng, v t
Bưc 7
display dùng ñ in ra dng biu din bên trong. Truy vn display([1, 2])
ñ thy biu din bên trong ca list [1, 2]. Vũ Quc Hoàng
Tp. HCM, 2/2009
Page 29