Thuật toán này sử dụng các quy tắc suy diễn để biến đổi một biểu thức logic phụ định sang dạng mệnh đề, từ đó chứng minh được tính đúng đắn của biểu thức đó.. a IV.Ứng Dựng Thuật Toán Th
Trang 1BỘ CÔNG THƯƠNG TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THỰC PHẨM TP HỒ CHÍ MINH
KHOA KHOA HỌC ỨNG DỤNG
-O0 - O
TIỂU LUẬN HỌC PHẦN:
TRÍ TUỆ NHÂN TẠO
TÊN ĐỀ TÀI: THUẬT TOÁN VƯƠNG HẠO
NHÓM: 12
Trang 2BỘ CÔNG THƯƠNG TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THỰC PHẨM TP HỒ CHÍ MINH
KHOA KHOA HỌC ỨNG DỤNG
-O0 - O
TÊN ĐỀ TÀI: THUẬT TOÁN VƯƠNG HẠO
NHÓM : 12
Giáo viên hướng dẫn: Trần Đình Toàn
1.La Mẫn Đạt – 2001215698
2.Trần Minh Tâm – 2001210674
TP HỒ CHÍ MINH, NĂM 2023
Trang 3MỤC LỤC
I KHÁI NIỆM 4
II Ý TƯỞNG VÀ NỘI DUNG THUẬT TOÁN 4 II.1 V Í DỤ 1: K IỂM TRA TÍNH HẰNG ĐÚNG CỦA BIỂU THỨC LÔGIC MỆNH ĐỀ SAU : 5
II.2 V ỚI VÍ DỤ 2 TRÊN ĐÂY TA CÓ SƠ ĐỒ BIẾN ĐỔI NHƯ HÌNH SAU ĐÂY , .5 II.3 V Í DỤ 3 ( BIỂU THỨC HẰNG ĐÚNG ): C Ó THỂ CHỨNG MINH RẰNG : 7 II.4 V Í DỤ 4 ( BIỂU THỨC KHÔNG HẰNG ĐÚNG ): K IỂM TRA TÍNH HẰNG ĐÚNG CỦA BIỂU THỨC : 7 III CODE MINH HỌA 8
IV ỨNG DỰNG THUẬT TOÁN 10
Trang 4Thuật toán Vương Hạo
I. Khái niệm
Thuật toán Vương Hạo là một thuật toán suy diễn được biểu diễn bới Vương Hạo vào năm 1981 Thuật toán này sử dụng các quy tắc suy diễn để biến đổi một biểu thức logic phụ định sang dạng mệnh đề, từ
đó chứng minh được tính đúng đắn của biểu thức đó
II.Ý tưởng và nội dung 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 dạng “Và” đơn giản hơn Bài toán ban đầu
sẽ được giải quyết khi và chỉ khi mọi bài toán con sơ cấp giải được
Trước tiên, ta đưa vế trái VT (hay vế phải VP) về dạng chuẩn hội (hay chuẩn tuyển tương ứng) bằng cách:
Thay các phép toán tương đương ↔ (nếu có) bởi các phép toán kéo theo → Thay các phép toán → bởi các phép toán ¬, ∨
Dùng các luật De Morgan để bỏ các dấu ¬ của nguyên một nhóm mệnh đề
Dùng các luật phân phối (nếu chưa gặp dạng chuẩn cần tìm) của phép tuyển đối với phép hội (hay của phép hội đối với phép tuyển tương ứng)
Trong thuật toán Wong, sau khi đưa VT về dạng chuẩn hội
và VP về dạng chuẩn tuyển, ta sẽ sử dụng các qui tắc sau (hãy chứng minh tại sao ta có quyền sử dụng chúng ? Bài tập) - Thủ tục Chuyển(VT,VP): thay các dấu các nhóm chính bên VT và các∧ dấu các nhóm chính bên VP bởi dấu phẩy; chuyển vế các mệnh∨
đề chính ở dạng phủ định ¬p từ vế này sang vế kia và bỏ đi dấu ¬ (chỉ còn p) Nói cách khác, ta có thể xem dấu phẩy (,) bên VT là phép hội và dấu phẩy (,) bên VP là phép tuyển
II.1 Ví dụ 1: Kiểm tra tính hằng đúng của biểu thức lôgic mệnh đề sau:
VT ≡ (¬a) (¬b c) (a b) (¬b) c ≡ VP∧ ∨ ⇒ ∧ ∨ ∨
Các nhóm chính trong: vế trái VT là (¬a) và (¬b c), vế phải∨
VP là (a b), (¬b) và (c).∧
Trang 5VT ≡ (¬a) (¬b c) (a b) (¬b) c ≡ VP∧ ∨ ⇒ ∧ ∨ ∨
Chuyển ¬a, ¬b c a b, ¬b, c ∨ ⇒ ∧
Chuyển
VT ≡ b, ¬b c a b, a, c ≡ VP∨ ⇒ ∧
Hàm lôgic Tách(VT,VP): tách mỗi nhóm tuyển chính trong∨
VT (hay mỗi nhóm hội chính trong VP) thành nhiều bài toán con∧ dạng VÀ Mỗi bài toán con gồm một mệnh đề trong nhóm chính và giữ nguyên các nhóm chính khác Nếu tách được thì thủ tục Tách(VT,VP) nhận giá trị true; nếu ngược lại, nó nhận trị false II.2 Với ví dụ 2:
Trên đây, ta có sơ đồ biến đổi như hình sau đây
Với mỗi bài toán con, nếu mỗi vế của nó có một mệnh đề đơn đứng độc lập giống nhau thì nó được chứng minh (hằng đúng) Bài toán xuất phát chỉ được chứng minh (hằng đúng) khi mọi bài toán con của nó được chứng minh Nói cách khác, bài toán xuất phát không hằng đúng nếu có tồn tại một bài toán con của nó không hằng đúng (không thể áp dụng qui tắc tách cũng như chuyển được nữa và hai vế không có chung một mệnh đề đơn đứng độc lập nào cả)
Trang 6Vậy bài toán nêu ra trong ví dụ 3 là hằng đúng.
* Thuật toán Vương Hạo
while (CheckTT() == 0)
{
for int ( i = nodes.Count - 1; i >= 0; i )
{
BieuThuc bieuThuc = nodes[i];
nodes.RemoveAt(i);
BieuThuc[] newBieuThucs = bieuThuc.ChuyenTrangThai(); BieuThuc tt1 = newBieuThucs[0];
BieuThuc tt2 = newBieuThucs[1];
(tt1 != if null)
{
nodes.Add(tt1);
nodes.Add(tt2);
Console.WriteLine("Tách " + bieuThuc + " thành " + tt1 + " và " + tt2);
}
(CheckTT() == -1)if
{
break;
Trang 7}
}
}
Console.Write("KẾT QUẢ:");
(CheckTT() == -1)if
Console.WriteLine(" Không được chứng minh");
(CheckTT() == 1)if
Console.WriteLine(" Được chứng minh");
II.3 Ví dụ 3 (biểu thức hằng đúng): Có thể chứng minh rằng:
[(a b → c) (b c → d) a b] d ? ∧ ∧ ∧ ∧ ∧ ⇒
Đưa VT về dạng chuẩn hội và VP về dạng chuẩn tuyển:
VT ≡ {¬a ¬b c, ¬b ¬c d, a, b}: dạng chuẩn hội ∨ ∨ ∨ ∨
VP ≡ {d}: dạng chuẩn tuyển
Ta có thể biểu diễn quá trình giải của thuật toán Wong thông qua đồ thị suy diễn hay đồ thị lời giải như sau:
Đồ thị lời giải trong thuật toán Wong
II.4 Ví dụ 4 (biểu thức không hằng đúng): Kiểm tra tính hằng đúng của biểu thức:
[(a b → c) a] c ? (1)∧ ∧ ⇒
Trang 8Đưa VT về dạng chuẩn hội và VP về dạng chuẩn tuyển:
VT ≡ {¬a ¬b c, a}: dạng chuẩn hội ∨ ∨
VP ≡ {c}: dạng chuẩn tuyển
Đồ thì lời giải
BT con (2) sai vì không thể tách, chuyển và không có mệnh đề chung
Do đó bài toán (1) xuất phát cũng sai
III. Code Minh Họa
public classVuongHao
{
private List<BieuThuc> nodes;
publicVuongHao(BieuThuc bieuThuc)
{
nodes = new List<BieuThuc> { bieuThuc };
}
public int CheckTT()
{
//Kiểm tra xem có bất kỳ biểu thức nào không được chứng minh (-1) hay không:
(nodes.Any(bieuThuc => bieuThuc.CheckCM() == -1))if
{
return -1;
}
//Kiểm tra xem có bất kỳ biểu thức nào còn chưa chứng minh (0) hay không:
Trang 9(nodes.Any(bieuThuc => bieuThuc.CheckCM() == 0))if
{
return 0;
}
//Nếu tất cả các biểu thức đều đã được chứng minh (1) hoặc danh sách rỗng:
return 1;
}
public void Run()
{
Console.WriteLine("Biểu thức của chúng ta là: " + nodes[0]); while (CheckTT() == 0)
{
for int ( i = nodes.Count - 1; i >= 0; i )
{
BieuThuc bieuThuc = nodes[i];
nodes.RemoveAt(i);
BieuThuc[] newBieuThucs = bieuThuc.ChuyenTrangThai(); BieuThuc tt1 = newBieuThucs[0];
BieuThuc tt2 = newBieuThucs[1];
(tt1 != if null)
{
nodes.Add(tt1);
nodes.Add(tt2);
Console.WriteLine("Tách " + bieuThuc + " thành " + tt1 + " và " + tt2);
}
(CheckTT() == -1)if
{
break;
Trang 10}
}
}
Console.Write("KẾT QUẢ:");
(CheckTT() == -1)if
Console.WriteLine(" Không được chứng minh");
(CheckTT() == 1)if
Console.WriteLine(" Được chứng minh");
foreach (var bieuThuc nodes)in
{
Console.WriteLine(bieuThuc);
}
}
}
Cài đặt thuật toán Vương Hạo bằng ngôn ngữ C#
a)
IV.Ứng Dựng Thuật Toán
Thuật toán Vương Hạo có thể được ứng dụng trong nhiều lĩnh vực, bao gồm:
Trí tuệ nhân tạo: Thuật toán Vương Hạo được sử dụng trong các hệ thống trí tuệ nhân tạo để chứng minh tính đúng đắn của các quy tắc logic, từ đó giúp các hệ thống này có thể đưa ra quyết định chính xác hơn
Kỹ thuật phần mềm: Thuật toán Vương Hạo được sử dụng để kiểm tra tính đúng đắn của các chương trình phần mềm
Toán học: Thuật toán Vương Hạo được sử dụng để chứng minh các định lý toán học
Dưới đây là một số ví dụ cụ thể về ứng dụng của thuật toán Vương Hạo:
Trang 11Trong trí tuệ nhân tạo, thuật toán Vương Hạo được sử dụng trong các hệ thống suy diễn để chứng minh tính đúng đắn của các quy tắc logic Ví dụ, trong hệ thống chẩn đoán bệnh, thuật toán Vương Hạo có thể được sử dụng để chứng minh rằng một bệnh nhân mắc một bệnh nhất định dựa trên các triệu chứng của bệnh nhân Trong kỹ thuật phần mềm, thuật toán Vương Hạo được sử dụng để kiểm tra tính đúng đắn của các chương trình phần mềm Ví dụ, thuật toán Vương Hạo có thể được sử dụng để kiểm tra xem một chương trình phần mềm có thể hoạt động chính xác trong tất cả các trường hợp hay không
Trong toán học, thuật toán Vương Hạo được sử dụng để chứng minh các định lý toán học Ví dụ, thuật toán Vương Hạo có thể được sử dụng để chứng minh định lý Pythagoras
Thuật toán Vương Hạo là một thuật toán mạnh mẽ và hiệu quả, có thể được ứng dụng trong nhiều lĩnh vực khác nhau
Trang 12Tài Liệu Tham Khảo
https://github.com/patrickphat/Wang-Algorithm-Giai-Thuat-Vuong-Hao
https://viblo.asia/p/mo-phong-thuat-toan-vuong-hao-trong-prolog-RQqKLq2NZ7z