[PRD] Refraction and Modify examples

All,

Here are a couple examples that might be helpful when discussing my 
proposal wrt the amendment of refraction (and conflict resolution) and 
Modify in PRD.

NB: I did not run those exact examples, and I lost the ones I ran on CLIPS 
and JRules. Hence the "should" and "should not" loop. My only knowledge of 
Jess being from the user's manual, the "should" and "should not"s, here, 
are just to say that this is according to my understanding of from said 
manual.

Modify (is it atomic?):

Rule 1: Forall ?X, if ?X[_att -> _bar] then Modify( ?X[_att -> bar] )

Facts: _foo[_att -> _bar]

Translated in JRules using a Foo class and a Modify action, this should 
not loop, except if "refresh" is specified.

In CLIPS, it should loop. As I understand the working of Jess (from the 
user's manual), it should loop in Jess as well, except if the rule is set 
to no-loop. If this is correct, it shows that the Modify is not atomic in 
Jess (it is certainly not in CLIPS, and it is certainly in JRules).

Rule 2: Forall ?x, if ?X[_att-1 -> _bar] then Modify( ?X[_att-2 -> 
_bar_too]

Facts: _foo[_att-1 -> _bar _att-2 -> _whatever]

In Jess, that should loop, unless the _foo template is declared 
slot-specific. I did not check that with CLIPS yet; neither did I with 
JRules and "refresh". But, again, if this is how Jess behaves, that proves 
even more that Modify is not an atomic action (in Jess, I mean).

Modify again (can we find a way to get the current PRD spec to work for 
Jess and JRules at the same time?):

Rule Modify_loop:
Forall ?x ?y
If ?x[_count -> ?y] And ?y > 0 Then Modify( ?x[ _count -> (?y - 1)] )

Rule Modify_noloop:
Forall ?x
If Exists ?y (?x[_count -> ?y] And ?y > 0)
Then Do((?y ?x[_count -> ?y]) Modify( ?x[ _count -> (?y - 1)] ))

Without using an "exists", the two rules above translate into CLIPS, 
JRules and Jess as the same rule, which looks like (here, in JRules):
rule modify_noloop{
when{ ?X:foo.Foo(?C:count;?C>0); }
then { modify ?X{count = ?C-1;} }
 }
Which does not loop in JRules, but does loop in CLIPS, and which should 
loop in Jess, unless it is declared as a "no-loop".

To produce the modify_loop behavior, instead, JRules has to change the RHS 
to:
modify refresh ?X{count = ?C-1;}
but, the, it loops if the RHS is
modify refresh ?X{count = ?C;}
as well, which contradicts the spec (since none of the variable bindings 
changed, it should not loop).

I think that we can find such cases, as well, where a RIF-Jess translator 
could not decide whether a rule should be declared "no-loop" only by 
looking at which variables are universally quantified and which are used 
in a Modify.

Refraction (does including the existentially quantified variables help?):

One easy case is:

Rule 3
If Exists ?x P(?x)
Then Print("Hello, World!")

Facts: P(a), P(b), P(c)

I assume that our engines all agree that rule 3 does not loop given the 
facts: if the bindings of the existential variables were taken into 
account in the PRD specification for refraction, Hello World! would be 
printed thrice.

A more interesting case, that aims at finding out whether existentials are 
dealt with specially as regards refraction

Facts: P(1)

Rule Exists-v1
If Exists ?x  P(?x)
Then Do( Retract( P(1) ) Assert( P(2) ) )

Rule Exists-v2
If Exists ?x P(?x)
Then Do( Assert( P(2) ) Retract( P(1) ))

In CLIPS, the first rule, Exists-v1, runs twice (with an error the second 
time, because of the attempt to retract the not exists fact P(1)), and the 
second rule, Exists-v2 runs only once. That is, CLIPS refracts the rule as 
long as the existence test remains satisfied, even if by another fact, 
provided that there is no intermediate state where no facts satisfies the 
existential. I tested JRules with another, more realistic example, that 
shows that JRules does the same. What about Jess?

Atomic actions (Does refraction and recency take intermediate states of 
the fact base after each atomic action into account or is it enough to 
take the effect of the action block, only, into account, as does PRD?)
 
In addition to the above examples that would all show that atomic effects 
must be taken into account for refraction, if they behave as expected, 
here is an example that purports to test the impact on conflict resolution 
(recency):

Rule r1: If P(1) then Print("R1 fired")

Rule r2: if P(2) then Print("R2 fired")

Rule test-1: if foo() then Do( Assert( P(1) ) Assert( P(2) ))

Rule test-2: if foo() then Do( Assert( P(2) ) Assert( P(1) ))

Facts: foo()

Does the ruleset {r1, r2, test-1} fire R2 first and r1 second and does the 
ruleset {r1, r2, test-2} do the reverse? CLIPS does, I expect Jess and 
JRules to, as well.

Cheers,

Christian

IBM
9 rue de Verdun
94253 - Gentilly cedex - FRANCE
Tel. +33 1 49 08 35 00
Fax +33 1 49 08 35 10


Sauf indication contraire ci-dessus:/ Unless stated otherwise above:
Compagnie IBM France
Siege Social : 17 avenue de l'Europe, 92275 Bois-Colombes Cedex
RCS Nanterre 552 118 465
Forme Sociale : S.A.S.
Capital Social : 611.451.766,20 ?
SIREN/SIRET : 552 118 465 03644

Received on Tuesday, 26 January 2010 15:48:01 UTC