예제 #1
0
        //

        /**
         * function TT-CHECK-ALL(KB, α symbols, model) returns true or false
         *
         * @param kb
         *            KB, the knowledge base, a sentence in propositional logic
         * @param alpha
         *            α, the query, a sentence in propositional logic
         * @param symbols
         *            a list of currently unassigned propositional symbols in the
         *            model.
         * @param model
         *            a partially or fully assigned model for the given KB and
         *            query.
         * @return true if KB entails α, false otherwise.
         */
        public bool ttCheckAll(KnowledgeBase kb, Sentence alpha, ICollection <PropositionSymbol> symbols, Model model)
        {
            // if EMPTY?(symbols) then
            if (symbols.IsEmpty())
            {
                // if PL-TRUE?(KB, model) then return PL-TRUE?(&alpha;, model)
                if (model.isTrue(kb.asSentence()))
                {
                    return(model.isTrue(alpha));
                }
                else
                {
                    // else return true // when KB is false, always return true
                    return(true);
                }
            }

            // else do
            // P <- FIRST(symbols)
            PropositionSymbol p = Util.first(symbols);
            // rest <- REST(symbols)
            ICollection <PropositionSymbol> rest = Util.rest(symbols);

            // return (TT-CHECK-ALL(KB, &alpha;, rest, model &cup; { P = true })
            // and
            // TT-CHECK-ALL(KB, &alpha;, rest, model U { P = false }))
            return(ttCheckAll(kb, alpha, rest, model.union(p, true)) &&
                   ttCheckAll(kb, alpha, rest, model.union(p, false)));
        }
예제 #2
0
        private Token symbol()
        {
            int            startPosition = getCurrentPositionInInput();
            IStringBuilder sbuf          = TextFactory.CreateStringBuilder();

            while (null != lookAhead(1) && PropositionSymbol.isPropositionSymbolIdentifierPart(lookAhead(1).Value))
            {
                sbuf.Append(lookAhead(1));
                consume();
            }
            string symbol = sbuf.ToString();

            if (PropositionSymbol.isAlwaysTrueSymbol(symbol))
            {
                return(new Token(LogicTokenTypes.TRUE, PropositionSymbol.TRUE_SYMBOL, startPosition));
            }
            else if (PropositionSymbol.isAlwaysFalseSymbol(symbol))
            {
                return(new Token(LogicTokenTypes.FALSE, PropositionSymbol.FALSE_SYMBOL, startPosition));
            }
            else if (PropositionSymbol.isPropositionSymbol(symbol))
            {
                return(new Token(LogicTokenTypes.SYMBOL, sbuf.ToString(), startPosition));
            }

            throw new LexerException("Lexing error on symbol " + symbol + " at position " + getCurrentPositionInInput(), getCurrentPositionInInput());
        }
예제 #3
0
        /**
         * La función TT-CHECK-ALL(KB, &alpha; symbols, model) devuelve cierto o falso
         *
         * @param kb
         *            KB, la base de conocimiento, una sentencia en lógica proposicional
         * @param alpha
         *            &alpha;, la consulta, una sentencia en lógica proposicional
         * @param symbols
         *            una lista de símbolos proposicionales no asignados actualmente en el modelo
         * @param model
         *            una asignación del modelo parcial o completa para la BC dada y la consulta.
         * @return cierto si &alpha; es consecuencia lógica de KB, falso en otro caso.
         */
        public bool TTCheckAll(KnowledgeBase kb, Sentence alpha, IList <PropositionSymbol> symbols, Model model)
        {
            // si EMPTY?(symbols) entonces
            if (symbols.Count == 0)
            {
                // si PL-TRUE?(KB, model) entonces return PL-TRUE?(&alpha;, model)
                if (model.IsTrue(kb.AsSentence()))
                {
                    return(model.IsTrue(alpha));
                }
                else
                {
                    // en caso contrario devolver cierto (cuando la KB es falsa, SIEMPRE se devuelve cierto)
                    return(true);
                }
            }

            // en caso contrario hacer
            // P <- FIRST(symbols)
            PropositionSymbol p = Util.First(symbols);
            // rest <- REST(symbols)
            IList <PropositionSymbol> rest = Util.Rest(symbols);
            // return (TT-CHECK-ALL(KB, &alpha;, rest, model &cup; { P = true })
            // and
            // TT-CHECK-ALL(KB, &alpha;, rest, model U { P = false }))
            var checkIfTrue  = TTCheckAll(kb, alpha, rest, model.Union(p, true));
            var checkIfFalse = TTCheckAll(kb, alpha, rest, model.Union(p, false));

            return(checkIfTrue && checkIfFalse);
        }
