<< Demo048 >> << Section 7.1: If-then Rules >> << 7.1.2: Backward Chaining >> use ReadTerms; component BackwardChaining; Deduce (RuleSet = list(term), Facts = list(term), Hypothesis = term) -> optional(boolean); begin Facts:= alist(term); RuleSet:= alist(term); Deduce (RuleSet = list(term), Facts = list(term), Hypothesis = term) -> optional(boolean); Deduce (rules, facts, Hypothesis) = [ RuleSet:=rules; Facts:= facts; ScanRules (Hypothesis)]; ScanRules (Hypothesis = term) -> optional(boolean); ScanRules (Hypothesis) = TryRule(items(RuleSet), Hypothesis); TryRule(Rule = term, Hypothesis = term) -> optional(boolean); TryRule(phrase(Rule = if Conditions then Conclusion), Conclusion) = Test(Conditions); Test(term) -> boolean; Test(Condition1 & Condition2) = if Test(Condition1) then Test(Condition2) else false; Test(Condition1 | Condition2) = if Test(Condition1) then true else Test(Condition2); Test(Condition) = Verify(Condition); Verify(Condition = term) -> boolean; Verify(Condition) = [ Found:= member(Condition,Facts); if ~ Found then [ Found:=ScanRules(Condition); if Found then add(Facts,Condition)]; Found]; member(term,list(term)) -> boolean; member(T,L) = [ return(true) when items(L) == T; false]; end component BackwardChaining; Input = OpenInputTermsFile("Animals.tst"); Facts = readlist(Input); Facts? RuleSet = readlist(Input); RuleSet? Hypotheses = readlist(Input); Hypotheses? close(Input); Deduce(RuleSet, Facts, items(Hypotheses))? Facts?