Re: [ISSUE-94] Object representation

Dave,

If I have this ruleset:

_o#eg:MyClass
_o[eg:att_1->_o]
 rif:error('type violation for eg:att_1, expected a string') :-
     ?o#eg:MyClass AND ?o[eg:att_1 -> ?x] AND
          pred:isLiteralNotOfType(?x, xsd:string)

Isn't it the case that no rif:error is entailed even though att_1 is
bound to something that is not a string?



On Thu, Apr 2, 2009 at 1:17 AM, Dave Reynolds <der@hplb.hpl.hp.com> wrote:
> You can express some notion of constraint in Core. What we do with the OWL 2
> RL rules is define a predicate (rif:error) which signals to the calling
> application that there was an inconsistency and so that any other
> entailments should be disregarded.
>
> rif:error('type violation for eg:att_1, expected a string') :-
>      ?o#eg:MyClass AND ?o[eg:att_1 -> ?x] AND
>           pred:isLiteralNotOfType(?x, xsd:string)
>
> Of course this is not a constraint rule, it doesn't lead to any reasoning
> about constraints nor prevent other inferences being drawn.
>
> But for OWL 2 RL, and I suspect for your case, it does the job, i.e. the
> calling application has a means to check for consistency (of the OWL 2 RL
> ontology in our case) by testing whether the rule set derives rif:error.
>
> I guess the underlying question is what you are trying to achieve by this
> axiomatization of Java constraints in RIF.  You might be tying to:
> (a) communicate the constraints so consuming translators can optimize their
> frame representation,
> (b) provide a means to do consistency checking so that rulesets which
> violate the constraints can be detected at run time,
> (c) use the constraints as part of the inference process to, for example,
> trigger some reasoning-by-cases to find branches which don't violate the
> constraints.
>
> For (a) you want a separate schema language (possibly attached via metadata
> annotations), for (b) the error predicate trick is sufficient, for (c) you
> probably[1] need a different dialect.
>
> Sorry if I'm off base here, I haven't been following the object
> representation discussions very closely.
>
> Dave
>
> [1] You can get some way with expressing real constraints in BLD (not Core)
> by using Jos' trick of entailing an inconsistent term like "1=2".
>
> Gary Hallmark wrote:
>>
>> Thanks, Michael.
>> This thread started talking about "better" object support in RIF, and I
>> interpret that as a need for constraints on frame slot cardinality and
>> datatype. The good news is that BLD and PRD seem expressive enough for
>> cardinality constraints. The difficulty is how to put cardinality
>> constraints in Core so that practical interoperation between BLD and PRD is
>> possible, even though you can't actually express the cardinality constraints
>> as Core rules.
>>
>> It's interesting that BLD is not expressive enough for datatype
>> constraints. I think both cardinality and datatype constraints are needed to
>> translate between RIF and a target rule language that uses an O-O datamodel
>> like Java. To translate to RIF, you need some way to axiomatize a Java
>> object as a frame, and I see no way to do that without cardinality and
>> datatype constraints. To translate from RIF, you need some way to recognize
>> a frame plus its axioms so you know what kind of Java object can be used
>> (what are the cardinalities and datatypes of its fields).
>>
>> On Wed, Apr 1, 2009 at 9:47 PM, Michael Kifer <kifer@cs.sunysb.edu
>> <mailto:kifer@cs.sunysb.edu>> wrote:
>>
>>
>>    On Wed, 1 Apr 2009 21:14:36 -0700
>>    Gary Hallmark <gary.hallmark@oracle.com
>>    <mailto:gary.hallmark@oracle.com>> wrote:
>>
>>     > Michael wrote:
>>     >
>>     > > But builtin predicates cannot appear in the rule heads.
>>     >
>>     >
>>     > Maybe they should be allowed.  Does pred:isString("foo") causes
>>    any more
>>     > problems in the head  than 1=1 ?  Or does pred:isString(1) cause
>> more
>>     > difficulties than does 0=1 ?
>>
>>    No, built-in preds cannot be allowed in BLD in the head in
>>    principle. It will
>>    not be Horn any more. For instance, you might infer
>>    integer(http://abc/cde^^rif:iri) and then this implies Exists ?X
>>    integer(?X)
>>    and ?X=http://abc/cde.
>>
>>
>>     > > What you need are constraints like
>>     > >
>>     > > !- ?o#eg:MyClass AND ?o[eg:att_1 -> ?x] AND Not pred:isString(?x).
>>     >
>>     >
>>     > Yes, that's what I proposed for PRD (PRD has NOT).
>>
>>    So, this is what you want then.
>>
>>
>>     > > But we don't have constraints and (more importantly) Not.
>>     >
>>     > Right.  And I'm not proposing NOT for BLD. I am proposing
>>    datatype guards in
>>     > the head, to function as a "poor man's" datatype integrity
>>    constraint, in
>>     > the same way that we use equality in the head to function as a
>>    poor man's
>>     > cardinality constraint.
>>
>>    No, these guards are anathema to BLD :-)
>>
>>
>>     > > (Constraints can be had if we introduce the predicates True and
>>    False, so
>>     > > it is
>>     > > a minor problem.)
>>     >
>>     > What does your notion of Constraint do when it is violated?  Make
>> the
>>     > ruleset inconsistent? or something else?
>>
>>    Yes, inconsistent. Like in the Oracle DB :-)
>>
>>    m
>>
>>
>>     >
>>     > >
>>     > >
>>     > > michael
>>     > >
>>     > >
>>     > >
>>     > >
>>     > > > > What if I have a fact like
>>     > > > >
>>     > > > > ...[att_1-> 1, att_2->2].
>>     > > > >
>>     > > > > Then the above rule is inconsistent.
>>     > > > Yes, exactly. You have violated the datatype constraint
>>    implied by the
>>     > > > class statement.
>>     > > >
>>     > > > > Also, builtin predicates are not allowed in rule heads.
>>     > > > Well, it seems we now have a use case for allowing them.
>>    Unless you
>>     > > > have another suggestion for expressing such datatype
>>    constraints in
>>     > > > BLD?
>>     > > > >
>>     > > > > michael
>>     > > > >
>>     > > > >
>>     > > > >>
>>     > > > >> (PRD)
>>     > > > >> Forall ?o, ?x, ?y If ?o#eg:MyClass AND ?o[eg:att_1 -> ?x
>>    eg:att_1 ->
>>     > > ?y]
>>     > > > >> AND NOT(?x=?y)
>>     > > > >> Then Do(Assert(rif:cardinality-violation(?o, att_1, ?x,
>>    ?y)) Halt)
>>     > > > >> Forall ?o, ?x If ?o#eg:MyClass AND ?o[eg:att_1 -> ?x ] AND
>>     > > > >> NOT(pred:isString(?x))
>>     > > > >> Then Do(Assert(rif:datatype-violation(?o, att_1, ?x,
>>    xs:string)) Halt)
>>     > > > >> Forall ?o, ?x If ?o#eg:MyClass AND ?o[eg:att_2 -> ?x ] AND
>>     > > > >> NOT(pred:isDate(?x))
>>     > > > >> Then Do(Assert(rif:datatype-violation(?o, att_2, ?x,
>>    xs:date)) Halt)
>>     > > > >>
>>     > > > >> (Core)
>>     > > > >> // just a comment
>>     > > > >>
>>     > > > >> Note that although the meaning of the class statement in
>>    PRD is given
>>     > > as
>>     > > > >> a set of rules on multi-valued frames, it would typically be
>>     > > implemented
>>     > > > >> procedurally using single valued statically typed objects.
>>     > > > >>
>>     > > > >> Gary Hallmark wrote:
>>     > > > >> > Yes, this is one of the top issues to resolve.
>>     > > > >> > I think it is especially important to be able to
>>    translate Core
>>     > > > >> > rulesets with frames to production rules with Java
>>    objects in a way
>>     > > > >> > that is "natural" -- i.e. the Java objects don't need a
>>    bunch of
>>     > > > >> > List-valued fields "just in case" the Core rules might
>>    conclude
>>     > > > >> > multiple slot values.
>>     > > > >> >
>>     > > > >> > More comments inline...
>>     > > > >> >
>>     > > > >> > Christian de Sainte Marie wrote:
>>     > > > >> >>
>>     > > > >> >> All,
>>     > > > >> >>
>>     > > > >> >> In view of the coming F2F, let us restart this thread.
>>     > > > >> >>
>>     > > > >> >> Here is a summary of the requirements, the problem and
>>    the proposed
>>     > > > >> >> solutions that have been discussed at one point or
>> another.
>>     > > > >> >>
>>     > > > >> >> 1. Requirements
>>     > > > >> >>
>>     > > > >> >> The PRD crowd requires a way to represent objects, that
>> is,
>>     > > > >> >> essentially to distingish single-valued attributes from
>>     > > multi-valued
>>     > > > >> >> ones.
>>     > > > >> >>
>>     > > > >> >> Using frames to represent object-attribute-value
>>    triples, that
>>     > > means
>>     > > > >> >> that PRD wants a way
>>     > > > >> >> to distinguish an attribute "att_1" to which the
>>    following axiom
>>     > > > >> >> applies:
>>     > > > >> >>
>>     > > > >> >> (1) Forall ?o, ?x, ?y, If ?o[att_1 -> ?x] AND ?o(att_1
>>    -> ?y] Then
>>     > > ?x
>>     > > > >> >> = ?y
>>     > > > >> >>
>>     > > > >> >>
>>     > > > >> >> from an attribute "att_2" that does not satisfy it.
>>     > > > >> >>
>>     > > > >> >> One consequence of attribute single-valuedness,
>>    apparently the only
>>     > > > >> >> one, is that, in the
>>     > > > >> >> case of a single-valued attribute, the semantics of an
>>    action that
>>     > > > >> >> asserts a new value of
>>     > > > >> >> the attribute, in PR languages, is the replacement of the
>>     > > attribute's
>>     > > > >> >> value by the asserted
>>     > > > >> >> value (whereas it is addition of the newly asserted
>>    value, in the
>>     > > > >> >> case of multi-valued
>>     > > > >> >> attributes).
>>     > > > >> >>
>>     > > > >> >> 2. Problem
>>     > > > >> >>
>>     > > > >> >> One problem is that the axiom (1), above, cannot be
>>    expressed in
>>     > > PRD
>>     > > > >> >> (nor in Core).
>>     > > > >> >>
>>     > > > >> > The axiom is not a very good one.  It's the best we can
>>    do in BLD.
>>     > > It
>>     > > > >> > just says that a cardinality violation makes your ruleset
>>     > > > >> > inconsistent. In PRD, you could say
>>     > > > >> >
>>     > > > >> > Forall ?o, ?x, ?y, If ?o[att_1 -> ?x att_1 -> ?y] AND
>>    NOT(?x=?y)
>>     > > Then
>>     > > > >> > Do(Assert(rif:cardinality-violation(?o, att_1, ?x, ?y))
>>    Halt)
>>     > > > >> >
>>     > > > >> > In Core, there's not much you can say.
>>     > > > >> >
>>     > > > >> >
>>     > > > >> >>
>>     > > > >> >> 3. Proposed solutions
>>     > > > >> >>
>>     > > > >> >> (a) Annotate, in the RIF document, the attribute as
>>    single-valued,
>>     > > > >> >> e.g. using RIF meta-data
>>     > > > >> >> construct;
>>     > > > >> >>
>>     > > > >> >> (b) Modify the Frame construct, so that the
>>    multiplicity of an
>>     > > > >> >> attribute is indicated
>>     > > > >> >> explicitly, e.g. adding a "cardinality" attribute to
>>    the <slot>
>>     > > element;
>>     > > > >> >>
>>     > > > >> >> (c) Specify a new construct, specific to the case of
>>    single valued
>>     > > > >> >> attributes (that is,
>>     > > > >> >> with multiplicity = 1), keeping the Frame construct
>>    unchanged (that
>>     > > > >> >> is the multiplicity of
>>     > > > >> >> attributes is 0..*). E.g. csma's proposal to introduce
>>    a new basic
>>     > > > >> >> term to represent the
>>     > > > >> >> value of a single valued attribute (in [1]; but [1]
>>    contains other
>>     > > > >> >> proposals as well, which
>>     > > > >> >> has muddled the discussion);
>>     > > > >> >>
>>     > > > >> >> (d) Leave attribute multiplicity implicit in condition
>>    formulas and
>>     > > > >> >> rely on RIF document
>>     > > > >> >> analysis to determine attributes multiplicity: the only
>>    attributes
>>     > > > >> >> that need be modelled as
>>     > > > >> >> single valued are those of Frames that appear in
>>    assertions with
>>     > > > >> >> replacement semantics, in
>>     > > > >> >> the conclusion of at least one rule;
>>     > > > >> >>
>>     > > > >> >> (e) Rely on out-of-band information (e.g. interchange
>>    of the
>>     > > intended
>>     > > > >> >> data model, in
>>     > > > >> >> parallel to the RIF document) to determine the
>>    multiplicity of
>>     > > > >> >> Frames' attributes;
>>     > > > >> >>
>>     > > > >> >> [1]
>>     > >
>> http://lists.w3.org/Archives/Public/public-rif-wg/2009Mar/0009.html
>>     > > > >> >>
>>     > > > >> >> </chair>
>>     > > > >> >> My preference goes to (c) (whether my proposed
>>    implementation of it
>>     > > > >> >> or an alternative is a
>>     > > > >> >> different question), for the following reasons:
>>     > > > >> >>
>>     > > > >> >> - (a) uses metadata for something that impacts the
>>    semantics of the
>>     > > > >> >> rules;
>>     > > > >> >>
>>     > > > >> >> - although the data model, that is assumed in the
>>    representation of
>>     > > > >> >> the rules for the data
>>     > > > >> >> to which the rules apply, is something that is completely
>>     > > orthogonal
>>     > > > >> >> to the rules, (a) and
>>     > > > >> >> (b) rely on RIF to interchange explicitely a part of
>>    that data
>>     > > model
>>     > > > >> >> (i.e. the multiplicity
>>     > > > >> >> of attributes);
>>     > > > >> >>
>>     > > > >> >> - (a), (b), (d) and (e) all use the Frame construct to
>>    represent
>>     > > > >> >> single-valued
>>     > > > >> >> attributes as well as multi-valued ones, although the
>>     > > > >> >> object-attribute-value triple is
>>     > > > >> >> redundant in the single-valued case (indeed, for
>>    single-valued
>>     > > > >> >> attributes, the object-
>>     > > > >> >> attribute pair determines the value unequivocally), and
>>    requires,
>>     > > in
>>     > > > >> >> many cases, the
>>     > > > >> >> introduction of dummy variables in the RIF
>>    representation of the
>>     > > rules.
>>     > > > >> >>
>>     > > > >> >> - (d) works only for PRD;
>>     > > > >> >>
>>     > > > >> >> - (e) works only if the required out-of-band information
>> is
>>     > > > >> >> available, and if a way to
>>     > > > >> >> relate it to the RIF representation of the rules has been
>>     > > specified,
>>     > > > >> >> which is a lots of
>>     > > > >> >> ifs...
>>     > > > >> >>
>>     > > > >> > I have a proposal (f).
>>     > > > >> > I propose that we have some common syntax to denote
>>    cardinality
>>     > > > >> > constraints on frame slots in Core (and thus also in BLD
>>    and PRD).
>>     > > BLD
>>     > > > >> > and PRD will give this syntax a semantics (using the
>>    above rules)
>>     > > but
>>     > > > >> > Core will formally treat the cardinality constraints as
>>    comments.
>>     > > > >> >
>>     > > > >> > A PRD translator could translate a single-valued frame
>>    slot to a
>>     > > > >> > nillable single-valued object field (where nil is a
>>    value not in the
>>     > > > >> > Domain). The translator could generate code to test for
>>    an attempt
>>     > > to
>>     > > > >> > assign a value to a non-nil field and produce a
>>     > > > >> > rif:cardinality-violation.
>>     > > > >> >
>>     > > > >> > So what is this common syntax? I propose that we declare
>> the
>>     > > > >> > cardinality constraints once in the ruleset rather than
>>    repeat them
>>     > > > >> > each time a slot is accessed in a frame formula.
>>     Something like
>>     > > > >> >
>>     > > > >> > class eg:MyClass [ eg:att_1->singleton, eg:att_2->set ]
>>     > > > >> >
>>     > > > >> > would say that att_1 is single-valued but att_2 is
>>    multi-valued. Or,
>>     > > > >> >
>>     > > > >> > class eg:MyClass [ eg:att_1->xs:string,
>>    eg:att_2->set(xs:date) ]
>>     > > > >> >
>>     > > > >> > would also give datatype constraints to frame slots,
>>    also nice to
>>     > > have
>>     > > > >> > for better object support.
>>     > > > >> >>
>>     > > > >> >
>>     > > > >> >
>>     > > > >> >
>>     > > > >>
>>     > > > >>
>>     > > > >
>>     > > > >
>>     > > >
>>     > > >
>>     > > >
>>     > >
>>     >
>>     >
>>     >
>>
>>
>>
>>
>> --
>> Cheers,
>>
>> Gary Hallmark
>>
>
>



-- 
Cheers,

Gary Hallmark

Received on Thursday, 2 April 2009 21:26:42 UTC