/// <summary> /// Suy diễn để chứng minh điều gì đó /// </summary> /// <returns>Nếu tập tìm thấy thì trả về true, ngược lại trả về false</returns> public Boolean SearchCondition(MMenhDe menhDeCanCM) { int demSKDB = 0; int demTLuat = 0; List <MMenhDe> TSKM = new List <MMenhDe>(); while (demSKDB != TSKDB.Count || demTLuat != TLuat.Count) { demSKDB = TSKDB.Count; demTLuat = TLuat.Count; List <int> viTriLuatDaDung = new List <int>(); for (int i = 0; i < TLuat.Count; i++) { MLuat li = TLuat[i]; List <MChiTietLuat> veTrai = li.ChiTietLuat(); Boolean suDungDuoc = true; foreach (MChiTietLuat m in veTrai) { if (!TSKDB.Contains(m.Left())) { suDungDuoc = false; break; } } if (suDungDuoc) { TSKDB.Add(li.Right()); TSKM.Add(li.Right()); viTriLuatDaDung.Add(i); } } if (TSKDB.Contains(menhDeCanCM)) { return(true); } for (int i = viTriLuatDaDung.Count - 1; i >= 0; i--) { TLuat.RemoveAt(viTriLuatDaDung[i]); } } return(false); }
/// <summary> /// Suy diễn tìm tất cả các phương án /// </summary> /// <returns>nếu tập SKDB thay đổi thì trả về true, ngược lại trả về false</returns> public List <MMenhDe> Search() { int demSKDB = 0; int demTLuat = 0; List <MMenhDe> TSKM = new List <MMenhDe>(); while (demSKDB != TSKDB.Count || demTLuat != TLuat.Count) { demSKDB = TSKDB.Count; demTLuat = TLuat.Count; List <int> viTriLuatDaDung = new List <int>(); for (int i = 0; i < TLuat.Count; i++) { MLuat li = TLuat[i]; List <MChiTietLuat> veTrai = li.ChiTietLuat(); Boolean suDungDuoc = true; foreach (MChiTietLuat m in veTrai) { if (TSKDB.FindIndex(item => item.ID == m.Left().ID) == -1) { Console.WriteLine("TEST: " + m.Left().ID); suDungDuoc = false; break; } Console.WriteLine("TEST OUT: " + m.Left().ID); if (suDungDuoc) { TSKDB.Add(li.Right()); TSKM.Add(li.Right()); viTriLuatDaDung.Add(i); break; } } } for (int i = viTriLuatDaDung.Count - 1; i >= 0; i--) { TLuat.RemoveAt(viTriLuatDaDung[i]); } } return(TSKM); }