RE: [PRD] PRD ch1 review

I thought Christian had done a good job on this. I'll split my review by
chapter + my comments are relatively minor:

 

1.1 Introduction 

This document specifies the production rule dialect of the W3C rule
interchange format (RIF-PRD). It is mostly intended for the designers of
RIF-PRD implementations. 

 

Intended for the designers of RIF-PRD translators? Or is the wording
"implementations" intended to convey that RIF-PRD is also targeting a
new class of rule engines?

 

1.3 Running example 

 

Every potato owned by a chicken gets mashed, the daily grain allowance
of every chicken that owns a potato is increased by 10%, and the mashed
potatoes are deleted from the ownership table IF the chicken is older
than 8 months, the potato's weight (in decigrams) is more than half the
chicken's age (in months), it's not Tuesday, and there is no fox in the
hen house. Jim calls it the "Chicken and Mashed Potatoes", or CMP, rule.


 

This definition seems particularly obtuse! It is neither correct English
(with apologies if that is the intent, but I assume not), nor is it
"pseudo code". While I would not go to the extent of replacing this with
SBVR type syntax (:-)) I would suggest saying something like (and it can
probably be improved further):

 

The following sequence of actions occur: chickens' own potatoes are
mashed, chickens owning potatoes have their daily grain allowance
increased by 10%, and mashed potatoes are no longer considered owned by
the chickens  

When: chickens are older than 8 months, their potatoes weight (in
decigrams) is more than half the chicken owners' age (in months), today
is not Tuesday, and no fox is inside the henhouse.  

 

It would also be worth listing any implied assumptions: chickens are
assumed to own potatoes that are mashed during the execution of the
rule. Etc.

 

Rephrased in RIF-PRD Presentation syntax: 

 

 (* jim:ChickenAndMashedPotatoes *)

 Forall ?chicken ?potato ?allowance ?age ?weight (

   Do( Execute(jim:mash(?potato)) 

 
Assign(?chicken[jim:allowance->External(func:numeric-multiply(?allowance
1.1))])

       Retract(jim:owns(?chicken ?potato)) )

   :-

   And( ?chicken#jim:Chicken 

        ?chicken[jim:age->?age jim:allowance->?allowance]

        External(pred:numeric-greater-than(?age, 8))

        ?potato#jim:Potato 

        ?potato[jim:weight->?weight]

        jim:owns(?chicken ?potato)

        External(pred:numeric-greater-than(?weight
External(func:numeric-divide(?age 2))))

        External(pred:string-not-equal(External(jim:today()),
"Tuesday"))

        Not(External(jim:foxAlarm())) ))

 

I stared at this like a headless chicken for a while, trying to work out
what it means. I conclude that (a) it needs annotating at this part of
the PRD document (b) as RIF is meant to be about interchange, it could
also benefit by being preceded by Jrules and OBR versions (or similar).
Of course, I could have just read the next paragraph, but as a serial
thinker I got stuck trying to interpret symbols without the key.

 

My attempt at annotation below:

(* jim:ChickenAndMashedPotatoes *) 

// rule identifier is "jim"

 Forall ?chicken ?potato ?allowance ?age ?weight ( 

 // local variables for theCurrentChicken, etc, will map onto
rulevariables or attributes of rulevariables

   Do(  

   // rule action list

 Execute(jim:mash(?potato))  

 // rule action: mash theCurrentPotato

 
Assign(?chicken[jim:allowance->External(func:numeric-multiply(?allowance
1.1))]) 

       // rule action: for theCurrentChicken, assign
theCurrentAllowance*1.1 to theCurrentAllowance

       Retract(jim:owns(?chicken ?potato)) ) 

       // remove the fact that theCurrentChicken owns theCurrentPotato

   :-

   And( ?chicken#jim:Chicken 

         // associate some Chicken to theCurrentChicken

         // fails if no Chicken

        ?chicken[jim:age->?age jim:allowance->?allowance]

         // associate theCurrentChicken's properties age and allowance
to the approprate theCurrentAge and theCurrentAllowance

         // fails if no such attributes

        External(pred:numeric-greater-than(?age, 8))

         // check if theCurrentAge is > 8

        ?potato#jim:Potato 

         // associate some Potato to theCurrentPotato

        ?potato[jim:weight->?weight]

         // associate theCurrentPotato's weight to theCurrentWeight

         // fails if no such attribute

        jim:owns(?chicken ?potato)

         // check if theCurrentChicken owns theCurrentPotato

        External(pred:numeric-greater-than(?weight
External(func:numeric-divide(?age 2))))

         // check if theCurrentWeight > theCurrentAge / 2

        External(pred:string-not-equal(External(jim:today()),
"Tuesday"))

         // check if today not Tuesday 

        Not(External(jim:foxAlarm())) ))

         // check no foxAlarm

 

