intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Lập Trình Logic Trong ProLog - PGS.TS. PHAN HUY KHÁNH phần 9

Chia sẻ: Dwefershrdth Vrthrtj | Ngày: | Loại File: PDF | Số trang:19

145
lượt xem
57
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Cú pháp và ngữ nghĩa của Prolog đơn giản và sáng sủa, nó được người Nhật coi là một trong những nền tảng để xây dựng máy tính thế hệ thứ năm mà ở đó, thay vì phải mô tả cách giải quyết một bài toán trên máy tính, con người chỉ cần mô tả bài toán và máy tính sẽ hỗ trợ họ nốt phần còn lại.

Chủ đề:
Lưu

Nội dung Text: Lập Trình Logic Trong ProLog - PGS.TS. PHAN HUY KHÁNH phần 9

  1. L p trình lägich trong Prolog 148 8 • 7 • 6 • 5 • 4 • 3 • 2 • 1 • 1 2 3 4 5 6 7 8 Hình II.7. M t l i gi i c a bài toán tám quân h u, bi u di n b i danh sách [ 1/4, 2/2, 3/7, 4/3, 5/6, 6/8, 7/5, 8/1 ]. ây, phép toán / không ph i là phép chia, mà ch là cách t h p hai to c a m t ô bàn c . Hình 5.6 trên ây là m t l i gi i khác c a bài toán tám quân h u ư c bi u di n dư i d ng m t danh sách như sau : [ 1/4, 2/2, 3/7, 4/3, 5/6, 6/8, 7/5, 8/1 ] T cách bi u di n danh sách, ta c n tìm l i gi i có d ng : [ X1/Y1, X2/Y2, X3/Y3, ... , X8/Y8 ] Ta c n tìm các giá tr c a các bi n X1, Y1, X2, Y2, X3, Y3, ... , X8, Y8. Do các quân h u ph i n m trên các c t khác nhau không th ăn l n nhau, nên ta có ngay giá tr c a các to X, và l i gi i lúc này có d ng : [ 1/Y1, 2/Y2, 3/Y3, ... , 8/Y8 ] Cho n lúc này, bài toán tám quân h u ch t ra i v i bàn c 8 × 8. Tuy nhiên, l i gi i ph i d ki n ư c cho trư ng h p t ng quát khi l p trình. ây, ta s th y r ng chính trư ng h p t ng quát l i ơn gi n hơn bài toán ban u. Bàn c 8 × 8 ch là m t trư ng h p riêng. gi i quy t cho trư ng h p t ng quát, ta chuy n kích thư c 8 quân h u thành m t s quân h u b t kỳ nào ó (m i c t m t quân h u), k c s c t b ng không. Ta xây d ng quan h solution t hai tình hu ng sau : 1. Danh sách các quân h u là r ng : danh sách r ng cũng là m t l i gi i vì không x y ra s t n công nào. solution( [ ] ). 2. Danh sách các quân h u khác r ng và có d ng như sau : [ X/Y | Others ]
  2. 149 K thu t l p trình Prolog Trong trư ng h p th hai, quân h u th nh t n m trên ô X/Y, còn nh ng quân h u khác n m trong danh sách Others. N u danh sách này là m t l i gi i, thì nh ng i u ki n sau ây ph i ư c tho mãn : 1. Nh ng quân h u trong danh sách Others không th t n công l n nhau, i u này nói lên r ng Others cũng là m t l i gi i. 2. V trí X và Y c a nh ng quân h u ph i n m gi a 1 và 8. 3. M t quân h u t i v trí X/Y không th t n công m t quân h u nào khác trong danh sách Others. i v i i u ki n th nh t, quan h solution ph i ư c g i m t cách quy. i u ki n th hai nói lên r ng Y ph i thu c v danh sách [ 1, 2, 3, 4, 5, 6, 7, 8 ]. ây, ta không c n quan tâm n v trí X, vì nó ph i tương h p v i danh sách k t qu tr v như ta ã xác nh ngay t u. Nghĩa là X ph i thu c v nh ng giá tr ã ư c n nh tương ng. Gi s i u ki n th ba ư c gi i quy t nh quan h noattack, chương trình Prolog cho quan h solution như sau : solution( [ X/Y | Others ] ) :- solution( Others ), member( Y, [ 1, 2, 3, 4, 5, 6, 7, 8 ] ), noattack( X/Y, Others ). Bây gi ta c n tìm quan h noattack. Ta th y : 1. N u danh sách Rlist r ng, khi ó noattack là úng, vì không có quân h u nào t n công quân h u t i X/Y nào ó. noattack( _, [ ] ). 2. N u danh sách Rlist khác r ng, khi ó có d ng [ R1 | Rlist1 ] và hai i u ki n sau ây ph i ư c tho mãn : (a) Quân h u t i ô R không th t n công quân h u t i ô R1, và (b) Quân h u t i ô R không th t n công quân h u nào trong Rlist1. m t quân h u không th t n công quân h u khác, thì chúng không th n m trên cùng hàng, cùng c t và cùng ư ng chéo chính ho c ph . Ta bi t ch c ch n r ng các quân h u ã n m trên các c t phân bi t nhau do mô hình l i gi i ã n nh. Bây gi ta c n ch ra r ng : • Các to Y c a các quân h u ph i phân bi t nhau, và • Các quân h u không th n m trên cùng ư ng chéo chính ho c ph . nghĩa là kho ng cách gi a các ô trên tr c X ph i khác v i các ô trên tr c Y.
  3. L p trình lägich trong Prolog 150 noattack( X/Y, [ X1/Y2 | Others ] ) :- Y =\= Y1, Y1 - Y =\= X1 - X, Y1 - Y =\= X - X1, noattack( X/Y, Others ). Dư i ây là chương trình Prolog y th nh t có ch a danh sách l i gi i là quan h model. Mô hình làm cho vi c tìm l i gi i cho bài toán tám quân h u tr nên ơn gi n hơn. % chương trình th nh t gi i bài toán tám quân h u % The problem of the eight queens - Program 1 % −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− solution( [ ] ). solution( [ X/Y | Others ] ) :- solution( Others ), ismember( Y, [ 1, 2, 3, 4, 5, 6, 7, 8 ] ), noattack( X/Y, Others ). noattack( _ , [ ] ). noattack( X/Y, [ X1/Y1 | Others ] ) :- Y =\= Y1, Y1 – Y =\= X1 - X, Y1 – Y =\= X - X1, noattack( X/Y, Others ). ismember( X , [ X | L ] ). ismember( X, [ Y | L ] ) :- ismember( X, L ). model( [ 1/Y1, 2/Y2, 3/Y3, 4/Y4, 5/Y5, 6/Y6, 7/Y7, 8/Y8 ] ). ). ?- model( S ), solution( S S = [1/4, 2/2, 3/7, 4/3, 5/6, 6/8, 7/5, 8/1] ; S = [1/5, 2/2, 3/4, 4/7, 5/3, 6/8, 7/6, 8/1] ; S = [1/3, 2/5, 3/2, 4/8, 5/6, 6/4, 7/7, 8/1] ; S = [1/3, 2/6, 3/4, 4/2, 5/8, 6/5, 7/7, 8/1] ; S = [1/5, 2/7, 3/1, 4/3, 5/8, 6/6, 7/4, 8/2] ; S = [1/4, 2/6, 3/8, 4/3, 5/1, 6/7, 7/5, 8/2] Yes S d ng v t not, ta vi t l i chương trình như sau : solution( [ ] ). solution( [ X/Y | Others ] ) :-
  4. 151 K thu t l p trình Prolog solution( Others ), member( Y, [ 1, 2, 3, 4, 5, 6, 7, 8 ] ), not( attack( X/Y, Others )). attack( X/Y, Others ) :- member( X1/Y1, Others ), ( Y1 = Y, Y1 is Y + X1 - X; Y1 is Y - X1 + X ). member( A, [ A | L ] ). member( A, [ B | L ] ) :- member( A, L). % Mô hình l i gi i model( [ 1/Y1, 2/Y2, 3/Y3, 4/Y4, 5/Y5, 6/Y6, 7/Y7, 8/Y8 ] ). ?- model( S ), solution( S ). S = [1/1, 2/1, 3/1, 4/1, 5/1, 6/1, 7/1, 8/1] ; S = [1/1, 2/8, 3/1, 4/1, 5/1, 6/1, 7/1, 8/1] ; S = [1/2, 2/8, 3/1, 4/1, 5/1, 6/1, 7/1, 8/1] ; S = [1/1, 2/1, 3/7, 4/1, 5/1, 6/1, 7/1, 8/1] ; S = [1/3, 2/1, 3/7, 4/1, 5/1, 6/1, 7/1, 8/1] ; S = [1/1, 2/2, 3/7, 4/1, 5/1, 6/1, 7/1, 8/1] Yes II.5.2. S d ng danh sách to theo c t Trong chương trình th nh t, ta ã ưa ra l i gi i bi u di n bàn c có d ng : [ 1/Y1, 2/Y2, 3/Y3, ... , 8/Y8 ] do m i c t ch t úng m t quân h u. Th c ra, ta không m t thông tin n u b i các to X. Ta có th bi u di n bàn c ch v i các to Y c a các quân h u : [ Y1, Y2, Y3, ... , Y8 ] không x y ra các quân h u n m trên cùng c t, c n ph i b trí m i quân h u m t hàng. T ây ta t ra ràng bu c cho các to Y : m i hàng 1, 2, 3, ..., 8 c a bàn c ch ư c phép t duy nh t m t quân h u. Ta nh n th y r ng m i l i gi i là m t hoán v c a danh sách các s 1 .. 8 sao cho th t c a m i con s là khác nhau : [ 1, 2, 3, 5, 6, 7, 8 ] M i hoán v c a danh sách là m t l i gi i S sao cho các quân h u tr ng thái an toàn (không ăn ư c l n nhau). Ta có :
  5. L p trình lägich trong Prolog 152 solution( S ) :- permutation( [ 1, 2, 3, 5, 6, 7, 8 ], S ), insafety( S ). Trong chương 1 trư c ây, ta ã xây d ng quan h permutation, bây gi ta c n nh nghĩa quan h safety. X y ra hai trư ng h p như sau : 1. N u danh sách S r ng, khi ó S cũng là l i gi i, vì không có quân h u nào t n công quân h u nào. insafety( [ ] ). 2. N u danh sách S khác r ng, khi ó S có d ng [ Queen | Others ]. Ta th y S là l i gi i n u các quân h u trong Others là tr ng thái an toàn và quân h u Queen không th t n công quân h u nào trong Others. T ó ta có : insafety( [ ] ). insafety( [ Queen | Others ] ) :- insafety( Others ), noattack( Queen, Others ). Trong nh nghĩa insafety, quan h noattack t ra tinh t hơn so v i cũng cùng quan h này trong chương trình 1 trên ây. Khó khăn n m ch v trí c a m t quân h u ch ư c xác nh b i các to Y, mà v ng m t to X. nh nghĩa quan h noattack, ta tìm cách khái quát v n như như minh ho hình dư i ây. (a) (b) • • Others • • • • Queen • • X=1 X=3 kho ng cách to kho ng cách to Hình II.8. Kho ng cách gi a to X c a Queen và to X c a Others là 1. (b) Kho ng cách gi a to X c a Queen và to X c a Others là 3. Ta th y r ng s d ng ích : noattack( Queen, Others )
  6. 153 K thu t l p trình Prolog là minh ch ng r ng quân h u Queen ch có th t n công các quân h u trong danh sách Others khi to X c a Queen cách to X c a Others ít nh t là 1. th c hi n i u này, ta thêm m t i th ba là XDist (kho ng cách theo to X gi a Queen và Others) vào noattack : noattack( Queen, Others, XDist ) Vì v y, ta ph i thay i l i ích noattack trong insafety như sau : insafety( [ Queen | Others ] ) :- insafety( Others ), noattack( Queen, Others, XDist ). nh nghĩa noattack, c n phân bi t hai trư ng h p c a danh sách Others : 1. N u Others r ng, khi ó không có quân h u nào t n công quân h u nào. noattack( _ , [ ], _ ). 2. N u danh sách Others khác r ng, khi ó Queen không th t n công quân h u là ph n t u c a danh sách Others (kho ng cách gi a to X c a Queen và to X c a ph n t u này là 1), cũng như không th t n công m t quân h u nào trong ph n danh sách còn l i c a Others, v i m t kho ng cách là XDist + 1. T ó ta có : noattack( Y, [ Y1 | YList ], XDist ) :- Y1 - Y =\= XDist, Y - Y1 =\= XDist, Dist1 is XDist + 1, noattack( Y, YList, Dist1 ). T t c nh ng l p lu n và quan h v a nh nghĩa trên ây cho ta chương trình l i gi i th hai cho bài toán tám quân h u như sau : % chương trình th hai gi i bài toán tám quân h u % The problem of the eight queens - Program 2 % −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− solution( Queens ) :- permutation( [ 1, 2, 3, 4, 5, 6, 7, 8 ], Queens ), insafety( Queens ). permutation( [ ], [ ] ). permutation( [ Head | Tail ], PermList ) :- permutation( Tail, PermTail ), remove( Head, PermList, PermTail ). remove( X, [ X | L ], L ). remove( X, [ Y | L ], [ Y | L1 ] ) :- remove( X, L, L1 ).
  7. L p trình lägich trong Prolog 154 insafety( [ ] ). insafety( [ Queen | Others ] ) :- insafety( Others ), noattack( Queen, Others, 1 ). noattack( _ , [ ], _ ). noattack( Y, [ Y1 | YList ], XDist ) :- Y1 - Y =\= XDist, Y - Y1 =\= XDist, Dist1 is XDist + 1, noattack( Y, YList, Dist1 ). Sau khi yêu c u, Prolog ưa ra các l i gi i như sau : S ). ?- solution( S = [5, 2, 6, 1, 7, 4, 8, 3] ; S = [6, 3, 5, 7, 1, 4, 2, 8] ; S = [6, 4, 7, 1, 3, 5, 2, 8] ; S = [3, 6, 2, 7, 5, 1, 8, 4] ; S = [6, 3, 1, 7, 5, 8, 2, 4] ; S = [6, 2, 7, 1, 3, 5, 8, 4] ; S = [6, 4, 7, 1, 8, 2, 5, 3] ; … Yes II.5.3. S d ng to theo hàng, c t và các ư ng chéo Trong chương trình th ba, ta ưa ra l p lu n như sau : C n ph i t m i quân h u lên m t ô, nghĩa là trên m t hàng, m t c t, m t ư ng chéo ngh ch (t dư i lên) và m t ư ng chéo thu n (t trên xu ng). m i quân h u không th ăn ư c l n nhau, chúng ph i ư c t m i quân trên m t hàng, m t c t, m t ư ng chéo ngh ch và m t ư ng chéo thu n phân bi t. Như v y, ta d ki n m t h th ng to bi u di n các quân h u như sau : x ct y hàng u ư ng chéo ngh ch v ư ng chéo thu n Các to không hoàn toàn c l p v i nhau : v i x và y ã cho, ta có th tính ư c u và v : u=x-y v=x+y Sau ây là b n mi n giá tr tương ng v i b n to X, Y, U, V : Dx = [ 1, 2, 3, 4, 5, 6, 7, 8 ]
  8. 155 K thu t l p trình Prolog Dy = [ 1, 2, 3, 4, 5, 6, 7, 8 ] Du = [ -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7] Dy = [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ] Bài toán tám quân h u bây gi ư c phát bi u l i như sau : hãy ch n ra tám b b n (X, Y, U, V), sao cho X ∈ Dx, Y ∈ Dy, U ∈ Du, V ∈ Dv và không bao gi s d ng hai l n cùng m t ph n t trong m i mi n giá tr Dx, Dy, Du và Dv. Như v y, U và V ư c sinh ra t vi c l a ch n X và Y. -7 -2 u=x–y +7 || | | | || |||| | | | | y 8 7 6 5 4 • 3 2 1 12345678 x 2 6 u=x+y 16 | | | | | | | | | | | | | | | Hình II.9. Quan h gi a c t, hàng, ư ng chéo ngh ch và ư ng chéo thu n Ô có ánh d u () trong hình có to x = 2, y = 4, u = 2 – 4 = -2, v = 2 + 4 = 6. L i gi i i khái có d ng như sau : cho trư c b n mi n giá tr , hãy ch n m t v trí cho quân h u u tiên, r i xoá các to c a chúng trong mi n giá tr , sau ó s d ng các mi n giá tr m i này t các quân h u khác ti p theo. Các v trí trên bàn c cũng ư c bi u di n b i m t danh sách các to trên tr c Y. Chương trình Prolog gi i bài toán tám quân h u s s d ng quan h : sol ( ListY, Dx, Dy, Du, Dv )
  9. L p trình lägich trong Prolog 156 cho phép ràng bu c các to c a các quân h u (trong ListY), xu t phát t nguyên lý là các quân h u n m trên các c t liên ti p nhau l y t Dx. Các to Y, U và V ư c l y t Dy, Du và Dv tương ng. L i gi i cu i cùng c a bài toán tám quân h u là m nh : ?- solution( S ) cho phép g i sol v i danh sách các tham i y . Chương trình như sau : % chương trình th ba gi i bài toán tám quân h u % The problem of the eight queens - Program 3 % −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− solution( ListY) :- ListY ), sol( [ 1, 2, 3, 4, 5, 6, 7, 8 ], [ 1, 2, 3, 4, 5, 6, 7, 8 ], [ -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7 ], [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ] ) . sol( [ ], [ ], Dy, Du, Dv ). sol( [ Y | ListY ], [ X | Dx1 ], Dy, Du, Dv ) :- del( Y, Dy, Dy1 ), U is X – Y, del( U, Du, Du1 ), V is X + Y, del( V, Dv, Dv1 ), sol ( ListY, Dx1, Dy1, Du1, Dv1 ). del( A, [ A | List ], List ) . del( A, [ B | List ], [ B | List1 ] ) :- del( A, List , List1 ). Sau khi yêu c u, Prolog ưa ra các l i gi i như sau : ?- solution( S ). S = [ 1, 5, 8, 6, 3, 7, 2, 4 ]; S = [ 1, 6, 8, 3, 7, 4, 2, 5 ]; S = [ 1, 7, 4, 6, 8, 2, 5, 3 ]; S = [ 1, 7, 5, 8, 2, 4, 6, 3 ] … Yes Th t c sol v a xây d ng trên ây có tính t ng quát vì có th dùng gi i quy t bài toán cho N quân h u b t kỳ (trên bàn c N × N). S khác nhau là ch mi n giá tr Dx, Dy, … thay i tuỳ theo N.
  10. 157 K thu t l p trình Prolog t o sinh các mi n giá tr này m t cách t ng, ta nh nghĩa th t c : gen( N1, N2, List ). t o ra m t danh sách các s nguyên gi a N1 và N2 : List = [ N1, N1 + 1, N1 + 2, …, N2 – 1, N2 ] Thân th t c như sau : gen( N, N, [ N ] ). gen( N1, N2, [ N1 | List ] ) :- N1 < N2, M is N1 + 1, gen( M, N2, List ). Bây gi ta thay i quan h solution như sau : solution( N, S ) :- gen( 1, N, Dxy), Nu1 is 1 – N, Nu2 is N - 1, gen( Nu1, Nu2, Du ), Nv2 is N + N, gen( 2, Nv2, Dv ), sol( S, Dxy, Dxy, Du, Dv). Gi s c n gi i bài toán v i 12 quân h u, ta có l i g i như sau : ?- solution( 12, S ). S = [ 1, 3, 5, 8, 10, 12, 6, 11, 2, 7, 9, 4] … Yes II.5.4. K t lu n Ví d bài toán tám quân h u trên ây minh ho cách gi i quy t m t bài toán trong Prolog theo nhi u l i gi i khác nhau, m i l i gi i s d ng m t phương pháp bi u di n c u trúc d li u. M i cách bi u di n d li u u có nh ng c trưng riêng, như ti t ki m b nh , hay bi u di n tư ng minh, hay bi u di n ph c h p các thành ph n c a i tư ng c n x lý. Cách bi u di n d li u nh m ti t ki m b nh có b t l i ch là thư ng xuyên ph i tính i tính l i m t s giá tr d li u trư c khi có th s d ng chúng. Trong ba l i gi i trên ây, l i gi i th ba minh ho rõ nét hơn c v cách xây d ng các c u trúc d li u xu t phát t m t t p h p các ph n t ã cho có nhi u ràng bu c. Hai chương trình u xây d ng t t c các hoán v có th r i l n lư t ki m tra có ph i hoán v ang xét là m t l i gi i không lo i b nh ng hoán v không t t trư c khi xây d ng chúng m t cách y . Vi c xác nh các hoán v
  11. L p trình lägich trong Prolog 158 gây ra t n th i gian do ph i th c hi n nhi u l n các phép tính s h c. Chương trình th ba tránh ư c i u này nh cách bi u di n bàn c h p lý. II.5.5. B di n d ch Prolog Xây d ng b di n d ch Prolog b ng chính ngôn ng Prolog, ư c g i là b siêu di n d ch vani (vanilla meta-interpreter). solve(true). solve((A, B)) :- solve(A), solve(B). solve(A) :- clause(A, B), solve(B). M nh clause(A, B) Prolog cho phép ki m tra n u A là m t s ki n hay v trái (LHS) c a m t lu t nào ó trong cơ s d li u (chương trình Prolog), B là thân hay v ph i c a lu t ó (n u A là m t s ki n thì B = true). Ví d: ?- clause(ins(X, [H|T], [ X,H|T ]), X @=< H). X = _G420 H = _G417 T = _G418 Yes Cách g i b siêu di n d ch vani : ?- solve(PrologGoal). III. Quá trình vào-ra và làm vi c v i t p III.1. Khái ni m Cho n lúc này, ta m i làm vi c v i Prolog qua ch tương tác : NSD t câu h i là dãy các ích d a trên chương trình ã biên d ch (là m t CSDL ch a lu t và s ki n), Prolog tr l i cho bi t các ích ư c tho mãn (Yes) hay không tho mãn (No), ng th i tuỳ theo yêu c u mà ưa ra k t qu dư i d n g ràng bu c giá tr cho các bi n (X = ...). Phương pháp này ơn gi n, trao i thông tin, tuy nhiên ngư i ta v n luôn luôn tìm cách m r ng kh năng trao i này. Ngư i ta c n gi i quy t nh ng v n sau : • Vào d li u cho chương trình dư i các d ng khác câu h i, ch ng h n các câu trong ngôn ng t nhiên (ti ng Anh, ti ng Pháp...). • ưa ra thông tin dư i b t kỳ d ng th c nào mong mu n. • Làm vi c ư c v i các t p (file) không ch thu n tuý màn hình, bàn phím.
  12. 159 K thu t l p trình Prolog H u h t các phiên b n Prolog u có nh ng v t thích h p gi i quy t ư c nh ng v n nêu trên. Gi ng như các ngôn ng l p trình khác, Prolog xem các thi t b vào-ra chu n (bàn phím, màn hình) là các t p c bi t. Quá trình vào-ra trên các thi t b này và trên các thi t b lưu tr ngoài ư c xem là quá trình làm vi c v i các t p. Hình dư i ây mô t cách Prolog làm vi c v i các t p. Giao di n NSD Vào t Ra bàn phím màn hình, máy in Dòng Dòng Trình T p1 Tp d li u d Prolog 3 li u T p2 Tp vào ra 4 Hình III.1. Liên l c gi a m t trình Prolog và nhi u t p . Trình Prolog có th c d li u vào t nhi u t p, ư c g i là dòng d li u vào (input streams), sau khi tính toán, có th ghi lên nhi u t p, ư c g i là dòng d li u ra (output streams). D li u n t giao di n NSD (bàn phím), r i k t qu g i ra màn hình, cũng ư c x lý như là nh ng dòng d li u vào ra khác. ây là nh ng t p gi (pseudo-file) ư c t tên là user (ngư i s d ng). Các t p ch a chương trình, hay d li u Prolog ư c NSD l a ch n t tên t do (mi n là khác user) trong khuôn kh c a h i u hành. Khi th c hi n m t trình Prolog, t i m i th i i m, ch có hai t p ho t ng là t p ang ư c c, ư c g i là dòng vào hi n hành (active input streams), và t p ang ư c ghi, ư c g i là dòng ra hi n hành (active output streams). Lúc m i ch y chương trình, dòng vào hi n hành là bàn phím và dòng ra hi n hành là màn hình (ho c máy in) tương ng v i ch vào ra chu n user. III.2. Làm vi c v i các t p III.2.1. c và ghi lên t p M t s v t x lý c và ghi lên t p c a Prolog như sau : Tên v t Ý nghĩa M t p File c d li u và xác nh File là dòng vào hi n hành. T p File ph i có t trư c, n u không, Prolog see(File) báo l i t p File không t n t i. Dòng vào hi n hành là bàn phím (ch chu n). see(user) H p nh t t p File v i t p vào hi n hành. seeing(File)
  13. L p trình lägich trong Prolog 160 M t p File ghi d li u lên và xác nh File là dòng tell(File) ra hi n hành. N u t p File chưa ư c t o ra trư c ó, thì t p File s ư c t o ra. N u t p File ã t n t i, n i dung t p File s b xoá ghi l i t u. Dòng ra hi n hành là màn hình (ch chu n). tell(user) telling(File) H p nh t t p File v i t p ra hi n hành. óng t p ang ghi lên hi n hành. Dòng vào tr l i ch told vào chu n user. óng t p ang c hi n hành. Dòng ra tr l i ch ra seen chu n user. c t dòng vào hi n hành m t giá tr kh p v i h ng Term. N u Term là bi n thì ư c l y giá tr này và v t tho mãn. N u không th s kh p, v t tr v th t b i mà không ti n hành quay lui. M i h ng trong t p ph i k t thúc read(Term) b i m t d u ch m và m t d u cách (space) ho c d u Enter. Khi th c hi n read mà ang v trí cu i t p, Term s nh n giá tr end_of_file. Ghi lên t p hi n hành giá tr c a h ng Term. N u Term là bi n thì giá tr này ư c ưa ra theo ki u c a Prolog. Các write(Term) ki u giá tr khác nhau u có th ưa ra b i write. Ví d III.1 : NSD nh hư ng dòng vào là t p myexp1.pl : ?- see(‘myexp1.pl'). % B t u c t p myexp1.pl. Yes Ho c : ?- see('C:/My Documents/Gt-Prolog/Example/myexp1.pl'). Yes ích see(F) luôn luôn ư c tho mãn, tr trư ng h p x y ra sai sót i v i các t p d li u. Chú ý tên thư m c và ư ng d n ư c vi t theo ki u Unix và ư c t trong c p d u nháy ơn. Sau khi làm vi c trên t p myexp1.pl, l nh seen cho phép tr v ch chu n. ?- seen. Yes Ví d III.2 : Dùng read c d li u vào b t kỳ t bàn phím : ?- read(N). | 100.
  14. 161 K thu t l p trình Prolog N = 100 Yes ?- read('Your name ?'). | asimo. No ?- read('Your name ?'). | 'Your name ?'. Yes ?- read(asimo). | Your_name. Yes c và ghi các h ng % ?- read(X). | father(tom, mary). X = father(tom, mary) Yes T = father(tom, mary), write(T). father(tom, mary) T = father(tom, mary) Yes Ví d III.3 c n i dung trong t p 'myex1.pl', sau ó quay l i ch vào ra chu n. ?- see('myex1.pl'), read(T),see(user). T = del(_G467, [_G467|_G468], _G468) Yes Trong dãy ích trên, ích read(T) c ư c s ki n (X, [ X | L ], L ). là n i dung dòng u tiên c a t p có nghĩa, sau khi b qua các dòng chú thích (n u có). Ta cũng có th hư ng dòng ra lên t p b ng cách s d ng ích : ?- tell(‘myex2.pl’). Dãy ích sau ây g i thông tin là s ki n parent(tom, bob). lên t p myex2.pl, sau ó quay l i ch vào ra chu n : tell(myex2.txt'), write('parent(tom, bob).'), tell(user). Các t p ch có th truy c p tu n t . Prolog ghi nh v trí hi n hành c a dòng vào c d li u. M i l n c h t m t i tư ng (lu t, hay s ki n), Prolog d i u c n v trí u i tư ng ti p theo. Khi c n h t t p, Prolog ưa ra thông báo h t t p : ?- see('exp.txt'), read(T),see(user). T = end_of_file
  15. L p trình lägich trong Prolog 162 Yes Ví d III.4 : Dùng write ưa d li u b t kỳ ra màn hình : ?- write(asimo). asimo Yes Cách ghi lên t p cũng theo cơ ch tương t , d li u ư c ghi liên ti p b t u t v trí cu i cùng c a i tư ng. Prolog không th quay lui hay ghi è lên ph n ã ghi trư c ó. Prolog ch làm vi c v i các t p d ng văn b n (text files), nghĩa là ch vào ra v i các ch cái ch s và ký t i u khi n ASCII. III.2.2. M t s ví d c và ghi lên t p M ts v t c và ghi khác c a Prolog như sau : Tên v t Ý nghĩa Ghi lên t p File giá tr h ng Term. write(File, Term) Ghi lên dòng ra hi n hành giá tr h ng Term writeq(Term) kèm d u nháy ơn (quotes). Ghi lên t p File giá tr h ng Term kèm d u writeq(File, Term) nháy ơn (quotes). In ra dòng ra hi n hành giá tr h ng Term. print(Term) In ra t p File giá tr h ng Term. print(File, Term) c t t p File hi n hành cho Term. read(File, Term) Tương t to read/1. c m t m nh t read_clause(Term) dòng vào hi n hành. c m t m nh t t p File. read_clause(File,Term) Nh y qua dòng m i (neuwline). nl In ra N d u kho ng tr ng (space) tab(N) In ra N d u kho ng tr ng trên t p File tab(File, N) Ví d III.5 : ?- nl. % Qua dòng m i Yes ?- tab(5), write(*), nl. * Yes ưa ra màn hình 5 d u cách r i n m t d u * và qua dòng. Ví d III.6 : Vi t th t c tính lu th a 3 c a m t s :
  16. 163 K thu t l p trình Prolog cube( N, C) :- C is N * N* N. Gi s ta mu n tính nhi u l n cube, khi ó ta ph i vi t nhi u l n ích : ?- cube( 2, X ). X=8 Yes ?- cube( 5, Y ). V 125 ?- cube( 12, Z). Z = 1728 Yes ch c n s d ng m t ích mà có th tính nhi u l n cube, ta c n s a l i chương trình như sau : cube :- read( X ), compute( X ). compute( stop ) :- !. compute( N) :- C is N *N* N, write( C), cube. Nghĩa th t c c a chương trình cube như sau : tìm lu th a 3, trư c tiên c X, sau ó th c hi n tính toán v i X và in ra k t qu . N u X có giá tr là stop, ng ng ngay, n u không, th c hi n tính toán m t cách quy. Chú ý khi nh p d li u cho v t read, c n k t thúc b i m t d u ch m : ?- cube. |: 3. 27 |: 10. 1000 |: 18. 5832 |: stop. Yes Ta có th ti p t c thay i chương trình. M t cách tr c giác, n u vi t l i cube mà không s d ng compute như sau là sai : cube :- read( stop), !. cube :- read( N),
  17. L p trình lägich trong Prolog 164 C is N *N * N, write( C), cube. b i vì, gi s NSD gõ vào 3, ích read( stop) th t b i, nhát c t b qua d li u này và do v y, cube(3) không ư c tính. L nh read( N) ti p theo s yêu c u NSD vào ti p d li u cho N. N u N là s , vi c tính toán thành công, ngư c l i, n u N là stop, Prolog s th c hi n tính toán trên các d li u phi s stop : ?- cube1. % Prolog b qua, không tính |: 3. |: 9. % Prolog tính ra k t qu cho N = 9 729 % Prolog b qua, không tính |: 4. % Prolog báo l i |: stop. ERROR: Arithmetic: `stop/0' is not a function ^ Exception: (9) _L143 is stop*stop*stop ? creep Thông thư ng các chương trình khi th c hi n c n s tương tác gi a NSD và h th ng. NSD c n ư c bi t ki u và giá tr d li u chương trình yêu c u nh p vào. Mu n v y, chương trình c n ưa ra dòng yêu c u hay l i nh c (prompt). Hàm cube ư c vi t l i như sau : cube :- write('Please enter a number: '), read( X ), compute( X ). compute( stop ) :- !. compute( N) :- C is N *N* N, write('The cube of '), write(N), write(' is '), write( C), nl, cube. cube. Please enter a number: 3. The cube of 3 is 27 Please enter a number: stop. Yes Ví d III.7 Ta xây d ng th t c displaylist sau ây in ra các ph n t c a danh sách : displaylist( [ ]). displaylist( [X | L ] ) :- write( X ), nl, displaylist( L).
  18. 165 K thu t l p trình Prolog ?- displaylist( [[a, b, c], [d, e, f], [g, h, i]]). [a, b, c] [d, e, f] [g, h, i] Yes Ta th y trong trư ng h p các ph n t c a m t danh sách l i là nh ng danh sách như trên thì t t hơn c là in chúng ra trên cùng hàng : displaylist( [ ]). displaylist( [X | L ] ) :- write( X ), tab( 1), displaylist( L), nl. displaylist( [[a, b, c], [d, e, f], [g, h, i]]). [a, b, c] [d, e, f] [g, h, i] Yes Th t c dư i ây in ra các ph n t ki u danh sách ph ng trên cùng hàng : displaylist2( [ ] ). displaylist2( [ L | L1 ] ) :- inline( u), displaylist2( L1 ), nl. inline( [ ] ). inline( [ X I L ] ) :- write( X ), tab( 1), inline( L). ?- displaylist2( [[a, b, c], [d, e, f], [g, h, i]]). abcdefghi Yes Ví d dư i ây in ra danh sách các s nguyên dư i d ng m t th g m các dòng k là các d u sao (hoa th ) * : barres( [ N | L]) :- asterisk(N), nl, barres(L). asterisk( N) :- N > 0, write( *), N1 is N - 1, asterisk( N1). asterisk( N) :- N =< 0. ?- barres([3, 4, 6, 5, 9]). *** **** ******
  19. L p trình lägich trong Prolog 166 ***** ********* No Ví d III.8 : c n i dung m t t p vào danh sách các s nguyên : readmyfile( File, List) :- see( File), readlist( List), seen, !. readlist( [X | L ]) :- get0(X), X =\= -1, !, read_list( L). readlist( [ ] ). III.2.3. N p chương trình Prolog vào b nh Các chương trình Prolog thư ng ư c lưu c t trong các t p có tên h u t (hay ph n m r ng c a tên) là « .pl » . n p chương trình (load) vào b nh và biên d ch (compile, Prolog s d ng v t : ?- consult(file_name). trong ó, file_name là m t nguyên t . Ví d III.9 : ích sau ây n p và biên d ch chương trình n m trong t p myexp.pl : ?- consult(‘myexp.pl'). Yes Prolog cho phép vi t g n trong m t danh sách như sau : ?- [‘myexp.pl' ]. n p và biên d ch ng th i nhi u t p chương trình khác nhau, có th li t kê trong m t danh sách như sau : ?- ['file1.pl', 'file2.pl']. Sau khi các chương trình ã ư c n p vào b nh , NSD b t u th c hi n chương trình. NSD có th xem n i dung toàn b chương trình nh v t : ?- listing. ho c xem m t m nh nào ó : ?- listing(displaylist). displaylist( [ ]).
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2