- 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