Пример #1
0
 public void Add(CNF addCNf)
 {
     foreach (var c in addCNf.cnf)
     {
         cnf.Add(c);
     }
 }
Пример #2
0
        public CNF Transform()
        {
            var res = Transform(logTree.ReturnRoot());

            cnf = res.Item2;
            cnf.Add(res.Item1);
            return(cnf);
        }
Пример #3
0
        public bool DPLLAlgo(CNF f)
        {
            var m = new Dictionary <int, int>(Lit.Count);

            foreach (var l in Lit)
            {
                m.Add(l, -1);
            }

            //Console.WriteLine(f);

            return(DPLLAlgo(f, Lit, m));
        }
Пример #4
0
        private CNF EliminatePureLiterals(CNF F, HashSet <Literal> model)
        {
            CNF newCNF = new CNF(F);

            foreach (var l in model)
            {
                var notL = l.Inversed();
                for (int i = 0; i < newCNF.Count; i++)
                {
                    HashSet <Literal> conj = newCNF.GetConj(i);

                    if (conj.Contains(l))
                    {
                        newCNF.Remove(conj); // выкидываем дизъюнкцию
                        i--;
                    }
                    else if (conj.Contains(notL))
                    {
                        conj.Remove(notL);
                    }
                }
            }
            return(newCNF);
        }
Пример #5
0
        private Tuple <Literal, CNF> Transform(INode node)
        {
            if (node.GetType() == typeof(Tree.AndNode))
            {
                var myLit = new Literal(id);
                vars.Add(id);
                id--;

                var res1 = Transform(node.GetRight());
                var res2 = Transform(node.GetLeft());

                var cnfUnion = new CNF();
                cnfUnion.Add(res1.Item2);
                cnfUnion.Add(res2.Item2);
                // ∆0 = ∆2 ∪ {¬p ∨ `1, ¬p ∨ `2, ¬`1 ∨ ¬`2 ∨ p}

                cnfUnion.Add(new Literal[] { myLit.Inversed(), res1.Item1 });
                cnfUnion.Add(new Literal[] { myLit.Inversed(), res2.Item1 });
                cnfUnion.Add(new Literal[] { myLit, res1.Item1.Inversed(), res2.Item1.Inversed() });
                return(Tuple.Create(myLit, cnfUnion));
            }
            else if (node.GetType() == typeof(Tree.OrNode))
            {
                var myLit = new Literal(id);
                vars.Add(id);
                id--;

                var res1 = Transform(node.GetRight());
                var res2 = Transform(node.GetLeft());

                var cnfUnion = new CNF();
                cnfUnion.Add(res1.Item2);
                cnfUnion.Add(res2.Item2);
                // ∆0 = ∆2 ∪ {¬p ∨ `1 ∨ `2, ¬`1 ∨ p, ¬`2 ∨ p}
                cnfUnion.Add(new Literal[] { myLit.Inversed(), res1.Item1, res2.Item1 });
                cnfUnion.Add(new Literal[] { myLit, res2.Item1.Inversed() });
                cnfUnion.Add(new Literal[] { myLit, res1.Item1.Inversed() });

                return(Tuple.Create(myLit, cnfUnion));
            }
            else if (node.GetType() == typeof(Tree.NotNode))
            {
                if (node.GetLeft().GetType() == typeof(Tree.TermNode))
                {
                    int num = ((Tree.TermNode)node.GetLeft()).Num;
                    vars.Add(num);
                    return(Tuple.Create(new Literal(num, true), new CNF())); //not x_i
                }
                else
                {
                    var cnfLoc = Transform(node.GetLeft());
                    return(Tuple.Create(cnfLoc.Item1.Inversed(), cnfLoc.Item2));
                }
            }
            else if (node.GetType() == typeof(Tree.TermNode))
            {
                int num = ((Tree.TermNode)node).Num;
                vars.Add(num);
                return(Tuple.Create(new Literal(num), new CNF())); // x_i
            }
            else
            {
                throw new ArgumentException();
            }
        }
Пример #6
0
 public TseitinTransformer(Tree tree)
 {
     logTree = tree;
     cnf     = new CNF();
     vars    = new HashSet <int>();
 }
Пример #7
0
        private bool DPLLAlgo(CNF f, List <int> unchLit, Dictionary <int, int> totalModel)
        {
            //Console.WriteLine(f);
            CNF newf = f;

            do
            {
                if (newf.IsEmpty())
                {
                    model = new Dictionary <int, int>(totalModel);
                    return(true);
                }

                if (newf.HasEmptyConj())
                {
                    return(false);
                }


                var unionLit             = newf.GetUnionDisj();
                HashSet <Literal> newLit = new HashSet <Literal>();
                foreach (var u in unionLit)
                {
                    UnitPropagation(u, totalModel, newLit);
                }
                unchLit.RemoveAll(x => newLit.Select(y => y.Name).Contains(x));

                newf = EliminatePureLiterals(newf, newLit);
            } while (newf.GetUnionDisj().Count > 0);

            if (newf.IsEmpty())
            {
                model = new Dictionary <int, int>(totalModel);
                return(true);
            }

            if (newf.HasEmptyConj())
            {
                return(false);
            }

            var l = ChooseLiteral(unchLit);

            if (l.Name == 0) // нет невыьранных литералов
            {
                Console.WriteLine("no Lit: " + newf.Count);
                return(DPLLAlgo(newf, unchLit, totalModel));
            }
            else
            {
                newf.Add(l);
                if (DPLLAlgo(newf, new List <int>(unchLit), new Dictionary <int, int>(totalModel)))
                {
                    return(true);
                }
                else
                {
                    //Console.WriteLine("Back Track: " + l + " " + newf.Count + " UncLit:" + unchLit.Count);

                    newf.AddInversed(l);
                    return(DPLLAlgo(newf, unchLit, totalModel));
                }
            }
        }
Пример #8
0
 public CNF(CNF f)
 {
     FullCopy(f.cnf);
 }