- From: Sandro Hawke <sandro@w3.org>
- Date: Tue, 19 Jun 2007 08:02:54 -0400
- To: Dave Reynolds <der@hplb.hpl.hp.com>
- Cc: public-rif-wg@w3.org
Dave Reynolds <der@hplb.hpl.hp.com> writes:
>
> Given that the proposed mapping of RDF to RIF will map the triple
> (s,p,o) to the Frame s[p->o], then RDF lists will end up as nested RIF
> Frame structures:
>
> _:1[rdf:first->a, rdf:rest->
> _:2[rdf:first->Y, rdf:rest->
> _:3[rdf:first->c, rdf:rest->rdf:nil]]]
>
> rather than nested function symbols.
>
> It would convenient if the RIF list builtins worked on RDF lists.
>
> Possibilities include:
>
> (1) Use nested-frame rather than nested-pair representation for lists (I
> suspect this is too ugly to be acceptable but thought I'd mention it).
>
> (2) Include in the RIF-specified RDF mapping a transformation so that
> RDF lists map to RIF lists.
>
> (3) Let individual applications include mapping rules which explicitly
> map the nested-frame structures to RIF lists and say nothing about RDF
> lists in the spec.
>
> I'm not sure I like any of these and so don't have a specific proposal
> at this stage. I'm just mentioning it in case anyone has another take on
> this issue.
Just to give a little context, I believe it's long been understood that
one can represents lists with cons+nil (or pair+nil as Harold calls it)
or car+cdr+nil (first+rest+nil as RDF calls it). The first approach
uses a binary function or a ternary predicate; the second uses two
binary predicates. The difference seems to be one of style, and perhaps
efficiency when using certain implementation techniques.
>From a different angle, I believe this is an instance of the common
duality between functions and predicates, and also the one between n-ary
predicates and frames.
If you turn the pair function (pair_f) into the pair predicate (pair_p):
L12 = pair_f(1,2)
=>
pair_p(L12, 1, 2)
then convert the 3-ary pair_p predicate into two 2-ary predicates, in
the frame style (since L12 works as an Id here), we get the RDF list
serialization Dave gave above.
What I'm wondering is if knowing this is a common duality, which will
appear in many applications, helps us. There will be rulesets that
represent the same knowledge in logic-functions, n-ary predicates, and
frames -- and the designers will know they mean the same thing, and
users will want to interchange/combine them. Should they write their
own conversion rules every time (Dave's option 3), or can they just
declare (function x=predicate y =slot-names z1,z2) and have the
conversion be automatic? If it's the latter, then maybe we've solved
the instance of this problem for sequences, saying "it's both; use
whichever you like."
Another approach (which seems heretical to RIF) is to just provide one
option (eg only binary predicates) and force everyone to convert to/from
that style. That gets us semantic interoperability without needing to
convert between the different styles. (This is what SWRL does.)
-- Sandro
Received on Tuesday, 19 June 2007 12:03:16 UTC