- From: Christian De Sainte Marie <csma@fr.ibm.com>
- Date: Mon, 18 Jan 2010 15:43:48 +0100
- To: Gary Hallmark <gary.hallmark@oracle.com>
- Cc: Neal Wyse <neal.wyse@oracle.com>, RIF WG <public-rif-wg@w3.org>
- Message-ID: <OF4B66F2C1.C2D91B16-ONC12576AA.00282ADC-C12576AF.0050EAAE@fr.ibm.com>
All, Gary and Neal are right: the specification of refraction in PRD is wrong. I propose that we have a PRD TF telecon tomorrow to discuss the changes needed. Here below are the results of my analysis of the problem, and a proposed solution. I made some testing with CLIPS and JRules, on the assumption that what worked for CLIPS would work for almost any other engine (and, esp., on the assumption that Jess and Oracle --and, maybe, Tibco-- would work like CLIPS, whereas Drools, Blaze etc would work like JRules) and I identified three problems with the PRD spec: 1. Refraction and recency should depend on the state changes that result from atomic actions, not on the state changes that result from action blocks: that means that we need to take intermediate states of the fact base into account. The definition of a state of the system will need be changed accordingly, but, apart from that, the semantics remains unchanged. Stretching it a little bit, we could consider that this is not such a substantial change (and, thus, no need to get back to LC). 2. in CLIPS, the Modify is, really, a Retract followed by an Assert, in the sense that it remove the modified fact from the RETE, and add it back after modification: that means that we cannot have, in PRD, a Modify that does not retract, then insert a new fact, with all the consequences on the agenda, if we want CLIPS and the engines that work the same way to be able to implement PRD. That point is not really a problem, as far as regards CR etc, because this, is, really, what the spec says it does, already. My suggestion is that we, only, make the fact that Modify = Retract+Assert more explicit, in PRD (if only because this is not what the spec was intended to say :-). [1] It is more of a problem for implementation in object-oriented engines, such as JRules, because it makes Frames even more inappropriate to represent objects, but this is a different question (the problem is really with retracting a field value without retracting the object instance; that could be, at least, simulated as long as the value of the field could be modified without a Retract; that will not be the case anymore). Notice that it follows that the Modify_noloop test case cannot work, existential variables or else: my best suggestion is to remove it (the test case); but this has no incidence on the status of the PRD spec wrt CR, LC etc. 3. the binding of the rule (universal) variables is not always discriminant enough to characterize a rule instance. That is, it does not allow to decide, in all cases, whether two instances of a rule are equal or not: in the following example, the rule should have two different instances, for the conflict resolution algo, but the binding of the unique rule variable is not enough to distinguish them: Rule: FORALL ?x, IF test(?x) AND ( foo(1) OR bar(B) ) THEN... Facts: (test a), (foo 1), (bar B) That shows that the characterization of a rule instance, in PRD, should take the facts that matched the condition into account, not only the binding of the rule variables (at least, I found no other way to take this kind of cases into account). My proposal is: a. to modify the definition of a rule instance [2], to add the definition of the matchedFacts, where matchedFacts(ri) is a set of ground facts that is associated to a rule instance ri; b. to change the definition of rule instance equality to add that the set of the matchedFacts must be equal as well; c. to modify the definition of a matching rule instance [3], to add the condition that matchedFacts(ri) must be a minimal subset of the matched state of facts, such that ri matches matchedFacts(ri) if all the existential formulas in the condition and patterns in rule(ri) are replaced with TRUE. The reason why we need not keep track of the facts that match the existential parts in a rule, is that which specific facts matched the existential parts of a rule does not make a difference wrt refraction (at least with CLIPS and JRules, but that also makes sense wrt intuition and the basic working of a RETE), and the existing definition of a matching rule instance guarantees already that they are matched. That modification in the spec does not change anything wrt to the current characterization of rule instance (in terms of the bindings of the universal variables), except when there are different possible sets of matching facts for the same binding, which, as far as I can see [4], happens only when the (non-existential part of the) condition contains a disjunction where different terms match different ground facts for the same bindings (e.g. the example above, or "test(?x ?y) AND (foo(?x) OR bar(?y)), etc). We can, therefore, consider that this is not a substantial change either: only that we complete our definition to take care of a corner case that we did not think of initially. Of course, the catch is that the conjunction of change 1 and 3 modifies the behaviour of the conflict resolution quite significantly... I started modifying the spec tentatively along these lines, in case we would agree that the proposed changes are needed, and that they are correct. Can we have a PRD task force meeting tomorrow at the usual time (after the RIF telecon) to discuss them? [1] Btw, another point where we might want to be more explicit is wrt the unicity of facts: can we have twice the same fact? That is, what happens if one asserts twice the same fact, and then retract it once: would a condition testing the fact still be true, or not? The current spec strongly suggests that this is not the case (that is, a fact cannot be duplicated), and this is how CLIPS works: shall we clarify the spec in this sense? [2] http://www.w3.org/TR/rif-prd/#def-rule-instance [3] http://www.w3.org/TR/rif-prd/#def-matching-rule-instance [4] that is, if there cannot be multiple instances of the same fact at the same time in the working memory 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 From: Gary Hallmark <gary.hallmark@oracle.com> To: RIF WG <public-rif-wg@w3.org>, Neal Wyse <neal.wyse@oracle.com> Date: 25/11/2009 17:15 Subject: Fwd: Clips behavior Sent by: public-rif-wg-request@w3.org A colleague and I have tested OBR, Jess, and Clips refraction behavior. All are consistent. All contradict PRD. I do not think the issue is whether actions are effective immediately, although there may also be issues with that. Rather, the issue ssems to be that PRD should consider all rule vars in the IF part, even existential vars, as part of the rule instance. Thus far, I have only heard that ILOG works like PRD says, and I haven't actually seen a test report verifying that. -------- Original Message -------- Subject: Clips behavior From: Neal Wyse <neal.wyse@oracle.com> To: Gary Hallmark <Gary.Hallmark@oracle.com> CC: null Hi Gary, I've attached 3 Clips examples. rif1.clp - Modify_loop test rif2.clp, rif3.clp - two approaches to the Modify_noloop test They all loop with Clips which is what I expected. I'm not sure if we can get closer than that for the noloop test. Neal (deftemplate foo (slot count) ) (defrule r3 (and ?f1 <- (foo (count ?c)) (not (not (test (> ?c 0)))) ) => (modify ?f1 (count (- ?c 1))) (printout t (str-cat "r3 fired: ") ?c crlf) ) (assert (foo (count 10))) (run) (deftemplate foo (slot count) ) (defrule r1 ?f1 <- (foo (count ?c&:(> ?c 0))) => (modify ?f1 (count (- ?c 1))) (printout t (str-cat "r1 fired: ") ?c crlf) ) (assert (foo (count 10))) (run) (deftemplate foo (slot count) ) (defrule r2 (and ?f1 <- (foo) (not (and (foo (count ?c)) (test (not (> ?c 0)))) ) ) => (bind ?cnt (fact-slot-value ?f1 count)) ;(modify ?f1 (count (- (fact-slot-value ?f1 count) 1))) (modify ?f1 (count (- ?cnt 1))) (printout t (str-cat "r2 fired: ") ?cnt crlf) ) (assert (foo (count 10))) (run) 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 Monday, 18 January 2010 14:44:32 UTC