Hi,

So essentially the solution is to use either a name
slot or an id slot and use it to store in other facts.

This was a dummy test example. I am using a more
complicated rule set wherein i dont have numeric ids
or names for all the facts. Hence the only option is
to use the fact-id's for joining.

thanks,




 --- [EMAIL PROTECTED] wrote: > 
> 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]
>
--------------------------------------------------------------------
>  

________________________________________________________________________
Send free SMS using the Yahoo! Messenger. Go to http://in.mobile.yahoo.com/new/pc/

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