예제 #4
0
        public Model union(PropositionSymbol symbol, bool?b)
        {
            Model m = new Model();

            m.assignments.PutAll(this.assignments);
            m.assignments.Put(symbol, b);
            return(m);
        }
예제 #5
0
        public Model Union(PropositionSymbol symbol, bool?b)
        {
            Model m = new Model();

            m.assignments = new Dictionary <PropositionSymbol, bool?>(assignments); //m.assignments.putAll(this.assignments);
            m.assignments.Add(symbol, b);
            return(m);
        }
예제 #6
0
        /**
         * Dice si es falso un símbolo proposicional.
         */
        public bool IsFalse(PropositionSymbol symbol)
        {
            bool?result = false;  // ESTO LO HE PUESTO YO... si no está el símbolo va a devolver false (no sé si es correcto!)

            assignments.TryGetValue(symbol, out result);

            return(bool.FalseString.Equals(result)); //Boolean.FALSE lo he cambiado a esto
        }
예제 #7
0
        /**
         * Dice si es cierto un símbolo proposicional.
         */
        public bool IsTrue(PropositionSymbol symbol)
        {
            bool?result = false;  // ESTO LO HE PUESTO YO... si no está el símbolo va a devolver false (no sé si es correcto!)

            assignments.TryGetValue(symbol, out result);

            return(true.Equals(result)); //Había un bool.TrueString ... que no tiene mucho sentido
        }
예제 #8
0
        /**
         * Obtiene el valor de un símbolo proposicional.
         */
        public bool?GetValue(PropositionSymbol symbol)
        {
            bool?result = null;   // O no haría falta inicializarlo, y ya se sobreentiende que está a nulo

            assignments.TryGetValue(symbol, out result);

            return(result);
        }
예제 #9
0
        public override ISet <Clause> VisitPropositionSymbol(PropositionSymbol s, ISet <Clause> arg)
        {
            // una cláusula unidad positiva
            Literal positiveLiteral = new Literal(s);

            arg.Add(new Clause(positiveLiteral));

            return(arg);
        }
예제 #10
0
        public override ISet <Clause> visitPropositionSymbol(PropositionSymbol s, ISet <Clause> arg)
        {
            // a positive unit clause
            Literal positiveLiteral = new Literal(s);

            arg.Add(new Clause(positiveLiteral));

            return(arg);
        }
예제 #11
0
            public override ISet <Literal> visitPropositionSymbol(PropositionSymbol s, ISet <Literal> arg)
            {
                // a positive literal
                Literal positiveLiteral = new Literal(s);

                arg.Add(positiveLiteral);

                return(arg);
            }
예제 #12
0
        protected PropositionSymbol randomlySelectSymbolFromClause(Clause clause)
        {
            // all the symbols in clause
            ISet <PropositionSymbol> symbols = clause.getSymbols();

            // a randomly selected symbol from clause
            PropositionSymbol result = (CollectionFactory.CreateQueue <PropositionSymbol>(symbols)).Get(random.Next(symbols.Size()));

            return(result);
        }
예제 #13
0
 public Model flip(PropositionSymbol s)
 {
     if (isTrue(s))
     {
         return(union(s, false));
     }
     if (isFalse(s))
     {
         return(union(s, true));
     }
     return(this);
 }
예제 #14
0
 public Model Flip(PropositionSymbol s)
 {
     if (IsTrue(s))
     {
         return(Union(s, false));
     }
     if (IsFalse(s))
     {
         return(Union(s, true));
     }
     return(this);
 }
예제 #15
0
        protected bool callDPLL(ISet <Clause> clauses, ICollection <PropositionSymbol> symbols,
                                Model model, PropositionSymbol p, bool?value)
        {
            // We update the model in place with the assignment p=value,
            bool result = dpll(clauses, symbols, model.unionInPlace(p, value));

            // as backtracking can occur during the recursive calls we
            // need to remove the assigned value before we pop back out from this
            // call.
            model.remove(p);
            return(result);
        }
