Có thể thấv quá trình giải quyết một bài toán trong lập trình logic modal gồm hai giai đoạn. Giai đoạn thứ nhấl ỉà quá trình xác định và chứng minh những tiên đề nào được phép áp dụng trong miền của bài toán (dựa trên các hạn định, ràng buộc). Từ đó xây dựng hệ logic của bài toán đã cho. Giai đoạn thứ hai là việc biểu diễn bài toán bằng các luật cùa logic modal và chạy chương trinh với một trình dịch xác định.
Quá trình suy diễn để tìm ra câu trả lời cho bài toán được thực hiện dựa trên các luật của chương trình và các luật của hệ logic modal của bài toán.
Sự khác biệt cơ bản giừa lập trình logic cổ điển và lập trình logic modal là trong lập trình logic cổ điển ta không cần phải xây dựng hệ logic cho bài toán. Sở đĩ có điểm khác biệt này là do lập trinh logic modal có thêm hai toán từ modal □ và 0 nên trong quá trình suy diễn phải áp dụng thêm các luật trong hệ logic nào đó để biến đổi các toán tử modal này (do các luật của chương trình không biến đổi được các toán tử modal).
K ết luận
Luận văn đã hệ thổne được nhữne nội dung cơ bản cùa lập trình logic bao gồm lý thuyết các mô hình, lý thuyết điểm bất dộng, thuật giải SLD. Đồng thời nêu ra được các đặc điểm giống và khác nhau giữa lập trình logic và hệ chuyên gia, hệ CSDL suy diễn.
Một ngôn ngừ hồ trợ tốt cho lập trình logic là Prolog cũng đã được đề cập với các ví dụ minh họa.
Đề tài cũng giới thiệu được một hướng tiếp cận hiện đại của lập trình logic có ứng dụng lớn trong thiết kể và cài đặt các hệ thống đa tác tử, hệ thống đa tác từ thông minh đó là lập trình logic modal.
Trên đây là những nội dung quan trọng về lập trình logic mà đề tài đã hệ thống được, điểm khuyết thiếu cùa đề tài là mặt ứng dụng. Trong tương lai đề tài sẽ hổ suna, thêm phần ứng dụng của lập trinh logic modal.
Phụ lụcm •
Prolog chuẩn khône hồ trợ các phép toán với xâu ký tự. Tuy nhiên Prolog mờ rộng thì có hỗ trợ một số phép toán với xâu ký tự. Ở đây chỉ trình bày các phép toán với kiểu dừ liệu là số, phép gán biểu thức số.
a. Toán tử số học
Các toán từ số học được áp dụng với các toán hạng là số nguyên, sổ thực
Phép cộng Ví dụ: ?- X iạ 4 + 5. X = 9 Phép trừ Ví dụ: ?- X is 9 - 5. X = 4 Phép ohân Ví dụ: ?- X is 5 * 4. X = 20 Phép chia nguyên Ví dụ: ?- X is 7 // 2. X = 3 b. Toán tử so sánh Phép so sánh băng X =:= Y có nghĩa là “X bằng Y” Ví dụ: ?- 8 =:= 8. yes Phép so sánh khác X =\= Y có nghĩa là “X khác Y”
Ví dụ: ?- 6 =\=5. ye s Phép so sánh nhỏ hơn X < Y có nghĩa là “X nhỏ hơn Y ” Ví dụ: ?- 7 < 8 yes Phép so sánh nhỏ hơn hoặc bằng
X =< Y có nghĩa là “X nhỏ hơn hoặc bằng Y ” Ví dụ: ?- 8 =< 9. yes Phép so sánh lớn hơn X > Y có nghĩa là “X lớn htm Y” Ví dụ: ?- 9 > 7. yes Phép so sánh lớn hơn hoặc bằng
X => Y có nghĩa là *‘X lớn hơn hoặc bằng Y ”
V í d ụ : ?- 9 => 7. yes
c. Toán tử định giá biểu thức
Toán tử định giá biểu thức là toán tử hai ngôi, ký hiệu là is. Ve trái của is là một hạng thức, vế phải là một biểu thức số học. Prolog tính toán giá trị cùa biểu thức sổ học và hợp nhất kết quả đó với hạng thức Ví dụ: ? - 8 is 9 - 1 . yes ?- X is 9 * 7. y e s 7 - 9 - 1 is 8.
Tân từput(n) sẽ in ra màn hình ký tự có mã ASCII là n. n là một số lự nhiên có giá trị từ 0 đến 255.
Ví dụ:
?- put(97). a
In ra màn hình mã ASCII của một xâu ký tự
Tân từ write(term) (term là hạng thức) sẽ in ra màn hình nội dung của term Nếu term là một xâu ký tự đặt trong cặp dấu Prolog sẽ in ra màn hình lần lượt theo thứ tự từ trái sanR phải mã ASCII cùa từng ký tự trong xâu ký tự đó trong một danh sách. Ví dụ: ?- write(1+2). 1+2 ye s write(“Ha noi"). [72,97.32.110,111,105] yes ?- write('Ha noi'). H a noi ye s Đọc dữ liệu từ bàn phím + Đọc một biểu thức vào hạng thức
Tân từ read(term) (terni là một hạng thức) sẽ chờ người dùng nhập hạng thức vào từ bàn phím, sau đó gán các giá trị nhận được cho term. Nếu không hợp nhất được giá trị nhận được với term thì phép gán không thành công. Nếu term là một biến thì giá trị nhận được sẽ gán vào biến.
Ví dụ:
?- read(X).
|: 123. r giá trị đư a vâo đ ư ợ c gân ch o X */ X = 123
ye s
?- read(a(X, Y)).
|: [1,3], 9. r giá trị đư a v à o không h ợ p nhất đ ư ợ c */ no
?- read(a(X, Y)).
|: b(12, 3). r giá trị đư a vào không h ợ p nhất đ ư ợ c */
no
?- read(a(X, Y)).
|: a(12, 3). /* giá trị đ ư a vào h ạ p nhất đ ư ợ c */ X = 12,
Y = 3 ? ; no
+ Đọc một ký tự ASCII vào hạng thức
Tân từ get(term) và getO(term) đều cho phép đọc một ký tự ASCII từ bàn phím vào term. Giá trị của term là mã ASCII của ký tự đọc được. Điểm khác biệt giừa get/1 và getO/1 là geưl chi đọc các ký tự có mã ASCII nằm giữa 33 và 126.
Ví dụ: ?- get(Ch). |: a C h = 97 y es ?- getO(Ch). |: p C h = 112 y es 3. Một số chương trình Prolog
Các chương trình nguồn Prolog trong phần này được dịch bởi phần mềm SlCStus Prolog 3.12.3 trên máy tính Intel Pentium III 800 MHz Processor, 256 MB Ram
Tìm số íìbonacỉ thứ k
Chương trình được viết trong file fibonaci.pl, gồm các câu sau:
fib(N, 1) :-N = 0. fib(N, 1) > N = 1.
fib(N, F) N > 1, N1 is N -1, N2 is N-2, fib(N1, F1), fib(N2, F2), F is F1 + F2.
Nạp file fibonaci.pl với trình dịch trên và chạy thử với câu hỏi:
?- fib(6, L).
Kết quả là: 1 = 1 3 ? ;
no
Thời gian thực hiện ls Chạy thử với câu hòi:
?- fib(25,L).
L = 121393 ? ; no
Với số fibonaci lớn hơn từ 30 trở đi, hệ thống không có câu trả lời vì đ ệ quy thiếu bộ nhớ.
?- fib(30,L).
! R e so u rc e error: insufficient m em ory
Bài toán sắp xếp một dãy số nguyên
Input: Một dãy số nguvên với thứ tự bất kỳ Output: dãy số đã được sắp theo thứ tự tăng dần
Ý tưởng cùa thuật toán là: Xét tất cả các hoán vị có thề có của dãy, hoán vị nào sấp theo thứ tự tăng dần thì đó là nghiệm.
Chương trình được viết trong file sapxep.pl như sau:
sapxep(X, Y) hoanvi(X, Y), dasap(Y).
dasap([]). dasap([X]).
dasap([X1|[X|Y]]):-dasap([X|Y]), X1 =< X.
hoanvi([],[]).
hoanvi([X|Y],Z) hoanvi(Y,W ), delete(X,Z,W ).
delete(X,[X|R],R).
delete(X,[F|R] [F|S]) delete(X,R ,S).
Nạp file sapxep.pl vào trình dịch và chạy với câu hỏi:
?- sap xep (Ị1 , 6, 7, 5, 4, 3, 8, 9, 2, 10], X).
Ta có kết quả là:
X = [1,2,3,4,5,6,7,8,9,10] ? ; no
Thời gian chạy trên máy tính để tìm ra lời giải đầu tiên là 30s. Thời gian chạy để kết thúc thuật toán là 45s (vì phải tìm tất cà các hoán vị).
Thuật toán trên cũng chỉ sắp được danh sách không lớn hơn 10 phần tử. Bài toán tám quân hậu
Một bàn cờ vua gồm 64 ô chia thành 8 hàng và 8 cột, yêu cầu hãy đặt lên bàn cờ tám quân hậu sao cho chúng từng đôi một không ăn lẫn nhau
Chương trình được viết trong file tamhau.pl có nội dung như sau
perm(ỊX|Y],Z) perm (Y,W ), delete(X.Z.W ) perm((],[]).
delete(X,[XjR),R).
delete(X,[F|R],[F|S]) delete(X,R,S).
m ember(X,[X|R]).
mem ber(X,[Y|R]) m em ber(X,R).
solve(P)
perm ([1,2,3,4,5,6,7,8],P),
com bine([1,2,3,4,5,6,7,8],P,S,D )l all_diff(S),
all_diff(D).
com bine([X1 |X],[Y1 |Y],[S1 |S],[D1|D]) S1 is X1 +Y1,
D1 i s X 1 - Y1, co m bine(X,Y ,S,D ). c o m b in e d [],[],[]).
all_diff([X|Y]) \+member(X,Y), all_diff(Y). all_diff([X]).
Nạp file này vào trình dịch và chạy thử với câu hỏi
?- solve(P).
K.ết quà nhận được các lời ẹiải của P:
p = [5,2,6,1,7,4,8,31?; p = [6.3 5,7,1,4,2,81? p = [6,4,7,1,3,5,2,8] ? p = [3 ,6 ,27 ,5 1 ,8 ,4 ]? p = [6,3,1,7,5,8,2,41? p = [6,2,7,1,3,5,8,41? p = (6,4,7,1,8,2,5 3 ] ? p = 13,6,2,7,1,4,8,5]? p = 16,3,7,2,4,8,1,5]? p = [6,3,7,4,1,8,2,51?
Lời giải nhận được là một danh sách các hàng ứng với các cột từ 1 đến 8 trên bàn
Ví dụ lời giải p = [5,2.6,1,7,4,8,31 nehĩa lả:
Cột 3: đặt quân hậu ở hàng 6; Cột 4: đặt quân hậu ờ hàng 1 ; Cột 5: đặt quân hậu ở hàng 7; Cột 6: đặt quân hậu ở hàng 4; Cột 7: đặt quân hậu ở hàng 8; Cột 8: đặt quân hậu ở hàng 3;
Kết quả nhận được là 92 lời giải cho p. Thời gian hầu như chỉ phụ thuộc vào người dùng nhấn phím ; (chấm phẩy) để vêu cầu lời giải tiếp theo.
4. Hướng dẫn sử dụng MProlog
MProlog là một module được thiết kế và cài đặt bởi tác giả Nguyễn Anh Linh - Đại học Warsaw - Ba lan.
Toàn bộ module được viết bằng Prolog, không có môi trường chạy riêng. MProlog chạy trong môi trường cùa SlCStus Prolog1.
Module MProỉog được nạp từ SlCStus Prolog nhằm hỗ trợ lập trình logic modal trong SlCtus Prolog. Vì vậy, toàn bộ mã, thư viện và hầu hết các tính năng cùa một chương trình Prolog đều sử dụna được trong chương trình MProlog.
Trong MProlog có ba loại tân từ: các tân từ cổ điển; các tân từ modal và các tân từ cổ điển được định nghĩa sử dụng các công thức modal. Trong đó, loại tân từ thứ ba được gọi là tân từ dum (dum predicate).
Một chương trình MProlog gồm hai phân đoạn: phân đoạn logic modal và phân đoạn logic cổ điển. Các tân từ trong phân đoạn logic cổ điển là các tân từ cổ điển; các tân từ trong phân đoạn logic modal là các tân từ dum.
Module MProloR dược viết bằng Prolog, gồm các loại file: file chương trình (*.pl), file thư viện của thuật giải SLD (*.cal) và một số file ví dụ mẫu (*.mpl)
Có thể download gói MProlog tại địa chi: w w w .m im uw .edu.pl/~ nguyen/m Prolog/ Cột 2: đạt quân hậu ở hàng 2;
MProlog chạy trong môi trường cùa phần mềm SlCStus Prolog. Bạn hãy download SICStus Prolog tại: http://www.sics.se/sicstus/products/ (phải đãng ký trước để có tài khoản download) và cài đặt SỈCStus Prolog vào đĩa cứng của bạn.
Bạn chạy SlCStus Prolog từ thư mục cài đặt. Ket quả bạn nhận được môi trường làm việc cùa SlCStus Prolog.
Tại cửa sổ lệnh của SlCStus Prolog, bạn chọn lệnh: File| Consult ... sau đó chọn file MProlog.pl trong gói MProIog của bạn.
Hoặc nhập lệnh: mconsuit (ProgramFile, [Calculus])
Trong đó: ProgramFiie là tên file mProlog.pi gồm cả đường dẫn; Calculus là thuật giài SLD đã được định nghĩa (các file *.cal) trong MProlog, nếu không có Calculus thì đó là logic cổ điển.
Kết quả cùa việc thực hiện lệnh là bạn nạp được module MProlog vào hệ thống SlCtus Prolog. Tại đây, bạn có thể chạy các chương trình MProlog bằng lệnh:
mcall(goal, (calculus])
Trona, đỏ: goal là một đích MProlog, Calculus là thuật giải SLD đã được định nghĩa (các file *.cal) trong MProIog, nếu không có Calculus thì đó là logic cổ điển.
5. Lược đồ KD4Ig5a trong MProỉog [6]
Hệ loeic (lược đồ) KD4Ig5a là một mờ rộne của hệ logic K. KD4Ig5a được xây dựng dùng trong suy diễn về các agent, cho n agent và m = 2" - 1. Cho g là một ánh xạ một - một, ánh xạ mọi số tự nhiên nhỏ hơn hoặc bằng m vào tập con của tập {1, 2, n}. Gọi i là một chi số 1 < i < m, chi một nhóm các agent mà chi số của chúng thuộc g(i).
KD4Ig5a được mở rộng từ K theo công thức sau:
KD4Ig5a = (K) + (D) + (4) + (lg) + (5.) Trong đó:
(D): OịCp —^ —iDj—iCp
( 4 ) : DiỌ - > DjDiip
(Ig): Dj(p -> DjCp nếu g(i) z> g(j). Nghĩa là nếu i là nhóm con của j thì mọi độ tin của i cũng là độ tin cùa j.
(5a): —iC]j<p -» Dj—idị(p nếu g(i) là tập một phần tử (singleton). Và các hạn định trên quan hệ R đối với hệ logic KD4Ig5a như sau:
Tiên đề Hạn định trên quan hệ R
D V u 3 v R|(u, V)
Vu, V , w (R,(u, v ) A R,(v, w ) -> R,(u, w ) )
Rj Ç Rị nếu g(i) => g(j)
Vu, V, w (R,(u, v) A R|(v, w) Ri( w, V )) n ế u g ( i ) là t ậ p m ộ t p h ầ n tử .
4 19 5a
Cho L là hệ logic KD4Ig5a, <L !à phép so sánh các toán tử modal được định nghĩa như sau: <[ là quan hệ phàn xạ và bắc cầu nhỏ nhất giữa các toán tử modal sao cho:
+ Oị <1. <E>i <L Di
+ 0j < L <x>j < L Di v à
+ Nếu g(i) Ç g(j) thì D ị <L dj và Dj <L Di
Các luật cùa KD41g5a đối với một chương trình MProlog được tóm tắt trong bảng sau:
AOiO( -> ADjCx nếu g(i) z> g 0 (1)
Ao,a -> AnịGia (2)
A<F>|E -> AũịO.E néu g(i) là tập một phần tử (3)
A V V ’E AOiE nếu 0| <L V và 0, SL V ’ (4)
A V .V /E -> A V j’E nếu g(i) là tập một phần tử vâ Vị' là Oi hoặc <E>, (5) A<X>,V| E-> AV|E nếu g(i) là tập một phần tử và Vị là Dị hoặc <E>„ X là một biến nguyên tố (6)
A<X>,E -> AOiE nếu X là một biến nguyên tố (7)
ủD|a -» A V ,a nếu g(i) Ç g(j) (8)
A 0,a - > A 0 ,a n ế u g (i) ZD g (j) (9 )
AdjCt - > ADiO,a ( 1 0 )
AOjE -» AVjO jE nếu g(i) là tập m ột phần tử (11)
T ài liệu th a m k h ả o■ Tiếng Việt
111 Hồ Thuần. B à i g iả n g Lập trình lo g ic và P ro lo g Đ ại học K H T N Huế. 1999.
Tiếng Anh
|2j John Durkin. E x p e rt system . P ren tice Hall International Inc, 1994.
|3| J .w . Lloyd. F o u n d a tio n s o f L o g ic P rog ra m m in g , 2nd E d itio n . Springer-Verlag. 1987. |4j L A N guyen A fix p o in t s e m a n tics a n d an S L D -re so lu tio n c a lc u lu s fo r m o d a l lo g ic program s. Fundam enta Inform aticae, 55(1):63-100, 2003.
|5| L A. Nguyen. M P ro lo g : A n e xte n sio n o f P ro lo g fo r m o d a l lo g ic p ro g ra m m in g . In B. Demoen a n d V. L ifs c h itz , e ditors. P ro cee d in g s of IC L P 2004, L N C S 3132, Springer. 2004.
[6] L.A. Nguyen. Reasoning about Epistemic States o f Agent by Modal Logic Proaramming 2004
|7| L A. N guyen. S o u rce file s, c a lcu li, a n d e xam ples o f M Prolog. A v a ila b le on Internet at http://www.mim uw.edu.pl/~nquven/m Proloq. 2004.
Ị8Ị L A Nguyen The modal logic programming system MProlog. In J.J. Alferes and
J.A. Leite, e ditors. P ro c e e d in g s of J E L IA 2004, L N C S 3229, springer. 2004.
|9| Patrick B lackburn. M aarten d e Rijke, Y d e Venem a. M odal lo g ic. P B , M dR, Y V . 1998.
110] Ulf Nilsson and Jan Maluszynski. Logic, Programming and Prolog (2Ed)
http://www.ida liu.se/~ulfni/lpp. 2000.
n i l http://www.trinc-Proloq.com/doc/
] 121 http://www.csupomona.edu/~irfisher/www/proloq tutorial 113] http://www.bu edu/w cp/Papers/Loqi/