Probably this is still too obtuse / introduces theCurrentX which may be
more confusing. 

The example also makes a big assumption that fact retraction can be
easily mapped to/from the underlying data representation.

 

 

Paul Vincent

TIBCO | Business Optimization | Business Rules & CEP

 

 

> -----Original Message-----

> From: public-rif-wg-request@w3.org
[mailto:public-rif-wg-request@w3.org]

> On Behalf Of Christian de Sainte Marie

> Sent: 10 June 2008 18:28

> To: RIF WG

> Subject: [PRD] PRD ready to review

> 

> 

> Adrian, Gary, all,

> 

> I finished updating the draft of PRD (except for the "compatibility
with

> BLD" appendix): as far as I am concerned, you can start reviewing the

> changes in http://www.w3.org/2005/rules/wiki/PRD.

> 

> I modified section 1 (Overview) quite a lot, to make it more palatable

> for the outside reader (hopefully).

> 

> In section 2 (Syntax), I mostly updated the syntax, to align it with

> BLD. I also removed all the editor notes that were for internal use,
and

> added some to ask for feedback or to warn about the syntax being still

> in flux.

> 

> Re the action part, I left only Assert, Retract and Execute: we

> discussed removing Execute, but it is used in the running example, and

> it is quite typical of production rules, so I decided unilaterally to

> leave it in. Also, I removed the 'Assert'+'target' wrapper around the

> 'Atom' or 'Frame' to be asserted, with an editor note asking for
feedback.

> 

> Re nested 'Forall' and 'pattern', I added an editor note asking for

> feedback, as discussed. And I removed the Ruleset construct, pointing
to

> the Group construct instead (and added an editor note asking for

> feedback :-)

> 

> Finally, I added a subsection for Document, Groups and metadata.

> 

> In section 3, the diff will show a lots of differences, so you should

> probably not care about it and read the new text directly.

> 

> Beside removing internal-purpose editor notes, I added an editor note
re

> the semantics of actions (3.3), as discussed, and I corrected and

> simplified the semantics of Rulesets (3.4), and I added textual

> explanations.

> 

> Regarding the specification of PICK, it was not much easier to specify

> the "no-repeat"+"random" default than to go a bit farther (as I had to

> go a bit farther to understand how to do it properly, anyway), so I

> included the more complete specification. I stopped short of
specifying

> the "priority", "recency" and "all at once" strategies completely,

> because they do not make sense if the syntax does not provide a way to

> indicate that they are intended, and this is something that we did not

> discuss.

> 

> Here again, I added an editor note asking for feedback, as discussed.

> 

> And I added a default specification for FINAL, with an editor note

> asking for feedback, as we discussed.

> 

> What remains to be done (before publication; that is, assuming you do

> not require anymore changes :-):

> - add the links and the references. I will do that by next week;

> - raise the issues that are mentioned in editor notes (and add the
ones

> that are raised by those of your comments that are not addressed in
the

> new version, as well as some that were raised in internal-purpose
editor

> notes that I commented out). I will do that by next week, at least for

> the ones that are mentioned in the doc;

> - Finalize the compatibility with BLD section. I have most of it done,

> but I must check it wrt to the changes I made when aligning the
syntax.

> I should be able to have a version that is consistent with this
version

> of the draft by Friday night;

> - The UML-like diagram. I have the one that corresopnds to the
previous

> version of the draft, so it should not take me more than 10mn. But I

> will do that last...

> 

> Cheers,

> 

> Christian

> 

 

Received on Thursday, 19 June 2008 20:34:25 UTC