Thanks, I appreciate that guidance; I see now that in order to get the
behavior I wanted, I need to (run) after asserting the activating fact but
before explicitly giving the MOD module focus:

(watch all)
(reset)
(run)
(assert (item (id 1)))
(run)
(focus MOD)
(run)
(printout t crlf (get-focus-stack) crlf crlf)

The rules behave as I expect and want now, but I have a follow-on question
about (watch all), which (as I understand) shows all module focus changes.
Although one can clearly see that MAIN has focus when "FIRE 1
MAIN::lose-an-item" occurs below, there was no "==> Focus MAIN" watch output
line that would explicitly show when precisely the focus change occurs.  I
believe that the focus change to MAIN must have occurred between the (item)
fact assertion and the subsequent (run).  Perhaps related, there is what I
consider to be a stray/misplaced "==> Focus MAIN" output line at the end.  I
speculate that it is out of order because my final call to (get-focus-stack)
shows an empty focus stack, which does not correspond with the previous
output line that indicates the MAIN module would be on (the top of) the
focus stack:

Jess> (batch main.clp)
 ==> Focus MAIN
 ==> f-0 (MAIN::initial-fact)
 <== Focus MAIN
 ==> f-1 (MAIN::item (id 1))
==> Activation: MAIN::lose-an-item :  f-1,
==> Activation: MOD::count-item :  f-1,
FIRE 1 MAIN::lose-an-item f-1,
 ==> f-2 (MAIN::lost (id 1))
 <== Focus MAIN
 ==> Focus MOD
FIRE 1 MOD::count-item f-1,
 ==> f-3 (MAIN::counted (id 1))
 <== Focus MOD
 ==> Focus MAIN

()
Jess>

On Jan 27, 2008 11:39 AM, Ernest Friedman-Hill <[EMAIL PROTECTED]> wrote:

> An auto-focus rule changes the module focus right at the moment the
> rule is activated, which happens during pattern matching -- i.e.,
> right at the "assert" call below. Focus would have been shifted to
> MAIN by that assert, if MAIN weren't already the focus module, which
> it is since (reset) moves the focus to MAIN. But then right after the
> assert, you explicitly shift the focus to the MOD module,  which
> effectively undoes what the auto-focus would have accomplished, anyway,
>
>
> On Jan 26, 2008, at 11:57 PM, D Moon wrote:
>
> > (deftemplate item (slot id))
> > (deftemplate lost (slot id))
> > (deftemplate counted (slot id))
> >
> > (set-current-module MAIN)
> >
> > (defrule lose-an-item
> >  (declare (auto-focus TRUE)(salience 100))
> >  (item (id ?c))
> >  (not (lost (id ?c)))
> > =>
> >  (assert (lost (id ?c)))
> >  (return)
> > )
> >
> > (defmodule MOD)
> >
> > (defrule count-item
> >  (declare (salience -100))
> >  (item (id ?id))
> >  (not (counted (id ?id)))
> > =>
> >  (assert (counted (id ?id)))
> > )
> >
> > (watch all)
> >
> > (reset)
> > (assert (item (id 1)))
> >
> > (focus MOD)
> > (run)
> >
> > I'm expecting the MAIN rule lose-an-item to fire first, because the
> > rule is declared auto-focus TRUE, but my expectations are off.
> > Here's what happens:
> >
> > Jess> (batch main.clp)
> >  ==> Focus MAIN
> >  ==> f-0 (MAIN::initial-fact)
> >  ==> f-1 (MAIN::item (id 1))
> > ==> Activation: MAIN::lose-an-item :  f-1,
> > ==> Activation: MOD::count-item :  f-1,
> >  <== Focus MAIN
> >  ==> Focus MOD
> > FIRE 1 MOD::count-item f-1,
> >  ==> f-2 (MAIN::counted (id 1))
> >  <== Focus MOD
> >  ==> Focus MAIN
> > FIRE 2 MAIN::lose-an-item f-1,
> >  ==> f-3 (MAIN::lost (id 1))
> >  <== Focus MAIN
> >  ==> Focus MAIN
> > 2
> >
> > I see that both rules properly activate upon assertion of the
> > matching (item) fact, but I want the MAIN rule to fire first, so I
> > gave it salience 100 (and gave the MOD rule salience -100 to see if
> > that would make difference).  Why doesn't MAIN auto-focus when I
> > (run), regardless that I have explicitly given MOD module focus?
> >
> > One other experiment I tried was to put an (agenda) call
> > immediately before and after (focus MOD) to see what's what:
> >
> > Jess> (batch main.clp)
> >  ==> Focus MAIN
> >  ==> f-0 (MAIN::initial-fact)
> >  ==> f-1 (MAIN::item (id 1))
> > ==> Activation: MAIN::lose-an-item :  f-1,
> > ==> Activation: MOD::count-item :  f-1,
> > [Activation: MOD::count-item  f-1, ; time=2 ; salience=-100]
> > For a total of 1 activations in module MOD.
> >  <== Focus MAIN
> >  ==> Focus MOD
> > [Activation: MOD::count-item  f-1, ; time=2 ; salience=-100]
> > For a total of 1 activations in module MOD.
> > FIRE 1 MOD::count-item f-1,
> >  ==> f-2 (MAIN::counted (id 1))
> >  <== Focus MOD
> >  ==> Focus MAIN
> > FIRE 2 MAIN::lose-an-item f-1,
> >  ==> f-3 (MAIN::lost (id 1))
> >  <== Focus MAIN
> >  ==> Focus MAIN
> > 2
> >
> > So the watch activations shows MAIN::lose-an-item activating upon
> > assertion of the matching (item) fact, yet (agenda) reports only
> > the MOD rule.  Seems like something happened to the activation of
> > MAIN::lose-an-item between the time I asserted the (item) fact and
> > the time that I executed the (agenda) function.  Is there something
> > subtle here that I am missing?  Please advise even if it's obvious
> > and not subtle.  ;-\
> >
> > [Aside:  I recall a discussion about auto-focus rules and the
> > (return) function on this list a while back, but removing (return)
> > from my lose-an-item rule gives no difference other than the final
> > ==> Focus MAIN not occurring.  With (return) in, I tried this:
> >
> > (reset)
> > (assert (item (id 1)))
> >
> > (printout t (get-focus-stack) crlf)
> > (agenda)
> > (focus MOD)
> > (printout t (get-focus-stack) crlf)
> > (agenda)
> > (run)
> > (printout t (get-focus-stack) crlf)
> >
> > and saw:
> >
> > Jess> (batch main.clp)
> >  ==> Focus MAIN
> >  ==> f-0 (MAIN::initial-fact)
> >  ==> f-1 (MAIN::item (id 1))
> > ==> Activation: MAIN::lose-an-item :  f-1,
> > ==> Activation: MOD::count-item :  f-1,
> > (MAIN)
> > [Activation: MOD::count-item  f-1, ; time=2 ; salience=-100]
> > For a total of 1 activations in module MOD.
> >  <== Focus MAIN
> >  ==> Focus MOD
> > (MOD MAIN)
> > [Activation: MOD::count-item  f-1, ; time=2 ; salience=-100]
> > For a total of 1 activations in module MOD.
> > FIRE 1 MOD::count-item f-1,
> >  ==> f-2 (MAIN::counted (id 1))
> >  <== Focus MOD
> >  ==> Focus MAIN
> > FIRE 2 MAIN::lose-an-item f-1,
> >  ==> f-3 (MAIN::lost (id 1))
> >  <== Focus MAIN
> >  ==> Focus MAIN
> > ()
> >
> > Note how it appears that the MAIN module refocuses after (run), but
> > then my final call to (get-focus-stack) shows the empty stack.  I
> > don't know why, don't know if it's related to my above-described
> > problem, but mention this parenthetically just in case.]
> >
> > V/R,
> >
> > Moon
>
> ---------------------------------------------------------
> Ernest Friedman-Hill
> Informatics & Decision Sciences          Phone: (925) 294-2154
> Sandia National Labs                FAX:   (925) 294-2234
> PO Box 969, MS 9012                 [EMAIL PROTECTED]
> 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