declare extract(string,_,_) extract(tag, %s[@a x] y,q) when << s = tag >> -> %s[@a x] extract(tag,y,q) extract(tag,_[_] y,q) -> extract(tag,y,q) extract(_,(),q) -> q split(person[@a name[str(n,_)] children[c] _] y,q) -> let tag = << match List.assoc "gender" a with "M"->"man" | _ ->"woman" >> in let c = split(c,()) in let sons = extract("man",c,()) in let daughters = extract("woman",c,()) in let a' = << ["name",n] >> in %tag[ @a' sons[sons] daughters[daughters] ] split(y,q) split(str(_,y),q) -> split(y,q) split((),q) -> q main(_[x] _) -> split(x,())