Chuẩn hóa dạng chuẩn hội (CNF)

Một phần của tài liệu Phụ thuộc logic trong cơ sở dữ liệu (Trang 56)

Quy trình chuẩn hóa dạng chuẩn hội

- Bước 1: Đưa các dấu phủ định ~ lên trước.

- Bước 2: Thay xor (), =>, <=>, bằng tổ hợp các phép toán ~, & và +. - Bước 3: Thay luật phân phối bằng 2 tích: ab + c = c + ab = (a+c)(b+c)

Một số c c luật t ờn sử dụn (1) X’’ = X (2) (XY)’ = X’ + Y’ (3) (X + Y)’ = X’Y’ (4) (X => Y) = X’+Y (5) (X => Y)’ = XY’ (6) (X <=> Y) = (X => Y)(Y => X) = (X’+Y)(X+Y’) (7) (X <=> Y)’ = XY’+X’Y (8) X  Y = (X+Y)(X’+Y’)

3.1.3 Phƣơng ph p chứng minh công thức suy dẫn bằng phép hợp giải

Cho f, g là các công thức Boole dương. Chứng minh f => g. Xét h: (f => g)’

- Bước 1: Đưa h về dạng CNF = tích các tổng: h = h1.h2…hk - Bước 2: Thay 2 nhân tử dạng (a+b) và (a’+c) bằng (b+c). - Bước 3: Lặp đến khi xảy ra 1 trong 2 tình huống sau:

+ Gặp 0: Kết luận f => g

+ Không gặp 0: Kết luận f không suy ra g.

3.2 Bài to n bao đóng h Algorithm Closure Format: Closure(X, F) Input: - B F trên U - h ộ h X U Output: - Y = X+ = {A U | XA F+} Method Y:=X;

for each element A in U\X do if member_GPB(F, XA) then Add A to Y; endif; endfor; return Y; End Closure. Thí dụ 3.1 Cho F={abc, bdc}. Tính b+? Giải

Với tập F đã cho thì U=abcd. Ta tìm bao đóng của X=b như sau: Y:={b};

Lần lượt xét các phần tử A  U\X. Kiểm tra xem nếu F => (X A) thì bổ sung A vào G. Sau đây là các bước thực hiện với X=b:

+ Trường hợp A=a: Ta có G={ba}. Kiểm tra F=>G: - Đưa về CNF: Đặt H=FG’. Ta có:

H=(a’+bc)(b’+dc)ba’ // Do G= ba nên G’=ba’ H=(a’+b)(a’+c)(b’+d)(b’+c)ba’có dạng CNF - Hợp giải:

H=(a’+b)(b’+c)(a’+c)(b’+d)ba’=(a’+c)(b’+d)ba’=(a’+c)da’0 + Trường hợp A=c: Ta có G={bc}. Kiểm tra F=>G:

- Đưa về CNF: Đặt H=FG’. Ta có: H=(a’+bc)(b’+dc)bc’ // Do G= bc nên G’=bc’ H=(a’+b)(a’+c)(b’+d)(b’+c)bc’có dạng CNF - Hợp giải: H=(a’+b)(a’+c)(b’+d)(b’+c)bc’=(a’+b)(a’+c)(b’+d)cc’=0 G:=Gc={b, c}

+ Trường hợp A=d: Ta có G={bd}. Kiểm tra F=>G: - Đưa về CNF: Đặt H=FG’. Ta có: H=(a’+bc)(b’+dc)bd’ // Do G= bd nên G’=bd’ H=(a’+b)(a’+c)(b’+d)(b’+c)bd’có dạng CNF - Hợp giải: H=(a’+b)(a’+c)(b’+d)(b’+c)bd’=(a’+b)(a’+c)(b’+c)dd’=0 G:=Gd={b, c, d}. Kết luận:

Vậy bao đóng của X = b là X+ = bcd.

3.3 Một số thí dụ minh họa

Thí dụ 3.2

Hãy chứng minh: Nếu a=>b, b=>c thì a=>c (Tc bắc cầu). Gọi f, g là các công thức sau:

f = (a=>b)(b=>c) = {a=>b, b=>c}; g = a=>c = {a=>c}. Hỏi rằng f => g? Giải X = ((a=>b)&(b=>c))=>(a=>c)? Xét phủ định của X: H = [((a=>b)&(b=>c))=>(a=>c)]’ (A) Đưa h về CNF H = [((a=>b)&(b=>c))=>(a=>c)]’ =

