Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 99 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
99
Dung lượng
659,91 KB
Nội dung
PGS.TS PHAN HUY KHÁNH L p t rình Lơ g ích Prolog NHÀ XU T B N I H C QU C GIA HÀ N I 2004 PGS.TS PHAN HUY KHÁNH L p tr ìn h L ơg í ch t r ong Pr ol og Prolog ngôn ng l p trình lơgich (Prolog = PROgramming in LOGic) GS A Colmerauer ưa l n u tiên năm 1972 t i trư ng i h c Marseille, nư c Pháp n năm 1980, Prolog nhanh chóng c áp d ng r ng rãi, c ngư i Nh t ch n làm ngôn ng phát tri n máy tính th h Prolog ã c cài t h u h t dòng máy tính Unix/Linux, Macintosh, Windows Prolog cịn c g i ngơn ng l p trình ký hi u (symbolic programming) tương t l p trình hàm (functional programming), hay l p trình phi s (non-numerical programming) Nguyên lý l p trình lơgich d a phép suy di n lơgích, liên quan n nh ng khái ni m tốn h c phép h p nh t Herbrand, h p gi i Robinson, lôgich Horn, lôgich v t b c m t (first order predicate logic), v.v Prolog r t thích h p gi i quy t nh ng toán liên quan n i tư ng m i quan h gi a chúng Prolog c ng d ng ch y u lĩnh v c trí tu nhân t o (Artificial Intelligence) cơng ngh x lý tri th c, h chuyên gia, máy h c, x lý ngơn ng , trị chơi, v.v N i dung cu n sách t p trung trình bày s lý thuy t nh ng k thu t l p trình b n Prolog, r t thích h p cho sinh viên ngành tin h c nh ng b n c mu n tìm hi u v k thu t l p trình ng d ng lĩnh v c trí tu nhân t o V TÁC GI : T t nghi p ngành Tốn Máy tính năm 1979 t i trư ng i h c Bách khoa Hà N i T 1979 n gi ng d y t i khoa Công ngh Thông tin, trư ng i h c Bách khoa, i h c N ng B o v ti n sĩ năm 1991 t i Pháp Gi ch c ch nhi m khoa Công ngh Thông tin 1995-2000 Hư ng nghiên c u : x lý ngôn ng , x lý a ng , lý thuy t tính tốn E-mail: khanhph@vnn.vn L I NĨI U Cu n sách nh m cung c p s lý thuy t nh ng phương pháp l p trình b n nh t c a mơn h c «L p trình lơgich» (Programming in Logic) Ngư i c s c làm quen v i m t s k thu t l p trình lơgich c ng d ng tương i ph bi n ch y u lĩnh v c trí tu nhân t o (Artificial Intelligence) công ngh x lý tri th c, máy h c, h chuyên gia, x lý ngơn ng t nhiên, trị chơi, v.v Cu n sách g m năm chương, m i chương, tác gi u c g ng ưa vào nhi u ví d minh h a N i dung chương sau : − Chương gi i thi u ngôn ng l p trình Prolog d a lơgich Horn (Horn logic) Ngư i c c làm quen v i ki u d li u c a Prolog, khái ni m lu t, s ki n vi t c chương trình Prolog ơn gi n − Chương trình bày m c nghĩa khác c a m t chương trình Prolog : nghĩa lôgich, nghĩa khai báo nghĩa th t c, cách Prolog tr l i câu h i, cách Prolog làm tho mãn ích − Chương trình bày phép toán s h c, phép so sánh i tư ng nh nghĩa hàm s d ng phép quy Prolog − Chương trình bày c u trúc danh sách phép x lý b n danh sách c a Prolog − Chương trình bày k thu t l p trình nâng cao v i Prolog − Ph n ph l c gi i thi u ngơn ng l p trình SWI-Prolog, hư ng d n cách cài t s d ng ph n m m m t s chương trình ví d tiêu bi u vi t SWI Prolog ã ch y có k t qu Cu n sách dùng làm giáo trình cho sinh viên ngành Tin h c nh ng b n c mu n tìm hi u thêm v k thu t l p trình cho lĩnh v c trí tu nhân t o Trong trình biên so n, tác gi ã nh n c t b n ng nghi p nhi u óng góp b ích v m t chun mơn, nh ng ng viên khích l v m t tinh th n, s giúp v biên t p cu n sách c i Tác gi xin c bày t lòng bi t ơn sâu s c Tác gi chân thành c m ơn m i ý ki n phê bình óng góp c a b n c g n xa v n i dung c a cu n sách N ng, ngày 27/05/2004 Tác gi M CL C CHƯƠNG M U V NGÔN NG PROLOG I GI I THI U NGÔN NG PROLOG I.1 Prolog ngôn ng l p trình lơgich I.2 Cú pháp Prolog I.2.1 Các thu t ng I.2.2 Các ki u d li u Prolog I.2.3 Chú thích II CÁC KI U D LI U SƠ C P C A PROLOG II.1 Các ki u h ng (tr c ki n) II.1.1 Ki u h ng s II.1.2 Ki u h ng lôgich II.1.3 Ki u h ng chu i ký t II.1.4 Ki u h ng nguyên t II.2 Bi n III S KI N VÀ LU T TRONG PROLOG III.1 Xây d ng s ki n III.2 Xây d ng lu t 10 III.2.1 nh nghĩa lu t 10 III.2.2 nh nghĩa lu t quy 16 III.2.3 S d ng bi n Prolog 18 IV KI U D LI U C U TRÚC C A PROLOG 20 IV.1 nh nghĩa ki u c u trúc c a Prolog 20 IV.2 So sánh h p nh t h ng 23 CHƯƠNG I II II.1 II.2 II.3 II.4 II.5 NG NGHĨA C A CHƯƠNG TRÌNH PROLOG 31 QUAN H GI A PROLOG VÀ LƠGICH TỐN H C 31 CÁC M C NGHĨA C A CHƯƠNG TRÌNH PROLOG 32 Nghĩa khai báo c a chương trình Prolog 33 Khái ni m v gói m nh 34 Nghĩa lôgich c a m nh 35 Nghĩa th t c c a Prolog 37 T h p y u t khai báo th t c 47 i III III.1 III.2 III.3 III.3.1 III.3.2 VÍ D : CON KH VÀ QU CHU I 48 Phát bi u toán 48 Gi i toán v i Prolog 49 S p t th t m nh ích 54 Nguy g p vòng l p vô h n 54 Thay i th t m nh ích chương trình 56 CHƯƠNG I I.1 I.2 I.3 II II.1 II.2 II.3 II.4 III III.1 III.2 III.3 III.3.1 III.3.2 III.3.3 CÁC PHÉP TOÁN VÀ S H C 65 S H C 65 Các phép toán s h c 65 Bi u th c s h c 65 nh nghĩa phép toán Prolog 68 CÁC PHÉP SO SÁNH C A PROLOG 73 Các phép so sánh s h c 73 Các phép so sánh h ng 75 V t xác nh ki u 77 M t s v t x lý h ng 77 NH NGHĨA HÀM 79 nh nghĩa hàm s d ng quy 79 T i ưu phép quy 87 M t s ví d khác v quy 88 Tìm ng i m t th có nh hư ng 88 Tính dài ng i m t th 89 Tính g n úng chu i 90 CHƯƠNG I II III III.1 III.1.1 III.1.2 III.1.3 III.1.4 III.1.5 III.1.6 III.2 C U TRÚC DANH SÁCH 95 BI U DI N C U TRÚC DANH SÁCH 95 M T S V T X LÝ DANH SÁCH C A PROLOG 98 CÁC THAO TÁC CƠ B N TRÊN DANH SÁCH 99 Xây d ng l i m t s v t có s n 99 Ki m tra m t ph n t có m t danh sách 99 Ghép hai danh sách 100 B sung m t ph n t vào danh sách 104 Lo i b m t ph n t kh i danh sách 104 Ngh ch o danh sách 105 Danh sách 106 Hoán v 107 III.3 III.3.1 III.3.2 III.3.3 M t s ví d v danh sách 109 S p x p ph n t c a danh sách 109 Tính dài c a m t danh sách 109 T o sinh s t nhiên 111 CHƯƠNG I I.1 I.2 I.2.1 I.2.2 I.2.3 I.3 I.3.1 I.3.2 II II.1 II.2 II.3 II.3.1 II.3.2 II.4 II.5 II.5.1 II.5.2 II.5.3 II.5.4 II.5.5 III III.1 III.2 III.2.1 III.2.2 III.2.3 III.3 III.3.1 III.3.2 III.3.3 III.3.4 III.3.5 K THU T L P TRÌNH PROLOG 117 NHÁT C T 117 Khái ni m nhát c t 117 K thu t s d ng nhát c t 118 T o ích gi b ng nhát c t 118 Dùng nhát c t lo i b hồn tồn quay lui 119 Ví d s d ng k thu t nhát c t 122 Phép ph nh 126 Ph nh b i th t b i 126 S d ng k thu t nhát c t ph nh 128 S D NG CÁC C U TRÚC 131 Truy c p thông tin c u trúc t m t s d li u 132 Tr u tư ng hoá d li u 136 Mô ph ng ôtômat h u h n 138 Mô ph ng ôtômat h u h n không ơn nh 138 Mô ph ng ôtômat h u h n ơn nh 143 Ví d : l p k ho ch i du l ch b ng máy bay 144 Bài toán tám quân h u 150 S d ng danh sách to theo hàng c t 151 S d ng danh sách to theo c t 155 S d ng to theo hàng, c t ng CHÉO 158 K t lu n 161 B di n d ch Prolog 162 QUÁ TRÌNH VÀO-RA VÀ LÀM VI C V I T P 163 Khái ni m 163 Làm vi c v i t p 164 c ghi lên t p 164 M t s ví d c ghi lên t p 167 N p chương trình Prolog vào b nh 171 ng d ng ch làm vi c v i t p 172 nh d ng h ng 172 S d ng t p x lý h ng 173 Thao tác ký t 175 Thao tác nguyên t 177 M t s v t x lý s d li u 180 iii PH L C A M T S PH L C B I II II.1 II.2 II.3 II.4 II.5 III CHƯƠNG TRÌNH PROLOG 187 HƯ NG D N S D NG SWI-PROLOG 200 GI I THIÊUU SWI-PROLOG 194 LAIM VIÊUC V I SWI-PROLOG 195 t câu h i 195 Ch y trình demo 196 Ch y trình demo XPCE 197 Các l nh ơn (Menu commands) 198 So n th o chương trình 200 M T S L NH SWI-PROLOG THÔNG D NG 201 TÀI LI U THAM KH O 203 CHƯƠNG M uv ngơn ng Prolog « A program is a theory (in some logic) and computation is deduction from the theory » J A Robinson « Program = data structure + algorithm » N Wirth « Algorithm = logic + control » R Kowalski I Gi i thi u ngôn ng Prolog I.1 Prolog ngơn ng l p trình lôgich rolog ngôn ng c s d ng ph bi n nh t dịng ngơn ng l p trình lơgich (Prolog có nghĩa PROgramming in LOGic) Ngôn ng Prolog giáo sư ngư i Pháp Alain Colmerauer nhóm nghiên c u c a ơng xu t l n u tiên t i trư ng i h c Marseille u nh ng năm 1970 n năm 1980, Prolog nhanh chóng c áp d ng r ng rãi châu Âu, c ngư i Nh t ch n làm ngơn ng phát tri n dịng máy tính th h Prolog ã c cài t máy vi tính Apple II, IBM-PC, Macintosh Prolog cịn c g i ngơn ng l p trình ký hi u (symbolic programming) tương t ngơn ng l p trình hàm (functional programming), hay l p trình phi s (nonnumerical programming) Prolog r t thích h p gi i quy t toán liên quan n i tư ng (object) m i quan h (relation) gi a chúng Prolog c s d ng ph bi n lĩnh v c trí tu nhân t o Ngun lý l p trình lơgich d a m nh Horn (Horn logíc) M t m nh Horn bi u di n m t s ki n hay m t s vi c ó úng ho c không úng, x y ho c khơng x y (có ho c khơng có, v.v ) Ví d I.1 : Sau ây m t s m nh Horn : N u m t ngư i già mà (và) khơn ngoan ngư i ó h nh phúc Jim ngư i h nh phúc N u X cha m c a Y Y cha m c a Z X ơng c a Z Tom ông c a Sue P L p trình lơgic Prolog T t c m i ngư i u ch t (ho c N u ngư i ó ph i ch t) Socrat ngư i Trong m nh Horn trên, m nh 1, 3, c g i lu t (rule), m nh l i c g i s ki n (fact) M t chương trình lơgich có th c xem m t s d li u g m m nh Horn, ho c d ng lu t, ho c d ng s ki n, ch ng h n t t c s ki n lu t t n Ngư i s d ng (NSD) g i ch y m t chương trình lơgich b ng cách t câu h i (query/ question) truy v n s d li u này, ch ng h n câu h i : Socrat có ch t khơng ? (tương ương kh ng nh Socrat ch t úng hay sai ?) M t h th ng lôgich s th c hi n chương trình theo cách «suy lu n»-tìm ki m d a v n «hi u bi t» ã có chương trình - s d li u, minh ch ng câu h i m t kh ng nh, úng (Yes) ho c sai (No) V i câu h i trên, h th ng tìm ki m s d li u kh ng nh Socrat ch t «tìm th y» lu t tho mãn (v thì) V n d ng lu t 5, h th ng nh n c Socrat ngư i (v n u) s ki n T ó, câu tr l i s : Yes có nghĩa s ki n Socrat ch t úng I.2 Cú pháp Prolog I.2.1 Các thu t ng M t chương trình Prolog m t s d li u g m m nh (clause) M i m nh c xây d ng t v t (predicat) M t v t m t phát bi u ó v i tư ng có giá tr chân úng (true) ho c sai (fail) M t v t có th có i nguyên lôgich (logic atom) M i nguyên t (nói g n) bi u di n m t quan h gi a h ng (term) Như v y, h ng quan h gi a h ng t o thành m nh H ng c xem nh ng i tư ng “d li u” m t trình Prolog H ng có th h ng sơ c p (elementary term) g m h ng (constant), bi n (variable) h ng ph c h p (compound term) Các h ng ph c h p bi u di n i tư ng ph c t p c a toán c n gi i quy t thu c lĩnh v c ang xét H ng ph c h p m t hàm t (functor) có ch a i (argument), có d ng Tên_hàm_t ( i_1, , i_n) Tên hàm t m t chu i ch và/ho c chũ s c b t u b i m t ch thư ng Các i có th bi n, h ng sơ c p, ho c h ng ph c h p Trong Prolog, Các phép toán s h c 77 a(X) :- b(X) b(X) :- X1 is X - 2, write(X), write(' '), a(X1) Chương trình khơng g i « quy » even_succ_nat K t qu sau l i g i a(20) dãy s gi m d n 20 18 16 14 12 10 Ví d III.2 : Xây d ng s t nhiên (Peano) phép c ng s t nhiên /* nh nghĩa s t nhiên */ nat(0) % m t s t nhiên nat(s(N)) :% s(X) m t s t nhiên nat(N) % n u N m t s t nhiên Ch ng h n s c vi t : s(s(s(s(s(zero))))) /* nh nghĩa phép c ng */ addi(0, X, X) % lu t : + X = X /* addi(X, 0, X) có th s d ng them lu t : X + = X addi(s(X), Y, s(Z)) :- % lu t : n u X + Y = Z (X+1) + Y = (Z+1) addi(X, Y, Z) Ho c nh nghĩa theo nat(X) sau : addi(0, X, X) :- nat(X) ?- addi(X, Y, s(s(s(s(0))))) X = Y = s(s(s(s(0)))) Yes ?- addi(X, s(s(0)), s(s(s(s(s(0)))))) X = s(s(s(0))) Yes ?- THREE = s(s(s(0))), FIVE = s(s(s(s(s(0))))), addi(THREE, FIVE, EIGHT) THREE = s(s(s(0))) FIVE = s(s(s(s(s(0))))) EIGHT = s(s(s(s(s(s(s(s(0)))))))) Yes Ví d III.3 : Tìm c s chung l n nh t (GCD: Greatest Common Divisor) Cho trư c hai s nguyên X Y, ta c n tính c s D USCLN d a ba quy t c sau : N u X = Y, D b ng X N u X < Y, D b ng USCLN c a X c a Y - X N u X > Y, th c hi n tương t bư c 2, b ng cách hoán v vai trị X Y 78 L p trình lơgic Prolog Có th d dàng tìm c ví d minh ho s ho t ng c a ba quy t c trư c ây V i X =20 Y =25, ta nh n c D =5 sau m t dãy phép tr Chương trình Prolog c xây d ng sau : gcd( X, X, X gcd( X, Y, D X < Y, Y1 is Y gcd( X, ) ) :– X, Y1, D ) gcd( X, Y, D ) :X > Y, gcd( Y, X, D ) ích cu i m nh th ba ây có th c thay th b i : X1 is X – Y, gcd( X1, Y, D ) K t qu ch y Prolog sau : ?- gcd( 20, 55, D ) D = Ví d III.4 : Tính giai th a fac(0, 1) fac(N, F) :N > 0, M is N - 1, fac(M, Fm), F is N * Fm M nh th hai có nghĩa r ng n u l n lư t : N > 0, M = N - 1, Fm is (N-1)!, F = N * Fm, F N! Phép tốn is gi ng phép gán ngôn ng l p trình m nh l nh Prolog, is không gán giá tr m i cho bi n V m t lôgich, th t m nh v ph i c a m t lu t khơng có vai trị gì, l i có ý nghĩa th c hi n chương trình M khơng ph i bi n l i g i th t c quy s gây m t vịng l p vô h n Các nh nghĩa hàm Prolog thư ng r c r i hàm quan h mà không ph i bi u th c Các quan h c nh nghĩa s d ng nhi u lu t th t lu t xác nh k t qu tr v c a hàm Ví d III.5 : Tính s Fibonacci /* Fibonacci function */ Các phép toán s h c 79 fib(0, 0) % fib0 = fib(1, 1) % fib1 = fib(N, F) :% fibn+2 = fibn+1 + fibn N > 1, N1 is N - 1, fib(N1, F1), N2 is N - 2, fib(N2, F2), F is F1 + F2 ?- fib(20, F) F = 10946 Yes ?- fib(21, F) ERROR: Out of local stack Ta nh n th y thu t tốn tính s Fibonacci ây s d ng hai l n g i quy ã nhanh chóng làm y b nh ch v i N=21, SWI-prolog ph i d ng l i thông báo l i Ví d III.6 : Tính hàm Ackerman /* Ackerman's function */ ack(0, N, A) :- % Ack(0, n) = n + A is N + ack(M1, 0, A) :- % Ack(m, n) = Ack(m-1, 1) M > 0, M is M - 1, ack(M, 1, A) ack(M1, N1, A) :% Ack(m, n) = Ack(m-1, Ack(m, n-1)) M1 > 0, N1 > 0, M is M - 1, N is N - 1, ack(M1, N, A1), ack(M, A1, A) Ví d III.7 : Hàm tính t ng plus(X, Y, Z) :nonvar(X), nonvar(Y), Z is X + Y plus(X, Y, Z) :nonvar(Y), nonvar(Z), X is Z - Y plus(X, Y, Z) :nonvar(X), nonvar(Z), Y is Z - X Ví d III.8 : Thu t toán h p nh t 80 L p trình lơgic Prolog Sau ây m t thu t toán h p nh t ơn gi n cho phép x lý trư ng h p m t bi n ó c thay th (h p nh t) b i m t h ng mà h ng l i có ch a úng tên bi n ó Ch ng h n phép h p nh t X = f(X) không h p l % unify(T1, T2) unify(X, Y) :% trư ng h p bi n var(X), var(Y), X = Y unify(X, Y) :% trư ng h p bi n = không ph i bi n var(X), nonvar(Y), X = Y unify(X, Y) :% trư ng h p không ph i bi n = bi n nonvar(X), var(Y), Y = X unify(X, Y) :% nguyên t hay s = nguyên t hay s nonvar(X), nonvar(Y), atomic(X), atomic(Y), X = Y unify(X, Y) :% trư ng h p c u trúc = c u trúc nonvar(X), nonvar(Y), compound(X), compound(Y), termUnify(X, Y) termUnify(X, Y) :% h p nh t h ng v i h ng ch a c u trúc functor(X, F, N), functor(Y, F, N), argUnify(N, X, Y) argUnify(N, X, Y) :% h p nh t N tham N>0, argUnify1(N, X, Y), Ns is N - 1, argUnify(Ns, X, Y) argUnify(0, X, Y) argUnify1(N, X, Y) :- % h p nh t tham arg(N, X, ArgX), arg(N, Y, ArgY), unify(ArgX, ArgY) i c a X Y i có b c N Ví d III.9 : Lý thuy t s Ta ti p t c xây d ng hàm m i s t nhiên ã c nh nghĩa ví d Ta xây d ng phép so sánh hai s t nhiên d a phép c ng sau : egal(+(X, 0), X) % phép c ng có tính giao hốn egal(+(0, X), X) egal(+(X, s(Y)), s(Z)) :egal(X+s(Y), s(Z)) % X YZ.egal(X+Y, Z) → Các phép toán s h c egal(+(X, Y), Z) Sau ây m t s k t qu : ?- egal(s(s(0))+s(s(s(0))), s(s(s(s(s(0)))))) Yes ?- egal(+(s(s(0)), s(s(0))), X) X = s(s(s(s(0)))) ?- egal(+(X, s(s(0))), s(s(s(s(s(0)))))) X = s(s(s(0))) Yes ?- egal(+(X, s(s(0))), s(s(s(s(s(0)))))) X = s(s(s(0))) Yes ?- egal(X, s(s(s(s(0))))) X = s(s(s(s(0))))+0 ; X = 0+s(s(s(s(0)))) ; X = s(s(s(0)))+s(0) ; X = 0+s(s(s(s(0)))) ; X = s(s(0))+s(s(0)) ; X = 0+s(s(s(s(0)))) ; X = s(0)+s(s(s(0))) ; X = 0+s(s(s(s(0)))) ; X = 0+s(s(s(s(0)))) ; X = 0+s(s(s(s(0)))) ; No V i ích egal(X, Y) sau ây, câu tr l i vô h n : ?- egal(X, Y) X = _G235+0 Y = _G235 ; X = 0+_G235 Y = _G235 ; X = _G299+s(0) Y = s(_G299) ; X = 0+s(_G302) Y = s(_G302) ; 81 82 L p trình lơgic Prolog X = _G299+s(s(0)) Y = s(s(_G299)) ; X = 0+s(s(_G309)) Y = s(s(_G309)) ; X = _G299+s(s(s(0))) Y = s(s(s(_G299))) ; X = 0+s(s(s(_G316))) Y = s(s(s(_G316))) ; X = _G299+s(s(s(s(0)))) Y = s(s(s(s(_G299)))) ; X = 0+s(s(s(s(_G323)))) Y = s(s(s(s(_G323)))) ; X = _G299+s(s(s(s(s(0))))) Y = s(s(s(s(s(_G299))))) ; X = 0+s(s(s(s(s(s(_G337)))))) Y = s(s(s(s(s(s(_G337)))))) ; X = _G299+s(s(s(s(s(s(s(0))))))) Y = s(s(s(s(s(s(s(_G299))))))) v.v 83 Các phép toán s h c III.2 T i ưu phép quy L i gi i toán s d ng quy ngôn ng l p trình nói chung thư ng ng n g n, d hi u d qu n lý c chương trình Tuy nhiên, m t s trư ng h p, s d ng quy l i x y v n v ph c t p tính tốn, khơng nh ng t n b nh mà t n th i gian Trong ngôn ng m nh l nh, phép tính n! s d ng quy c n s d ng b nh có c 0(n) th i gian tính tốn có c 0(n), thay g i quy, ngư i ta thư ng s d ng phép l p fac=fac*i, i=1 n Ta xét l i ví d tính s Fibonacci ây v i l i g i quy : fib(N, F) :N > 1, N1 is N - 1, fib(N1, F1), N2 is N - 2, fib(N2, F2), F is F1 + F2 ý r ng m i l n g i hàm fib(n) v i n>1 s d n t i hai l n g i khác, nghĩa s l n g i s tăng theo lu th a V i n l n, chương trình g i quy v y d gây tràn b nh Ví d sau ây t t c l i g i có th cho trư ng h p n=5 fib5 3 1 2 1 Hình III.1 Bi u di n l i g i quy tìm s Fibonacci M t s ngơn ng m nh l nh tính s Fibonacci s d ng c u trúc l p tránh tính i tính l i m t giá tr Chương trình Pascal dư i ây dùng hai bi n ph x=fib(i) y=fib(i+1) : { tính fib(n) v i n > } i:= 1; x:= 1; y:= 0; while i < n begin x:= x + y; y:= x – y end; Ta vi t l i chương trình Prolog sau : fibo(0, 0) fibo(N, F) :N >= 1, fib1(N, 1, 0, F) fib1(1, F, _, F) fib1(N, F2, F1, FN) :- 84 L p trình lơgic Prolog N > 1, N1 is N - 1, F3 is F1 + F2, fib1(N1, F3, F2, FN) ?- fibo(21, F) F = 10946 Yes ?- fibo(200, F) F = 2.80571e+041 Yes III.3 M t s ví d khác v III.3.1 Cho m t quy Tìm ng i m t th có th có nh hư ng nh hư ng sau : A B C D E Hình III.2 Tìm ng i m t th có nh hư ng Ta xét tốn tìm ng i gi a hai nh c a th M i cung n i hai nh c a th bi u di n m t quan h gi a hai nh T th trên, ta có th vi t m nh Prolog bi u di n s ki n : arc(a, arc(b, arc(c, arc(c, arc(a, b) c) e) d) e) Gi s c n ki m tra có t n t i m t ng i gi a hai nút a d (không t n t i ng i gi a hai nút ã mô t ), ta vi t m nh : path(a, d) nh nghĩa này, ta nh n xét sau : • T n t i m t ng i gi a hai nút có cung n i chúng 85 Các phép tốn s h c • T n t i m t ng i gi a hai nút X Y n u t n t i m t nút th ba Z cho t n t i m t ng i gi a X Z m t ng i gi a Z Y Ta vi t chương trình sau : path(X, Y) :- arc(X, Y) path(X, Y) :arc(X, Z), path(Z, Y) Ta th y nh nghĩa th t c path(X, Y) tương t th t c tìm t tiên gián ti p gi a hai ngư i dòng h ancestor(X, Y) ã xét trư c ây ?- path(X, Y) X = a Y = b ; X = b Y = c ; III.3.2 Tính dài ng i m t th Ta xét tốn tính dài ng i gi a hai nút, t nút u n nút cu i m t th s cung gi a chúng Ch ng h n dài ng i gi a hai nút a d ví d Ta l p lu n sau : • N u gi a hai nút có cung n i chúng dài ng i • G i L dài ng i gi a hai nút X Y, L1 dài ng i gi a m t nút th ba Z Y n u t n t i gi s có cung n i X Z, ó L = L1 + Chương trình c vi t sau : trajectory(X, Y, 1) :- arc(X, Y) trajectory(X, Y, L) :arc(X, Z), trajectory(Z, Y, L1), L is L1 + trajectory(a, d, L) L = Yes III.3.3 Tính g n úng chu i Trong Toán h c thư ng g p tốn tính g n úng giá tr c a m t hàm s v i xác nh tuỳ ý (e) theo phương pháp khai tri n thành chu i Max Loren Ví d tính hàm mũ ex v i xác 10-6 nh khai tri n chu i Max Loren : 86 L p trình lôgic Prolog ex = + x + x x3 + + 2! 3! G i expower(X, S) hàm tính giá tr hàm mũ theo X, bi n S k t qu g n úng v i xác e=10-6 T cơng th c khai tri n Max Loren ây, ta nh n th y giá tr c a hàm mũ ex t ng vơ h n có d ng : sum(0) = 1, t0 = tương ng v i x = ex = sum(i+1) = sum(i) + ti+1, v i ti+1 = ti * x /( i+1), i = 0, 1, th c hi n phép l p, ta c n xây d ng hàm quy tính t ng sum(X, S, I, T) ó s d ng bi n trung gian I bư c l p th i T s h ng ti Theo cách xây d ng này, hàm tính t ng sum(X, S, I, T) t ng c a s h ng th I tr i c a chu i Q trình tính t ng d ng l i ti< e, nghĩa ã t c xác e T i th i i m này, giá tr c a t ng s h ng ti i u ki n kh i ng trình l p chuy n v t expower(X, S) thành v t tính t ng sum(X, S, I, T) v i giá tr u I=0 T=1 Ta có chương trình quy sau : expower(X, S) :sum(X, S, 0, 1) sum(_, T, _, T) :abs(T) < 0.000001 sum(X, S, I, T) :abs(T) > 0.000001, I1 is I + 1, T1 is T*X/I1, sum(X, S1, I1, T1), S is S1 + T ?- expower(1, S) S = 2.71828 Yes ?- expower(10, S) S = 22026.5 Yes Tóm t t chương • Các phép tốn s h c c th c hi n nh th t c thư ng trú Prolog Các phép tốn s h c 87 • Vai trị c a phép tốn tương t vai trị c a hàm t , ch nhóm thành ph n c a c u trúc mà thơi • M i NLT có th t nh nghĩa nh ng phép tốn riêng c a M i phép tốn c nh nghĩa b i tên, ưu tiên ki u g i tham i • Các phép tốn cho phép NLT v n d ng cú pháp linh ho t cho nhu c u riêng c a h S d ng phép toán làm cho chương trình tr nên d c (readability) • tính m t bi u th c s h c, m i tham i có m t bi u th c ó ph i c ràng bu c b i giá tr s • Ch d n op dùng nh nghĩa m t phép toán m i, g m y u t : tên, ki u ưu tiên c a phép tốn m i • S d ng phép toán trung t , ti n t , ho c h u t làm tăng cư ng tính d c c a m t chương trình Prolog • ưu tiên m t s nguyên n m m t kho ng giá tr cho trư c, thông thư ng n m gi a 1200 Hàm t c a m t bi u th c phép tốn có ưu tiên cao nh t Các phép tốn có ưu tiên th p nh t c ưu tiên nh t • Ki u c a m t phép toán ph thu c vào hai y u t : v trí c a phép toán so v i tham i, ưu tiên c a tham i c so sánh v i ưu tiên c a phép toán i v i ký hi u c t xfy, tham i x có ưu tiên bé h n ưu tiên c a phép tốn, cịn tham i y có ưu tiên bé ho c b ng ưu tiên c a phép toán Bài t p chương Cho bi t k t qu c a câu h i sau ây : ?- X=Y ?- X is Y ?- X=Y, Y=Z, Z=1 ?- X=1, Z=Y, X=Y ?- X is 1+1, Y is X ?- Y is X, X is 1+1 ?- 1+2 == 1+2 ?- X == Y ?- X == X 88 L p trình lơgic Prolog ?- =:= 2-1 ?- X =:= Y Cho bi t k t qu c a câu h i sau ây : ?- op(X) is op(1) ?- op(X) = op(1) ?- op(op(Z), Y) = op(X, op(1)) ?- op(X, Y) = op(op(Y), op(X)) T nh nghĩa s t nhiên (nat) phép c ng (addi) cho ví d m c nh nghĩa hàm, vi t ti p hàm tr (subt), nhân (multi), chia (divi), lu th a (power), giai th a (fact), so sánh nh (less) tìm c s chung l n nh t (pdg) s d ng hàm ã có (ch ng h n less, subt ) Vi t hàm Prolog ki m tra m t s nguyên tuỳ ý N : a N s ch n (even number) s d ng quy tr c ti p Hư ng d n : N ch n N±2 s ch n b N s l (odd number) s d ng quy tr c ti p Hư ng d n : N l N±2 s l c N ch n s d ng hàm ki m tra s l câu d (N ch n N±1 s l ) d N s l s d ng hàm ki m tra s ch n câu c (N l N±1 ch n) Vi t hàm Prolog làm t (tracking/traverse) nh phân theo th t trư c (reorder), sau (post-order) gi a (in-order) Gi s nh phân tương ng v i bi u th c s h c (5+6)*(3-(2/2)) m nh Prolog sau : tree(’*’, tree(’+’, leaf(5), leaf(6)), tree(’-’, leaf(3), tree(’/’, leaf(2), leaf(2))) K t qu t sau : theo th t trư c : [*, +, 5, 6, -, 3, /, 2, 2] th t gi a : [5, +, 6, *, 3, -, 2, /, 2] th t sau : [5, 6, +, 3, 2, 2, /, -, *] Vi t l i hàm t o 10 s t nhiên ch n u tiên ( ã cho ph n quy) cho k t qu tr v dãy s tăng d n L p b ng nhân table(R, N) có s b nhân (multiplicator) t tr i v i s nhân N (multiplier) d ng l i g p s b nhân R (k t qu R * N) 89 Các phép toán s h c xác e = 10-5 : Vi t hàm tính g n úng giá tr hàm sau v i 1 = − + − + π 1+