예제 #16
0
 public bool?visitPropositionSymbol(PropositionSymbol s, bool?arg)
 {
     if (s.isAlwaysTrue())
     {
         return(true);
     }
     if (s.isAlwaysFalse())
     {
         return(false);
     }
     return(getValue(s));
 }
예제 #17
0
 public void test_isAlwaysTrueSymbol()
 {
     Assert.IsTrue(PropositionSymbol.isAlwaysTrueSymbol("True"));
     Assert.IsTrue(PropositionSymbol.isAlwaysTrueSymbol("tRue"));
     Assert.IsTrue(PropositionSymbol.isAlwaysTrueSymbol("trUe"));
     Assert.IsTrue(PropositionSymbol.isAlwaysTrueSymbol("truE"));
     Assert.IsTrue(PropositionSymbol.isAlwaysTrueSymbol("TRUE"));
     Assert.IsTrue(PropositionSymbol.isAlwaysTrueSymbol("true"));
     //
     Assert.IsFalse(PropositionSymbol.isAlwaysTrueSymbol("Tru3"));
     Assert.IsFalse(PropositionSymbol.isAlwaysTrueSymbol("True "));
     Assert.IsFalse(PropositionSymbol.isAlwaysTrueSymbol(" True"));
 }
예제 #18
0
 public void test_isAlwaysFalseSymbol()
 {
     Assert.IsTrue(PropositionSymbol.isAlwaysFalseSymbol("False"));
     Assert.IsTrue(PropositionSymbol.isAlwaysFalseSymbol("fAlse"));
     Assert.IsTrue(PropositionSymbol.isAlwaysFalseSymbol("faLse"));
     Assert.IsTrue(PropositionSymbol.isAlwaysFalseSymbol("falSe"));
     Assert.IsTrue(PropositionSymbol.isAlwaysFalseSymbol("falsE"));
     Assert.IsTrue(PropositionSymbol.isAlwaysFalseSymbol("FALSE"));
     Assert.IsTrue(PropositionSymbol.isAlwaysFalseSymbol("false"));
     //
     Assert.IsFalse(PropositionSymbol.isAlwaysFalseSymbol("Fals3"));
     Assert.IsFalse(PropositionSymbol.isAlwaysFalseSymbol("False "));
     Assert.IsFalse(PropositionSymbol.isAlwaysFalseSymbol(" False"));
 }
예제 #19
0
        public void testAIMAExample()
        {
            KnowledgeBase kb = new KnowledgeBase();

            kb.tell("P => Q");
            kb.tell("L & M => P");
            kb.tell("B & L => M");
            kb.tell("A & P => L");
            kb.tell("A & B => L");
            kb.tell("A");
            kb.tell("B");
            PropositionSymbol q = (PropositionSymbol)parser.parse("Q");

            Assert.AreEqual(true, plfce.plfcEntails(kb, q));
        }
예제 #20
0
        public void testKBWithNonDefiniteClauses()
        {
            KnowledgeBase kb = new KnowledgeBase();

            kb.tell("P => Q");
            kb.tell("L & M => P");
            kb.tell("B & L => M");
            kb.tell("~A & P => L"); // Not a definite clause
            kb.tell("A & B => L");
            kb.tell("A");
            kb.tell("B");
            PropositionSymbol q = (PropositionSymbol)parser.parse("Q");

            Assert.AreEqual(true, plfce.plfcEntails(kb, q));
        }