= (a’+b)(b’+c)(a’+c)’ // Vận dụng công thức (x=>y)’ = xy’ và (x=>y) = x’+y = (a’+b)(b’+c)ac’ = (a’+b)(b’+c)ac’ // Đây chính là CNF.

(B) Hợp giải

H = (a’+b)(b’+c)ac’ => (a’+c)ac’ // Thay (a’+b)(b’+c) bằng (a’+c). => cc’ // Thay (a’+c)a = (a’+c)(a+0) bằng (c+0) = c

=> 0.

Kết luận: Nếu a=>b, b=>c thì a=>c (Tc bắc cầu).

Thí dụ 3.3

Hãy kiểm tra công thức sau: (a=>b) => (ac=>bc) ?

Giải

H = (a=>b)(ac=>bc)’ = (a’+b)(ac(bc)’) = (a+b)(b’+c’)ac. CNF H => (a+c’)ac => aa = a. Sai

Kết luận: (a=>b) =/> (ac=>bc)

Thí dụ 3.4

Hãy kiểm tra công thức (a=>b) => ((a+c)=>(b+c)) ?

Giải

H = (a=>b)[(a+c)=>(b+c)]’ = (a’+b)(a+c)(b+c)’ = (a’+b)(a+c)b’c’. CNF H = (a’+b)(a+c)b’c’ =>(b+c)b’c’ => cc’ = 0.

Kết luận: Công thức suy dẫn trên là đúng.

Thí dụ 3.5

Giải

Với thí dụ này, ta sử dụng phương pháp phản chứng. Giả sử X sai, ta có: H = X’ = (x+a)(y+a’)(x+y)’ = (x+a)(y+a’)x’y’. CNF

H => (x+y)x’y’ => yy’ = 0.

Kết luận: Công thức suy dẫn trên là hằng đúng.

Thí dụ 3.6

Hãy chứng minh X = a’+1 là hằng đúng.

Giải

Vẫn dùng phương pháp phản chứng. Giả sử X sai, ta có H = X’ = (a’+1)’ = a0 = 0.

Kết luận: Công thức suy dẫn trên là hằng đúng.

Thí dụ 3.7

Hãy chứng minh công thức X = (ab => c) => (a => (b => c)) là hằng đúng.

Giải

Sử dụng phương pháp phản chứng như sau: Giả sử X sai, ta có H = X’ = [(ab => c) => (a => (b => c))]’ = (ab=>c)[a=>(b=>c)]’ = = (ab=>c)a(b=>c)’ = ((ab)’+c)abc’ = (a’+b’+c)abc’ . CNF

H => (b’+c)bc’ => cc’ = 0.

Kết luận: Công thức X = (ab => c) => (a => (b => c)) là hằng đúng.

3.4 Môi trƣờng xây dựng chƣơng trình

3.4.1 Phần cài đặt chƣơng trình

Chương trình được xây dựng bằng ngôn ngữ Prolog, là ngôn ngữ lập trình logic được sử dụng phổ biến trong lĩnh vực trí tuệ nhân tạo. Nguyên lý lập trình logic dựa trên các mệnh đề Horn (Horn logic). Nội dung của chương trình nhằm giải bài toán thành viên, tìm khóa trên tập các thuộc tính với dữ liệu là các công thức Logic F, G.

3.4.2 Dữ liệu p dụng cho chƣơng trình

Dữ liệu được sử dụng để chạy chương trình là tập các thuộc tính của phụ thuộc Logic F và tập các thuộc tính của phụ thuộc Logic G có sẵn, hoặc có thể nhập trực tiếp trên bàn phím trong phần code của chương trình.

Thí dụ 3.8

Giải bài toán thành viên với các phụ thuộc logic F và G như sau: F= (a&b => c) & (~a+b), G = a => c. Hỏi F => G?

3.5 Kết quả đạt đƣợc

Khi thực hiện các lệnh gọi các thủ tục chương trình sẽ giải một cách nhanh chóng bài toán thành viên với các phụ thuộc Boole F và G và cho ra kết quả nếu là rỗng ta kết luận theo thuật toán hợp giải ta có thể kết luận là F => G, ngược lại F =/> G.

