/* построение описания УДК в иерархическом формате */ main(X) :- F = readXML("ql"+X+".xml"), ch := eXElem(F, "//item"), List=makeItemList(^ch), doubleVec := newVector([]), Vector = newVector([]), insert(List, Vector), write("-----------------"), XXX = printTree(enum(Vector), ""+X), writeXML("tree"+X+".xml", _XXX;, "w"); makeItemList(DocEnum) :- exhausted(DocEnum), [] ; makeItemList(DocEnum) :- Item = eValue(DocEnum), [Item|makeItemList(eNext(DocEnum))] ; insert([CurItem|Rest], Vector) :- !, ID = sNorm(getXText(CurItem, "//identifier")), VectorToInsert = checkNodes(ID, enum(Vector), Vector), !, vAdd(VectorToInsert, [ID, CurItem, newVector([])]), write("."), insert(Rest, Vector) ; insert([], Vector) :- !, Vector ; refsToList(Enum) :- exhausted(Enum), !, []; refsToList(Enum) :- R = eValue(Enum), !, [R | refsToList(eNext(Enum))]; checkNodes(_, VecEnum, Vec) :- exhausted(VecEnum), !, Vec ; checkNodes(ID, VecEnum, _) :- ItemNode = eValue(VecEnum), Ch = checkNode(ID, ItemNode), !, ( Ch=0, !, ^doubleVec /* элемент уже имеется */ ## SubVec = getSubVec(ItemNode), checkNodes(ID, enum(SubVec), SubVec) ) ; checkNodes(CurStr, VecEnum, Vec) :- checkNodes(CurStr, eNext(VecEnum), Vec) ; checkNode(CurStr, [CurStr | _]) :- !, 0 ; checkNode(CurStr, [NodeStr | _]) :- startsWith(CurStr, NodeStr, 0), 1 ; getSubVec([_, _, SubVec]) :- SubVec; printTree([ID, CurItem, Vec], Super) :- !, Title = sNorm(getXText(CurItem, "//title")), Descr = sNorm(getXText(CurItem, "//description")), Refs = eXElem(CurItem, "//references"), Depr = getXElem(CurItem, "//isReplacedBy"), Status = getXAttr(CurItem, "status"), ( Depr = null, !, Rep = " " ## Rep = Depr ), _ID; _Title; _Descr; _Super; _printTree(enum(Vec), ID); _Rep; _refsToList(Refs); ; printTree(Enum, _) :- exhausted(Enum), !, []; printTree(Enum, Super) :- V = eValue(Enum), [printTree(V, Super) | printTree(eNext(Enum), Super)] ; t(N) :- trace("level", N);