Hi Joe,

Once again, it looks like you've exceeded Jess's current
capabilities. I'm really quite grateful to you for coming up with
these stress tests!

There's no quick patch, although I made a bit of progress
already. Look for an improvement here in the next release.

I think Joe Kopena wrote:
> 
> Dr. Friedman-Hill (and others),
> This problem took up an unplanned portion of my day today, so even 
> though I've achieved my end goal, I'm hoping you can shed some light on 
> what I've been missing or doing wrong.
> 
> I was trying to write a rule that basically implements the statement "if 
> for any two lists the second list contains all members of the first list 
> or has a member in a given relation with a member of the first list, 
> fire the rule." This breaks down into "if there does not exist a member 
> of the first list which is not in the second list or is not in the 
> relation with a member of the second list, fire the rule." I think this 
> implements that:
> 
> (defrule rule3
>    (rule-holds ?list2 ?list1)
>    (not
>      (and
>        (list-item ?list1 ?x)
>        (not
>          (and (list-item ?list2 ?y)
>            (or
>              (sugar ?x ?y)
>              (test (eq ?x ?y))
>            )
>          )
>        )
>      )
>    )
> =>
>    (printout t "Rule 3 fired..." crlf);
>    ; end rule 1
> )
> 
> 
> For example, on this input it fires as you'd expect:
> (assert
>    (list-item Foo A)
>    (list-item Foo B)
> 
>    (list-item Bar A)
> 
>    (rule-holds Foo Bar)
> )
> 
> However, if I take this rule pretty much verbatim (changing the 
> relation) and incorporate it into my (largeish) rulebase, it doesn't 
> work as I'd expect. More correctly, if I remove the or and the sugar 
> relation it works as I expect, and if I remove the sugar but keep the or 
> it works as I expect, but as soon as I add in the sugar it doesn't fire 
> (even though I would think it still should since they are indeed eq and 
> it fired without the sugar there).
> 
> This drove me crazy because it worked in my small test but not in the 
> larger application (and I was pretty sure there were no typos present). 
> In the end I got it to work by transforming the rule into this form:
> 
> (defrule rule4
> 
>    (rule-holds ?list2 ?list1)
> 
>    (not
>      (and
>        (list-item ?list1 ?y)
> 
>        (not
>          (or
>            (list-item ?list2 ?y)
>            (and
>              (list-item ?list2 ?x)
>              (sugar ?x ?y)
>            )
>          )
>        )
>      )
>    )
> 
> =>
>    (printout t "Rule 4 fired..." crlf);
> 
>    ; end rule 1
> )
> 
> So, am I missing something here about what forms Jess can compile or did 
> I make an actual mistake?
> 
> Thanks
> 
> -- 
> - joe kopena
> 
> --------------------------------------------------------------------
> 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]
> --------------------------------------------------------------------
> 



---------------------------------------------------------
Ernest Friedman-Hill  
Distributed Systems Research        Phone: (925) 294-2154
Sandia National Labs                FAX:   (925) 294-2234
Org. 8920, MS 9012                  [EMAIL PROTECTED]
PO Box 969                  http://herzberg.ca.sandia.gov
Livermore, CA 94550

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