Chương trình có thể thực hiện tìm khóa trên lược đồ quan hệ có tập hợp các thuộc tính với các phụ thuộc Logic F, G cho trước. Kết quả của thuật toán sẽ cho ra giá trị là tập hợp các khóa tìm được trên quan hệ đó.

Ta cũng có thể tìm các trị một cách nhanh chóng bằng cách đưa vào các thuộc tính hay các hàm, chương trình sẽ xuất ra kết quả tương ứng của thuộc tính hay hàm đó.

3 . 6 K ế t c h ƣ ơ n g

Chương này đã trình bày một số một số bài toán thành viên và bài toán bao đóng, các thuật toán và phương pháp hợp giải để giải bài toán thành viên cho các phụ thuộc Logic, sử dụng thuật toán tìm khóa để giải bài toán tìm khóa cho lược đồ quan hệ gồm các phụ thuộc Logic F,G. Đồng thời trình bày cách thực hiện, việc đưa dữ liệu và kết quả của chương trình ứng dụng viết trên ngôn ngữ Prolog.

KẾT LUẬN VÀ KIẾN NGHỊ HƢỚNG PHÁT TRIỂN

Kết luận

Lý thuyết phụ thuộc dữ liệu luôn là vấn đề được nhiều người quan tâm nghiên cứu, phát triển về mặt lý thuyết cũng như ứng dụng. Các nhà nghiên cứu đã đề xuất nhiều loại phụ thuộc dữ liệu khác nhau để đáp ứng yêu cầu thực tế phong phú và đa dạng. Lớp phụ thuộc dữ liệu đầu tiên là phụ thuộc hàm đã được E. F. Codd [13] tác giả mô hình cơ sở dữ liệu quan hệ giới thiệu năm 1970. Cùng với sự phát triển của lớp phụ thuộc hàm, nhiều lớp phụ thuộc khác cũng được nghiên cứu, phát triển như phụ thuộc đối ngẫu, phụ thuộc mạnh, phụ thuộc yếu, phụ thuộc đối sánh, phụ thuộc tuần tự, phụ thuộc sai khác…và một số lớp phụ thuộc Boole dương. Với mong muốn đóng góp vào sự phát triển và ứng dụng đó, luận văn đã cố gắng tìm hiểu và trình bày một số khái niệm cơ bản về lớp phụ thuộc Boole dương và một số vấn đề của lớp phụ thuộc này như bao đóng, bài toán suy dẫn, bài toán thành viên.

Kiến nghị hƣớng phát triển tiếp theo

- Nghiên cứu và ứng dụng về các loại phủ cho lớp phụ thuộc Boole dương như phủ tự nhiên, phủ tối tiểu.

- Tiếp tục tìm hiểu một số lớp phụ thuộc dữ liệu có bản chất là phụ thuộc Boole dương được nghiên cứu gần đây như phụ thuộc hàm mềm, phụ thuộc hàm có điều kiện, phụ thuộc sai khác….

- Xây dựng các ứng dụng, giải quyết bài toán thực tế dựa vào lớp các phụ thuộc Boole dương.

PHỤ LỤC

(Một số kết quả của chƣơng trình ứng dụng)

- Gọi thực hiện lệnh “go1.” để giải bài to n thành viên.

- Kích đúp chuột lên file chương trình là thanhvien.pl

- Màn hình hiển thị như sau:

Welcome to SWI-Prolog (Multi-threaded, 32 bits, Version 6.4.1) Copyright (c) 1990-2013 University of Amsterdam, VU Amsterdam

SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions.

Please visit http://www.swi-prolog.org for details. For help, use?- help(Topic). or?- apropos(Word). 1?-

- Tại dấu nhắc ta đánh vào lệnh “go1.”

1?- go1.

(a&b=>c)& (~a+b) => a=>c? ---

Given: (a&b=>c) & (~a+b)=> (a=>c) Y = ~ ((a&b=>c) & (~a+b)=> (a=>c)) CNF: (~a+ ~b+c) & (~a+b)& (a& ~c) ToList: [~a+ ~b+c,~a+b,a,~c]

List: [[~a,~b,c],[~a,b],[a],[~c]] [] true ! true . 2 ?- Hình phụ lục 1- Gọi thủ tục go1

