Re: JESS: question on slot specific

"Ernest Friedman-Hill" <[email protected]> Sun, 12 Jun 2011 23:16:56 -0400
Newsgroups gmane.comp.java.jess
Message-ID <[email protected]>
Argh, sorry, I used "no-loop" in my example, but I meant "slot- 
specific."


On Jun 12, 2011, at 11:12 PM, Ernest Friedman-Hill wrote:

> Oooh, that's a bad example; I'll have to fix the manual. If you type  
> (watch all) before your code, you'll see that the rule actually  
> fires twice; once when B is nil, and once when it's 3. But the  
> second time it fires, the "modify" has no effect, since the slot is  
> being modified to contain the value it already contains. Try this  
> rule instead, both with and without no-loop (and use (watch all) so  
> you can see what's going on:)
>
> (defrule R (declare (no-loop TRUE))
>  ?d <- (D (A 1))
>  =>
>  (modify ?d (B (+ ?d.B 1))))
>
> Note that your initial assert needs to have a number in the B slot,  
> or you'll get an error.
>
>
>
> On Jun 12, 2011, at 8:08 PM, Felix Chan wrote:
>
>> Hi,
>>
>> I have been trying to understand the slot-specific functionality  
>> which
>> is described in the JESS manual as follows:
>>
>> ---------------------------------------------------
>> 6.18. The 'slot-specific' declaration for deftemplates
>> Deftemplate definitions can now include a "declare" section just as
>> defrules can. There are several different properties that can be
>> declared. One is "slot-specific". A template with this declaration
>> will be matched in a special way: if a fact, created from such a
>> template, which matches the left-hand-side of a rule is modified, the
>> result depends on whether the modified slot is named in the pattern
>> used to match the fact. As an example, consider the following:
>>
>> Jess> (deftemplate D (declare (slot-specific TRUE)) (slot A) (slot  
>> B))
>> Jess> (defrule R
>> ?d <- (D (A 1))
>> =>
>> (modify ?d (B 3)))
>> Without the "slot-specific" declaration, this rule would enter an
>> endless loop, because it modifies a fact matched on the LHS in such a
>> way that the modified fact will still match. With the declaration, it
>> can simply fire once. This behavior is actually what many new users
>> expect as the default; the technical term for it is refraction.
>> --------------------------------------------------
>>
>> I tried the following without the slot-specific declaration,  
>> expecting
>> an infinite loop to occur:
>>
>> (reset)
>> (deftemplate D (slot A) (slot B))
>>
>> (defrule R
>> ?d <- (D (A 1))
>> =>
>> (modify ?d (B 3)))
>>
>> (bind ?f (assert (D (A 1))))
>> (facts)
>> (run)
>> (facts)
>>
>> But I got the following outcome with no infinite loop:
>> f-0   (MAIN::initial-fact)
>> f-1   (MAIN::D (A 1) (B nil))
>> For a total of 2 facts in module MAIN.
>> f-0   (MAIN::initial-fact)
>> f-1   (MAIN::D (A 1) (B 3))
>> For a total of 2 facts in module MAIN.
>>
>> It seems slot-specific makes no difference in the outcome. I  
>> suspect I
>> am missing a key concept here. Could someone explain?
>>
>> Thanks.
>>
>> Felix
>>
>>
>> --------------------------------------------------------------------
>> 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] 
>> .
>> --------------------------------------------------------------------
>
> ---------------------------------------------------------
> 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] 
> .
> --------------------------------------------------------------------

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