예제 #21
0
        /**
         * PL-FC-ENTAILS?(KB, q)<br>
         * The forward-chaining algorithm for propositional logic.
         *
         * @param kb
         *            the knowledge base, a set of propositional definite clauses.
         * @param q
         *            q, the query, a proposition symbol
         * @return true if KB |= q, false otherwise.
         * @throws IllegalArgumentException
         *             if KB contains any non-definite clauses.
         */
        public bool plfcEntails(KnowledgeBase kb, PropositionSymbol q)
        {
            // count <- a table, where count[c] is the number of symbols in c's
            // premise
            IMap <Clause, int> count = initializeCount(kb);
            // inferred <- a table, where inferred[s] is initially false for all
            // symbols
            IMap <PropositionSymbol, bool?> inferred = initializeInferred(kb);
            // agenda <- a queue of symbols, initially symbols known to be true in
            // KB
            ICollection <PropositionSymbol> agenda = initializeAgenda(count);
            // Note: an index for p to the clauses where p appears in the premise
            IMap <PropositionSymbol, ISet <Clause> > pToClausesWithPInPremise = initializeIndex(count, inferred);

            // while agenda is not empty do
            while (!agenda.IsEmpty())
            {
                // p <- Pop(agenda)
                PropositionSymbol p = agenda.Pop();
                // if p = q then return true
                if (p.Equals(q))
                {
                    return(true);
                }
                // if inferred[p] = false then
                if (inferred.Get(p).Equals(false))
                {
                    // inferred[p] <- true
                    inferred.Put(p, true);
                    // for each clause c in KB where p is in c.PREMISE do
                    foreach (Clause c in pToClausesWithPInPremise.Get(p))
                    {
                        // decrement count[c]
                        decrement(count, c);
                        // if count[c] = 0 then add c.CONCLUSION to agenda
                        if (count.Get(c) == 0)
                        {
                            agenda.Add(conclusion(c));
                        }
                    }
                }
            }

            // return false
            return(false);
        }
예제 #22
0
        public void test_isPropositionSymbolDoesNotContainConnectiveChars()
        {
            // '~', '&', '|', '=', '<', '>'
            Assert.IsFalse(PropositionSymbol.isPropositionSymbol("~"));
            Assert.IsFalse(PropositionSymbol.isPropositionSymbol("&"));
            Assert.IsFalse(PropositionSymbol.isPropositionSymbol("|"));
            Assert.IsFalse(PropositionSymbol.isPropositionSymbol("="));
            Assert.IsFalse(PropositionSymbol.isPropositionSymbol("<"));
            Assert.IsFalse(PropositionSymbol.isPropositionSymbol(">"));

            Assert.IsFalse(PropositionSymbol.isPropositionSymbol("A~"));
            Assert.IsFalse(PropositionSymbol.isPropositionSymbol("A&"));
            Assert.IsFalse(PropositionSymbol.isPropositionSymbol("A|"));
            Assert.IsFalse(PropositionSymbol.isPropositionSymbol("A="));
            Assert.IsFalse(PropositionSymbol.isPropositionSymbol("A<"));
            Assert.IsFalse(PropositionSymbol.isPropositionSymbol("A>"));
        }
예제 #23
0
        public bool dpll(ISet <Clause> clauses, ICollection <PropositionSymbol> symbols, Model model)
        {
            // if every clause in clauses is true in model then return true
            if (everyClauseTrue(clauses, model).Value)
            {
                return(true);
            }

            // if some clause in clauses is false in model then return false
            if (someClauseFalse(clauses, model) || currIsCancelled)
            {
                return(false);
            }

            // P, value <- FIND-PURE-SYMBOL(symbols, clauses, model)
            Pair <PropositionSymbol, bool?> pAndValue = findPureSymbol(symbols,
                                                                       clauses, model);

            // if P is non-null then
            if (pAndValue != null)
            {
                // return DPLL(clauses, symbols - P, model U {P = value})
                return(dpll(clauses, minus(symbols, pAndValue.GetFirst()),
                            model.union(pAndValue.GetFirst(), pAndValue.getSecond())));
            }

            // P, value <- FIND-UNIT-CLAUSE(clauses, model)
            pAndValue = findUnitClause(clauses, model);
            // if P is non-null then
            if (pAndValue != null)
            {
                // return DPLL(clauses, symbols - P, model U {P = value})
                return(dpll(clauses, minus(symbols, pAndValue.GetFirst()),
                            model.union(pAndValue.GetFirst(), pAndValue.getSecond())));
            }

            // P <- FIRST(symbols); rest <- REST(symbols)
            PropositionSymbol p = Util.first(symbols);
            ICollection <PropositionSymbol> rest = Util.rest(symbols);

            // return DPLL(clauses, rest, model U {P = true}) or
            // ...... DPLL(clauses, rest, model U {P = false})
            return(dpll(clauses, rest, model.union(p, true)) ||
                   dpll(clauses, rest, model.union(p, false)));
        }
