Lý thuyết thuật toán Vương Hạo và thuật toán Robinson trong trí tuệ nhân tạo. Cấu trúc tài liệu gồm có lý thuyết thuật toán, các bước thực hiện và chương trình minh họa. Source code demo được viết bằng ngôn ngữ c chạy tốt và ổn định, có kèm dữ liệu mẫu.
HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG cabd BÀI TẬP MÔN HỌC TRÍ TUỆ NHÂN TẠO Tên bài tập: MINH HỌA THUẬT TOÁN VƯƠNG HẠO VÀ THUẬT TOÁN ROBINSON Học viên thực hiện : Nguyễn Văn Hữu Hoàng Mã số học viên : N13CHIS024 Lớp : Cao học HTTT 2013 Giáo viên hướng dẫn: TS. Tân Hạnh TP HCM, Năm 2014 Báo cáo bài tập môn học Trí tuệ nhân tạo Học viên: Nguyễn Văn Hữu Hoàng Trang 1 MỤC LỤC 1. Thuật toán Vương Hạo 2 1.1 Ý tưởng của thuật toán 2 1.2 Các bước thực hiện 2 2. Thuật toán Robinson 4 2.1 Ý tưởng của thuật toán 4 2.2 Các bước thực hiện 4 3. Viết chương trình minh họa 5 3.1 Mục tiêu 5 3.2 Cấu trúc dữ liệu 5 3.3 Giải thuật 6 3.4 Chương trình minh họa 7 4. Kết luận 11 Báo cáo bài tập môn học Trí tuệ nhân tạo Học viên: Nguyễn Văn Hữu Hoàng Trang 2 1. Thuật toán Vương Hạo 1.1 Ý tưởng của thuật toán Áp dụng chiến lược “chia để trị” nhằm tách bài toán xuất phát thành các bài toán con dạng đơn giản hơn. Bài toán ban đầu sẽ được chứng minh khi và chỉ khi mọi bài toán sơ cấp được chứng minh. 1.2 Các bước thực hiện - Bước 1: Ta đưa vế trái và vế phải của bài toán cần chứng minh về dạng chuẩn. Biểu thức mệnh đề dạng chuẩn là biểu thức mệnh đề chỉ bao gồm 3 phép toán ˄ (tuyển), ˅ (hội) và ¬ (phủ định). - Bước 2: Thay phép toán ˄ ở GT i và phép toán ˅ ở KL j bằng dấu “,”. - Bước 3: Chuyển vế này sang vế kia các GT i , KL j có dạng phủ định. - Bước 4: Nếu dòng hiện hành có một trong hai dạng sau: Dạng 1: GT 1 , GT 2 ,…, a ∨ b, …, GT n-1 , GT n → KL 1 , KL 2 ,…., KL m-1 , KL m Thì thay bằng hai dòng: – GT 1 , GT 2 ,…, a,…, GT n-1 , GT n → KL 1 , KL 2 ,…., KL m-1 , Kl m – GT 1 , GT 2 ,…, b,…, GT n-1 , GT n → KL 1 , KL 2 ,…., KL m-1 , Kl m Dạng 2: GT 1 , GT 2 ,…, GT n-1 , GT n → KL 1 , KL 2 ,…, a ∧ b,…, KL m-1 , Kl m Thì thay bằng hai dòng: – GT 1 , GT 2 ,…., GT n-1 , GT n → KL 1 , KL 2 ,…, a,…, KL m-1 , Kl m – GT 1 , GT 2 ,…., GT n-1 , GT n → KL 1 , KL 2 ,…, b,…, KL m-1 , Kl m - Bước 5: Một dòng được chứng minh nếu tồn tại chung một mệnh đề ở cả hai vế hoặc tồn tại 2 mệnh đề phủ định lẫn nhau. - Bước 6: o Một vấn đề được giải quyết trọn vẹn nếu mọi dòng dẫn xuất biểu diễn ở dạng chuẩn được chứng minh. o Nếu một dòng không còn dấu liên kết ˄, ˅ và cả hai vế không có chưng Báo cáo bài tập môn học Trí tuệ nhân tạo Học viên: Nguyễn Văn Hữu Hoàng Trang 3 mệnh đề nào thì dòng đó không được chứng minh. Các công thức cơ bản: p -> q ó ¬p v q ¬(p ^ q) ó ¬p v ¬q ¬(p v q) ó ¬p ^ ¬q Ví dụ: Cho: (p->q)^(q->r)^(¬p->r)=> r Bước 1 (đưa về dạng chuẩn): ¬p˅q, ¬q˅r, p˅r => r Bước 2 (Thay phép toán ˄ ở GT và phép toán ˅ ở KL bằng dấu “,”): ¬p˅q, ¬q˅r, p˅r => r Bước 3 (chuyển vế các mệnh đề có dạng phủ định): ¬p˅q, ¬q˅r, p˅r => r Bước 4: Xét vế trái, ta chia ra làm 2 trường hợp: TH1: q, (¬q˅r), (p˅r) => r TH2: ¬p, (¬q˅r), (p˅r) => r Xét: ¬p, (¬q˅r), (p˅r) => r Bước 3 (chuyển vế các mệnh đề có dạng phủ định): (¬q˅r), (p˅r) => r, p Bước 4: Xét vế trái, ta chia ra làm 2 trường hợp: TH1: r, (p˅r) => r, p -> Đúng TH2: ¬q, (p˅r) => r, p Xét: ¬q, (p˅r) => r, p Bước 1 (đưa về dạng chuẩn): ¬q, (p˅r) => r, p Bước 3 (chuyển vế các mệnh đề có dạng phủ định): (p˅r) => r, p, q Bước 4: Xét vế trái, ta chia ra làm 2 trường hợp: TH1: r => r, p, q -> Đúng TH2: p => r, p, q -> Đúng Xét: q, (¬q˅r), (p˅r) → r Bước 4: Xét vế trái, ta chia ra làm 2 trường hợp: TH1: q, r, (p˅r) => r -> Đúng TH2: q, ¬q, (p˅r) => r Xét: q, ¬q, (p˅r) => r Bước 3 (chuyển vế các mệnh đề có dạng phủ định): q, (p˅r) => r, q Bước 4: Xét vế trái, ta chia ra làm 2 trường hợp: TH1: q, r => r, q -> Đúng TH2: q, p => r, q -> Đúng Báo cáo bài tập môn học Trí tuệ nhân tạo Học viên: Nguyễn Văn Hữu Hoàng Trang 4 Vậy giả thuyết => kết luận đúng, do tất cả các dẫn xuất đều được chứng minh. 2. Thuật toán Robinson 2.1 Ý tưởng của thuật toán Thuật toán này do Robinson đề xuất và hoạt động dựa trên phương pháp chứng minh phản chứng. Phương pháp chứng minh phản chứng: Bài toán: Chứng minh phép a->b là đúng với a là giả thiết, b là kết luận. Phản chứng: Giả sử b sai suy ra ¬b đúng. Bài toán được chứng minh nếu a đúng và ¬b đúng sinh ra một mâu thuẩn. 2.2 Các bước thực hiện - Bước 1: Ta đưa vế trái và vế phải của bài toán cần chứng minh về dạng chuẩn. Biểu thức mệnh đề dạng chuẩn là biểu thức mệnh đề chỉ bao gồm 3 phép toán ˄ (tuyển), ˅ (hội) và ¬ (phủ định). - Bước 2: Đưa về danh sách các mệnh đề dạng: GT 1 , GT 2 ,…GT n-1 , GT n , ¬ KL 1 , ¬ KL 2 ,…., ¬ KL m-1 , ¬ KL m - Bước 3: Nếu trong danh sách các mệnh đề ở bước 2 có hai mệnh đề đối ngẫu nhau thì vấn đề được giải quyết xong, còn không chuyển sang bước 4. - Bước 4: Xây dựng một mệnh đề mới bằng cách tuyển một cặp mệnh đề trong danh sách các mệnh đề ở bước 2, nếu mệnh đề mới có các biến mệnh đề đối ngẫu thì những biến đó được loại bỏ. - Bước 5: Bổ sung mệnh đề mới vào danh sách và loại bỏ hai mệnh đề cũ vừa tạo thành mệnh đề mới ra khỏi danh sách. - Bước 6: Nếu không xây dựng thêm mệnh đề mới nào và trong danh sách các mệnh đề không có hai mệnh đề nào đối ngẫu nhau thì vấn đề phát biểu ở dạng chuẩn bước 1 là Sai. Báo cáo bài tập môn học Trí tuệ nhân tạo Học viên: Nguyễn Văn Hữu Hoàng Trang 5 Ví dụ thuật toán Robinson: 3. Viết chương trình minh họa 3.1 Mục tiêu Mục tiêu của chương trình là: - Đọc được các đầu vào phức tạp bằng cách xử lý chuỗi. - Thực hiện thuật toán Vương Hạo và xuất ra kết quả ở mỗi bước. - Thực hiện thuật toán Robinson và xuất ra kết quả ở mỗi bước. Chương trình được viết bằng ngôn ngữ C#, nền tảng .Net 3.5, sử dụng IDE là Visual Studio 2010. 3.2 Cấu trúc dữ liệu Để mô tả mệnh đề ta dùng cấu trúc dữ liệu sau: public class MenhDe { public char KyHieu; public List<MenhDe> DSMenhDeCon; public List<PhepToan> DSToanTu; public bool PhuDinh = false; } Báo cáo bài tập môn học Trí tuệ nhân tạo Học viên: Nguyễn Văn Hữu Hoàng Trang 6 Trong đó: - KyHieu: Ký hiệu của mệnh đề, khác rỗng nếu là mệnh đề đơn p,q,r… - DSMenhDeCon: chứa các mệnh đề con theo thứ tự trong mệnh đề, bằng rỗng nếu là mệnh đề đơn. - DSToanTu: chứa các phép toán theo thứ tự trong mệnh đề. - PhuDinh: lữu trữ toán từ phủ định, bằng true nếu là phủ định mệnh đề. Để quản lý một mệnh đề có hai vế trái và phải theo bài toán đưa ra ta dùng cấu trúc: public class BieuThuc { public MenhDe MDVeTrai; public MenhDe MDVePhai; public int DaXet; //true nếu không tách ở bước 4 } 3.3 Giải thuật - Với cấu trúc dữ liệu như trên, từ một chuỗi ban đầu phức tạp ta sẽ tách thành 2 vế trái phải, ở mỗi vế ta đọc chuỗi và tách thành các mệnh đề con, sau đó tiếp tục dùng đệ quy để tách các mệnh đề con thành các mệnh đề con nhỏ hơn, cho đến khi nào mệnh đề là ký tự đơn p,q,r… thì dừng lại. Vương Hạo: - Sử dụng 1 biến kiểu stack để lưu các biểu thức cần xử lý, sau mỗi lần tách ở bước 4 thì ta lại đưa các trường hợp cần kiểm tra vào stack, sau đó lấy ra xử lý ở vòng lặp tiếp theo. - Áp dụng 6 bước của thuật toán Vương Hạo, xuất ra kết quả mỗi bước và kết quả cuối cùng. bool ketqua = true; while (stack.Count != 0) { BieuThuc bieuThuc = stack.Pop(); builderKetQua.Append("\r\n - Xét " + bieuThuc.ToString()); if (Buoc5(bieuThuc)) { builderKetQua.Append(" -> Bước 5: Đúng"); continue; } if (Buoc6(bieuThuc)) { builderKetQua.Append(" -> Bước 6: Sai"); ketqua = false; break; } Báo cáo bài tập môn học Trí tuệ nhân tạo Học viên: Nguyễn Văn Hữu Hoàng Trang 7 if (bieuThuc.DaXet) continue; Buoc1(ref bieuThuc); Buoc2(ref bieuThuc); Buoc3(ref bieuThuc); Buoc4(ref bieuThuc); } if (ketqua) builderKetQua.Append("\r\nMệnh đề được chứng minh là đúng."); else builderKetQua.Append("\r\nKhông đủ dữ liệu để chứng minh!"); Robinson: - Do việc kết hợp 2 mệnh đề có thể là ngẫu nhiên nên ở bước 4 sẽ kết hợp 2 mệnh đề đẩu tiên, cho đến khi số mệnh đề rỗng thì vấn đề được chứng minh, ngược lại thì mệnh đề suy ra không đúng. bool ketqua = false; menhDeChinh = new MenhDe(); Buoc1(ref bieuThuc); Buoc2(bieuThuc, ref menhDeChinh); while (menhDeChinh.DSMenhDeCon.Count > 1) { if (Buoc3(menhDeChinh)) { builderKetQua.Append(" -> Đúng"); ketqua = true; break; } else { builderKetQua.Append(" -> Chưa có"); if (!Buoc4(ref menhDeChinh)) break; } } if (ketqua) builderKetQua.Append("\r\n => Mệnh đề được chứng minh là đúng."); else builderKetQua.Append("\r\n=> Không đủ dữ liệu để chứng minh mệnh đề!"); 3.4 Chương trình minh họa Ø Yêu cầu đầu vào: - Hai vế trái phải cách nhau bởi dấu => - Mệnh đề: a,b,c,d,e,f (khác v) - Các ký hiệu phép toán: ^: và v: hoặc ->: kéo theo Báo cáo bài tập môn học Trí tuệ nhân tạo Học viên: Nguyễn Văn Hữu Hoàng Trang 8 - Ký hiệu phủ định: ¬ - Có thể sử dụng các ký tự như {} [] () trong 2 vế. - Ví dụ: [(a^b->cvd)^(c->e)^a]=>[b->e] Ø Các chức năng chính: - Chạy thuật toán Vương Hạo, Robinson. - Lấy dữ liệu từ file mẫu hoặc nhập vào. - Lưu kết quả vào file. Ø Giao diện chương trình: Chạy thuật toán Vương Hạo: Báo cáo bài tập môn học Trí tuệ nhân tạo Học viên: Nguyễn Văn Hữu Hoàng Trang 9 Chạy thuật toán Robinson: Có thể chọn các dữ liệu mẫu: [...]... xuất ra của chương trình bằng thuật toán Vương Hạo: Bài toán: [(a^b->cvd)^(c->e)^a]=>[b^c->e] - Xét ((a^b)->(cvd))^(c->e)^a=>(b^c)->e Bước1: Đưa về dạng chuẩn: ((¬av¬b)v(cvd))^(¬cve)^a=>(¬bv¬c)ve Bước 2: Thay ˄ ở GTi và ˅ ở KLj bằng dấu ",": ((¬av¬b)v(cvd)),(¬cve),a=>¬b,¬c,e Bước 3: Chuyển vế nếu GTi, KLj có dạng phủ định: ((¬av¬b)v(cvd)),(¬cve),a,b,c=>e Bước 4: Tách dòng nếu có v ở GT hoặc ^ ở KL: (¬av¬b),(¬cve),a,b,c=>e... GTi và ˅ ở KLj bằng dấu ",": (¬av¬b),(¬cve),a,b,c=>e Bước 3: Chuyển vế nếu GTi, KLj có dạng phủ định: (¬av¬b),(¬cve),a,b,c=>e Bước 4: Tách dòng nếu có v ở GT hoặc ^ ở KL: ¬a,(¬cve),a,b,c=>e ¬b,(¬cve),a,b,c=>e - Xét ¬b,(¬cve),a,b,c=>e -> Bước 5: Đúng - Xét ¬a,(¬cve),a,b,c=>e -> Bước 5: Đúng Các dẫn xuất đều đúng => Mệnh đề được chứng minh là đúng Kết quả xuất ra từ thuật toán Robinson: Bài toán: (p->q)^(q->r)^(¬p->r)=>r... (¬pvq),(¬qvr),(pvr),¬r Bước 3: Nếu có hai mệnh đề đối ngẫu nhau thì vấn đề được CM là đúng: (¬pvq),(¬qvr),(pvr),¬r -> Chưa có Bước 4: Xây dựng MĐ mới bằng cách tuyển một cặp MĐ trong DS các MĐ: (¬pvr),(pvr),¬r Bước 3: Nếu có hai mệnh đề đối ngẫu nhau thì vấn đề được CM là đúng: (¬pvr),(pvr),¬r -> Chưa có Bước 4: Xây dựng MĐ mới bằng cách tuyển một cặp MĐ trong DS các MĐ: r,¬r Bước 3: Nếu có hai mệnh đề đối ngẫu... dạng chuẩn - Chương trình đã xử lý tốt chuỗi đầu vào, đọc được hầu như tất cả các mệnh đề đơn giản đến phức tạp - Chương trình có giao diện trực quan đối với người sử dụng, dễ dàng nhập dữ liệu đầu vào - Chương trình đã minh họa tốt và chạy đúng các bước của thuật toán Vương Hạo, Robinson HẾT Học viên: Nguyễn Văn Hữu Hoàng Trang 11 ... 2: Thay ˄ ở GTi và ˅ ở KLj bằng dấu ",": (cvd),(¬cve),a,b,c=>e Bước 3: Chuyển vế nếu GTi, KLj có dạng phủ định: (cvd),(¬cve),a,b,c=>e Bước 4: Tách dòng nếu có v ở GT hoặc ^ ở KL: c,(¬cve),a,b,c=>e d,(¬cve),a,b,c=>e - Xét d,(¬cve),a,b,c=>e Bước1: Đưa về dạng chuẩn: d,(¬cve),a,b,c=>e Bước 2: Thay ˄ ở GTi và ˅ ở KLj bằng dấu ",": d,(¬cve),a,b,c=>e Bước 3: Chuyển vế nếu GTi, KLj có dạng phủ định: d,(¬cve),a,b,c=>e... d,(¬cve),a,b,c=>e Bước 4: Tách dòng nếu có v ở GT hoặc ^ ở KL: d,¬c,a,b,c=>e d,e,a,b,c=>e - Xét d,e,a,b,c=>e -> Bước 5: Đúng - Xét d,¬c,a,b,c=>e -> Bước 5: Đúng - Xét c,(¬cve),a,b,c=>e Bước1: Đưa về dạng chuẩn: c,(¬cve),a,b,c=>e Bước 2: Thay ˄ ở GTi và ˅ ở KLj bằng dấu ",": c,(¬cve),a,b,c=>e Bước 3: Chuyển vế nếu GTi, KLj có dạng phủ định: c,(¬cve),a,b,c=>e Bước 4: Tách dòng nếu có v ở GT hoặc ^ ở KL: c,¬c,a,b,c=>e