- From: Michael Dyck <jmdyck@ibiblio.org>
- Date: Sat, 10 Dec 2005 15:43:01 -0800
- To: www-ql@w3.org
"L.G. Meredith" wrote: > > 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. Ah, right. Well, that should be even easier: function decompose( input-set ): element coll { for bipartition in bipartitions( input-set, (), () ) where p1(bipartition/coll[0]) and p2(bipartition/coll[1]) return bipartition } function bipartitions( remaining-input, part1_so_far, part2_so_far ): if remaining-input is empty: element coll { element coll {part1_so_far}, element coll {part2_so_far} } else let h := head(remaining-input), t := tail(remaining-input) return ( bipartitions( t, part1_so_far + h, part2_so_far ) , bipartitions( t, part1_so_far, part2_so_far + h ) ) Or, you could push the "p1 and p2" test into bipartitions(); it would make the latter un-generic, but it might save space, depending on the XQuery implementation. -Michael > 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:43:21 UTC