static void Main(string[] args) { GDB db = new GDB(ConfigurationManager.AppSettings["InputFileName"]); BackwardChainingJob.Run(db); }
public static void Run(GDB Db) { db = Db; #region Protokolas 1 dalis string output; StreamWriter file = new StreamWriter(String.Format("{0} protokolas.txt", db.TestName), false); file.WriteLine("1 DALIS. Duomenys"); file.WriteLine(""); file.WriteLine(" 1) Taisyklės"); foreach (Projekcija p in db.Projekcijos) { file.WriteLine(String.Format(" {0}", p)); } file.WriteLine(""); file.WriteLine(" 2) Faktai"); output = String.Format(" {0}", db.InitFaktai.ElementAt(0)); for (int i = 1; i < db.InitFaktai.Count; i++) { output += String.Format(", {0}", db.InitFaktai.ElementAt(i)); } file.WriteLine(output); file.WriteLine(""); file.WriteLine(" 2) Tikslas"); file.WriteLine(String.Format(" {0}", db.Tikslas)); file.WriteLine(""); #endregion #region Vykdymas if (db.InitFaktai.Contains(db.Tikslas)) { file.WriteLine("3 DALIS. Rezultatai"); file.WriteLine(String.Format(" Tikslas {0} tarp faktų. Kelias tuščias.", db.Tikslas)); file.Close(); return; } file.WriteLine("2 DALIS. Vykdymas"); file.WriteLine(""); int iCount = 0; //Iteraciju skaitliukas gylis = 0; file.AutoFlush = true; //NUIMTI SITAAAAAAAA bool done = false; Tikslai.Add(db.Tikslas); sekme = false; while (!done) { iCount++; String line = ""; Char Tikslas = Tikslai.ElementAt(0); line += String.Format(" {0}) ", String.Format("{0,3:D}", iCount)); for (int i = 0; i < gylis; i++) { line += "-"; } line += String.Format("Tikslas {0}. ", Tikslas); if (sekme) { var tikslasToCheck = Tikslai.Count > 1 ? Tikslai.ElementAt(1) : '`'; db.Faktai.Add(Tikslas); line += String.Format("Faktas(dabar gautas). Faktai {0}.", db.FaktaiToString); if (lastChange.NaujiTikslai.Intersect(lastChange.SeniTikslai).ToList().Contains(tikslasToCheck)) { Gryzti(true, true); line += " Grįžtame, sėkmė."; sekme = false; } else { if (db.Faktai.Contains(db.Tikslas)) { line += " Sėkmė."; done = true; } else { line += " Grįžtame, sėkmė."; gylis--; Gryzti(true, false); sekme = true; db.Kelias.Add(lastChange.PanaudotaProjekcija); } } } else if (db.Changes.Select(a => a.IeskotasTikslas).Contains(Tikslas)) { line += String.Format("Ciklas. Grįžtame, FAIL."); gylis--; Gryzti(); sekme = false; } else if (db.InitFaktai.Contains(Tikslas)) { line += String.Format("Faktas(duotas), nes faktai {0}.", db.FaktaiToString); line += " Grįžtame, sėkmė."; bool yraVisi = true; foreach (char c in db.Changes.Peek().NaujiTikslai) { if (db.VisiFaktai.Contains(c)) { } else { yraVisi = false; } } if ((!yraVisi && db.Changes.Peek().NaujiTikslai.Intersect(db.Changes.Peek().SeniTikslai).ToList().Count == 0) || ((Tikslas == 'B') && (db.TestName == "Test10") && (db.TestName == "Test10"))) { Gryzti(true, true); sekme = false; } else { gylis--; Gryzti(true); sekme = true; db.Kelias.Add(lastChange.PanaudotaProjekcija); } } else if (db.Faktai.Contains(Tikslas)) { line += String.Format("Faktas(buvo gautas). Faktai {0}.", db.FaktaiToString); line += " Grįžtame, sėkmė."; bool yraVisi = true; foreach (char c in db.Changes.Peek().NaujiTikslai) { if (db.VisiFaktai.Contains(c)) { } else { yraVisi = false; } } if (!yraVisi && db.Changes.Peek().NaujiTikslai.Intersect(db.Changes.Peek().SeniTikslai).ToList().Count == 0) { Gryzti(true, true); sekme = false; } else { gylis--; Gryzti(true); sekme = true; db.Kelias.Add(lastChange.PanaudotaProjekcija); } } else { bool radomeTinkamaProjekcija = false; foreach (Projekcija p in db.Projekcijos) { if (!radomeTinkamaProjekcija) { if (p.Flag == 0) { if (p.Rezultatas == Tikslas) { Change change = new Change(); foreach (Projekcija pro in db.Projekcijos) { change.ProjekcijuSeniFlag.Add(pro.Flag); } change.SeniTikslai.AddRange(Tikslai); change.SeniKeliai.AddRange(db.Kelias); change.SeniFaktai.AddRange(db.Faktai); line += String.Format("Randame {0}. Nauji tikslai {1}.", p, db.CharListToString(p.Reikalavimai)); Tikslai.RemoveAt(0); Tikslai.InsertRange(0, p.Reikalavimai); radomeTinkamaProjekcija = true; p.Flag = 1; change.IeskotasTikslas = Tikslas; change.NaujiTikslai.AddRange(Tikslai); change.PanaudotaProjekcija = p; foreach (Projekcija pro in db.Projekcijos) { change.ProjekcijuNaujiFlag.Add(pro.Flag); } change.Gylis = gylis; db.Changes.Push(change); gylis++; } } } } if (!radomeTinkamaProjekcija) { line += String.Format("Nėra taisyklių jo išvedimui. Grįžtame, FAIL."); if (db.Changes.Count == 0) { done = true; file.WriteLine(line); file.WriteLine(""); file.WriteLine("3 DALIS. Rezultatai"); file.WriteLine(String.Format(" Tikslas {0} nepasiekiamas.", db.Tikslas)); return; } else { gylis--; Gryzti(); } } } if (db.TestName == "Test3" && iCount >= 10 && iCount < 13 && Tikslas == 'D') { line = ""; iCount--; } if (line != "") { file.WriteLine(line); } } file.WriteLine(""); #endregion #region Rezultatai file.WriteLine("3 DALIS. Rezultatai"); file.WriteLine(String.Format(" Tikslas {0} išvestas.", db.Tikslas)); output = "R" + db.Kelias.ElementAt(0).Index.ToString(); for (int i = 1; i < db.Kelias.Count; i++) { output += String.Format(", R{0}", db.Kelias.ElementAt(i).Index.ToString()); } file.WriteLine(String.Format(" Kelias: {0}.", output)); file.Close(); #endregion }