MOT SO CHUONG TRINH PROLOG

17 276 1
MOT SO CHUONG TRINH PROLOG

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

PHỦ LỦC A Mäü t säú chỉång trçnh Prolog • u cáưu âc hiãøu, dỉûng lải thût toạn v âạnh giạ âäü phỉïc tảp cạc chỉång trçnh Prolog dỉåïi âáy • Chảy chỉång trçnh SWI-Prolog kãút qu % Thao tạc trãn cáy tree(X) :b_tree(5, b_tree(2, b_tree(8, et, et), b_tree(2, et, et)), b_tree(3, et, b_tree(9, b_tree(2, et, et), et))) is_tree(et) is_tree(X) :X=tree(_, Y, Z), is_tree(Z), is_tree(Z) in_ordre(et) in_ordre(tree(R, G, D)) :in_ordre(G), write(-), write(R), write(-), in_ordre(D) pre_ordre(et) pre_ordre(tree(R, G, D)) :write(-), write(R), write(-), pre_ordre(G), pre_ordre(D) post_ordre(et) post_ordre(tree(R, G, D)) :post_ordre(G), post_ordre(D), write(-), write(R), write(-) root(et) root(tree(R, G, D), X) :X is R sort(et) sort(tree(R, G, D)) :RG is root(G, X), RD is root(D, X), R>RG, RY, tree_sort(B), C=emptytree tree_sort(X) :X=tree(A, B, C), B=emptytree, C=tree(Y, _, _), Y>A, tree_sort(C) tree_sort(X) :X=tree(A, B, C), B=tree(Y, _, _), A>Y, tree_sort(B), C=tree(Z, _, _), Z>A, tree_sort(C) % Bi toạn Thạp H Näüi (Hanoi towers) towers :repeat, write('Number of rings (or ctl-c to end): '), read(X), hanoi(X), fail hanoi(N) :- move(N,left,center,right), ! move(0,_,_,_) :- ! Phủ lủc A Mäüt säú chỉång trçnh Prolog move(N,A,B,C) :M is N-1, move(M,A,C,B), inform(A,B), move(M,C,B,A) inform(A,B) :write([move,disk,from,A,to,B]), nl % Tảo bng (Table) table :create_popup( _,_,_,_ ), for(0,15,Row), for(0,15,Colidx), Attr is Row*16+Colidx, Col is 5*Colidx, tmove(Row,Col), write(Attr), tmove(Row,Col), wa(5, Attr), fail table :nl,nl,write( $Press any key to continue$ ), get0_noecho(_), exit_popup for(X, X, X) :- ! for(Y, X, Y) :- true for(X, Y, Z) :- inc(X, X1), for(X1, Y, Z) :- public misscann/0 misscann :- solve(start-state(3,3,left), X), pathwrite(X) solve(Init-state(0,0,right), Init-state(0,0,right)-finish) :- ! solve(Init-S1, Final) :new_state(S1, S2), not member(S2, Init), solve(Init-S1-S2, Final) new_state(state(M1,C1,left), state(M2,C2,right)) :move(M, C), M =< M1, C =< C1, M2 is M1-M, C2 is C1-C, balanced(M2, C2) new_state(state(M1,C1,right), state(M2,C2,left)) :- 189 Láûp trçnh lägich Prolog 190 move(M, C), M2 is M1+M, C2 is C1+C, M2 =< 3, C2 =< 3, balanced(M2, C2) balanced(X, X) :- ! balanced(3, X) :- ! balanced(0, X) move(2,0) move(1,0) move(1,1) move(0,1) move(0,2) member(X, Y - X) :- ! member(X, Y - Z) :- member(X,Y) pathwrite(A-B) :- !, pathwrite(A), nl, !, pathwrite(B) pathwrite(X) :- write(X) % solve/1 % PROLOG interpreter written in PROLOG (so-called vanilla meta-interpreter) % usage: ?-solve(PrologGoal) solve(true) solve((A, B)) :solve(A), solve(B) solve(A) :clause(A,B), solve(B) % Vê dủ mäüt hãû chun gia animal(su_tu_bien, [1, 2, 8, 18]) animal(ca_voi, [1, 2, 4, 9]) animal(su_tu, [1, 2, 5, 11]) animal(báo, [1, 2, 5, 10, 17]) animal(gau, [1, 2, 6, 8, 15, 16, 17]) animal(huou_cao_co, [1, 5, 7, 10]) animal(voi, [1, 5, 6, 12, 13, 18]) animal(con_diec, [3, 7, 8, 15, 18]) animal(chim_mòng_bien, [3, 8, 14, 15, 18]) animal(dà_dieu_châu_phi, [7]) animal(chim_canh_cut, [4, 8, 19]) Phủ lủc A Mäüt säú chỉång trçnh Prolog question(1) :write('Con v t có lơng khơng khơng ?’), nl, !, answer(1) question(2) :write(‘Con vâ.t n th t khơng ?’), nl, !, answer(2) question(3) :write(‘Con vâ.t bi t bay khơng ?’), nl, !, answer(3) question(4) :write(‘Con vâ.t có s ng n c khơng ?’), nl, !, answer(4) question(5) :write(‘Con vâ.t có s ng Châu Phi khơng ?’), nl, !, answer(5) question(6) :write(‘Con vâ.t có s ng r ng khơng ?’), nl, !, answer(6) question(7) :write(‘Con vâ.t có chân dài khơng ?’), nl, !, answer(7) question(8):write(‘Con vâ.t có n cá khơng ?’), nl, !, answer(8) question(9):write(‘Con vâ.t có n phù du sinh v t n i khơng ?’), nl, !, answer(9) question(10):write(‘Con vâ.t có da lơng l m đ m khơng ?’), nl, !, answer(10) question(11):write(‘Con vâ.t có b m khơng ?’), nl, !, answer(11) question(12):write(‘Con vâ.t có r ng nanh hay ngà khơng ?’), nl, !, answer(12) question(13):write(‘Con vâ.t có s ng khơng ?’), nl, !, answer(13) question(14):write(‘Con vâ.t có làm t núi đá khơng ?’), nl, !, answer(14) question(15):write(‘Con vâ.t có m t ph n da (lơng) màu tr ng khơng ?’), nl, !, answer(15) question(16):write(‘Con vâ.t có m t ph n da (lơng) màu nâu khơng ?’), nl, !, answer(16) question(17):- 191 Láûp trçnh lägich Prolog 192 write(‘Con vâ.t có leo trèo khơng ?’), nl, !, answer(17) question(18):write(‘Con vâ.t có da (lơng) màu xám khơng ?’), nl, !, answer(18) question(19):write(‘Con vâ.t có da (lơng) màu tr ng đen khơng ?’), nl, !, answer(19) % Nh n di n v t identifier :animal(X, Y), put_questions(Y), explaining(X, Y), abolish(discovery, 2) identifier(X) :write(‘Con v t ch a bi t.'), nl % H chun gia đ t câu h i h i ng put_questions([]) put_questions([ X|Y ]) :questioner(X), put_questions(Y) questioner(X) :discovery(X, yes), ! questioner(X) :discovery(X, no), !, fail questioner(X) :question(X) c l i ng i s d ng % Phân tích câu tr l i answer(X) :read(R), assert(discovery(X, R)), R = yes explaining(X, Y) :write(‘ ây :'), write(X), nl, write('B i :'), nl, explications(Y) explications([ ]) explications([ X1|X2 ]) :expl(X1), nl, explications(X2) expl(1) :write(‘Con vâ.t lồi đ ng v t có vú.') Phủ lủc A Mäüt säú chỉång trçnh Prolog expl(2) :write(‘Con vâ.t lồi đ ng v t n th t.') expl(3) :write(‘Con vâ.t bi t bay.') expl(4) :write('Con v t s ng n c.') expl(5) :write(‘Con vâ.t s ng Châu Phi.') expl(6) :write(‘Con vâ.t s ng r ng.') expl(7) :write(‘Con vâ.t có chân dài.') expl(8) :write(‘Con vâ.t n cá.') expl(9) :write(‘Con vâ.t n n phù du sinh v t n i.') expl(10) :write(‘Con vâ.t có da lơng l m đ m.') expl(11) :write(‘Con vâ.t có b m.') 193 PHỦ LỦC B Hỉåï n g dáù n sỉí dủ n g SWI-Prolog I Giåïi thiãûu SWI-Prolog SWI-Prolog thüc h Prolog Edinburgh Giạo sỉ Jan Wielemaker xáy dỉûng tỉì nàm 1983 tải Khoa Khoa hc Thäng tin X häüi, trỉåìng Âải hc Amsterdam, H Lan (Dept of Social Science Informatics, SWI, University of Amsterdam, Netherlands) Hiãûn nay, cọ thãø ti miãùn phê pháưn mãưm SWIProlog phiãn bn 5.2.11 for Windows tỉì âëa chè Web : http://www.swi-prolog.org/ SWI-Prolog cọ mäüt thỉ viãûn vë tỉ, v ti liãûu hỉåïng dáùn phong phụ SWIProlog hoảt âäüng theo hãû thäúng âån thãø, cọ giao diãûn trao âäøi hai chiãưu linh hoảt våïi ngän ngỉỵ C SWI-Prolog l mäüt ngän ngỉỵ sỉ phảm, váûy bë hản chãú êt nhiãưu vãư täúc âäü biãn dëch chỉång trçnh SWI-Prolog hoảt âäüng mäi trỉåìng âäư hoả XPCE âënh hỉåïng âäúi tỉåüng (GUI) X-window SWI-Prolog tỉång âäúi dãù sỉí dủng nhåì khai thạc cạc âàûc trỉng tỉång tạc âäư hoả SWI-Prolog cọ cạc phiãn bn cho cạc mạy chảy Linux/Unix, Macintosh Khi ti SWI-Prolog, NSD cọ thãø ti thãm ti liãûu hỉåïng dáùn sỉí dủng Sau ci âàût phiãn bn SWI-Prolog 5.2.11 for Windows, räưi khåíi âäüng trçnh plwin.exe, cỉía säø lm viãûc SWI-Prolog hiãûn hình dỉåïi âáy SWI-Prolog lm viãûc theo chãú âäü tỉång tạc (interpreter mode) (xem hçnh) Dáúu nhàõc lãûnh SWI-Prolog l mäüt càûp dáúu cháúm hi v dáúu gảch ngang (dáúu trỉì), âỉåüc liãût kã thỉï tỉû 1, 2, âãø theo di quạ trçnh lm viãûc ca NSD, theo sau l tr mn hçnh (dáúu chn) nháúp nhạy : ?Âãø SWI-Prolog, dng lãûnh File/ Exit, hồûc dng vë tỉì halt : ?- halt 194 Phủ lủc B Hỉåïng dáùn sỉí dủng SWI-Prolog 195 Hçnh I.1 Cỉía säø lm viãûc ca SWI-Prolog II II.1 Lm viãûc våïi SWI-Prolog Âàût cáu hi Sau mäüt chỉång trçnh Prolog âỉåüc biãn dëch hồûc âỉåüc ti vo bäü nhåï, NSD cọ thãø âàût cáu hi truy váún (kãút thục båíi mäüt dáúu cháúm) Tu theo cáu hi (âêch phi xoạ), Prolog tr låìi âụng (Yes) hồûc sai (No) v km theo kãút qu X = nãúu âêch cọ chỉïa biãún X no âọ Trong trỉåìng håüp cọ nhiãưu cáu tr låìi, sau kãút qu tr låìi âáưu tiãn, NSD cọ thãø âàût mäüt dáúu cháúm pháøy ; (semi-colon) nãúu mún tiãúp tủc u cáưu Prolog âỉa cạc cáu tr låìi khạc Tiãúp tủc quạ trçnh ny, Prolog láưn lỉåüt âỉa cạc kãút qu khạc cho âãún khi, hồûc Prolog tr låìi No, thç cọ nghéa l khäng cn cáu tr låìi no nỉỵa, hồûc Yes, nãúu NSD mún dỉìng lải bàòng cạch g Enter (↵) NSD cọ thãø nháûn âỉåüc thäng bạo läùi nãúu cáu hi cọ váún âãư : Láûp trçnh lägich Prolog 196 ERROR: Undefined procedure < / > % NSD â g sai tãn th tủc hồûc : ERROR: Syntax error: Operator expected II.2 % NSD â g sai biãøu thỉïc, v.v Chảy trçnh demo Sau âáy l vê dủ chảy chỉång trçnh demo likes.pl ca SWI-Prolog Näüi dung tãûp likes.pl sau : likes(sam, A) :indian(A), mild(A) likes(sam, A) :chinese(A) likes(sam, A) :italian(A) likes(sam, chips) italian(pizza) italian(spaghetti) chinese(chow_mein) chinese(chop_suey) chinese(sweet_and_sour) mild(dahl) mild(tandoori) mild(kurma) indian(curry) indian(dahl) indian(tandoori) indian(kurma) NSD nảp chỉång trçnh vo bäü nhåï båíi lãûnh sau : ?- [swi('demo/likes')] % swi('demo/likes') compiled 0.00 sec, 2, 340 bytes Yes Sau tãûp likes.pl âỉåüc ti vo bäü nhåï, NSD âàût cạc cáu hi v nháûn âỉåüc kãút qu sau : ?- like(X, Y) Correct to: likes(X, Y)? Yes X = sam Y = dahl ; X = sam Y = tandoori ; Phủ lủc B Hỉåïng dáùn sỉí dủng SWI-Prolog 197 Yes ?- II.3 % NSD â g Enter v váùn cn cáu tr låìi Chảy trçnh demo XPCE SWI-Prolog âỉåüc trang bë chỉïc nàng láûp trçnh hỉåïng âäúi tỉåüng tảo giao diãûn âäư hoả, âỉåüc gi l XPCE, cọ m ngưn tỉång thêch våïi Unix/X11 v Wçndows NSD cọ thãø thỉûc hiãûn cạc chỉång trçnh demo XPCE bàòng cạch g : ?- [swi( 'xpce/prolog/demo/pce_demo')] % contrib(contrib) compiled into pce_contrib 0.02 sec, 1,260 bytes % swi('xpce/prolog/demo/pce_demo') compiled into pce_demo 0.02 sec, 11,408 bytes Yes ?- pcedemo Yes Mäüt cỉía säø hiãûn sau : Hçnh II.1 Cạc chỉång trçnh demo XPCE ca SWI-Prolog NSD chn xem mäüt tr chåi bàòng cạch lỉûa tãn tr chåi räưi Open Sau âọ, nhàõp chüt tải nụt Quit âãø kãút thục chỉång trçnh Vê dủ tr chåi Rubiks Cube hçnh dỉåïi âáy : Láûp trçnh lägich Prolog 198 Hçnh II.2 Trçnh demo XPCE Rubiks Cube ca SWI-Prolog II.4 Cạc lãûnh âån (Menu commands) Cỉía säø lm viãûc SWI-Prolog gäưm mäüt säú lãûnh âån ch úu sau : File/consult Tỉång tỉû lãûnh consult(File) dng âãø nảp tãûp chỉång trçnh File vo bäü nhåï File/Reload modified files Dng âãø nảp lải (reloads) mäüt tãûp chỉång trçnh â bë thay âäøi vo bäü nhåï Thỉåìng âỉåüc sỉí dủng sau â soản tho trãn chỉång trçnh cọ thãø sỉí dủng lãûnh make File/Navigator Måí cỉía säø tỉång tỉû explorer ca Windows âãø tçm kiãúm tãûp hồûc vë tỉì Prolog cạc thỉ mủc, äø âéa Phủ lủc B Hỉåïng dáùn sỉí dủng SWI-Prolog 199 Hçnh II.Cỉía säø Navigator Settings/Font Dng âãø thay âäøi phäng chỉỵ giao diãûn SWI-Prolog Settings/User init file Soản tho tãûp cáúu hçnh pl.ini chỉïa cạc thäng tin ci âàût hãû thäúng v chụ thêch Settings/Stack sizes Cho phẹp âënh nghéa lải kêch thỉåïc khäng gian lm viãûc ca cạc danh âáøy xúng (stack sizes) Hçnh II.3 Âënh nghéa kêch thỉåïc danh âáøy xúng Run/Interrupt Ngàõt mäüt tiãún trçnh Prolog (Prolog process) cọ thãø sỉí dủng täø håüp phêm Control-C cọ cng hiãûu qu tỉång tỉû Lục ny, xút hiãûn âäúi thoải : Action (h for help) ? Options: a: abort c: continue b: e: break exit Láûp trçnh lägich Prolog 200 g: h (?): goals help t: trace Action (h for help) ? abort ERROR: Execution Aborted % Execution Aborted ?Run/New thread Tảo mäüt cỉía säø lm viãûc måïi âãø thỉûc hiãûn chỉång trçnh Trong cỉía säø måïi ny cọ thãø dng chung chỉång trçnh v dỉỵ liãûu â cọ màût cỉía säø lm viãûc chênh Debug/Edit spy points Soản tho cạc âiãøm ngàõt cạc vë tỉì Help Tçm âc cạc näüi dung hỉåïng dáùn sỉí dủng SWI-Prolog khạc II.5 Soản tho chỉång trçnh NSD cọ thãø sỉí dủng mäüt hãû soản tho vàn bn báút k ca Windows NotePad, NCeditor âãø soản tho chỉång trçnh Prolog, lỉu cáút lãn âéa, sau âọ ti vo mäi trỉåìng SWI-Prolog âãø chảy nhåì lãûnh : ?- consult( ) hồûc : ?- [ ] Våïi l tãn tãûp chỉång trçnh (khäng cáưn ghi pháưn måí räüng pl Cọ thãø chè âënh âỉåìng dáùn thỉ mủc âãún tãn tãn tãûp Chụ dáúu cháúm hi ?âàût trỉåïc mäùi cáu lãûnh l dáúu nhàõc ca SWI-Prolog Vê dủ nảp chỉång trçnh bi toạn Qn Háûu (xem pháưn trçnh by l thuút) : ?- [myex5] % myex5 compiled 0.00 sec, 2,020 bytes Yes ?- solution( 8, S ) % Tçm mäüt låìi gii cho bi toạn Qn Háûu S = [1, 7, 4, 6, 8, 2, 5, 3] Yes % Vë trê Qn Háûu trãn cạc cäüt Khi â nảp chỉång trçnh Prolog vo bäü nhåï, dng lãûnh : ?- Listing Phủ lủc B Hỉåïng dáùn sỉí dủng SWI-Prolog 201 âãø liãût kã cạc dng lãûnh cỉía säø lm viãûc chênh ca Prolog Hçnh II.4 Cỉía säø soản tho vàn bn PceEmacs ca SWI-Prolog SWI-Prolog cọ sàơn mäüt hãû soản tho PceEmacs ráút thûn tiãûn âãø soản tho v thỉûc hiãûn chỉång trçnh G vo dng lãûnh : ?- emacs âãø måí cỉía säø soản tho vàn bn nhiãưu chỉïc nàng (scratch) III Mäüt säú lãûnh SWI-Prolog thäng dủng Sau âáy l mäüt säú vë tỉì âiãưu khiãøn mäi trỉåìng thäng dủng ca SWIProlog consult(+File) Nảp tãûp chỉång trçnh vo bäü nhåï Chụ sỉí dủng dáúu phán cạch thỉ mủc l / Vê dủ : % Nảp tãûp likes.pl tỉì thỉ mủc lm viãûc (xem pwd) vo bäü nhåï ?- consult(likes) % Nảp tãûp likes.pl sỉí dủng âỉåìng dáùn âáưy â - tuût âäúi (absolute path) ?- ['C:/Program Files/pl/demo/likes'] % Sỉí dủng âỉåìng dáùn kiãøu Windows (Windows-style path-name) ?- ['C:\\Program Files\\pl\\demo\\likes'] Láûp trçnh lägich Prolog 202 pwd Âỉa thỉ mủc lm viãûc (working directory hay folder) ca SWI-Prolog ls Liãût kã danh cạc tãûp thỉ mủc hiãûn hnh edit Nãúu Prolog âỉåüc khåíi âäüng båíi mäüt tãûp pl tỉì Windows Explorer, thç chảy trçnh soản tho màûc nhiãn, chàóng hản Windows Notepad, âãø soản tho tãûp ny Cọ thãø sỉí dủng lãûnh âån File/Edit ?- edit % Waiting for editor Yes % Sau NSD kãút thục soản tho edit(+File) Sản tho tãûp hay âån thãø chỉång trçnh â cọ màût trãn âéa ?- edit(myex) % Waiting for editor Yes % Måí Notepad âãø soản tho tãûp myex.pl % hiãûn cọ åí thỉ mủc hiãûn hnh % Sau NSD kãút thục soản tho make Nảp tãûp chỉång trçnh vo bäü nhåï sau â thỉûc hiãûn mäüt säú thay âäøi trace Chảy trçnh duût tçm sỉía läùi debugger apropos(+Keyword) Tçm vë tỉì cọ chỉïa tỉì khoạ Keyword help(+Spec) Måí cỉía säø hỉåïng dáùn vãư Spec, l tãn mäüt vë tỉì hồûc tãn mäüt hm C T i liãû u tham kh o I Bratko (L Ricard d ch), Programmation en Prolog pour l’ intelligence artificielle, InterÉditions, Paris, 1988 I Bratko, Programming for Artificial Intelligence, AddisonWesley, 1987 K.L Clavle, S.A Tarnlound Logic Programming Accademic Press 1983 G Falquet Prolog et programmation logique Notes de cours, Université de Genève, 2002 H Farrenry, M Ghallab Éléments d’intelligence artificielle, Hermes, Paris-LondreLausanne 1990 B ch H ng Khang, Hồng Ki m Trí tu nhân t o : ph Xu t b n Khoa h c K thu t, 1989 ng pháp ng d ng Nhà J.W Leoyd Foundations of Logic Programming, Springer-Verlag, 1984 P Nugues La Programmation logique et le langage Prolog Notes de cours, ISMRA, 2002 D.Teller Partiel de Prolog Notes de cours, École Centrale de Lyons, 2001 10 Nguy n Thanh Thu Trí tu nhân t o : ph ng pháp gi i quy t v n đ k thu t x lý tri th c Nhà Xu t b n Giáo d c, 1986 11 A.Voronkov, Logic Programming and automated reasoning, Springer-Verlag, 1993 12 Các tài li u v Prolog t p Prolog Internet : ftp://ftp.umh.ac.be/pub/ftp_sgl/LangagesProgrammation/LP-exercProlog.pdf http://www.etse.urv.es/EngInf/assig/iai/Laboratoris/Prolog/ http://membres.lycos.fr/epl2000/2eme/POO/ SPV_Prolog/1_Prolog_leLangage/ 203 ... write(X) % solve/1 % PROLOG interpreter written in PROLOG (so- called vanilla meta-interpreter) % usage: ?-solve(PrologGoal) solve(true) solve((A, B)) :solve(A), solve(B) solve(A) :clause(A,B), solve(B)... affpost(C), write(A) tree_sort(X) :X=emptytree tree_sort(X) :X=tree(A, B, C), B=emptytree, C=emptytree tree_sort(X) :X=tree(A, B, C), B=tree(Y, _, _), A>Y, tree_sort(B), C=emptytree tree_sort(X) :X=tree(A,... SWI -Prolog I Giåïi thiãûu SWI -Prolog SWI -Prolog thüc h Prolog Edinburgh Giạo sỉ Jan Wielemaker xáy dỉûng tỉì nàm 1983 tải Khoa Khoa hc Thäng tin X häüi, trỉåìng Âải hc Amsterdam, H Lan (Dept of Social

Ngày đăng: 29/06/2017, 23:03

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan