Truy vấn trong Datalog (Datalog Query)

Một phần của tài liệu Luận văn thạc sĩ công nghệ thông tin Nghiên cứu cơ sở dữ liệu suy diễn và ứng dụng (Trang 62 - 87)

3.5.1. Định nghĩạ

Một câu truy vấn trong CSDL suy diễn gồm có:

 Một chƣơng trình Datalog, tức là một tập hữu hạn, có thể rỗng của các luật.

 Một literal đơn có dạng P(x1,x2,...,xn)? Trong đó, xi (i=1,2,...,n) là hằng số hoặc tên biến.

Việc khai thác câu hỏi trƣớc tiên là tính chƣơng trình Datalog (nếu có), tiếp theo P(x1,x2,...,xn) đƣợc đánh giá. Thủ tục này tƣơng tự nhƣ lựa chọn trong quan hệ P theo ràng buộc phù hợp.

Ví dụ 1: Tìm tất cả các n-bộ của quan hệ vay tại chi nhánh Hà Nộị Khi đó ta có :

Ví dụ 2: Tính tập các khách hàng của chi nhánh Hà Nội có tài khoản mà số dƣ trên

1200. Khi đó chƣơng trình Datalog chỉ có một luật đơn C(Y) Gửi_Tiền(“Hà Nội”, X, Y,Z), Z > 1200 C(Y)?

Câu C(Y)? là thừa, vì nó chỉ nhằm xác định quan hệ cần thể hiện. Để loại trừ hiện tƣợng thừa, ngƣời ta có thể dùng ký pháp ngắn gọn, nếu không sợ bị lẫn lộn, nhằm lẫn. Nếu bây giờ cho câu P(x1,x2,...,xn) và yêu cầu chƣơng trình Datalog bao hàm một luật đơn phân biệt là: Hỏi(x1,x2,...,xn)...

Trong đó xi (i=1,2,...,n) là tên biến. Điều này hiểu rằng ngƣời ta có câu: Hỏi(x1,x2,...,xn)?

Câu này là một phần của câu hỏị Do vậy, câu hỏi sau là tƣơng đƣơng với câu hỏi trên: Hỏi(Y) Gửi_Tiền(“Hà Nội”, X, Y,Z), Z > 1200

3.5.2. Cấu trúc.

Để trình bày cấu trúc của câu hỏi ngƣời ta sử dụng đồ thị luật (Rule Graph) Một đồ thị luật đối với câu hỏi q là đồ thị có hƣớng mà:

 Các nút của đồ thị ứng với tập các kí hiệu Literal có mặt trong các luật của q.

 Cung của đồ thị ứng với quan hệ trƣớc giữa Literal trong thân của luật và Literal có mặt trong đầu của luật đó.

Do vậy đồ thị sẽ có cung ai aj nếu luật này có mặt trong câu hỏi ai ...aj...

Chú ý: Việc xây dựng này không tính đến tập các biến và các hằng số có mặt trong các

luật đa dạng của câu hỏi nàỵ Thông tin duy nhất ngƣời ta dùng là tập các ký hiệu Literal và quan hệ của chúng theo các luật đa dạng.

Ví dụ 1: xét câu hỏi:

P1(X,Y,Z) Q1(X,Y), Q2(X,Z), Q3(Y,Z) P2(A,B) P1(A,B), Q4(B,A)

Đồ thị ứng với câu hỏi này là:

Hình 3.1: Đồ thị không có chu trình.

Đồ thị trên là đồ thị không có chu trình, thƣờng đƣợc gọi là câu hỏi không đệ quỵ

Ví dụ 2: Xét câu hỏi:

P1(A,B,C) Q1(A,B), P2(B,C) P2(X,Y)  Q2(X), P1(X,Y,Z) Hỏi(A,B) P1(A,B,C), P2(B,C) Đồ thị tƣơng ứng với câu hỏi này là:

Hình 3.2: Đồ thị có chu trình.

Đây là đồ thị có chu trình, thƣờng đƣợc gọi là câu hỏi có đệ quỵ

Kết luận: Hỏi P1 P2 P3 Q1 Q2 Q3 Q4 Hỏi P1 P2 Q1 Q2

 Việc xây dựng cấu trúc của câu hỏi cho phép chúng ta dễ dàng trong việc đánh giá câu hỏị

 Giữa câu hỏi đệ quy và câu hỏi không đệ quy cũng có nhiều khác nhau ở khía cạnh loại hình câu hỏi trên CSDL. Thực tế cho thấy việc đánh giá câu hỏi đệ quy phức tạp hơn đánh giá câu hỏi thƣờng.

3.5.3. So sánh Datalog với đại số quan hệ.

(Nguồn: “Giáo trình Datalog”-Lê Mạnh Thạnh (2004))

Về mặt cơ bản, ngôn ngữ Datalog với các câu hỏi không đệ quy đƣợc xem nhƣ tƣơng đƣơng với đại số quan hệ về khả năng thể hiện.

Với các câu hỏi đệ quy đƣợc xem nhƣ là một công cụ cho phép ngƣời ta truy vấn dữ liệu nhanh hơn, dễ dàng hơn các ngôn ngữ đại số quan hệ. Điều này ngôn ngữ Datalog cho phép hỏi các câu hỏi không đƣợc phép trong đại số quan hệ.

(1) Phép hợp: Là tập các luật có cùng đầu luật:

Hỏi(X1, X2,...,Xn)r1(X1, X2, ..., Xn) Hỏi(Y1, Y2,...,Yn)r2(Y1, Y2, ..., Yn)

Ví dụ 1:

(r1) Cha_mẹ (x,y) Bố (x,y) (r2) Cha_mẹ (x,y) Mẹ (x,y)

Ví dụ 2:

Tìm tên của các khách hàng tại chi nhánh “Hà Nội”, làm nhƣ sau: Hỏi(Y)Vay(“Hà Nội”, X,Y,Z)

Hỏi(B)Gửi_Tiền(“Hà Nội”,A,B,C)

Chú ý: Hai luật thể hiện phép hợp là tách biệt.

(2) Phép chọn: ứng với một luật mà thân luật có một vị từ so sánh, còn gọi là biểu thức chọn. Phép chọn các n_bộ trong quan hệ r đƣợc viết dƣới dạng câu hỏi: r(x1, x2,..,xn)?. Trong đó, xi (i=1,2,...n) là tên biến hay một hằng số.

Cha_mẹ(x, y)  Cha_mẹ(x, y), y=”Dũng”. Điều này tƣơng đƣơng với cú pháp sau: y=”Dũng”(Cha_mẹ(x,y)) (phép chọn với điều kiện y =”Dũng”)

Ví dụ 2:

Chọn (tìm kiếm) tên của những khách hàng vay quá 1000? Hỏi(Y)Vay(“Hà Nội”, X,Y,Z), z>1000

(3) Phép chiếu: là phép toán tƣơng ứng với một số luật mà có một số biến ở thân

luật mà không xuất hiện ở đầu luật.

Ví dụ:

Chăx) = KQ(x)  Cha_mẹ(x, y), y=”Dũng”.

(4) Phép kết nối: là phép ứng với luật mà có biến chung ở các vị từ của thân luật. Phép kết nối hai quan hệ r1, r2 đƣợc viết dƣới dạng Datalog nhƣ sau:

Hỏi(X1, X2,...,Xn, Y1, Y2,...,Ym)  r1(X1, X2,..,Xn), r2(Y1, Y2,..,Ym) Trong đó, Xi, Yj (i=1,2,...,n và j=1,2,...,m) là các tên biến phân biệt nhaụ

Ví dụ: Ông_bà(x,y)Cha_mẹ(x,z), Cha_mẹ(z,y)

(5) Khả năng đệ quy:

Ví dụ: Giả sử có lƣợc đồ quan hệ:

Quản lý( Tên nhân công, tên người quản lý).

Lƣợc đồ này thể hiện mối quan hệ giữa ngƣời quản lý và nhân công. Giả sử “Quản lý“ là một quan hệ theo mô hình trên.

Bảng 3.2: Bảng quan hệ Quản lý công nhân.

Yêu cầu:

Tên nhân công Tên ngƣời quản lý Mỗ Hoa Mai Lan Mễ Mỗ Mỗ Mỗ

1) Tìm tên của những ngƣời làm việc trực tiếp dƣới quyền của ông Mỗ, tức phụ thuộc mức 1, viết nhƣ sau:

Hỏi(X)Quản lý(X, “Mỗ”)

2) Tìm tên của những ngƣời trực tiếp dƣới quyền của ngƣời do ông Mỗ quản lý, tức phụ thuộc mức 2 vào ông Mỗ, ta viết nhƣ sau:

Hỏi(X)Quản lý(X, Y), Quản lý(Y, “Mỗ”).

Nhƣ vậy ngƣời ta không thể thể hiện yêu cầu tìm ngƣời phụ thuộc bậc n vào ông Mỗ trong đại số quan hệ đƣợc. Dĩ nhiên câu hỏi tìm tên của nhân công làm việc dƣới quyền của ông Mỗ, trực tiếp hay gián tiếp, không thể tạo đƣợc bằng đại số quan hệ hay bằng Datalog với các câu hỏi không đệ quỵ Nguyên nhân là do ngƣời ta không biết ông Mỗ quản lý đến mức nàọ Tuy nhiên ngƣời ta có thể tạo câu hỏi này trong Datalog dƣới dạng câu hỏi đệ quy nhƣ sau:

e(X)Quản lý(X, “Mỗ”) e(X)Quản lý(X, Y), e(Y) Hỏi(X)e(X)

Chú ý: Cách a).

Đối với những câu hỏi đệ quy ngƣời ta cũng có thể chuyển về câu hỏi không đệ quy bằng cách sử dụng ngôn ngữ tựa pascal với một số lần hữu hạn các bƣớc lặp. Việc lặp đƣợc thể hiện qua câu lệnh Repeat. Điều kiện trong câu Until sẽ kiểm tra về tập hợp, nhƣ tính bằng nhau, bao nhau hay rỗng. Trong câu Until các quan hệ suy diễn đƣợc coi nhƣ các tập. Do vậy câu hỏi đệ quy trên có thể đƣợc viết lại nhƣ sau:

e’(X)Quản lý(X, “Mỗ”) Repeat

e(X) e’(X)

e’(X) Quản lý(X, Y), e(Y) Until e=e’

Mô tả:

 Luật đầu tiên tìm nhân công mà ông Mỗ trực tiếp quản lý. Khi hoàn thành các luật trong vòng Repeat đƣợc đánh giá.

 Tại mỗi lần lặp, mức tiếp theo của nhân công đƣợc tìm và bỗ sung vào tập ẹ

 Thủ tục này kết thúc khi tập e = e’( khi không còn nhân công mới có thể đƣợc bỗ sung vào e). Mặt khác, do tập những ngƣời quản lý là hữu hạn.

Cách thực hiện: Theo dõi chu trình với các dữ liệu trong bảng khi chạỵ e’ ={Hoa, Lan, Mai }

e = { Hoa, Lan, Mai } Lặp lại

e’ ={ Hoa, Lan, Mai, Chén, Tích} e = { Hoa, Lan, Mai, Chén, Tích}

Cách b).

Ngoài cách làm nhƣ trên ngƣời ta cũng có thể làm theo cách khác mà vẫn đạt đƣợc kết quả nhƣ nhau:

m(X,Y) Quản lý(X, Y)

m(X,Y) Quản lý(X, Z), m(Z,Y) Hỏi(X)m(X, “Mỗ”)

So sánh cách a)cách b)

 Cách a1). Tìm ra các nhân công của ông Mỗ. Cách này cho phép tìm nhanh hơn.

 Cách a2). Tìm tất cả quan hệ nhân công – ngƣời quản lý rồi chọn ra các cặp có tên ngƣời quản lý là ông Mỗ.

3.6. Chƣơng trình Datalog có chứa ký hiệu hàm.

Ở trên ta chỉ xét các quy tắc của chƣơng trình Datalog ta đã giả thiết là các đối số của các vị từ chỉ là hằng hoặc biến. Tuy nhiên có những tình huống đƣợc mô tả dễ hơn nhiều bằng cách dùng đối số là các hạng thức đƣợc xây dựng từ biến, hằng và ký hiệu hàm. Các bộ của các quan hệ EDB có thể có các thành phần là các hạng thức thay vì là các hằng nhƣ trƣớc đâỵ

Ta giả sử các hạng thức trong quan hệ EDB là hạng thức nền, nghĩa là không chứa biến.

Khi các quy tắc là đệ quy, việc sử dụng các ký hiệu hàm có thể tạo ra một tập vô hạn các giá trị trong các quan hệ, nhƣ ví dụ sau đây:

Ví dụ(theo Giáo trình Datalog, Lê Mạnh Thạnh(2003)):

Phép cộng có thể định nghĩa đệ quy nhƣ sau : Giả sử int(X) là ký hiệu vị từ và int(X) là true nếu X nguyên (không âm) và vị từ sum(X,Y,Z) là true nếu Z=X+Ỵ Giả

sử succ là ký hiệu hàm và succ(X) là số nguyên X+1. Hằng 0 là số nguyên. L c đó

succ(0) ta gọi là "1", succ(succ(0)) là "2", các số nguyên khác ngoại trừ 0 là không tồn tại trong dạng khác. L c đó ta có các quy tắc sau đây thỏa mãn định nghĩa trên :

(1) int(0)

(2) int(succ(X))  int(X) (3) sum(X,0,X)  int(X)

(4) sum(X,succ(Y),succ(Z))  sum(X,Y,Z)

Hai quy tắc (1) và (2) định nghĩa 0, succ(0), succ(succ(0)),...là các số nguyên,... Quy tắc (3) nói rằng tổng của mọi số nguyên với 0 là chính số nguyên đó.

