Re: Creating new skolems within a rule

Thomas Russ <[email protected]> Wed, 11 Jul 2007 11:44:21 -0700
Newsgroups gmane.comp.ai.powerloom
Message-ID <[email protected]>
On Jul 11, 2007, at 10:58 AM, Prasan Samtani wrote:

> I’m in the process of creating a multiagent system in Powerloom.  
> I’m looking for a way to create a new skolem within a rule without  
> explicitly naming it. Let’s say I have a rule that defines how an  
> agent reacts in a particular situation:
>
>
>
> (defrule greeting-rule
>
>    (=>
>
>       (and (conv-opening ?s) (act-addressee ?s Pierre) (greeted  
> Pierre FALSE)
>
>            (act-speaker ?s ?a) (= (act-time ?s) (system-time  
> TLTWorld)))
>
>       (and (conv-opening pierre-greet) (act-speaker pierre-greet  
> Pierre)
>
>            (act-should-execute pierre-greet TRUE) (greeted Pierre  
> TRUE) (act-addressee pierre-greet ?a) )
>
> ))
>
>
>
> Every time this rule is triggered, the value of the skolem pierre- 
> greet is overwritten. Is there a way to create a new skolem in the  
> right hand side of the rule, such as:
Well, yes and no.

Creating a skolem is easily accomplished by introducing the new  
variable with an EXISTS clause, so if you wrap the consequent with an  
(exists (?spr) ...) form, you will have created a new skolem.

    (defrule greeting-rule

        (=>

             (and (conv-opening ?s) (act-addressee ?s Pierre)  
(greeted Pierre FALSE)

                  (act-speaker ?s ?a) (= (act-time ?s) (system-time  
TLTWorld)))

             (exists (?spr)

                (and (conv-opening ?spr) (act-speaker ?spr Pierre)

                     (act-should-execute ?spr TRUE) (greeted Pierre  
TRUE) (act-addressee ?spr ?a) ))))



But this may not result in what you really want, and in particular  
won't necessarily create an new skolem if there is an existing skolem  
that already satisfies the clauses in the consequents.
> This way, every time the rule is triggered, a new skolem is created  
> that has the correct values in its slots. This way, the values of  
> the older skolems are not overwritten. Is it possible to do this in  
> PowerLoom, or would you recommend an alternate approach?
The fundamental issue is that it seems that you want to use the  
logical inference rules as if they were (procedural) production  
rules.  Although the formalisms are similar there are some important  
differences between them.  Logical inference rules are used to encode  
axioms that are universally true.  They should be used to conclude  
the consequences of the information in the knowledge base.  They are  
not intended to model reactions to changing circumstances, which is  
why introducing new instances isn't easy [although I think Hans  
Chalupsky may have some modifications that can
change this.]  Logical rules in PowerLoom are also non-monotonic,  
which means that the conclusions can be later retracted if the  
underlying facts change.  This is one of their strengths.  You can  
also run into problems if you include things which are logical  
inconsistencies in the rules, such as a rule of the form:
     A => (not A)
I suspect that you have something like this with the (greeted Pierre  
TRUE/FALSE) clause in your rule.

Production rules, on the other hand, are a method of procedural  
programming, which perform a match-act cycle and can be used to (in  
general) perform arbitrary changes to the knowledge base.  Some  
familiar production rule systems are JESS, OPS5 and the MYCIN  
derivatives.  There is generally no automatic retraction, since by  
the procedural nature of the rule paradigm, things are expected to  
change as a result of the rules, and one does not want to undo  
things.  In particular, production rules don't have a problem with  
retracting items in their antecedent, whereas doing this via negation  
(or the resetting of functional relation properties) in logical  
inference rules is a problem.

PowerLoom does not have a production rule system associated with  
it.*  It just has the logical inference rules.

Now, as to an alternate approach:  Since there is no real production  
rule system in PowerLoom, you would need to construct some of that  
functionality using code on your own.  You can use queries to look  
for matches and then introduce assertions.  This is not as efficient  
a matching strategy as the rete-nets found in production systems, but  
unless you have to do this often, it may be acceptable.  Constructs  
such as ASSERT-FROM-QUERY may be useful in such cases.  One other  
downside is that PowerLoom won't monitor the KB and react to  
particular updates.  Again, there are tools (such as associating  
DAEMONs with predicates) that you can use to handle this part of it.   
It is a bit more work, though, but these sorts of tools will do the  
job more reliably.


-Tom.

* The predecessor Loom system did have a production rule system, but  
that doesn't really help.


--
Thomas A. Russ, Ph.D.  Senior Research Scientist             [email protected]
USC/Information Sciences Institute              WWW:  http://www.isi.edu
4676 Admiralty Way, Marina del Rey, CA 90292              (310) 448-8775