- From: Jos de Bruijn <debruijn@inf.unibz.it>
- Date: Tue, 11 Mar 2008 17:50:53 +0100
- To: Michael Kifer <kifer@cs.sunysb.edu>
- CC: axel@polleres.net, "Public-Rif-Wg (E-mail)" <public-rif-wg@w3.org>
- Message-ID: <47D6B86D.10602@inf.unibz.it>
Michael Kifer wrote: >> Thinking a bit about implementation, implementing built-ins such as >> isNotString might not be as straightforward as I had originally thought. >> >> Namely, isString and isNotString will give rise to multiple minimal models: >> for every IRI a there will be one minimal model in which isString(a) is >> true and one minimal model in which isNotString(a) is true. The lack of >> a single minimal model prevents the use of the usual fixpoint operator >> for computation. > > Why is that? You are probably thinking of them as complements, while they > should not be. Both isNotString(a) and isString(a) should be false in the > minimal model in the absence of other information. They should be complements. I cannot think of any other reasonable definition: isString is defined as the value space of xsd:string; given an interpretation I with a domain D, isNotString is defined as D - (value space of xsd:string) What did you have in mind? Best, Jos > > What we should avoid is the possibility of both isString(a) and > isNotString(a) being true (being false is not a problem). This should be > treated as inconsistency. But this is not a problem - at least in rule > languages. None of these predicates is allowed to be in the conclusion of a > rule. So, the only way to make an IRI a string is to equate it to a > string. So, if you equate an iri xyz to "abc" and 123 then you get > inconsistency anyway. > > For non-rule dialects, e.g., FOL, they will need to work out the > restrictions on the builtins anyway. > > > --michael > > >> Best, Jos >> >> Jos de Bruijn wrote: >>>> I was talking to Harold about the DTB document again and we agreed >>>> both that we do not really like the "negative guards", because they >>>> seem to introduce some special form of negation, which is a bit weird, >>>> as otherwise negation is not part of bld... >>>> >>>> Now let's take the use case, which I suppose brought up the whole idea >>>> about negative guards: >>>> >>>> >>>> I assume the idea was that guards where meant to do some type >>>> checking to prevent other builtins to fail with an error... so we need >>>> these for instance to right something like: >>>> >>>> q(X+1) :- p(X) if X is numeric. >>>> q(0) :- p(X) if X is not Numeric. >>> the most natural way to write these rules is: >>> >>> q(X+1) :- p(X), isNumeric(X). >>> q(0) :- p(X), isNotNumeric(X). >>> >>> In fact, I would be surprised if we would not have the isNumeric and >>> isNotNumeric built-in predicates. (we already have built-ins such as >>> numeric-add and numeric-subtract, so it will be rather silly not to have >>> the isNumeric and isNotNumeric predicates) >>> >>> Now, your first example is an approximation of this, which can be >>> simplified, as Michael pointed out. >>> >>> Your second example is an encoding that one can only understand if one >>> would know about the intricacies of the way RIF deals with errors. >>> Guards are a way to prevent errors occurring in the first place, thereby >>> not requiring users to know about the intricacies of the semantics of >>> errors. >>> >>> >>> Then, I would argue that having "negation" in built-in predicates does >>> not introduce negation in the language. >>> In fact, we already have negation in our built-in predicates. For >>> example, greater-than is the negation of less-or-equal. >>> Perhaps negation is also not the proper term in this context. Perhaps >>> we should rather talk about "complement". Greater-than is the >>> complement of less-or-equal; numeric-equal is the complement of >>> numeric-unequal; isNumeric is the complement of isNotNumeric. >>> Implementing the complement of a built-in predicate is as complex as >>> implementing the built-in predicate itself. >>> >>> Finally, complement of built-in predicates is quite different from the >>> (default) negation usual in logic programs. >>> Consider isNotString(ex:myiri). This statement may be true in some >>> models, and false in others. >>> Consider now not isString(ex:myiri). This statement is true in the >>> minimal model, because it is not known that ex:myiri is a string. >>> >>> >>> Best, Jos >>> >>> >>>> i.e. to make a case distinction, concerning whether the arbuments are >>>> "allowed" for the built-in which should e "guarded". >>>> >>>> Now with the current means we would need to write this something like >>>> as follows: >>>> >>>> q(numeric-add(X,1)) :- p(X), isInteger(X) . >>>> q(numeric-add(X,1)) :- p(X), isDecimal(X) . >>>> q(numeric-add(X,1)) :- p(X), isLong(X) . >>>> >>>> q(0) :- p(X), isNotInteger(X), isNotLong(X), isNotDecimal(X). >>>> >>>> whereas we could write this simpler and without negative guards if we >>>> just add one more guard except the current datatypeguards: >>>> >>>> q(numeric-add(X,1)) :- p(X), isInteger(X) . >>>> q(numeric-add(X,1)) :- p(X), isDecimal(X) . >>>> q(numeric-add(X,1)) :- p(X), isLong(X) . >>>> q(0) :- p(X), isError(X+1). >>>> >>>> I don't know whether this solves all use cases for negative guards, but, >>>> before buying into sneaking in some form of negation which we can later >>>> on have in dialects with negation for free... maybe adding the >>>> isError() guard for the moment and leaving out the negative guards >>>> would do for the moment? >>>> >>>> Axel >>>> >>>> >> -- >> debruijn@inf.unibz.it >> >> Jos de Bruijn, http://www.debruijn.net/ >> ---------------------------------------------- >> One man that has a mind and knows it can >> always beat ten men who haven't and don't. >> -- George Bernard Shaw -- debruijn@inf.unibz.it Jos de Bruijn, http://www.debruijn.net/ ---------------------------------------------- One man that has a mind and knows it can always beat ten men who haven't and don't. -- George Bernard Shaw
Received on Tuesday, 11 March 2008 16:54:35 UTC