// <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)); }
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)); }