- Gọi thực hiện lệnh “go2.” để giải bài to n thành viên. 1 ?- go2.

(a=>b)& (b=>c) => a=>c? ---

Given: (a=>b)& (b=>c)=> (a=>c) Y = ~ ((a=>b)& (b=>c)=> (a=>c)) CNF: (~a+b)& (~b+c)& (a& ~c) ToList: [~a+b,~b+c,a,~c] List: [[~a,b],[~b,c],[a],[~c]] [] true ! true Hình phụ lục 2 - Gọi thủ tục go2

- Gọi thực hiện lệnh “go3.” để giải bài to n thành viên. 2 ?- go3.

(a=>b+c)& (a&d=>e)& (c+e=>b) => b&e=>a+d? ---

Given: (a=>b+c)& (a&d=>e)& (c+e=>b)=> (b&e=>a+d) Y = ~ ((a=>b+c)& (a&d=>e)& (c+e=>b)=> (b&e=>a+d))

CNF: (~a+ (b+c))& (~a+ ~d+e)& ((~c+b)& (~e+b))& (b&e& (~a& ~d)) ToList: [~a+ (b+c),~a+ ~d+e,~c+b,~e+b,b,e,~a,~d]

List: [[~a,b,c],[~a,~d,e],[~c,b],[~e,b],[b],[e],[~a],[~d]] [[b],[e],[~a],[~d],[~a,b],[~a,~d,b]]

By val [0,1,0,0,1] false ! true

- Gọi thực hiện lệnh “go.” để giải bài to n thành viên. 3 ?- go. (a b)& (b c) a c? --- Given: (ab)& (bc) (ac) Y = ~ ((ab)& (bc) (ac)) CNF: (~a+b)& (~b+c)& (a& ~c) ToList: [~a+b,~b+c,a,~c] List: [[~a,b],[~b,c],[a],[~c]] [] true ! Continue [Y|N] ? y. Hình phụ lục 4- Gọi thủ tục go

- Để tiếp tục thực hiện giải ta nhấn “y.”, kết quả tiếp tục giải như sau:

(~a+b)& (~b+c) a c? ---

Given: (~a+b)& (~b+c) (ac) Y = ~ ((~a+b)& (~b+c) (ac)) CNF: (~a+b)& (~b+c)& (a& ~c) ToList: [~a+b,~b+c,a,~c] List: [[~a,b],[~b,c],[a],[~c]] [] true ! Continue [Y|N] ? y. Hình phụ lục 5 - Gọi tiếp thủ tục go

(x+a)& (y+ ~a) x+y? ---

