예제 #1
0
        // <summary>
        // Retrieves all implications directly derivable from the atomic expression.
        // </summary>
        // <param name="expression">
        // Atomic expression to be extended with facts derivable from the knowledge base.
        // </param>
        internal DomainBoolExpr Chase(DomainTermExpr expression)
        {
            DomainBoolExpr implication;

            Implications.TryGetValue(expression, out implication);

            return(new AndExpr <DomainConstraint>(expression, implication ?? TrueExpr <DomainConstraint> .Value));
        }
예제 #2
0
        public HornClauses(List <Block> clauses) : this()
        {
            foreach (var clause in clauses)
            {
                if (clause.NextBlock == clause && clause.PreviousBlock == clause)
                {
                    Facts.Add(clause.GetContent(true).ToString());
                    continue;
                }

                // safe against nested symbols inside clause or multiple clauses pointing at 1 symbol
                var symbol    = clause.PreviousBlock.GetContent(true).ToString();
                var unvisited = new List <Block> {
                    clause
                };
                if (!Implications.ContainsKey(symbol))
                {
                    Implications.Add(symbol, new List <List <string> >());
                }

                // if a horn clause is pointing at the same symbol as some other horn clauses,
                // add current clause's requirements to a new list instead of combining them together
                Implications[symbol].Add(new List <string>());

                // recursion using while loop, flatten down all nested symbols (if any)
                // as well as pushing clause's requirements for future reference
                while (unvisited.Count != 0)
                {
                    BlockIterator.TerminableForEach(unvisited[0], (block) =>
                    {
                        switch (block.ContentType)
                        {
                        case ContentType.Logic:
                            if ((block.GetContent() as PropositionalLogic).IsImplication)
                            {
                                return(false);
                            }
                            break;

                        case ContentType.Normal:
                            Implications[symbol].Last().Add(block.GetContent(true).ToString());
                            break;

                        case ContentType.Nested:
                            unvisited.Add(block.GetContent() as Block);
                            break;
                        }
                        return(true);
                    });

                    unvisited.RemoveAt(0);
                }
            }
        }
 public static bool Infers <T>(this T premise, T conclusion, Paradox <T> predicate = null)
 {
     if (null == predicate)
     {
         return(premise.Implies(conclusion, Infers));
     }
     if (Implies != predicate)
     {
         return(predicate(premise, conclusion));
     }
     return(Implications.CheckImplies(premise, conclusion));
 }