countAttr(xElem(_, A, Conts, _), AttrName) :- hasKey(A, AttrName), 1 + countContents(eFlat(Conts), AttrName) ; countAttr(xElem(_, A, Conts, _), AttrName) :- countContents(eFlat(Conts), AttrName) ; countAttr(_, _) :- 0; countContents(Enum, _) :- exhausted(Enum), 0 ; countContents(Enum, AttrName) :- N = countAttr(eValue(Enum), AttrName), N + countContents(eNext(Enum), AttrName) ; countElem(xElem(_, _, Conts, _)) :- 1 + countConts(eFlat(Conts)) ; countElem(_) :- 0; countConts(Enum) :- exhausted(Enum), 0 ; countConts(Enum) :- N = countElem(eValue(Enum)), N + countConts(eNext(Enum)) ; count(xDoc(Conts)) :- countConts(eFlat(Conts)); count(XML) :- countElem(XML); replaceElem(xElem(Old, A, Conts, NS), Old, New) :- xElem(New, A, replaceConts(eFlat(Conts), Old, New), NS) ; replaceElem(xElem(Other, A, Conts, NS), Old, New) :- xElem(Other, A, replaceConts(eFlat(Conts), Old, New), NS) ; replaceElem(Other, _, _) :- Other; replaceConts(Enum, Old, New) :- exhausted(Enum), [] ; replaceConts(Enum, Old, New) :- Result = replaceElem(eValue(Enum), Old, New), [Result | replaceConts(eNext(Enum), Old, New)] ; addElem(Tbl, xElem(Name, A, C, NS)) :- ( hasKey(Tbl, Name), VectOfElems = hGet(Tbl, Name), vAdd(VectOfElems, Name) ## hPut(Tbl, Name, newVector([xElem(Name, A, C, NS)])) ); addElem(Tbl, _) :- true; xdoc() :- a;