JESS: [EXTERNAL] Nested not/and syntax question

"Theodore Patkos" <[email protected]> Fri, 6 Jan 2012 14:40:19 +0100
Newsgroups gmane.comp.java.jess
Message-ID <[email protected]>
Hello everyone and best wishes for the new year

could someone please give me an explanation why the following two rules 
behave in a different way, although they express the same logical 
formula (i.e., not (Object ^ Pred) )? In fact, only the second rule 
reaches correct conclusions, as I note below.

(defrule Rule1
(not
    (and
       ?o <- (Object (name B))
       (Pred (obj ?o))
))
=>
(printout t "OK1" crlf)
)


(defrule Rule2
(or
    (not (Object (name B)))
    (and
       ?o <- (Object (name B))
       (not (Pred (obj ?o)))
))
=>
(printout t "OK2" crlf)
)

The definition of facts could be like:
(deftemplate Object (slot name))
(assert (Object (name A)))
(assert (Object (name B)))
(deftemplate Pred (slot obj))

where <obj> is the id of some Object fact, eg.

(defrule Rule
(declare (salience 10))
?o <- (Object (name A))
=>
(assert (Pred (obj ?o)))
)


What I notice is that Rule1 behaves erroneously when the Object fact 
exists in the KB, but not the Pred fact: although it is supposed to be 
triggered, it is not! Rule2, on the other hand, behaves correctly all 
the times.

When both Object and Pred facts exist or when the Object does not exist, 
both rules behave fine.

So, what is wrong with the syntax of the first rule? No variable 
definition is used outside the not pattern..

Thanks

Theodore


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