예제 #1
0
 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;
 }
예제 #2
0
 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;
 }
예제 #3
0
 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;
 }
예제 #4
0
 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;
 }
예제 #5
0
 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);
     }
 }
예제 #6
0
 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);
     }
 }
예제 #7
0
 //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;
 }
예제 #8
0
        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();
        }
예제 #9
0
        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();
        }