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