- From: Christian De Sainte Marie <csma@fr.ibm.com>
- Date: Tue, 26 Jan 2010 16:47:23 +0100
- To: RIF <public-rif-wg@w3.org>
- Message-ID: <OF547C4C89.A3282612-ONC12576B6.0065EB19-C12576B7.0056BDA7@fr.ibm.com>
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