1. Trang chủ
  2. » Luận Văn - Báo Cáo

Tiểu luận môn cơ sở dữ liệu nâng cao CƠ SỞ DỮ LIỆU SUY DIỄN VÀ PROLOG

15 398 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 15
Dung lượng 215,5 KB

Nội dung

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH CHƯƠNG TRÌNH ĐẠO TẠO THẠC SĨ CNTT QUA MẠNG ________ ________ BÀI THU HOẠCH MÔN HỌC Môn: CƠ SỞ DỮ LIỆU NÂNG CAO CƠ SỞ DỮ LIỆU SUY DIỄN VÀ PROLOG Học viên thực hiện: CH1101154 TRẦN THỊ TƯỜNG VI TP. HCM, năm 2012 ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH CHƯƠNG TRÌNH ĐẠO TẠO THẠC SĨ CNTT QUA MẠNG Mở đầu Bài thu hoạch này chỉ gói gọn trong 2 phần: Phần 1: Giới thiệu kiến thức sơ lược về cơ sở dữ liệu suy diễn và Prolog Phần 2: Áp dụng kiến thức tìm hiểu trên để giải bài toán về quan hệ ‘ancestor’ MÔN HỌC : CƠ SỞ DỮ LIỆU NÂNG CAO - PGS.TS. Đỗ Phúc - 1 - ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH CHƯƠNG TRÌNH ĐẠO TẠO THẠC SĨ CNTT QUA MẠNG MỤC LỤC CHƯƠNG TRÌNH ĐẠO TẠO THẠC SĨ CNTT QUA MẠNG 1 TP. HCM, năm 2012 1 Mở đầu 1 CHƯƠNG TRÌNH ĐẠO TẠO THẠC SĨ CNTT QUA MẠNG 2 PHẦN I : LÝ THUYẾT 3 I. CƠ SỞ DỮ LIỆU SUY DIỄN 3 II. NGÔN NGỮ PROLOG 5 PHẦN II : ÁP DỤNG 9 I. GIẢI BÀI TOÁN 9 II. NHẬN XÉT 12 MÔN HỌC : CƠ SỞ DỮ LIỆU NÂNG CAO - PGS.TS. Đỗ Phúc - 2 - ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH CHƯƠNG TRÌNH ĐẠO TẠO THẠC SĨ CNTT QUA MẠNG PHẦN I : LÝ THUYẾT I. CƠ SỞ DỮ LIỆU SUY DIỄN 1. Giới thiệu - CSDL suy diễn tích hợp CSDL và lập trình logic. Lập trình logic có thế mạnh là khả năng diễn đạt tri thức, ràng buộc toàn vẹn. - CSDL có khả năng quản trị dữ liệu, bảo mật dữliệu. - CSDL suy diễn có khả năng sử dụng các tính năng của lập trình logic để thực hiện các suy diễn nhằm tạo ra thông tin mới dựa trên các luật suy diễn và dữ liệu được lưu trữ trong CSDL. 2. Mô hình dữ liệu suy diễn - Có 2 đặc tính quan trọng của mô hình cấu trúc dữ liệu suy diễn như sau: a. Mô hình dữ liệu Suy diễn cung cấp một cách tiếp cận hợp nhất tới định nghĩa của những cấu trúc dữ liệu và những thủ tục. b. Mô hình dữ liệu Suy diễn qui định một khả năng để khôi phục không những rõ ràng dữ liệu được cất giữ mà còn suy luận dữ liệu một cách hợp lý. Hay nói cách khác, những hệ thống cơ sở dữ liệu suy diễn có khả năng kế xuất và đưa ra những kết luận mang tính logic. - Để máy tính có thể xữ lý được các thông tin, những biểu thức thực tế cần được viết bằng mã được quy định bởi một tập hợp các quy tắc, hình thức ký pháp mã hóa. Những hệ thống cơ sở dữ liệu suy diễn hoạt động trên những quy tắc, hình thức được gọi chung là những vị từ, ký hiệu vị từ. - Những khuôn mẫu thực tế là một ký pháp đại diện cho một số thực tế. Thật sự, một khuôn mẫu thực tế là một hàm logic hợp lệ ( ví dụ trả lại giá trị " Đúng " nếu những giá trị biến thiên có thể được tìm thấy trong cơ sở dữ liệu hoặc trả lại giá trị " Sai " nếu những giá trị biến thiên không được tìm thấy trong cơ sở dữ liệu 3. Quy tắc suy diễn MÔN HỌC : CƠ SỞ DỮ LIỆU NÂNG CAO - PGS.TS. Đỗ Phúc - 3 - ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH CHƯƠNG TRÌNH ĐẠO TẠO THẠC SĨ CNTT QUA MẠNG - Những quy tắc suy diễn được định nghĩa: Ký hiệu thuật ngữ (x1, x2,…xn)  hàm logic (x1,x2,…xn) - Những quy tắc suy diễn được định nghĩa như sau: “nếu có sự kết hợp đặc biệt giữa những biến tự do x1, x2 trong thuật ngữ đúng thì với những giá trị giống như vậy cũng sẽ cho hàm logic đúng.” Như vậy, những quy tắc suy diễn được xác định mới từ những suy luận thực tế. - Trong đó: o Biến là những định danh đặc biệt để giữ một mục tin dữ liệu trong thời gian dữ liệu xử lý. Chúng ta cũng có thể sử dụng những biến trên những miền khác, hay định nghĩa hai và nhiều biến hơn nào trên những mục tin dữ liệu của một miền. o Logic là ký pháp vị từ ( Biến 1, Biến 2,…) định nghĩa một hàm lôgic mà trả lại những giá trị Đúng hay Sai phụ thuộc vào một hay nhiều giá trị hiện tại của các biến. Những biến (Biến 1, Biến 2,…) được gọi là những biến tự do. o Những số hạng lôgic có thể được kết hợp vào trong một hàm lôgic mới, phức tạp hơn bằng phương pháp những phép toán logic như phép hội, phép phủ định, trong đó kết quả phụ thuộc vào tất cả các biến tự do được định nghĩa cho những số hạng lôgic. - Một cơ sở dữ liệu suy diễn gồm có những thực tế cơ bản.Những khung mẫu cho tất cả các thực tế cơ bản như vậy được mô tả trong mô hình cơ sở dữ liệu hiện thời. Đồng thời, mô hình cơ sở dữ liệu định nghĩa cái gọi là những quy tắc suy diễn được dùng để tự động suy luận những thực tế mới (gọi là những thực tế được suy luận). Suy luận những thực tế đã được trở nên sẵn có đối với những người sử dụng thông qua một giao diện hợp nhất. - Những người sử dụng giao tiếp với một cơ sở dữ liệu suy diễn thực hiện những mục đích kiểm tra thông tin, tìm kiếm thông tin và thực hiện các thông tin. o Kiểm tra thông tin là một vị từ mà có thể xác định bởi 02 kết quả Đúng hoặc Sai. MÔN HỌC : CƠ SỞ DỮ LIỆU NÂNG CAO - PGS.TS. Đỗ Phúc - 4 - ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH CHƯƠNG TRÌNH ĐẠO TẠO THẠC SĨ CNTT QUA MẠNG o Tìm kiếm thông tin là một hàm logic định nghĩa với ít nhất một biến tự do. - Một số quy tắc suy diễn: o Quy tắc suy diễn đệ quy: Những thực tế được suy luận có thể được định nghĩa một cách đệ quy, một thực tế được suy luận có thể được sử dụng như một kết luận và như một vị từ trong quy tắc suy diễn. o Quy tắc móc xích ngược: DBMS suy diễn suy luận một sự đáp lại tới một mục đích đã cho như thế nào? + Bước 1: Thay thế mục đích đã cho với những mục đích đơn giản tương xứng với những thực tế cơ bản hay những thủ tục. + Bước 2: tìm kiếm những giá trị cho những mục đích đơn giản và cho giá trị cuối cùng. o Những thuật ngữ tính toán: Để cung cấp những quy tắc suy diễn với một sức mạnh tính toán đầy đủ, mô hình dữ liệu logic cũng hỗ trợ một khái niệm gọi là những thuật ngữ tính toán. Những thuật ngữ tính toán là những biểu thức số học có những biến tự do, những hằng số và những tham số. Ký pháp sau đây được dùng để định nghĩa những thuật ngữ tính toán như vậy: ([Tham số_1] [Thao tác] [ Tham số_2]) Ở đây [ tham số_1] và [ tham số_2] là những biến tự do, những hằng số hay những thuật ngữ tính toán khác. Thuật ngữ được sử dụng như những biến tự do trong những quy tắc suy diễn. II. NGÔN NGỮ PROLOG 1. Giới thiệu MÔN HỌC : CƠ SỞ DỮ LIỆU NÂNG CAO - PGS.TS. Đỗ Phúc - 5 - ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH CHƯƠNG TRÌNH ĐẠO TẠO THẠC SĨ CNTT QUA MẠNG - Prolog là một ngôn ngữ lập trình. Tên gọi Prolog được xuất phát từ cụm từ tiếng Pháp Programmation en logique, nghĩa là "lập trình theo lô gích". Xuất hiện từ năm 1972 (do Alain Colmerauer và Robert Kowalski thiết kế), mục tiêu của Prolog là giúp người dùng mô tả lại bài toán trên ngôn ngữ của logic, dựa trên đó, máy tính sẽ tiến hành suy diễn tự động dựa vào những cơ chế suy diễn có sẵn (hợp nhất, quay lui và tìm kiếm theo chiều sâu) để tìm câu trả lời cho người dùng. - Prolog được sử dụng nhiều trong các ứng dụng của trí tuệ nhân tạo và ngôn ngữ học trong khoa học máy tính (đặc biệt là trong ngành xử lý ngôn ngữ tự nhiên vì đây là mục tiêu thiết kế ban đầu của nó). 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. - Ví dụ về một số mệnh đề Horn: 1. Nếu một người già mà (và) khôn ngoan thì người đó hạnh phúc. 2. Jim là người hạnh phúc. 3. Nếu X là cha mẹ của Y và Y là cha mẹ của Z thì X là ông của Z. 4. Tom là ông của Pat. 5. Tất cả mọi người đều phải chết (hoặc Nếu ai đó là người thì ai đó phải chết.) 6. Socrat là người. - Trong các mệnh đề Horn ở trên, các mệnh đề 1,3,5 được gọi là các luật (rule), các mệnh đề còn lại được gọi là các sự kiện (fact). Một chương trình logic có thể được xem như là một cơ sở dữ liệu gồm các mệnh đề Horn, hoặc dạng luật, hoặc dạng sự kiện, chẳng hạn như tất cả các sự kiện và luật từ 1 đến 6 ở trên. Người dung gọi chạy một chương trình logic bằng cách đặt câu hỏi truy vấn trên CSDL này, chẳng hạn: Socrat có chết không? (tương đương với khẳng định Socrat chết đúng hay sai?) - Một hệ thống logic sẽ thực hiện chương trình theo các “suy luận”tìm kiếm dựa trên vốn “hiểu biết” đã có là chương trình-CSDL để minh chứng câu hỏi là một khẳng định là đúng (yes) hoặc sai (No). Và như trên câu trả lời sẽ là : Yes (Có nghĩa là Socrat chết là đúng.) 2. Cú pháp Prolog - Một chương trình Prolog là một CSDL gồm các mệnh đề (Clause). Mỗi mệnh đề được xây dựng từ các vị từ (predicate). Một vị từ là một phát biểu nào đó về các đối tượng có giá trị chân đúng (true) hoặc sai (false). Một vị từ có thể có các đối là các nguyên logic (logic atom). MÔN HỌC : CƠ SỞ DỮ LIỆU NÂNG CAO - PGS.TS. Đỗ Phúc - 6 - ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH CHƯƠNG TRÌNH ĐẠO TẠO THẠC SĨ CNTT QUA MẠNG Mỗi nguyên tử biểu diễn một quan hệ giữa các hạng (term). Như vậy, hạng và quan hệ giữa các hạng tạo thành mệnh đề. Hạng được xem alf những đối tượng “dữ liệu” trong một trình Prolog. Hạng có thể là hạng sơ cấp gồm hằng, biến, cà các hạng thức phức hợp. Các hạng phức hợp là một hàm tử có chứa các đối, có dạng: Tên_hàm_tử(Đối 1,…, Đối n) - Ví dụ: f(5,a,b). student(Robert, 1975,info,2,address(6,’mal juin’,’Caen’)). [a,b,c] - Mệnh đề có thể là một sự kiện, một luật (hay quy tắc), hay một câu hỏi. - Prolog quy ước viết sau mỗi mệnh đề một dấu chấm để kết thúc như sau: o Sự kiện: <…> (tương ứng với luật <…> ) o Luật: <…>:-<…>. o Câu hỏi ?-<…>. (ở chế độ tương tác có dấu nhắc lệnh) 3. Lập trình đệ quy với Prolog - Kỹ thuật này cũng phù hợp với suy nghĩ của con người khi tiếp cận giải quyết vấn đề và khiến cho việc lập trình trên Prolog có một sự uyển chuyển và nhẹ nhàng trong việc viết mã. Tuy vậy, nó tạo ra một sự khó khăn với những người quen lập trình thủ tục. - Chúng ta sẽ xem xét lại từng bước trong việc gọi đệ quy để tìm ra lời giải qua ví dụ sau. Có đoạn chương trình như sau: giaithua(0,1):-!. giaithua(X,Y):- X1 is X -1, giaithua(X1,Y1), Y is X*Y1. - Ở đây có một sự thay đổi nhỏ: chúng ta đặt nhát cắt để chuyển sự kiện đầu thành luật. - Chúng ta muốn khẳng định: nếu số cần tìm giai thừa là 0 thì giai thừa của nó là 1, và kết quả này là duy nhất, không cần phải tiếp tục tìm các trường hợp khác. Ngoài ra, chúng ta cũng cần lưu ý thêm là vị từ “is” khác với phép hợp nhất “=” như trong ví dụ sau: Với biến Y có giá trị là 1 thì trong mệnh đề “X is Y + 1” thì X có giá trị là 2 còn trong mệnh đề “X = Y + 1” thì X có giá trị là 1 + 1. Với goal là giaithua(2,X), hệ thống sẽ so trùng với mệnh đề giaithua(0,1) là mệnh đề đầu tiên tìm thấy có liên quan đến khái niệm giaithua. - Hệ thống sẽ hợp nhất các thông số theo thứ tự, 2 hợp nhất với 0 và X hợp nhất với 1. MÔN HỌC : CƠ SỞ DỮ LIỆU NÂNG CAO - PGS.TS. Đỗ Phúc - 7 - ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH CHƯƠNG TRÌNH ĐẠO TẠO THẠC SĨ CNTT QUA MẠNG - Công việc hợp nhất X với 1 thành công, X có giá trị là 1, nhưng 2 hợp nhất với 0 thất bại. - Hệ thống sẽ tiếp tục tìm kiếm lời giải khác bằng cách so trùng với mệnh đề khác. Lần này hệ thống so trùng goal với mệnh đề giaithua(X,Y). Khi tạo mối liên quan giữa các thông số, hệ thống hợp nhất 2 với X của mệnh đề và Y với X của goal. Chúng ta sẽ ký hiệu XG là X thong số của goal. Do Y và XG đều chưa có giá trị, Prolog sẽ xem hai biến này là một. - Sau đó hệ thống bắt đầu thực hiện từng sub-clause: X1 is X -1 X1 là biến mới, và chưa có giá trị. X đã có giá trị là 2, nên X - 1 có giá trị là 1. Hợp nhất X1 với 1 ta sẽ có giá trị của X1 là 1. giaithua(X1,Y1) - Ở đây mệnh đề giai thừa được gọi đệ quy. Lưu ý lúc này X1 đã có giá trị là 1, Y1 là biến mới chưa có giá trị, vì vậy nhiệm vụ của hệ thống là tìm giá trị của Y1 sao cho sub-clause giaithua(X1,Y1) cho giá trị là đúng. Và cũng như các ví dụ trên, cách thức Prolog trả lời một sub-clause cũng tương tự như khi trả lời câu hỏi từ goal, tức là lại so trùng câu hỏi với các mệnh đề đã biết - So trùng với giaithua(0,1), Prolog tiến hành hợp nhất X1 với 0, Y1 với 1, do X1 đã có giá trị là 1, việc hợp nhất với 0 thất bại, Prolog phải so trùng với mệnh đề khác. - So trùng với giaithua(X,Y), Prolog tiến hành hợp nhất X1 với X đồng nhất Y1 với Y. - Chúng ta ký hiệu X và Y ở lần gọi đệ quy này là X2 và Y2, và sử dụng cách ký hiệu tương tự như vậy cho các biến còn lại ở lần gọi đệ quy này cũng như các lần gọi đệ quy tiếp theo. Như vậy X2 sẽ có giá trị là 1 và Y1 sẽ có giá trị mà Y2 sẽ có. - Tương tự ở lần gọi thứ nhất, các sub-clause của mệnh đề trên ở lần gọi thứ hai này sẽ lần lượt được gọi: X12 is X2 - 1, hợp nhất X12 với X2 -1, ta có X12 có giá trị là 0. giaithua(X12,Y12), X12 đã có giá trị là 0, Prolog sẽ tìm giá trị của Y12 bằng việc tiếp tục so trùng giaithua(X12,Y12) với các mệnh đề có liên quan: So trùng giaithua(X12,Y12) với giaithua(0,1). Do X12 đã có giá trị là 0, Prolog tiến hành hợp nhất X12 với 0 và Y12 với 1. Thực hiện tiếp subclause!, do câu hỏi giaithua(X12,Y12) chưa tìm được câu trả lời nào, nên sub-clause này trả lời là đúng. Việc thực hiện mệnh đề giaithua(0,1) thành công, và Y12 đã có giá trị là 1 nên câu hỏi giaithua(X12,Y12) đã có đáp số. Vị từ ! sẽ ngăn chặn việc tìm các đáp số khác, vì vậy trong trường hợp này, Prolog không tiếp tục so trùng tiếp với mệnh đề giaithua(X,Y). Y2 = X2 * Y12, lúc này Y2 chưa có giá trị, X2 và Y12 đã có giá trị là 1 và 1 nên Prolog sẽ hợp nhất Y2 và 1. Kết quả sẽ là Y2 có giá trị là 1. - Như vậy đến đây các sub-clause của mệnh đề giaithua(X2,Y2) đã thực thi thành công, và Y2 đã có giá trị là 1, và vì Y1 được đồng nhất với Y2, nên Y1 cũng sẽ có giá trị la 1. Y = X* Y1, lúc này Y chưa có giá trị, X và Y1 MÔN HỌC : CƠ SỞ DỮ LIỆU NÂNG CAO - PGS.TS. Đỗ Phúc - 8 - ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH CHƯƠNG TRÌNH ĐẠO TẠO THẠC SĨ CNTT QUA MẠNG đã lần lượt có giá trị là 2 và 1, nên Prolog hợp nhất Y và 2*1, kết quả Y sẽ có giá trị là 2. - Như vậy đến đây các sub-clause của mệnh đề giaithua(X,Y) đã thực thi thành công, và Yđã có giá trị là 2, và vì XG được đồng nhất với Y, nên XG cũng sẽ có giá trị là 2, và lời giải củabài toán đã được tìm thấy. PHẦN II : ÁP DỤNG I. GIẢI BÀI TOÁN 1. Mô tả bài toán Viết chương trình để tính: MÔN HỌC : CƠ SỞ DỮ LIỆU NÂNG CAO - PGS.TS. Đỗ Phúc - 9 - [...]... thức bộ môn này, gói gọn trong mục tiêu tìm hiểu đủ kiến thức để giải quyết bài toán tìm quan hệ ‘ancestor’ Qua đó em cũng hiểu thêm nhiều về cơ sở dữ liệu suy diễn và đặc biệt là ngôn ngữ Prolog MÔN HỌC : CƠ SỞ DỮ LIỆU NÂNG CAO - PGS.TS Đỗ Phúc - 13 - ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH CHƯƠNG TRÌNH ĐẠO TẠO THẠC SĨ CNTT QUA MẠNG Tài liệu tham khảo 1 Bài giảng môn học Cơ sở dữ liệu nâng cao Giảng... ancestor(X,Y) :- parent(X,Y) ancestor(X,Y) :- parent(X,Z), ancestor(Z,Y) - Trong shell cua prolog lần lượt gọi lệnh để tính, ta được kết quả như bên dưới MÔN HỌC : CƠ SỞ DỮ LIỆU NÂNG CAO - PGS.TS Đỗ Phúc - 11 - ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH CHƯƠNG TRÌNH ĐẠO TẠO THẠC SĨ CNTT QUA MẠNG II NHẬN XÉT MÔN HỌC : CƠ SỞ DỮ LIỆU NÂNG CAO - PGS.TS Đỗ Phúc - 12 - ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH CHƯƠNG TRÌNH... tham khảo 1 Bài giảng môn học Cơ sở dữ liệu nâng cao Giảng viên : PGS.TS Đỗ Phúc 2 Seminar CSDL: Mô hình dữ liệu suy diễn – Deductive Data Phan Thanh Quảng 3 Nguyên lý các hệ dữ liệu phân tán M Tamer Ozsu, Patrick Valduriez 4 http://vi.wikipedia.org/wiki /Prolog MÔN HỌC : CƠ SỞ DỮ LIỆU NÂNG CAO - PGS.TS Đỗ Phúc - 14 - ... ?ancestor(?, ken) ?ancestor(?,?) Biết rằng: ancestor(X,Y) :- parent(X,Y) ancestor(X,Y) :- parent(X,Z) & ancestor(Z,Y) Và: 2 Giải bài toán MÔN HỌC : CƠ SỞ DỮ LIỆU NÂNG CAO - PGS.TS Đỗ Phúc - 10 - ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH CHƯƠNG TRÌNH ĐẠO TẠO THẠC SĨ CNTT QUA MẠNG - Sử dụng SWI Prolog, tạo file ancestor.pl parent(chester,irvin) parent(chester,clarence) parent(chester,mildred) parent(irvin,ken) . thấy trong cơ sở dữ liệu hoặc trả lại giá trị " Sai " nếu những giá trị biến thiên không được tìm thấy trong cơ sở dữ liệu 3. Quy tắc suy diễn MÔN HỌC : CƠ SỞ DỮ LIỆU NÂNG CAO - PGS.TS ĐẠO TẠO THẠC SĨ CNTT QUA MẠNG ________ ________ BÀI THU HOẠCH MÔN HỌC Môn: CƠ SỞ DỮ LIỆU NÂNG CAO CƠ SỞ DỮ LIỆU SUY DIỄN VÀ PROLOG Học viên thực hiện: CH1101154 TRẦN THỊ TƯỜNG VI TP. HCM,. Một cơ sở dữ liệu suy diễn gồm có những thực tế cơ bản.Những khung mẫu cho tất cả các thực tế cơ bản như vậy được mô tả trong mô hình cơ sở dữ liệu hiện thời. Đồng thời, mô hình cơ sở dữ liệu

Ngày đăng: 10/04/2015, 14:35

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w