Hi,
First of all thanks for your replies.
I am designing a java application for energy management. I have an ontology,
which I use to save information about the devices (what commands a device has,
what is its state (on, off, open close, etc.) among other information. Then I
want to design some rules implementing some energy management strategy.
A simple example:
If there is enough sun light and the light is on,
Then turn off the light.
Turn off the light: Two things have to be done here: 1- change the working
memory of jess (change the state of the light to off) and 2- call a java
function that modifies my ontology (change the state of the light to off) and a
command will be sent to the light to turn it off.
Another example (this is how I wanted to use the call to the function):
If there is enough sun light and the light is on and userWantstoSave(),
Then turn off the light.
userWantstoSave() would be my java function returning a Boolean. This function
simply represents if the user wants these rule to turn off the light or not.
However, for what you are saying I should put this Boolean in a fact and then
change the fact whenever it is necessary.
In my last email I use this rule:
(defrule trueFunction
"True Function"
(test (returnTrue))
=>
((System.out) println "True"))
I used this as an example as I thought it would be better to keep it as simple
as possible.
I have another question relating execution of rules. If a fact in my working
memory changes, does jess fire the appropriate rules?
For example I have the following two rules:
(defrule Rule-1
(object (is-a http://www.simple-ontology.owl#Light)
(http://www.simple-ontology.owl#hasState ?sl&:(eq ?sl "On")))
=>
((System.out) println "The light is On"))
(defrule Rule-2
(object (is-a http://www.simple-ontology.owl#Light)
(http://www.simple-ontology.owl#hasState ?sl&:(eq ?sl "Off")))
=>
((System.out) println "The light is Off"))
And my java code is:
Rete engine = new Rete();
engine.addUserpackage(new JessTabFunctions());
engine.executeCommand("(load-project
file:/M:/MyJessTest/osgi.myjesstest.test/simple-owl.pprj)");
Batch.batch("myrules.clp", engine);
engine.run();
engine.executeCommand(" (slot-replace$ http://www.simple-ontology.owl#light1
http://www.simple-ontology.owl#hasState 1 1 On)");
//calling run again
engine.run();
light1 has initial state Off. When I run my java application, in the console I
can see that the message "the light is Off" is printed as it should be. Then I
change the state of light1 to On. However, the message "the light is On" does
not get printed unless I call engine.run() for second time. Does this means
that everytime I modify I fact from the working memory I have to also do
engine.run()?
Thanks!
Ana