Quy tắc (4) nói rằng X+(Y+1) = Z nếu X+Y=Z. Nhận xét :

 Các vị từ int và sum tạo ra các quan hệ vô hạn mặc dù các quy tắc đã cho là an toàn.

 Mặc dầu c pháp đối với các ký hiệu hàm và các ký hiệu vị từ là nhƣ nhau (chuỗi bắt đầu bằng chữ thƣờng) nhƣng hoàn toàn không có sự nhầm lẫn giữa hai kiểu ký hiệu nàỵ Các ký hiệu hàm lấy giá trị trên miền nhƣ các đối số và trả về các giá trị của miền, các ký hiệu vị từ cũng lấy giá trị trên miền nhƣ các đối số nhƣng trả về giá trị chân lý (true hoặc false). Nhƣ ở ví dụ

trên thì succ lấy một đối số là số nguyên và trả về một số nguyên, trong khi

sum lấy ba đối số nguyên và trả về true nếu thành phần thứ ba bằng tổng

thành phần thứ nhất và thứ hai, ngƣợc lại nó trả về false.

3.7. Kết luận.

CSDL suy diễn là mô hình CSDL dựa trên lập trình logic, mặc dù khả năng ứng dụng rộng và tính hiệu quả của nó không bằng CSDL quan hệ mà ta đã biết, nhƣng nó có những đặc tính mà các mô hình CSDL khác không có. Chẳng hạn nhƣ khả năng đệ quy trong truy vấn dữ liệu; khả năng suy diễn ra những tri thức mới từ những tri thức đã có;…Chƣơng này trình bày một số vấn đề mang tính lý thuyết đơn giản nhƣng không kém phần quan trọng trong việc tạo tiền đề cho những nghiên cứu sâu hơn, rộng hơn về lĩnh vực nàỵ

CHƢƠNG 4. CÀI ĐẶT DEMO ỨNG DỤNG

Nội dung chính: Xây dựng demo ứng dụng: “Ứng dụng CSDL suy diễn vào việc

tìm kiếm thông tin sách trong thư viện”

4.1. Mục tiêụ

Nhầm đánh giá lại vai trò và tầm quan trọng của CSDL suy diễn trong hệ thống cơ sở dữ liệụ Bằng một chƣơng trình ứng dụng thực tế chúng ta sẽ thấy rõ hơn vai trò của nó. Qua đó chúng ta sẽ có cách nhìn tổng quan hơn, sâu sắc hơn về CSDL suy diễn.

Xây dựng đƣợc giao diện tƣơng tác thân thiện giữa ngƣời sử dụng và chƣơng trình. Thông qua giao diện chƣơng trình, ngƣời sử dụng có thể chọn CSDL mẫu và thực hiện tƣơng tác một số câu truy vấn đã đƣợc thiết kế sẳn.

4.2. Cấu trúc chƣơng trình.

Chƣơng trình là một hệ thống tƣơng tác dựa trên giao diện form đã đƣợc thiết kế bằng ngôn ngữ lập trình C#.

Từ CSDL mẫu đƣợc đƣa vào, ngƣời sử dụng có thể tƣơng tác thực hiện một số câu truy vấn đƣợc thiết kế sẳn trên giao diện chƣơng trình.

Những câu truy vấn đƣợc thực hiện thông qua cơ chế suy diễn bằng việc kết nối với thƣ viện SWI-Prolog.

4.3. Mô hình luồng xử lý bài toán.

Hình 4.1: Mô hình luồng xử lý bài toán.

NNLT C# Tạo CSDL mẫu từ

file excel

Xây dựng cấu trúc cây suy diễn cho từng dạng câu hỏi (mỗi câu

hỏi là một file .pl) Prolog

Truy vấn

Xây dựng cấu trúc câu truy vấn hoàn chỉnh.

Xử lý truy vấn Prolog Begin

4.4. Môi trƣờng thực nghiệm.

 Chƣơng trình đƣợc cài đặt trên ngôn ngữ Visual C# và đƣợc thử nghiệm trên hệ điều hành Windows 7 32bit, máy tính PC tốc độ 1,6 GHz, bộ nhớ 1Gb RAM.

 Toàn bộ CSDL mẫu đƣợc thiết kế và lƣu trữ trên Microsoft Office 2010.

 Bộ thƣ viện SWI-Prolog cho windows 32bit.

 Bộ Visual studio 2010.

4.5. Quy trình thực hiện. 4.5.1. Đặt vấn đề. 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?

Một phần của tài liệu Luận văn thạc sĩ công nghệ thông tin Nghiên cứu cơ sở dữ liệu suy diễn và ứng dụng (Trang 62 - 87)

Tải bản đầy đủ (PDF)

(87 trang)