Hi Ana,

First let me note that this isn't at all the way Jess is intended to work. It's supposed to be used to match data, not the results of calling functions. If you want to monitor the status of a function's return value over time, a simple Java loop would be far more convenient!

But assuming your actual intended application is more nuanced: in (1), the rule won't fire because pattern matching is always driven by working memory changes; if you write a rule like this one which matches no working memory elements, then Jess automatically makes it match "(initial-fact)", the fact that is asserted by the "reset" function, so you'll need to call that at some point. Also, rules only fire when you call "run". So your Java code might look like


engine.executeCommand("(load-project file:/M:/MyJessTest/ osgi.myjesstest.test/simple-owl.pprj)");
           Batch.batch("myrules.clp", engine);
           engine.addUserfunction(new ReturnTrue());
           engine.reset();
           engine.run();

(You might need to call "load-project" before the "reset()", and it would make sense to define the function before loading the rules, although that's not required.)

Now, for question (2), the only way to re-evaluate the function is to force re-evaluation of the (initial-fact) pattern. Calling "reset" would do that, but it would also empty out working memory. In a real rule, you might have some real patterns, and re-evaluating one of those would do the trick -- modifying a fact that was matched on the rule's LHS before the function call.

PropertyChangeEvents have nothing directly to do with your question -- that's a mechanism for telling Jess that a working memory element (i.e., a fact) has changed.


On Jul 28, 2010, at 5:42 AM, Ana Rossello Busquet wrote:

Hi,

I am beginner in Jess. I have a java application that uses jess.Rete. I want to define a rule in jess that calls a Userfunction in LHS. If the Userfunction returns true, the rule should be fired. I have mainly two problems: 1- how do I write this rule in jess 2- how do I notify my engine that the return value of the function has changed.

1-      How do I write the rule in jess:
I have created a this class that implements Userfunction:

public class ReturnTrue implements Userfunction {
@Override
public Value call(ValueVector arg0, Context arg1) throws JessException {
return new Value(Funcall.TRUE);
}
@Override
public String getName() {return "returnTrue";}
}

My main code, where jess.Rete is initialized and my rules and Userfunctions are loaded:

Rete engine = new Rete();
engine.addUserpackage(new JessTabFunctions());
try {
           //my database is an ontology created with protege
engine.executeCommand("(load-project file:/M:/MyJessTest/ osgi.myjesstest.test/simple-owl.pprj)");
           Batch.batch("myrules.clp", engine);
           engine.addUserfunction(new ReturnTrue());
} catch (JessException e) {
e.printStackTrace();
}

I have write my rule like this, but it does not seem to be working:
(defrule trueFunction
   "True Function"
   (test (returnTrue))
   =>
    ((System.out) println "True"))

What am I doing wrong?

2- - how do I notify my engine that the return value of the Userfunction has changed

I have found a post that actually talks about this: Userfunction on LHS called only once. In this post ejfried suggests two options: idle-rule or JavaBean which support PropertyChangeEvents. Can some on give more information on how to use PropertyChangeEvents or even better an example code?

Thanks!

Ana


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







--------------------------------------------------------------------
To unsubscribe, send the words 'unsubscribe jess-users [email protected]'
in the BODY of a message to [email protected], NOT to the list
(use your own address!) List problems? Notify [email protected].
--------------------------------------------------------------------

Reply via email to