- From: Gary Hallmark <gary.hallmark@oracle.com>
- Date: Thu, 09 Oct 2008 14:57:36 -0700
- To: Changhai Ke <cke@ilog.fr>
- CC: RIF WG <public-rif-wg@w3.org>
> > insert Book > > { > > ISBN = “978-0-201-72789-0” > > title = “The Power of Events”; > > price = 40; > > year = 2007; > > author = “David Luckham”; > > category = “computer science”; > > }; > Oracle has a textual rule language (called simply "RL") similar to yours. We say assert(new Book(ISBN: “978-0-201-72789-0”, title: “The Power of Events”, price: 40)); We can also call a constructor with arguments. > > > *Non-intrusiveness of production rule systems* > > One important principle of rule systems is being non-intrusive to the > application object model. When an application is designed, the > designer had the freedom to design the object model accordingly to the > pure business requirements. He/she designs the classes, and will > assign them some constructors. Some of them will be with arguments, > and some others without arguments, this is dictated by the business > needs. Only later on, the rules are brought into the application. The > rules must then infer on an existing object model, without requiring > altering it. As a matter of fact, people who write rules are not > necessarily the ones who designed the object model. In this sense, the > inability of RIF-PRD to use any form of constructor violates the > non-intrusiveness of production rule systems. Although we are making > the decision to support only zero-arg constructors, this weakness > needs to be understood and acknowledged. > Yes, we need constructors and methods (eventually). > > > */Necessity of a “modify” for RIF-PRD/* > > A “modify” statement signifies that an object in the WM is being > modified, one or several fields are assigned new values. Below is an > example of syntax in ILOG JRules: > > modify ?b > > { > year = 2008; > > price = 50; > > } > RL is similar: modify(b, year: 2008, price: 50) > > Without a “modify” statement, the object modifications will be > simulated in RIF-PRD using “retract” and “assert”, in the following way: > > retract ?b; > > ?b.year = 2008; > > ?b.price = 50; > > insert ?b; > No. They will be implemented as either: a. Core compatible mode ?b[year->2008 price->50] b. PRD mode retract(?b[year->?oldyear price->?oldprice]) ?b[year->2008 price->50] In Core there is no retract, so you just add new slots/values. Whether this "works" depends on the use case. I might be in favor of allowing wildcards in place of ?oldyear and ?oldprice, so our translators don't have to add these variables and bind them in the condition. > > This is much more verbose and ugly than a native “modify” statement. > Be careful. Beauty is subjective, and we aren't designing an end-user language. This is an interchange format that we would like to work across many kinds of rule engines, not just production rules. That said, I could see that modify(?b[year->2008 price->50]) could be short for retract(?b[year->* price->*]) ?b[year->2008 price->50] However, it has the same semantics. > > A modify statement is required for a few reasons: > > · Most of the production rule systems, ILOG JRules, Fair Isaac, > Drools, Jess, OPS family, have a “modify” statement (sometimes called > “change”, “update”) etc. > yes but they probably have subtle differences in both syntax and semantics. We must define a standard syntax and semantics, and we must consider non-PR systems as well. > > · This indicates that an object is being modified. The engine can be > prepared accordingly. This also improves human readability. > The only real issue is: can you build a translator? Neither your engine nor your users will see RIF-PRD syntax. > > · It is an essential feature to build Truth Maintenance System. > Retract/assert would break the truth maintenance. > I don't think this is true if you consider the frame-level retract/assert. You seem to have been assuming object-level retract -- which is not correct.
Received on Thursday, 9 October 2008 21:59:40 UTC