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


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