예제 #24
0
        /**
         * Determina basándose en las asignaciones actuales del modelo, cuando una cláusula se sabe que es cierta, falsa o desconocida.
         *
         * @param c
         *            una cláusula proposicional.
         * @return cierto, si se conoce que la cláusula es cierta bajo las actuales asignaciones del modelo.
         *         falso, si se conoce que la cláusula es falsa bajo las actuales asignaciones del modelo.
         *         nulo, si se desconoce que la cláusula sea cierta o falsa bajo las actuales asignaciones del modelo.
         */
        // Aquí claramente se está apostando por usar un bool nullable
        public bool?DetermineValue(Clause c)
        {
            bool?result = null;   // es decir, desconocido

            if (c.IsTautology())  // Prueba independiente de las asignaciones del modelo
            {
                result = true;    // Boolean.TRUE ponía
            }
            else if (c.IsFalse()) // Prueba independiente de las asignaciones del modelo
            {
                result = false;   // Boolean.FALSE ponía
            }
            else
            {
                bool unassignedSymbols = false;
                foreach (Literal literal in c.GetLiterals())
                {
                    PropositionSymbol symbol = literal.GetAtomicSentence();
                    bool?value;
                    assignments.TryGetValue(symbol, out value);
                    if (value == null)   // Debería meterse el TryGetValue aquí en vez de ver si es nulo
                    {
                        unassignedSymbols = true;
                    }
                    else if (value.Equals(literal.IsPositiveLiteral()))
                    {
                        result = true;
                        break;
                    }
                }
                if (result == null && !unassignedSymbols)
                {
                    // Si no se ha determinado que sea cierto y no hay símbolos sin asignar entonces podemos determinaar falsedad
                    // (es decir, todos sus literales se asignan como falsos bajo el modelo)
                    result = false;
                }
            }
            return(result);
        }
예제 #25
0
        public void test_isPropositionSymbol()
        {
            Assert.IsTrue(PropositionSymbol.isPropositionSymbol("True"));
            Assert.IsTrue(PropositionSymbol.isPropositionSymbol("False"));
            Assert.IsTrue(PropositionSymbol.isPropositionSymbol("A"));
            Assert.IsTrue(PropositionSymbol.isPropositionSymbol("A1"));
            Assert.IsTrue(PropositionSymbol.isPropositionSymbol("A_1"));
            Assert.IsTrue(PropositionSymbol.isPropositionSymbol("a"));
            Assert.IsTrue(PropositionSymbol.isPropositionSymbol("a1"));
            Assert.IsTrue(PropositionSymbol.isPropositionSymbol("A_1"));
            Assert.IsTrue(PropositionSymbol.isPropositionSymbol("_"));
            Assert.IsTrue(PropositionSymbol.isPropositionSymbol("_1"));
            Assert.IsTrue(PropositionSymbol.isPropositionSymbol("_1_2"));
            Assert.IsTrue(PropositionSymbol.isPropositionSymbol("$"));
            Assert.IsTrue(PropositionSymbol.isPropositionSymbol("$1"));
            Assert.IsTrue(PropositionSymbol.isPropositionSymbol("$1_1"));

            // Commas not allowed (only legal java identifier characters).
            Assert.IsFalse(PropositionSymbol.isPropositionSymbol("A1,2"));
            Assert.IsFalse(PropositionSymbol.isPropositionSymbol(" A"));
            Assert.IsFalse(PropositionSymbol.isPropositionSymbol("A "));
            Assert.IsFalse(PropositionSymbol.isPropositionSymbol("A B"));
        }
예제 #26
0
 // No hace falta override porque PLVisitor es una interfaz, pero pongo virtual por si queremos seguir sobreescribiendo
 public virtual Sentence VisitPropositionSymbol(PropositionSymbol s, A arg)
 {
     // El comportamiento por defecto es tratar los símbolos proposicionales como áromos y dejarlos sin cambios.
     return(s);
 }
예제 #27
0
 public bool remove(PropositionSymbol p)
 {
     return(assignments.Remove(p));
 }
예제 #28
0
 public Model unionInPlace(PropositionSymbol symbol, bool?b)
 {
     assignments.Put(symbol, b);
     return(this);
 }
예제 #29
0
 public bool isFalse(PropositionSymbol symbol)
 {
     return(false.Equals(assignments.Get(symbol)));
 }
예제 #30
0
 public bool isTrue(PropositionSymbol symbol)
 {
     return(true.Equals(assignments.Get(symbol)));
 }