//backward chain public Clause Infer(string goal_variable, List <Clause> unproved_conditions) { Clause conclusion = null; List <Rule> goal_stack = new List <Rule>(); foreach (Rule rule in m_rules) { Clause consequent = rule.getConsequent(); if (consequent.Variable == goal_variable) { goal_stack.Add(rule); } } foreach (Rule rule in m_rules) { rule.FirstAntecedent(); bool goal_reached = true; while (rule.HasNextAntecedents()) { Clause antecedent = rule.NextAntecedent(); if (!m_wm.IsFact(antecedent)) { if (m_wm.IsNotFact(antecedent)) //conflict with memory { goal_reached = false; break; } else if (IsFact(antecedent, unproved_conditions)) //deduce to be a fact { m_wm.AddFact(antecedent); } else //deduce to not be a fact { goal_reached = false; break; } } } if (goal_reached) { conclusion = rule.getConsequent(); break; } } return(conclusion); }
public void fire(WorkingMemory wm) { if (!wm.IsFact(m_consequent)) { wm.AddFact(m_consequent); } m_fired = true; }
public bool isTriggered(WorkingMemory wm) { foreach (Clause antecedent in m_antecedents) { if (!wm.IsFact(antecedent)) { return(false); } } return(true); }