This was an interesting one. OK, here's the deal.

1) You create a bunch of facts. In particular, there's a "class" fact
whose "course-id" slot contains a reference to a "course" fact whose
"title" slot is "History". This is an actual Java reference to the
"course" jess.Fact object.

2) You clone all the facts, and store the clones in an array
list. Here's where things start to go wrong: the cloned "class" fact's
course-id slot still contains a reference to the *non-cloned* course fact.

3) You reset the engine and assert the cloned facts. Now there's a
slot in a class fact containing a reference to a course fact that
isn't in working memory.

4) When Jess does the pattern matching for


   (defrule change-professor
        (class (course-id ?course1))
        ?course1 <- (course (title "History"))

Jess binds the ?course1 variable to the slot contents, which is a
reference to the old fact. Then it checks if the "course" fact in
working memory is "equal" to this one. In this context, the equality
check is just a comparison to see that the numeric fact-id's are the
same -- under normal circumstances, this suffices. Jess actually can't
use an identity test (for reasons that I won't go into now) so this is
unlikely to change. Anyway, this test passes, even though the two
variables refer to different fact objects, because they have the same
ID, and normally two facts in working memory can't have the same ID,
so these look like the same fact.

5) Then when the RHS of this rule tries to modify ?course1, you get an
exception because, essentially, you're passing a Fact to (modify)
which is not in working memory.

So, what should you do? Well, if "course" had an "ID" slot that held a
numeric ID for a course, then you could put that into the course-id
slot of class and your general scheme would then work fine. Just do
the joining using the id slot rather than the fact-id of the course.




I think =?iso-8859-1?q?Moderator?= wrote:
[Charset iso-8859-1 unsupported, filtering to ASCII...]
> Hi,
> 
> i want to store the facts from the rete engine, fire
> the rule and load back the previous facts and fire the
> rule again.
> heres a briefing of what i am doing
> 
> 1. clone each fact and store it in the arraylist
> 2. fire the rule. 
> 3. Assert the fact one by one from the arraylist using
> rete.assertFact(fact) method.
> 4. fire the rule.
> 
> The rule is very simple: it modifies a slot of one of
> the facts. First time the rule fires properly without
> any errors. How ever when the rule fires second time
> following exception is thrown.
> 
> Jess reported an error in routine Funcall.execute
>       while executing (modify ?course1 (professor ABC))
>       while executing defrule MAIN::change-professor.
>   Message: Error during execution.
>       at jess.Funcall.execute(Funcall.java:273)
>       at jess.Defrule.fire(Defrule.java:215)
>       at jess.Activation.fire(Activation.java:84)
>       at jess.Agenda.run(Agenda.java:203)
>       at jess.Agenda.run(Agenda.java:183)
>       at jess.Rete.run(Rete.java:1097)
>       at Test.main(Test.java:32)
> Caused by: java.lang.NullPointerException
>       at jess.FactList.assignTime(FactList.java:40)
>       at jess.Rete.processToken(Rete.java:952)
>       at jess.FactList.finishModify(FactList.java:347)
>       at jess.FactList.modifyRegularFact(FactList.java:382)
>       at jess.FactList._modify(FactList.java:303)
>       at jess.Rete._modify(Rete.java:433)
>       at jess.Modify.call(Funcall.java:971)
>       at jess.FunctionHolder.call(FunctionHolder.java:30)
>       at jess.Funcall.execute(Funcall.java:266)
>       ... 6 more
> 
> I am attaching the .clp file and also the .java file
> herewith.
> I  guess the problem is occuring as i am asserting the
> facts with the rete.assertFact() method. Hence the
> rule is not able to modify the fact slots.
> 
> How do i put the facts back in the rete engine?
> 
> thanks in advance,
> 
> sanket.
> 
> ________________________________________________________________________
> Send free SMS using the Yahoo! Messenger. Go to http://in.mobile.yahoo.com/new/pc/
Content-Description: Test.java

[Attachment, skipping...]
Content-Description: test.clp

[Attachment, skipping...]



---------------------------------------------------------
Ernest Friedman-Hill  
Distributed Systems Research        Phone: (925) 294-2154
Sandia National Labs                FAX:   (925) 294-2234
PO Box 969, MS 9012                 [EMAIL PROTECTED]
Livermore, CA 94550         http://herzberg.ca.sandia.gov

--------------------------------------------------------------------
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