On Aug 25, 2008, at 1:26 PM, Marcin Krol wrote:


I'm new to Jess and struggling with making one example work, based on
problem from http://en.wikipedia.org/wiki/Backward_chaining



(defrule frog-color
 (need-color ?name ?)
 (kind ?name frog)
...

This is the problem here. You've used the variable "?name" in both patterns. That tells Jess that the "need-color" goal and the "kind" fact should both contain the same value in that slot. But the need- color goal is generated based on the failure of this rule to match:

(defrule print-Fritz-color
 (color ?name ?val) ...

And since "color" is the first pattern in the rule, there's no indication what the value of "?name" should be. So the goal need-color contains "nil" in that position. "nil" doesn't match "Fritz" (or whatever the user types in) so the "kind" and "need-color" facts don't match, and so the rule doesn't fire.

Jason's version works because he used an anonymous variable to match the names, but he doesn't mention this as having been the problem. The anonymous variables aren't constrained to having the same value.

Another way to fix the program is to embed the name information in the need-color goal; you can do this by matching the "kind" fact in the print-Fritz-color rule, since, as I said, that's the rule that forces the backwards chaining to happen:

(defrule print-Fritz-color
 (kind ?name ?type)
 (color ?name ?val) =>
 (printout t "Color of " ?name " is " ?val crlf)
)




---------------------------------------------------------

Ernest Friedman-Hill
Informatics & Decision Sciences, Sandia National Laboratories
PO Box 969, MS 9012, Livermore, CA 94550
http://www.jessrules.com






Reply via email to