caml << let is_man a = (List.assoc "gender" a = "M") >> children(children[x] q) -> split(x,()) children(_ q) | children(_[_] q) -> children(q) name(name[x] q) -> x name(_ q) -> name(q) sons(man[@a x] y,q) -> man[@a x] sons(y,q) sons(_[_] y,q) | sons(_ y,q) -> sons(y,q) sons((),q) -> q daughters(woman[@a x] y,q) -> man[@a x] daughters(y,q) daughters(_[_] y,q) | daughters(_ y,q) -> daughters(y,q) daughters((),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[sons(c,())] daughters[daughters(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,())