public static Zagrada SpojiZagrade(Zagrada a, Zagrada b, int varijabla, Dictionary<int, List<Zagrada>> veze_var_zagrada,List<Zagrada> Formula,List<int> varijable) { Zagrada nova = new Zagrada(); for (int i = 0; i < a.varijable.Count; i++) { if (a.varijable[i] != varijabla && a.varijable[i] != (-varijabla) && (!nova.varijable.Contains(a.varijable[i]))) nova.varijable.Add(a.varijable[i]); } for (int i = 0; i < b.varijable.Count; i++) { if (b.varijable[i] != varijabla && b.varijable[i] != (-varijabla) && (!nova.varijable.Contains(b.varijable[i]))) nova.varijable.Add(b.varijable[i]); } if (!Tautologija(nova)) { for (int i = 0; i < nova.varijable.Count; i++) { if (!veze_var_zagrada.ContainsKey(nova.varijable[i])) veze_var_zagrada.Add(nova.varijable[i], new List<Zagrada>()); veze_var_zagrada[nova.varijable[i]].Add(nova); } } nova.tezina = 1; popraviVeze(a, b, veze_var_zagrada, varijable); Formula.Remove(a); Formula.Remove(b); return nova; }
public static bool Tautologija(Zagrada a) { for (int i = 0; i < a.varijable.Count; i++) { if (a.varijable.Contains(-a.varijable[i])) return true; } return false; }
public static void popraviVeze(Zagrada a, Zagrada b, Dictionary<int, List<Zagrada>> veze_var_zagrada,List<int> varijable) { for (int i = 0; i < varijable.Count; i++) { if (veze_var_zagrada.ContainsKey(varijable[i]) && veze_var_zagrada[varijable[i]].Contains(a)) veze_var_zagrada[varijable[i]].Remove(a); if (veze_var_zagrada.ContainsKey(-varijable[i]) && veze_var_zagrada[-varijable[i]].Contains(a)) veze_var_zagrada[-varijable[i]].Remove(a); if (veze_var_zagrada.ContainsKey(varijable[i]) && veze_var_zagrada[varijable[i]].Contains(b)) veze_var_zagrada[varijable[i]].Remove(b); if (veze_var_zagrada.ContainsKey(-varijable[i]) && veze_var_zagrada[-varijable[i]].Contains(b)) veze_var_zagrada[-varijable[i]].Remove(b); } }
//rekurzivni poziv za svaku zagradu public static List<Zagrada> RezolucijaFormule1(List<Zagrada> Formula, Dictionary<int, List<Zagrada>> veze_var_zagrada, List<int> varijable, int index, int brojSpajanjaZagrada) { if (index == Formula.Count || Formula.Count == 1 || brojSpajanjaZagrada == 0) return Formula; for (int i = 0; i < Formula[index].varijable.Count; i++) { if (veze_var_zagrada.ContainsKey(-Formula[index].varijable[i]) && veze_var_zagrada[-Formula[index].varijable[i]].Count != 0) { Zagrada nova = SpojiZagrade(Formula[index], veze_var_zagrada[-Formula[index].varijable[i]].First(), Formula[index].varijable[i], veze_var_zagrada, Formula,varijable); brojSpajanjaZagrada--; if (!Tautologija(nova)) Formula.Add(nova); index--; break; } } RezolucijaFormule1(Formula, veze_var_zagrada, varijable, index + 1, brojSpajanjaZagrada); return Formula; }
public static void PripremiFormulu() { try { /* Read cnf from txt file*/ using (StreamReader sr = new StreamReader("../../formule/expr3.cnf")) { String line; int[] elements = new int[3]; int k, a = 0, b = 0, c = 0; while ((line = sr.ReadLine()) != null) { k = 0; string pom_str = string.Empty; for (int i = 0; i < line.Length; i++) { if (Char.IsDigit(line[i]) || line[i] == '-') pom_str += line[i]; if (pom_str.Length > 0 && (i + 1 >= line.Length || line[i + 1] == ' ')) { elements[k++] = int.Parse(pom_str); if (0 == varijable.Find(x => x == Math.Abs(elements[k - 1]))) varijable.Add(Math.Abs(elements[k - 1])); pom_str = ""; } } try { a = Math.Abs(elements[0]); b = Math.Abs(elements[1]); c = Math.Abs(elements[2]); // izbacuje zagrade koje su tautologije (ako je tautologija nemoj tu zagradu uzet u obzir) if (!((Math.Abs(a) == Math.Abs(b) && a != b) || (Math.Abs(a) == Math.Abs(c) && a != c) || (Math.Abs(b) == Math.Abs(c) && b != c))) { Zagrada nova = new Zagrada(elements[0], elements[1], elements[2]); Zagrade.Add(nova); if (!veza_var_zagrada.ContainsKey(elements[0])) veza_var_zagrada.Add(elements[0], new List<Zagrada>()); if (!veza_var_zagrada.ContainsKey(elements[1])) veza_var_zagrada.Add(elements[1], new List<Zagrada>()); if (!veza_var_zagrada.ContainsKey(elements[2])) veza_var_zagrada.Add(elements[2], new List<Zagrada>()); veza_var_zagrada[elements[0]].Add(nova); veza_var_zagrada[elements[1]].Add(nova); veza_var_zagrada[elements[2]].Add(nova); } } catch (Exception e) { Console.WriteLine("Greska kod ubacivanja Zagrada:"); Console.WriteLine(e.Message); } /*mapa svih varijabli s kojim je neka varijabla vezana*/ if (!veze_varijabli.ContainsKey(a)) { List<int> pom = new List<int>(); pom.Add(b); pom.Add(c); veze_varijabli.Add(a, pom); } else { if (0 == veze_varijabli[a].Find(x => x == b)) veze_varijabli[a].Add(b); if (0 == veze_varijabli[a].Find(x => x == c)) veze_varijabli[a].Add(c); } if (!veze_varijabli.ContainsKey(b)) { List<int> pom = new List<int>(); pom.Add(a); pom.Add(c); veze_varijabli.Add(b, pom); } else { if (0 == veze_varijabli[b].Find(x => x == a)) veze_varijabli[b].Add(a); if (0 == veze_varijabli[b].Find(x => x == c)) veze_varijabli[b].Add(c); } if (!veze_varijabli.ContainsKey(c)) { List<int> pom = new List<int>(); pom.Add(b); pom.Add(a); veze_varijabli.Add(c, pom); } else { if (0 == veze_varijabli[c].Find(x => x == b)) veze_varijabli[c].Add(b); if (0 == veze_varijabli[c].Find(x => x == a)) veze_varijabli[c].Add(a); } } } } catch (Exception e) { Console.WriteLine("The file could not be read:"); Console.WriteLine(e.Message); } /*Algoritam za nalazenje nezavisnih skupova*/ Stack<int> stog = new Stack<int>(); List<int> pomocni_skup = new List<int>(); while (veze_varijabli.Count != 0) { int lk = 0; foreach (int k in veze_varijabli.Keys) { lk = k; break; } stog.Push(lk); while (0 != stog.Count) { int sa_stoga; sa_stoga = stog.Peek(); stog.Pop(); if (0 == pomocni_skup.Find(x => x == sa_stoga)) { pomocni_skup.Add(sa_stoga); foreach (int s in veze_varijabli[sa_stoga]) if (0 == pomocni_skup.Find(x => x == s)) stog.Push(s); } veze_varijabli.Remove(sa_stoga); } nezavisni_skupovi.Add(new List<int>(pomocni_skup)); pomocni_skup.Clear(); } varijable.Sort(); }
public static void PripremiFormulu() { try { /* Read cnf from txt file*/ using (StreamReader sr = new StreamReader("../../formule/expr3.cnf")) { String line; int[] elements = new int[3]; int k, a = 0, b = 0, c = 0; while ((line = sr.ReadLine()) != null) { k = 0; string pom_str = string.Empty; for (int i = 0; i < line.Length; i++) { if (Char.IsDigit(line[i]) || line[i] == '-') { pom_str += line[i]; } if (pom_str.Length > 0 && (i + 1 >= line.Length || line[i + 1] == ' ')) { elements[k++] = int.Parse(pom_str); if (0 == varijable.Find(x => x == Math.Abs(elements[k - 1]))) { varijable.Add(Math.Abs(elements[k - 1])); } pom_str = ""; } } try { a = Math.Abs(elements[0]); b = Math.Abs(elements[1]); c = Math.Abs(elements[2]); // izbacuje zagrade koje su tautologije (ako je tautologija nemoj tu zagradu uzet u obzir) if (!((Math.Abs(a) == Math.Abs(b) && a != b) || (Math.Abs(a) == Math.Abs(c) && a != c) || (Math.Abs(b) == Math.Abs(c) && b != c))) { Zagrada nova = new Zagrada(elements[0], elements[1], elements[2]); Zagrade.Add(nova); if (!veza_var_zagrada.ContainsKey(elements[0])) { veza_var_zagrada.Add(elements[0], new List <Zagrada>()); } if (!veza_var_zagrada.ContainsKey(elements[1])) { veza_var_zagrada.Add(elements[1], new List <Zagrada>()); } if (!veza_var_zagrada.ContainsKey(elements[2])) { veza_var_zagrada.Add(elements[2], new List <Zagrada>()); } veza_var_zagrada[elements[0]].Add(nova); veza_var_zagrada[elements[1]].Add(nova); veza_var_zagrada[elements[2]].Add(nova); } } catch (Exception e) { Console.WriteLine("Greska kod ubacivanja Zagrada:"); Console.WriteLine(e.Message); } /*mapa svih varijabli s kojim je neka varijabla vezana*/ if (!veze_varijabli.ContainsKey(a)) { List <int> pom = new List <int>(); pom.Add(b); pom.Add(c); veze_varijabli.Add(a, pom); } else { if (0 == veze_varijabli[a].Find(x => x == b)) { veze_varijabli[a].Add(b); } if (0 == veze_varijabli[a].Find(x => x == c)) { veze_varijabli[a].Add(c); } } if (!veze_varijabli.ContainsKey(b)) { List <int> pom = new List <int>(); pom.Add(a); pom.Add(c); veze_varijabli.Add(b, pom); } else { if (0 == veze_varijabli[b].Find(x => x == a)) { veze_varijabli[b].Add(a); } if (0 == veze_varijabli[b].Find(x => x == c)) { veze_varijabli[b].Add(c); } } if (!veze_varijabli.ContainsKey(c)) { List <int> pom = new List <int>(); pom.Add(b); pom.Add(a); veze_varijabli.Add(c, pom); } else { if (0 == veze_varijabli[c].Find(x => x == b)) { veze_varijabli[c].Add(b); } if (0 == veze_varijabli[c].Find(x => x == a)) { veze_varijabli[c].Add(a); } } } } } catch (Exception e) { Console.WriteLine("The file could not be read:"); Console.WriteLine(e.Message); } /*Algoritam za nalazenje nezavisnih skupova*/ Stack <int> stog = new Stack <int>(); List <int> pomocni_skup = new List <int>(); while (veze_varijabli.Count != 0) { int lk = 0; foreach (int k in veze_varijabli.Keys) { lk = k; break; } stog.Push(lk); while (0 != stog.Count) { int sa_stoga; sa_stoga = stog.Peek(); stog.Pop(); if (0 == pomocni_skup.Find(x => x == sa_stoga)) { pomocni_skup.Add(sa_stoga); foreach (int s in veze_varijabli[sa_stoga]) { if (0 == pomocni_skup.Find(x => x == s)) { stog.Push(s); } } } veze_varijabli.Remove(sa_stoga); } nezavisni_skupovi.Add(new List <int>(pomocni_skup)); pomocni_skup.Clear(); } varijable.Sort(); }