-------------- Original message ----------------------
From: "Hal Hildebrand" <[EMAIL PROTECTED]>
> Thanks!  This is exactly what I need.  As you can see in my follow up email,
> I tried to do this transformation, but for some odd reason ­ I think it was
> my placement of (watch all) - I didn¹t see all the assertions.  However, I
> still have the endless loop issue if I combine this with the
> removeTransformation rule.

But note the use of the logical construct in Bob Kirby's rule.  This prevents 
the need for the remove-transformations rule!

When you retract your original (source (id ?id) (templates $? ?template $?)) 
fact, the dependent assertions will be retracted automagically!

> > This can all be combined in a single rule without a "foreach" loop.
> > 
> > (defrule manage-source-templates
> >     "Logically assert or retract templates for source"
> >     (logical (source (id ?id) (templates $? ?template $?)))
> >     (not (transform (source ?id) (template ?template)))
> >     =>
> >     (assert (transform (source ?id) (template ?template))))
> > 
> > Bob Kirby

Praise be the heady power of declarative programming!

- Mike Smith

--- Begin Message ---
Title: Re: JESS: LHS, lists and productions.
Thanks!  This is exactly what I need.  As you can see in my follow up email, I tried to do this transformation, but for some odd reason – I think it was my placement of (watch all) - I didn’t see all the assertions.  However, I still have the endless loop issue if I combine this with the removeTransformation rule.


On 9/7/07 9:40 AM, "Robert Kirby" <[EMAIL PROTECTED]> wrote:

This can all be combined in a single rule without a "foreach" loop.

(defrule manage-source-templates
    "Logically assert or retract templates for source"
    (logical (source (id ?id) (templates $? ?template $?)))
    (not (transform (source ?id) (template ?template)))
    =>
    (assert (transform (source ?id) (template ?template))))

Bob Kirby

At 09:11 AM 9/7/2007, Ernest Friedman-Hill wrote:
Same idea:

(defrule removeTransforms
    ?t <- (transform (source ?id) (template ?t))
    (not (source (id ?id)(templates $? ?t $?))
=>
    (retract ?t))


On Sep 7, 2007, at 11:57 AM, Hal Hildebrand wrote:
Doh!  That does work well and I'll certainly replace my cheesy  
solution with this, but one of the issues I'm dealing with is that the set of templates can change and I would like to ensure that as changes to the list of templates occur, the corresponding transforms are asserted or  
retracted.
Sorry, this is an additional constraint I would like to satisfy that I
should have noted.


On 9/7/07 8:28 AM, "Wolfgang Laun" <[EMAIL PROTECTED]>  
wrote:
Assuming that the absence of any "transform" fact with a "source"  
slot equal to the "id" slot of a new "source" fact is the criterion for
creating the "transform" facts:

(defrule makeTransforms
    ?s <- (source (id ?id)(templates $?templates))
    (not (transform (source ?id)))
=>
    (foreach ?temp $?templates
        (assert (transform (source ?id) (template ?temp))))
)

kr
Wolfgang

Hal Hildebrand wrote:
I have a system where I need to ensure that for every member of a  
list, there is a fact which contains that member.  For example, here's  
my domain:


(deftemplate source (slot id) (multislot templates))
(deftemplate transform (slot source) (slot template))


What I would like is to write some rules that ensure that for ever member of the templates slot of a "source", I have a corresponding transform.  If I assert:

(assert source (id 1) (templates (create$ a b c)))

I would like to see three facts asserted in response:

(assert transform (source 1) (template a))
(assert transform (source 1) (template b))
(assert transform (source 1) (template c))


I have accomplished this by creating an intermediary fact and some rules which essentially cycle through the list of templates in the source, asserting a transform for each.  However, this just feels wrong.  It seems like I should be able to express this without the intermediary facts.

Perhaps this is where backward chaining would be useful?  Or perhaps I can use the new "accumulate" CE?  Or, have I already found the solution using an intermediary fact to cycle through the list of templates?

Any help/suggestions would be appreciated.

---------------------------------------------------------
Ernest Friedman-Hill
Advanced Software Research          Phone: (925) 294-2154
Sandia National Labs               FAX:   (925) 294-2234
PO Box 969, MS 9012                [EMAIL PROTECTED]
Livermore, CA 94550                http://www.jessrules.com



--- End Message ---

Reply via email to