- From: L.G. Meredith <lgreg.meredith@gmail.com>
- Date: Sat, 10 Dec 2005 15:23:11 -0800
- To: Michael Dyck <jmdyck@ibiblio.org>
- Cc: www-ql@w3.org
- Message-ID: <5de3f5ca0512101523n5fc1c812qe236edb362ac080b@mail.gmail.com>
Michael,
Thanks for taking a whack at it. But, there was a slight misunderstanding.
The predicates hold of a (sub)collection -- not of an element. That is, a
predicate p_i will have type p_i : Coll -> bool, not p_i: E -> bool, where
Coll is the type of coll and E is the type of e. Additionally, it will
almost never be the case that p_i is the pointwise lifting of some predicate
q:E -> bool. So, this solution will not work.
Best wishes,
--greg
On 12/10/05, Michael Dyck <jmdyck@ibiblio.org> wrote:
>
>
> "L.G. Meredith" wrote:
> >
> > each element of the outermost collection is a pair of collections such
> > that
> >
> > 1. the total set of elements of the pair unions to the original
> > collection, e.g.
> > <coll><ei0/>...<eim0/></coll> U <coll><ej0/>...<ejn0/></coll>
> > = <coll><e0/>...<en/></coll> (ignoring order)
> > 2. the pairs are disjoint, e.g.
> > <coll><ei0/>...<eim0/></coll> /\ <coll><ej0/>...<ejn0/></coll> =
> > <coll/> (the empty collection)
> > 3. the first part of the pair satisfies the predicate p1 and the
> > second satisfies p2; e.g.
> > <coll><ei0/>...<eim0/></coll> satisfies p1; and
> > <coll><ej0/>...<ejn0/></coll> satisfies p2.
>
> So, just to clarify:
> -- If some ei in the input collection satisfies neither p1 nor p2,
> the result will be an empty collection.
> -- If k elements in the input collection satisfy both p1 and p2,
> the result will have 2^k pairs (since each of those elements
> can appear in either part of each pair, and you want all distinct
> combinations).
>
> If so, here's some pseudocode:
>
> function decompose( input-set ):
> element coll { foo( input-set, (), () ) }
>
> function foo( remaining-input, p1s_so_far, p2s_so_far ):
> if remaining-input is empty:
> element coll {
> element coll {p1s_so_far},
> element coll {p2s_so_far}
> }
> else
> let h := head(remaining-input), t := tail(remaining-input)
> return
> if p1(h): foo( t, p1s_so_far + h, p2s_so_far ) else: ()
> ,
> if p2(h): foo( t, p1s_so_far, p2s_so_far + h ) else: ()
>
> It should be fairly straightforward to translate that to proper XQuery.
>
> -Michael
>
>
--
L.G. Meredith
505 N 72nd St
Seattle, WA 98103
+1 206.650.3740
Received on Saturday, 10 December 2005 23:24:56 UTC