JESS: [EXTERNAL] Bug report regarding nested not/and and or/not - And a way to come around them

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

JESS: [EXTERNAL] Bug report regarding nested not/and and or/not - And a way to come around them

Theodore Patkos
This can be considered a continuation of the post "Nested not/and  
syntax question"

With the help of Ernest, the following two bugs in rule compilation  
have been identified.

A. Pattern (not (and ( ?var <- ...)))
The following rule is erroneously compiled.

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

Specifically, variable ?o inside the Pred fact obtains a new name, as  
shown by the (ppdefrule) output, leading to wrong results:

(ppdefrule Rule1bug)
"(defrule MAIN::Rule1bug
    (initial-fact)
    (not ?o <- (and ?o <- (Object (name A)) (Pred (obj ?_021_o))))
    =>
    (printout t \"OK1\" crlf))"

One easy way to come around this bug is to add a test pattern, instead  
of using explicit variable matching. Eg:

(defrule Rule1fixed
(not
     (and
         ?o <- (Object (name A))
         (Pred (obj ?o2))
         (test (eq ?o ?o2))
     )
)
=>
(printout t "OK1" crlf))

B. Pattern (or (..) (and ( ?var <- ...)))
Now the compilation of the outermost (or ) and its contents is  
perfomed correctly, but whatever pattern is added to the lhs of the  
rule outside (i.e., after) the (or ..) ends up insided it somehow. Eg:

(defrule Rule2bug
(or
     (not (Object (name C)))
     (and    ?o <- (Object (name C))
         (not (Pred (obj ?o)))
     )
)
(test (eq 1 1))
=>
(printout t "OK2" crlf))

The (ppdefrule) output shows that the (test ) pattern is included in  
the (and ) pattern. In fact, no statement following the (or ) pattern  
can in practice appear outside it:

Jess> (ppdefrule Rule2bug)
"(defrule MAIN::Rule2bug
    (or
      (and
        (initial-fact)
        (not (Object (name C))))
      (and
        ?o <- (Object (name C))
        (not (and (Pred (obj ?o))
         (test (eq 1 2))))))
    =>
    (printout t \"OK2\" crlf))"

I still can't figure out a way to overcome this bug. Notice that both  
Rule1bug/fixed and Rule2bug express the same logical statement,  
therefore the fixed rule can be used as a potential solution in this  
case.

Theodore






--------------------------------------------------------------------
To unsubscribe, send the words 'unsubscribe jess-users [hidden email]'
in the BODY of a message to [hidden email], NOT to the list
(use your own address!) List problems? Notify [hidden email].
--------------------------------------------------------------------