Do thời gian có hạn, việc cài đặt quá trình hợp giải trong logic ngôn ngữ áp
dụng cho bài toán suy diễn tổng quát em vẫn chưa thực hiện được. Ở đây chỉ là sự cài đặt áp dụng cho ví dụ trên, với những bài toán khác thì nó không hiệu quả. Tuy
nhiên, ý tưởng về việc xây dựng cấu trúc dữ liệu bài toán và một số vấn đề khác có
thể được dùng lại cho sự phát triển tiếp về sau.
Theo công thức hợp giải như trang 35, chúng ta có hợp giải của công thức Aa
V Bb1, với độ tin cậy α1 và công thức Cc V Bb2, với độ tin cậy α2 là công thức Aa V Cc, với độ tin cậy α3 = {α1, α2, ¬(b1b2)}. Trong đó A, B, C là các kí hiệu mệnh
đề logic; a, b1 , b2 , c là các giá trị ngữ nghĩa; α1, α2, α3 là độ tin cậy của các công
thức. Từ đó, chúng ta có ý tưởng xây dựng cấu trúc dữ liệu như sau:
- Mệnh đề logic là một cấu trúc dữ liệu gồm 3 trường: Prop là kí hiệu mệnh
đề, SeVal là giá trị ngữ nghĩa và i là chỉ số quy ước sự xuất hiện của mệnh
đề trong công thức. Các mệnh đề trên cùng một công thức sẽ có cùng chỉ số
i.
- Các công thức được lưu trữ trong cấu trúc bảng băm, mỗi công thức được lưu tại một chỉ số trong bảng băm tương ứng với chỉ số i của các mệnh đề
trong công thức đó. Ví dụ: công thức F0 = A V B lưu trữ tại vị trí 0 trong
bảng băm tương ứng với chỉ số i = 0 của các mệnh đề A và B.
- Để tiện việc tính toán, các giá trị ngữ nghĩa như MolVeryTrue,
MolTrue,…sẽ được quy thành các giá trị trong khoảng (0, 1) một cách cảm
tính, ví dụ: MolVeryFalse tương ứng 0.1, MolTrue tương ứng 0.6,….theo thủ
Các công thúc trong ví dụ trên:
1) (std_Robert, Hard)M oLF alse (uni_Robert, hi−ra)F alse (emp_Robert, Good)P ossT rue 2) (uni_Robert, Hi − ra)M oLV eryT rue
3) (std_Robert, Hard)V eryT rue 4) (emp_Robert, good)F alse
Đặt A: (std_Robert, Hard), B: (uni_Robert, hi−ra), C: (emp_Robert, Good)
Mã nguồn khởi tạo như sau:
// khởi tạo công thức 1)
md.Prop = "A";
md.SeVal = "MolFalse"; md.i = 0;
listLiteral.Add(md);//đưa mệnh đề vào công thức
md = newLiteral();// khởi tạo mệnh đề mới
md.Prop = "B"; md.SeVal = "False"; md.i = 0; listLiteral.Add(md); md = newLiteral(); md.Prop = "C"; md.SeVal = "PossTrue"; md.i = 0; listLiteral.Add(md);
// Khởi tạo công thức 2)
md.Prop = "B";
md.SeVal = "MolVTrue"; md.i = 1;
listLiteral.Add(md);
// Khởi tạo công thức 3)
md = new Literal(); md.Prop = "A"; md.SeVal = "VTrue"; md.i = 2;
listLiteral.Add(md);
// Khởi tạo công thức 4)
md = new Literal(); md.Prop = "C"; md.SeVal = "False"; md.i = 3;
listLiteral.Add(md);
Hình 3.3. Kết quả khởi tạo công thức
Kết quả hợp giải như sau :
Hình 3.4. Kết quả hợp giải Mã nguồn chương trình:
using System; using System.Collections.Generic; using System.Text; using System.Collections; namespace ConsoleApplication2 { class Literal {
publicstring Prop;// ki hieu menh de
publicstring SeVal;// gia tri ngu nghia
publicint i;// chi so quy uoc su xuat hien cua Literal trong cung mot cong thuc
//cac literals co cung chi so i se la mot cong thuc tuyen cac literals do.
publicfloat GiaTri(string s) {
float f=0.0F;
if (s == "MVFalse") f = 0.1F;//MoreVeryFalse
elseif (s == "VFalse") f = 0.2F;//VeryFalse
elseif (s == "MolVFalse") f = 0.3F;//More or lessVeryFalse
elseif (s == "False") f = 0.4F;//False
elseif (s == "MolFalse") f = 0.5F;//More or less False
elseif (s == "MolTrue") f = 0.6F;//More or less True
elseif (s == "PossTrue") f = 0.61F;//poss true
elseif (s == "True") f = 0.7F;//True
elseif (s == "MolVTrue") f = 0.8F;//More or less VeryTrue
elseif (s == "VTrue") f = 0.9F;//VeryTrue
elseif (s == "MVTrue") f = 0.95F;//MoreVeryTrue
return f; }
publicstring GiaTu(float f) {
string s = "";
if (f == 0.1F) s = "MVFalse";//MoreVeryFalse
elseif (f == 0.2F) s = "VFalse";//VeryFalse
elseif (f == 0.3F) s = "MolVFalse";//More or lessVeryFalse
elseif (f == 0.4F) s = "False";//False
elseif (f == 0.5F) s = "MolFalse";//More or less False hoac PossFalse
elseif (f == 0.51F) s = "PossFalse";
elseif (f == 0.6F) s = "MolTrue";//More or less True hoac PossTrue
elseif (f == 0.61F)s = "PossTrue";
elseif (f == 0.7F) s = "True";//True
elseif (f == 0.8F) s = "MolVTrue";//More or less VeryTrue
elseif (f == 0.9F) s = "VTrue";//VeryTrue
elseif (f == 0.95F) s = "MVTrue";//MoreVeryTrue
return s; }
publicstring Min(float[]T) //phep lay gia tri nho nhat
{
float c = 1.0F;
for (int i = 0; i <= T.Length - 1; i++)
if (System.Math.Min(T[i], c) == T[i]) c = T[i];
return (GiaTu(c)); }
publicstring DoiXung(string s) //phep toan phu dinh
{
string[] T ={ "MVFalse", "VFalse", "MolVFalse","False","MolFalse","PossFalse"}; string[] F ={"MVTrue","VTrue","MolVTrue","True","MolTrue","PossTrue"};
for (int i = 0; i < 6; i++) if (s == T[i]) str = F[i];
elseif (s == F[i]) str = T[i];
return str; }
}
class Resolution // hợp giải
{
publicList<Literal> listLiteral = newList<Literal>();
publicHashtable listFormula = newHashtable();// danh sach chua cac cong thuc chuan bi cho qua
// trinh hop giai
public Literal md = new Literal(); publicvoid Khoitao()
{ md.Prop = "A"; md.SeVal = "MolFalse"; md.i = 0; listLiteral.Add(md); md = new Literal(); md.Prop = "B"; md.SeVal = "False"; md.i = 0;
listLiteral.Add(md); md = new Literal(); md.Prop = "C"; md.SeVal = "PossTrue"; md.i = 0; listLiteral.Add(md); md = new Literal(); md.Prop = "B"; md.SeVal = "MolVTrue"; md.i = 1; listLiteral.Add(md); md = new Literal(); md.Prop = "A"; md.SeVal = "VTrue"; md.i = 2; listLiteral.Add(md); md = new Literal(); md.Prop = "C"; md.SeVal = "False"; md.i = 3; listLiteral.Add(md); md = new Literal();
// Khoi tao danh sach cac cong thuc
for (int k = 0; k < 4; k++) {
for (int h = 0; h < listLiteral.Count; h++) if (listLiteral[h].i == k)
{
list.Add(listLiteral[h]); }
listFormula.Add(k, list); list = newList<Literal>(); }
}//end khoi tao
//khoi tao do tin cay cho cac cong thuc.Mac nhien la 1.
float[] T = { 1.0F, 1.0F, 1.0F, 1.0F };
float[] Conf1 = newfloat[3];
float[] Conf2 = newfloat[2];
int count = 0;
//Ham hop giai
publicvoid Hopgiai() {
for (int k = 0; k < listFormula.Count; k++) {
for (int h = k + 1; h < listFormula.Count; h++) {
List<Literal> getStr2 = (List<Literal>)listFormula[h];
listLiteral = newList<Literal>(); for (int l = 0; l < getStr1.Count; l++)
for (int m = 0; m < getStr2.Count; m++) { if (getStr1[l].Prop == getStr2[m].Prop) { ListLiteral.Add(getStr1[l]); listLiteral.Add(getStr2[m]); count++; } } Conf1[0] = T[k]; Conf1[1] = T[h];
Conf2 = newfloat[listLiteral.Count];
for (int p = 0; p < listLiteral.Count; p++) {
}
Conf1[2] = md.GiaTri(md.DoiXung(md.Min(Conf2)));
T[k] = Conf1[2]; if (Conf1[2] != 0)
Console.WriteLine("Do tin cay cua hop giai lan thu " + count.ToString() + " " + "la: " + md.Min(Conf1)); }
}
}//end hop giai
publicvoid HienThi() {
for (int k = 0; k < listFormula.Count; k++) {
List<Literal> getStr = (List<Literal>)listFormula[k];
Console.WriteLine("Cong thuc thu" + " " + k.ToString());
for (int i = 0; i < getStr.Count; i++) {
Console.Write(getStr[i].Prop + " " + getStr[i].SeVal + " "); }
Console.WriteLine(); }
}//end hien thi
class Program {
staticvoid Main(string[] args)
{ Resolution Rs = new Resolution(); Rs.Khoitao(); Rs.HienThi(); Console.WriteLine(); Rs.Hopgiai();
for (int k = 0; k < Rs.listFormula.Count; k++) {
List<Literal> getStr = (List<Literal>)Rs.listFormula[k]; if ((getStr.Count == 1) && getStr[0].Prop == "C") {
Console.WriteLine("Qua trinh hop giai dung"); } } Console.ReadLine(); } } }
KẾT LUẬN
Kết quảđạt được
Qua luận văn này, tôi đã thu được một số kết quả như sau:
+ Lý thuyết:
- Nắm bắt được nền tảng lý thuyết của logic mờ, logic ngôn ngữ.
- Nắm được nền tảng lý thuyết của cấu trúc đại số gia tử.
- Nắm được các phương pháp hợp giải trên logic mờ và logic ngôn ngữ.
+ Cài đặt:
- Cài đặt thử nghiệm phương thức hợp giải mờ cho mệnh đề logic.
- Cài đặt thử nghiệm phương thức hợp giải trên logic ngôn ngữ.
Đánh giá kết quả
Qua thời gian nghiên cứu luận văn, tôi đã thu được nhiều kiến thức bổ ích về
logic mờ, logic ngôn ngữ và các phương pháp suy diễn trên chúng. Tuy nhiên, do thời gian và khả năng bản thân có hạn, nên chưa thể có những nghiên cứu thật sâu
về các phương thức suy diễn trong logic ngôn ngữ cũng như chưa có những đóng góp mới về mặt lý thuyết. Về phần cài đặt, chỉ là những cài đặt thử nghiệm các phương thức hợp giải trên logic mờ và logic ngôn ngữ và còn nhiều hạn chế, chỉ là một số trường hợp đặc thù chứ chưa ở mức khái quát cho nhiều trường hợp, cần được phát triển thêm.
Hướng phát triển
Như đã nêu trên, việc cài đặt hợp giải trên logic mờ và trên logic ngôn ngữ
chỉ là những thử nghiệm, nhưng tôi tin tưởng rằng, với những kiến thức và kinh nghiệm thu được qua quá trình làm luận văn sẽ là tiền đề để tôi có thể cài đặt chúng
một cách hoàn chỉnh hơn trong tương lai. Đồng thời, tiếp tục nghiên cứu mở rộng
miền giá trị của ngôn ngữ sang các lớp đại số gia tử tổng quát hơn và xây dựng các
TÀI LIỆU THAM KHẢO
1. N. C. Ho and H. V. Nam, "A theory of refinement structure of hedge algebras and its application to linguistic-valued fuzzy logic", in: D. Niwinski and M. Zawadowski (Eds.), Logic, Algebra, and Computer Science (Banach Center Publications, PWN Polish Scientific Publishers, Warszawa, 1998).
2. N. C. Ho, H. V. Nam, and N. H. Chau, "Hedge algebras and their applications to fuzzy logic and fuzzy reasoning", Proc. of VJFUZZY'98 (Halong Bay, Vietnam, 1998), pp. 315-323.
3. N. C. Ho and W. Wechler, "Hedge algebras: an algebraic approach to structures of sets of linguistic domains of linguistic truth variables", Fuzzy Sets and Systems
35 (1990), pp. 281-293.
4. Chapter 3 • FUZZY LOGIC FUNDAMENTALS page 61 -100.
5. Richard C.T. Lee, “Fuzzy logic and resolution principle”, National institude of Health.
6. Zuliang Shen, Liya Ding Masso Mukaidono, “Fuzzy resolution principle”. 7. Nguyễn Cát Hồ, Trần Đình Khang, Huỳnh Văn Nam, Nguyễn Hải Châu, “Hedge aldebras, linguistic-valued logic and their application to fuzzy reasoning”.
8. Marc BEZEM, “Completeness of resolution revisited” , Theorical computer science 74(1990)
9. Trần Đức Khánh, Bài giảng Logic.
10. Nguyễn Cát Hồ, Huỳnh Văn Nam, “An algebraic approach to linguistic hedges