caml << let is_man a = (List.assoc "gender" a = "M") >> children(children[x] q) -> x children(_ q) | children(_[_] q) -> children(q) name(name[x] q) -> x name(_ q) -> name(q) sons(person[@a x] y,q) when << is_man a >> -> person[@a x] sons(y,q) sons(person[_] y,q) | sons(_ y,q) -> sons(y,q) sons((),q) -> q daugh(person[@a x] y,q) when << not (is_man a) >> -> person[@a x] daugh(y,q) daugh(person[_] y,q) | daugh(_ y,q) -> daugh(y,q) daugh((),q) -> q split(person[@a x] y,q) -> let tag : string = << if is_man a then "man" else "woman" >> in let q = split(y,q) in let c = children(x) in let c = sons[split(sons(c,()),())] daughters[split(daugh(c,()),())] in match name(x) with [ %n _ -> let a' = << ["name",n] >> in %tag[ @a' c ] q ] split(_ y,q) -> split(y,q) split((),q) -> q main(doc[x] _) -> split(x,())