예제 #1
0
        public List<Sentence> plResolve(Sentence clause1, Sentence clause2)
        {
            List<Sentence> resolvents = new List<Sentence>();
            ClauseSymbols cs = new ClauseSymbols(clause1, clause2);
            List<Symbol> complementedSymbols = cs.getComplementedSymbols();
            foreach(Symbol symbol in complementedSymbols)
            {
                resolvents.Add(createResolventClause(cs, symbol));
            }

            return resolvents;
        }
예제 #2
0
        public List <Sentence> plResolve(Sentence clause1, Sentence clause2)
        {
            List <Sentence> resolvents          = new List <Sentence>();
            ClauseSymbols   cs                  = new ClauseSymbols(clause1, clause2);
            List <Symbol>   complementedSymbols = cs.getComplementedSymbols();

            foreach (Symbol symbol in complementedSymbols)
            {
                resolvents.Add(createResolventClause(cs, symbol));
            }

            return(resolvents);
        }
예제 #3
0
        private Sentence createResolventClause(ClauseSymbols cs, Symbol toRemove)
        {
            List <Symbol> positiveSymbols = SetOps
                                            .union(cs.clause1PositiveSymbols, cs.clause2PositiveSymbols);
            List <Symbol> negativeSymbols = SetOps
                                            .union(cs.clause1NegativeSymbols, cs.clause2NegativeSymbols);

            if (positiveSymbols.Contains(toRemove))
            {
                positiveSymbols.Remove(toRemove);
            }
            if (negativeSymbols.Contains(toRemove))
            {
                negativeSymbols.Remove(toRemove);
            }

            positiveSymbols.Sort(new SymbolComparator());
            negativeSymbols.Sort(new SymbolComparator());

            List <Sentence> sentences = new List <Sentence>();

            for (int i = 0; i < positiveSymbols.Count; i++)
            {
                sentences.Add(positiveSymbols[i]);
            }
            for (int i = 0; i < negativeSymbols.Count; i++)
            {
                sentences.Add(new UnarySentence(negativeSymbols[i]));
            }
            if (sentences.Count == 0)
            {
                return(new Symbol("EMPTY_CLAUSE")); // == empty clause
            }
            else
            {
                return(LogicUtils.chainWith("OR", sentences));
            }
        }
예제 #4
0
        private Sentence CreateResolventClause(ClauseSymbols cs, Symbol toRemove)
        {
            var positiveSymbols = cs.Clause1PositiveSymbols.Union(cs.Clause2PositiveSymbols).ToList();
            var negativeSymbols = cs.Clause1NegativeSymbols.Union(cs.Clause2NegativeSymbols).ToList();

            if (positiveSymbols.Contains(toRemove))
            {
                positiveSymbols.Remove(toRemove);
            }
            if (negativeSymbols.Contains(toRemove))
            {
                negativeSymbols.Remove(toRemove);
            }

            positiveSymbols.Sort(this.CompareSymbols);
            negativeSymbols.Sort(this.CompareSymbols);

            IList <Sentence> sentences = new List <Sentence>();

            for (int i = 0; i < positiveSymbols.Count; i++)
            {
                sentences.Add(positiveSymbols[i]);
            }
            for (int i = 0; i < negativeSymbols.Count; i++)
            {
                sentences.Add(new UnarySentence(negativeSymbols[i]));
            }
            if (sentences.Count == 0)
            {
                return(new Symbol("EMPTY_CLAUSE")); // == empty clause
            }
            else
            {
                return(LogicUtils.ChainWith("OR", sentences));
            }
        }
예제 #5
0
        public IList <Sentence> PLResolve(Sentence clause1, Sentence clause2)
        {
            var cs = new ClauseSymbols(clause1, clause2);

            return(cs.GetComplementedSymbols().Select(symbol => this.CreateResolventClause(cs, symbol)).ToList());
        }
예제 #6
0
        private Sentence createResolventClause(ClauseSymbols cs, Symbol toRemove)
        {
            List<Symbol> positiveSymbols = SetOps
                    .union(cs.clause1PositiveSymbols, cs.clause2PositiveSymbols);
            List<Symbol> negativeSymbols = SetOps
                    .union(cs.clause1NegativeSymbols, cs.clause2NegativeSymbols);
            if (positiveSymbols.Contains(toRemove))
            {
                positiveSymbols.Remove(toRemove);
            }
            if (negativeSymbols.Contains(toRemove))
            {
                negativeSymbols.Remove(toRemove);
            }

            positiveSymbols.Sort(new SymbolComparator());
           negativeSymbols.Sort( new SymbolComparator());

            List<Sentence> sentences = new List<Sentence>();
            for (int i = 0; i < positiveSymbols.Count; i++)
            {
                sentences.Add(positiveSymbols[i]);
            }
            for (int i = 0; i < negativeSymbols.Count; i++)
            {
                sentences.Add(new UnarySentence(negativeSymbols[i]));
            }
            if (sentences.Count == 0)
            {
                return new Symbol("EMPTY_CLAUSE"); // == empty clause
            }
            else
            {
                return LogicUtils.chainWith("OR", sentences);
            }

        }