4.5.1. Đặt vấn đề.
Cho 4 câu sau:
1. Tác giả X viết sách Ỵ
2. Sách Y đƣợc viết bởi tác giả X. 3. Tác giả X viết sách Y vào năm Z.
4. NXP P phát hành sách Y của tác giả X vào năm Z.
Với 4 câu trên thì ta có thể suy ra đƣợc các dạng câu hỏi tƣơng ứng nhƣ sau: 1.1 Tác giả nào viết sách X ?
1.2 Tác giả X viết sách nàỏ
2.1 Sách nào đƣợc viết bởi tác giả X ? 2.2 Sách X đƣợc viết bởi tác giả nào ? 3.1 Tác giả nào viết sách X vào năm Y ? 3.2 Tác giả X viết sách nào vào năm Y ? 3.3 Tác giả X viết sách Y vào năm nào ?
4.1 NXB nào phát hành sách X của tác giả Y vào năm Z ? 4.2 NXB X phát hành sách nào của tác giả Y vào năm Z ? 4.3 NXB X phát hành sách Y của tác giả nào vào năm Z ? 4.4 NXB X phát hành sách Y của tác giả Z vào năm nào ?
4.5.2. Quy trình thực hiện.
Bƣớc 1: Xây dựng văn phạm cho từng dạng câu hỏị
Dạng câu hỏi 1.1: Tác giả nào viết sách X?
sentence(s(NP,VP)) --> np(NP), vp(VP). vp(vp(V,NP)) --> verb(V), np2(NP). verb(verb(viet)) -->[viet].
np(np(N,PN)) --> n(N),wh(PN). n(n('tac giá)) -->[tac,gia]. wh(wh(nao)) -->[nao].
np2(np2(N,PN)) --> n2(N),pron(PN). n2(n2(sach)) -->[sach].
pron(pron([H|T])) --> [H|T]. Dạng câu hỏi 1.2: Tác giả X viết sách nàỏ
sentence(s(NP,VP)) --> np(NP), vp(VP). vp(vp(V,NP)) --> verb(V), np2(NP). verb(verb(viet)) -->[viet].
np(np(N,PN)) --> n(N),pron(PN). n(n('tac giá)) -->[tac,gia].
pron(pron([H|T])) --> [H|T].
np2(np2(N,PN)) --> n2(N),wh(PN). n2(n2(sach)) -->[sach].
wh(wh(nao)) -->[nao].
Dạng câu hỏi 2.1: Sách nào đƣợc viết bởi tác giả X?
sentence(s(NP,VP)) --> np(NP), vp(VP). vp(vp(V,NP)) --> pass_verb(V), np2(NP).
pass_verb(pass_verb('duoc viet boí)) -->[duoc,viet,boi]. np(np(N,PN)) --> n(N),wh(PN).
n(n(sach)) -->[sach]. wh(wh(nao)) -->[nao].
np2(np2(N,PN)) --> n2(N),pron(PN). n2(n2('tac giá)) -->[tac,gia].
pron(pron([H|T])) --> [H|T].
Dạng câu hỏi 2.2: Sách X đƣợc viết bởi tác giả nàỏ
sentence(s(NP,VP)) --> np(NP), vp(VP). vp(vp(V,NP)) --> pass_verb(V), np2(NP).
pass_verb(pass_verb('duoc viet boí)) -->[duoc,viet,boi]. np(np(N,PN)) --> n(N),pron(PN).
n(n(sach)) -->[sach].
pron(pron([H|T])) --> [H|T].
np2(np2(N,PN)) --> n2(N),wh(PN). n2(n2('tac giá)) -->[tac,gia].
wh(wh(nao)) -->[nao].
Dạng câu hỏi 3.1: Tác giả nào viết sách X vào năm Ỷ
sentence(s(NP,VP,ADV)) --> np(NP), vp(VP),adv(ADV). vp(vp(V,NP)) --> verb(V), np2(NP).
verb(verb(viet)) -->[viet].
np(np(N,PN)) --> n_tacgiăN),wh(PN). n_tacgiăn_tacgiắtac giá)) -->[tac,gia]. wh(wh(nao)) -->[nao]. np2(np2(N,PN)) --> n_sach(N),pron(PN). n_sach(n_sach(sach)) -->[sach]. pron(pron([H1|T1])) --> [H1|T1]. adv(adv(Prep,Time)) --> prep(Prep),time(Time). prep(prep(vao)) --> [vao]. time(time(N,Number)) --> n_year(N),number(Number).
n_year(n_year(nam)) --> [nam].
number(number([H2|T2])) --> [H2|T2]. Dạng câu hỏi 3.2: Tác giả X viết sách nào vào năm Ỷ
sentence(s(NP,VP,ADV)) --> np(NP), vp(VP),adv(ADV). vp(vp(V,NP)) --> verb(V), np2(NP).
verb(verb(viet)) -->[viet].
np(np(N,PN)) --> n_tacgiăN),pron(PN). n_tacgiăn_tacgiắtac giá)) -->[tac,gia]. pron(pron([H1|T1])) --> [H1|T1]. np2(np2(N,PN)) --> n_sach(N),wh(PN). n_sach(n_sach(sach)) -->[sach]. wh(wh(nao)) -->[nao]. adv(adv(Prep,Time)) --> prep(Prep),time(Time). prep(prep(vao)) --> [vao]. time(time(N,Number)) --> n_year(N),number(Number). n_year(n_year(nam)) --> [nam]. number(number([H2|T2])) --> [H2|T2]. Dạng câu hỏi 3.3: Tác giả X viết sách Y vào năm nàỏ
sentence(s(NP,VP,ADV)) --> np(NP), vp(VP),adv(ADV). vp(vp(V,NP)) --> verb(V), np2(NP).
verb(verb(viet)) -->[viet].
np(np(N,PN)) --> n_tacgiăN),pron(PN). n_tacgiăn_tacgiắtac giá)) -->[tac,gia]. pron(pron([H1|T1])) --> [H1|T1].
np2(np2(N,PN)) --> n_sach(N),pron(PN). n_sach(n_sach(sach)) -->[sach].
pron(pron([H2|T2])) --> [H2|T2].
prep(prep(vao)) --> [vao].
time(time(N,Num)) --> n_year(N),wh(Num). n_year(n_year(nam)) --> [nam].
wh(wh(nao)) -->[nao].
Dạng câu hỏi 4.1: NXB nào phát hành sách X của tác giả Y vào năm Z?
sentence(s(NP,VP,ADV)) --> np1(NP),vp(VP),adv(ADV). vp(vp(V,NP,PP)) --> verb(V),np2(NP),pp(PP).
verb(verb('phat hanh')) --> [phat,hanh]. np1(np1(N,PN)) --> n_nxb(N),wh(PN). n_nxb(n_nxb(nxb))--> [nxb]. wh(wh(nao)) --> [nao]. np2(np2(N,PN)) --> n_sach(N),pron_sach(PN). n_sach(n_sach(sach)) -->[sach]. pron_sach(pron_sach([H|T])) --> [H|T]. pp(pp(Prep,NP)) --> prep_tg(Prep),np3(NP). prep_tg(prep_tg(cua)) --> [cua]. np3(np3(N,PN)) --> n_tacgiăN),pron_tacgiăPN). n_tacgiăn_tacgiắtac giá)) --> [tac,gia].
pron_tacgiăpron_tacgiă[H|T])) --> [H|T]. adv(adv(Prep,Time)) --> prep(Prep),time(Time). prep(prep(vao)) --> [vao]. time(time(N,Number)) --> n_year(N),number(Number). n_year(n_year(nam)) --> [nam]. number(number([H2|T2])) --> [H2|T2].
Dạng câu hỏi 4.2:NXB X phát hành sách nào của tác giả Y vào năm Z?
sentence(s(NP,VP,ADV)) --> np1(NP),vp(VP),adv(ADV). vp(vp(V,NP,PP)) --> verb(V),np2(NP),pp(PP).
np1(np1(N,PN)) --> n_nxb(N),pron_nxb(PN). n_nxb(n_nxb(nxb))--> [nxb]. pron_nxb(pron_nxb([H|T])) --> [H|T]. np2(np2(N,PN)) --> n_sach(N),wh(PN). n_sach(n_sach(sach)) -->[sach]. wh(wh(nao)) --> [nao]. pp(pp(Prep,NP)) --> prep_tg(Prep),np3(NP). prep_tg(prep_tg(cua)) --> [cua]. np3(np3(N,PN)) --> n_tacgiăN),pron_tacgiăPN). n_tacgiăn_tacgiắtac giá)) --> [tac,gia].
pron_tacgiăpron_tacgiă[H|T])) --> [H|T]. adv(adv(Prep,Time)) --> prep(Prep),time(Time). prep(prep(vao)) --> [vao]. time(time(N,Number)) --> n_year(N),number(Number). n_year(n_year(nam)) --> [nam]. number(number([H2|T2])) --> [H2|T2].
Dạng câu hỏi 4.3: NXB X phát hành sách Y của tác giả nào vào năm Z?
sentence(s(NP,VP,ADV)) --> np1(NP),vp(VP),adv(ADV). vp(vp(V,NP,PP)) --> verb(V),np2(NP),pp(PP).
verb(verb('phat hanh')) --> [phat,hanh]. np1(np1(N,PN)) --> n_nxb(N),pron_nxb(PN). n_nxb(n_nxb(nxb))--> [nxb]. pron_nxb(pron_nxb([H|T])) --> [H|T]. np2(np2(N,PN)) --> n_sach(N),pron_sach(PN). n_sach(n_sach(sach)) -->[sach]. pron_sach(pron_sach([H|T])) --> [H|T]. pp(pp(Prep,NP)) --> prep_tg(Prep),np3(NP). prep_tg(prep_tg(cua)) --> [cua].
np3(np3(N,PN)) --> n_tacgiăN),wh(PN). n_tacgiăn_tacgiắtac giá)) --> [tac,gia]. wh(wh(nao)) --> [nao]. adv(adv(Prep,Time)) --> prep(Prep),time(Time). prep(prep(vao)) --> [vao]. time(time(N,Number)) --> n_year(N),number(Number). n_year(n_year(nam)) --> [nam]. number(number([H2|T2])) --> [H2|T2].
Dạng câu hỏi 4.4: NXB X phát hành sách Y của tác giả Z vào năm nàỏ
sentence(s(NP,VP,ADV)) --> np1(NP),vp(VP),adv(ADV). vp(vp(V,NP,PP)) --> verb(V),np2(NP),pp(PP).
verb(verb('phat hanh')) --> [phat,hanh]. np1(np1(N,PN)) --> n_nxb(N),pron_nxb(PN). n_nxb(n_nxb(nxb))--> [nxb]. pron_nxb(pron_nxb([H|T])) --> [H|T]. np2(np2(N,PN)) --> n_sach(N),pron_sach(PN). n_sach(n_sach(sach)) -->[sach]. pron_sach(pron_sach([H|T])) --> [H|T]. pp(pp(Prep,NP)) --> prep_tg(Prep),np3(NP). prep_tg(prep_tg(cua)) --> [cua]. np3(np3(N,PN)) --> n_tacgiăN),pron_tacgiăPN). n_tacgiăn_tacgiắtac giá)) --> [tac,gia].
pron_tacgiăpron_tacgiă[H|T])) --> [H|T]. adv(adv(Prep,Time)) --> prep(Prep),time(Time). prep(prep(vao)) --> [vao]. time(time(N,Num)) --> n_year(N),wh(Num). n_year(n_year(nam)) --> [nam]. wh(wh(nao)) --> [nao].
Bƣớc 2: Kết hợp với Prolog để tạo cấu trúc cho các câu hỏi dƣới dạng cây suy diễn để xử lý (dựa vào văn phạm đã đƣợc xây dựng ở trên).
Ví dụ: Tác giả nào viết sách Tin học đại cƣơng vào năm 2000?
Parse thành cây c pháp nhƣ sau:
s(np(n_tacgiătacgia),wh(nao)),vp(verb(viet),np2(n_sach(sach),pron([tin,hoc,dai, cuong]))),adv(prep(vao),time(n_year(nam),number([2000])))).
Bƣớc 3:Xác định đối tƣợng để hỏi của câu là gì và những giả thiết đã biết liên qua tới đối tƣợng đƣợc hỏi đó.
Tiếp tục ví dụ trên:
Đầu tiên ta xác định từ truy vấn “nào” nằm ở vị trí nào trên câỵ Dựa vào câu:
s(np(n_tacgiătacgia),wh(nao)),vp(verb(viet),np2(n_sach(sach),pron([tin,h
oc,dai,cuong]))),adv(prep(vao),time(n_year(nam),number([2000])))). Ta thấy từ “nào” nằm trong “wh(nao)” và đồng thời “wh(nao)” nằm trong
np(n_tacgiătacgia),wh(nao)), ta xác định đƣợc np chứa nó.
Tiếp đến, muốn biết đối tƣợng để hỏi là gì thì ta dựa vào đối tƣợng n(noun) nằm trong np vừa xác định ở trên.
Ở đây, n là n_tacgia (tacgia) nên đối tƣợng cần hỏi là tác giả.
Sau đó, dựa vào các đối tƣợng còn lại (trừ VP) để xác định giả thiết.
Ở đây giả thiết (đối tƣợng đã biết)là :
Sách: Tin học đại cương(np2(n_sach(sach), pron([tin,hoc,dai,cuong])))
Năm: 2000 (adv(prep(vao),time(n_year(nam),number([2000])))) Bƣớc 4: Xây dựng CSDL.
CSDL gồm những thông tin về sách nhƣ: Tên sách, tác giả, nhà xuất bản, năm phát hành.
Vì đây chỉ là một ứng dụng nhỏ cho nên CSDL chỉ đƣợc tổ chức lƣu trên 1 bảng dạng nhƣ sau:
Bảng 4.1: Bảng dữ liệu mẫụ
Sách Tác giả NXB Năm
KINH TE HOC VI MO DAVID BEGG THONG KE 2012
NGAN HANG DAU TU MAC QUANG HUY TRE 2012
KE TOAN TAI CHINH TRAN XUAN NAM TRE 2003
GIAO TRINH C# NGUYEN HAI LINH THOI DAI 2005
LAP TRINH VISUAL BASIC 6.0 NGUYEN CHI HIEU THOI DAI 2001
KINH TE HOC PHAT TRIEN NGUYEN THANH HAI TRE 2003
CACH LAM GIAU NHANH NHAT TRAN XUAN NAM THONG KE 2003
THI TRUONG CHUNG KHOAN NGUYEN CONG NGHI THONG KE 2002
1001 CHIEU THUC TIEP THI NGUYEN HANH THOI DAI 2008
KINH TE NGAY NAY TRAN BINH TRE 2010
GIAO TRINH C# NGUYEN HAI LINH TRE 2004
KY THUAT WORD 2010 NGUYEN HAI LINH THONG KE 2011
NHAP MON TIN HOC NGUYEN HANH THONG KE 2014
PHIM TAT TRONG WORD HAI NAM THOI DAI 2001
THU THUAT EXCEL TRAN NAM HAI TRE 2003
Bƣớc 5: Thực hiện truy vấn và cho ra kết quả cần tìm.
Sau khi đã có đƣợc giả thiết (đối tƣợng đã biết) và kết luận (đối tƣợng chƣa biết) thì ta tiến hành truy vấn dựa trên CSDL đã đƣợc xây dựng ở trên.
4.5.3. Thực hiện chƣơng trình.
Bƣớc 1:Khởi động chƣơng trình:Giao diện chƣơng trình nhƣ sau:
Hình 4.2: Giao diện chính khi chạy chương trình.
Bƣớc 2: Nạp dữ liệu: Hệ thống Nạp dữ liệụ
Hình 4.4:Lựa chọn dữ liệu cho chương trình.
Bƣớc 3: Lựa chọn tìm kiếm theo các chủ đề:
- Tìm kiếm thông tin về sách - Tìm kiếm thông tin về tác giả
- Tìm kiếm thông tin về Nhà Xuất Bản
Hình 4.6:Giao diện lựa chọn tìm kiếm theo chủ đề. Bƣớc 4:
- Chọn câu hỏi từ menu sổ xuống. - Nhập biến tìm kiếm.
- Nhấp chọn nút Tìm kiếm để xem kết quả.
CHƢƠNG 5: KẾT LUẬN VÀ HƢỚNG PHÁT TRIỂN.
Trong đề tài này chúng tôi đã giới thiệu một cách tƣơng đối đầy đủ về C S D L suy diễn, về khả năng biểu diễn CSDL thông qua ngôn ngữ logic; đồng thời giới thiệu một ngôn ngữ lập trình tƣơng thích để biểu diễn cơ sở tri thức bằng logic mô tả, đó là ngôn ngữ Prolog (tiền thân của ngôn ngữ Datalog). Đề tài đã trình bày khả năng ứng dụng logic trong biểu diễn mô hình CSDL suy diễn. Đề tài cũng thảo luận về khả năng thực hiện truy vấn thông qua cách thức biểu diễn của ngôn ngữ Datalog, biến đổi các luật của Datalog thành các mô tả khái niệm trong logic mô tả.
Với khả năng biểu diễn, truy vấn bằng logic mô tả ta có thể suy rộng ra rằng, CSDL có thể đƣợc biến đổi thành cơ sở tri thức, với ngữ nghĩa truy vấn phong phú hơn.
Tuy nhiên, ngoài những công việc đã làm đƣợc, trong đề tài này mới mang tính lý thuyết. Chúng tôi chỉ mới xây dựng đƣợc chƣơng trình DEMO đơn giản, nên chắc chắn chƣa hoàn toàn thuyết phục. Vì vậy, kế hoạch công việc trong tƣơng lai để hoàn thành hơn sẽ là đi sâu, ứng dụng một trong những ngôn ngữ suy diễn (chẳng hạn Prolog, Datalog, Racer...) để xây dựng đƣợc một chƣơng trình ứng dụng thực tế với quy mô lớn hơn, hoàn thiện hơn.
Ở nƣớc ta cũng nhƣ trên thế giới việc nghiên cứu về CSDL suy diễn rất ít, do vậy nguồn tài liệu nghiên cứu về đề tài cũng rất hạn chế. Do đó đề tài chắc chắn còn nhiều những hạn chế, chúng tôi rất mong các thầy, các cô và các bạn đồng nghiệp đóng góp ý kiến để đề tài đƣợc hoàn thiện hơn.
TÀI LIỆU THAM KHẢO
Tiếng Việt.
[1]Ths. Đinh Nguyễn Anh Dũng, “Biểu diễn tri thức”(2001). NXB Thống Kê.
[2]TS. Phan Huy Khánh, “Lập trình logic trong Prolog”(2004), NXB Đại học quốc gia Hà Nộị
[3]Vũ Đức Thi, ”Cơ sở dữ liệu”, NXB Thống kê, 2004. [4]Đỗ Trung Tuấn, “Hệchuyêngia”, Nxb. Giáo dục, 1998
[5]Đỗ Trung Tuấn, “Trítuệnhântạo”, Nxb. Đại học Quốc gia Hà Nội, 2010
[6]Lê Mạnh Thạnh, Trƣơng Công Tuấn (2002), “Tối ưu câu truy vấn trên chương
trình Datalog”, Báo cáo Hội nghị Toán học toàn quốc lần VI tại Huế.
[7]Biên dịch: Trần Đức Quang (1999), Nguyên lý các hệ Cơ sở dữ liệu và Cơ Lê Mạnh Thạnh, Trƣơng Công Tuấn (2003), “Tối ưu hóa câu truy vấn trong cơ sở
dữ liệu suy diễn bằng phép biến đổi ma tập”, Tạp chí Tin học và Điều khiển
học.
Tiếng Anh.
[8]Apt K. R., “Logic Programming” (1990), Elsevier Science Publishers, pp. 135- 144.
[9]Arni, F., Ong, K., Tsur, S., Wang, H., and Zaniolo, “The deductive database system LDL++”. TPLP 3, 1 (2003), 61–94.
[10] Ceri S. , Gottlob G., Tanca L, ”Logic Programming and Databases” (1990), Springer-Verlag Berlin Heidelberg Publishers, pp.54-63.
[11] Clark K. L, “Negation as failure in Logic and Databases”(1978), H. Gallaire and J. Minker, editors, Plenum Press, New York, pp. 293-322.
[12] H Ait-Kaci and R Nasr, "LOGIN: A Logic Programming Language with Built-in Inheritance"(1986). Journal of Logic Programming, pp. 187-215.
[13] LTF Ganut, "Introduction to Logic"(1991). The University of Chicago Press, pp. 178-193.
[14] In J. Minker, editor, “Foundation of Deductive Databases and Logic Programming” (1972), Morgan Kaufmann, Publishers, pp. 126-144.
[15] J Ullman, "Database and Knowledge Base Systems"(1988), Computer Press, pp. 171-178.
[16] S Tsur and C Zaniolo, "LDL: A Logic Based Data Language"(1986). Proc. of the 12th Int. Conf. on Very Large Database, Tokyo, pp. 203-214.
WEBSITE THAM KHẢO
[17] http:// en.wikipediạorg/wiki/Deductive_database(22/02/2013) [18] http://wikịvisualprolog.com/index.php?title=New_Features_in_Visual_Prol og_7.4#IDẸ(27/02/2013) [19] http://www.cs.sunysb.edu/~warren/xsbbook/node12.html.(01/03/2013) [20] http://docs.racket-lang.org/datalog.(11/03/2013) [21] www.cs.uclạedu/~zaniolo/papers.(15/03/2013) [22] http://tainguyensọvnụedụvn/xmlui/handle/123456789/10492(17/03/2013) [23] http://123doc.vn/collection/1043-csdl.htm .(20/03/2013) [24] http://tailieutonghop.com/free/logic-mo-ta-va-ung-dung-trong-co-so-du- lieu_f254-7649.html(22/03/2013) [25] http://csẹunl.edu/~riedesel/pub/cse413/des/doc/manualDES.pdf