Given: (x+a)& (y+ ~a)x+y Y = ~ ((x+a)& (y+ ~a) (x+y) CNF: (x+a)& (y+ ~a)& (~x& ~y) ToList: [x+a,y+ ~a,~x,~y]

List: [[x,a],[y,~a],[~x],[~y]] [] true ! Continue [Y|N] ? y. Hình phụ lục 6- Gọi tiếp thủ tục go a+b a? --- Given: a+b a Y = ~ (a+b a) CNF: (a+b)& ~a ToList: [a+b,~a] List: [[a,b],[~a]] [[b]] By val [0,1] false ! Continue [Y|N] ? y. Hình phụ lục 7- Gọi tiếp thủ tục go

a&b a? Given: a&b a Y = ~ (a&b a) CNF: a&b& ~a ToList: [a,b,~a] List: [[a],[b],[~a]] [] true ! Continue [Y|N] ? n. Bye ! true . Hình phụ lục 8 - Gọi tiếp thủ tục go

- Khi nhấn “n.” chương trình sẽ thoát khỏi thủ tục “go”.

- Gọi thực hiện lệnh “tt( thuộc tính).” để tính trị cho c c thuộc tính. Thí dụ 3.9

Để tính trị của biểu thức a+b ta gọi như sau:

2 ?- tt(a+b). [a,b] a+b --- [0,0] 0 [0,1] 1 [1,0] 1 [1,1] 1 --- True Hình phụ lục 9- Tính trị a+b

Thí dụ 3.10

Để tính trị của biểu thức a&b ta gọi như sau:

3 ?- tt(a&b). [a,b] a&b --- [0,0] 0 [0,1] 0 [1,0] 0 [1,1] 1 --- True Hình phụ lục 10- Tính trị a&b Thí dụ 3.11

Để tính trị của biểu thức a b ta gọi như sau:

4 ?- tt(a b). [a,b] a b --- [0,0] 1 [0,1] 1 [1,0] 0 [1,1] 1 --- True Hình phụ lục 11- Tính trị a b

Thí dụ 3.12

Để tính trị của biểu thức a^b ta gọi như sau:

5 ?- tt(a ^ b). [a,b] a^b --- [0,0] 0 [0,1] 1 [1,0] 1 [1,1] 0 --- True Hình phụ lục 12 - Tính trị a^b Thí dụ 3.13

Để tính trị của biểu thức a<=>b ta gọi như sau:

6 ?- tt(a b). [a,b] ab --- [0,0] 1 [0,1] 0 [1,0] 0 [1,1] 1 --- true Hình phụ lục 13 - Tính trị ab

TÀI LIỆU THAM KHẢO

Tài liệu tiếng Việt

[1] Bùi Đức Minh, Lương Nguyễn Hoàng Hoa (2011), “Hệ sinh cân bằng và bài toán biểu diễn cơ sở hệ sinh ánh xạ đóng”, Chuyên san các công trình ghiê ứ h iể ứ g ụ g CN -TT, Tập V-1, Số 5 (25), tr.15-21. [2] Nguyễn Xuân Huy (2006), C hụ h ộ gi g ở ữ iệ , Viện

KH&CN Việt nam, NXB Thống kê, Hà Nội.

[3] Nguyễn Xuân Huy, Lê Đức Minh, Vũ Ngọc Loãn (2000), “Các ánh xạ đóng và ứng dụng trong cơ sở dữ liệu”, ạ h i họ iề hiể họ , 16(4), tr.1-6.

[4] Nguyễn Xuân Huy, Lê Thị Mỹ Hạnh (2005), “Giàn giao của ánh xạ đóng”,

Ch ê g h ghiê ứ - iể h i iễ h g g ghệ h g i 14 35-42.

[5] Nguyễn Xuân Huy, Lê Thị Mỹ Hạnh (2005), “Thu gọn hệ sinh ánh xạ đóng”, Ch ê g h ghiê ứ - iể h i iễ h g g ghệ h g i 15 53-58.

[6] Nguyễn Xuân Huy, Lê Thị Mỹ Hạnh, Lương Nguyễn Hoàng Hoa, Bùi Đức Minh, Nguyễn Đức Vũ (2007), “Thiết kế cơ sở dữ liệu theo tiếp cận dịch chuyển lược đồ quan hệ”, Kỷ Hội h Kh họ Q gi “Mộ ấ ề họ ọ C g ghệ h g i ề h g”, Đại Lải, 14- 15/09/2007, NXB KHTN, tr.499-506.

Tài liệu tiếng Anh

[7] Armstrong W.W., Delobel C. (1980), “Decomposition and Functional Dependencies in Relations” , ACM TODS, 5(4), pp. 404-430.

[8] Bohannon, P., Fan, W., Geerts, F., Jia, X., and K.ementsietsidis,. A (2007), “Conditional functional dependencies for data cleaning”, In ICDE, pp.746- 755.

[9] Cong, G., Fan, W., Geerts, F., Jia, X., and Ma, S. (2007), “Improving data quality: Consistency and accuracy”, In VLDB, pp.315-326.

[10] Fan, W., Geerts, F., Lakshmanan, L. V. S., and Xiong, M. (2009), “Discovering conditional functional dependencies”, In ICDE, pp. 1231- 1234.

[11] Luong Nguyen Hoang Hoa (2011), “Some results concerning Generalized Positive Boolean Dependencies in relational database”, Internatinal Journal of Computer Electrical Engineering (IJCEE), vol. 3, no. 6, pp. 779-783. [12] Song, S., and Chen, L. (2011), “Differential Dependencies: Reasoning and

Discovery”, ACM Trans. Datab. Syst., vol.9, no 4, Article 39.

[13] Codd E. F. (1970), “A Relational Model of Data for Large Shared Data Banks, CACM 13(6), pp. 377-387.

Một phần của tài liệu Phụ thuộc logic trong cơ sở dữ liệu (Trang 56)

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

(71 trang)