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