Hi,

Maybe this helps you in understanding:
http://www.jessrules.com/jess/docs/71/rules.html#not_ce

"Note that a not pattern cannot define any variables that are used in
subsequent patterns (since a not pattern does not match any facts, it
cannot be used to define the values of any variables!) You can
introduce variables in a not pattern, so long as they are used only
within that pattern"

i.e. you cannot (read: should not) use ?t3 outside of the not expression.
Please correct me if I'm wrong..


2011/12/12 Al C <trapatk...@hotmail.com>:
> Hello all,
>
> First, I apologize for the length of this post. I have an issue with the
> syntax of a rule of mine that is puzzling me. The rule is as follows (i copy
> it exactly as it appears in its program, all parentheses are as shown):
>
> (defrule ColorChange
>     (Time (timepoint ?t2))
>     ?e0 <- (event (name StartPressing) (arg B1))
>     (EC (predicate Happens) (event ?e0 ) (time ?t1))
>     (test (= (+ ?t1 5) ?t2))
>     (or     (not (event (name StopPressing) (arg B1)))
>         (and     ?e2 <- (event (name StopPressing) (arg B1))
>              (not (EC (predicate Happens) (event ?e2 ) (time ?t3)))) )
>     (test (>= ?t3 ?t1))
>     (test (< ?t3 ?t2))
>     ?event <- (event (name ChangeColor) (arg B1))
> =>
> (assert (EC (predicate Happens)
>     (epistemic no)
>     (event ?event)
>     (time ?t2))))
>
> The idea is that ?t1<= ?t3 < ?t2, where ?t2 = ?t1 + 5. That is, if event
> StartPressing(B1) occurs at ?t1 a ChangeColor event will occur after 5
> timepoints, given that no StopPressing(B1) event happened in the meantime
> (events may or may not appear in the KB, yet their occurences are what we
> are interested in).
>
> The rule at first seems to work fine, but then I noticed that ?t3 is
> declared outside the scope of its declaration. In fact, although it is
> correctly instantiated somehow, i cannot print its value using (printout t
> ?t3 crlf) in the head of the rule ("Message: No such variable t3")
>
> On the other hand, if I omit the first disjunct and write
>
> (defrule ColorChange
>     (Time (timepoint ?t2))
>     ?e0 <- (event (name StartPressing) (arg B1))
>     (EC (predicate Happens) (event ?e0 ) (time ?t1))
>     (test (= (+ ?t1 5) ?t2))
>     ?e2 <- (event (name StopPressing) (arg B1))
>     (not (EC (predicate Happens) (event ?e2 ) (time ?t3)))
>     (test (>= ?t3 ?t1))
>     (test (< ?t3 ?t2))
>     ?event <- (event (name ChangeColor) (arg B1))
> =>
> (assert (EC (predicate Happens)
>     (epistemic no)
>     (event ?event)
>     (time ?t2))))
>
> i get "Message: Variable used before definition: t3" during parsing, as
> expected.
>
> The fact that ?t3 is instantiated correctly has been tested by running
> different cases, where all events exists in the KB and StopPressing(B1)
> happens before and after StartPressing(B1) (in the former the rule fires, in
> the latter it does not).
>
> In addition, trying to figure out whether the tests for ?t3 are actually
> considered or not, I added a "trivial" test condition (test (> 1 0)) just
> after the last test. When this condition is true and the rule should not
> fire (StopPressing(B2) has happened), indeed it does not fire. Surprisingly,
> when the condition is false (test (eq 1 0)) and the rule should not fire..
> it fires. Even without the existence of the ?t3 tests in the body of the
> rule.
>
> I cannot ascribe this behavior (or even why ?t3 is instantiated in the first
> place) to anything. I could use some ideas to understand where to focus the
> syntactical reshaping.
>
> Thank you
>
> Alex
>
>


--------------------------------------------------------------------
To unsubscribe, send the words 'unsubscribe jess-users y...@address.com'
in the BODY of a message to majord...@sandia.gov, NOT to the list
(use your own address!) List problems? Notify owner-jess-us...@sandia.gov.
--------------------------------------------------------------------

Reply via email to