this is xml converted in prolog file which i wnated to be get access for each child using parent group.
here is file :-
:- style_check(-singleton).
better('SWI-Prolog', AnyOtherProlog).
group('Running Conditions',
item('No Cylinders are Cut Out
or Chief Limited',
outvar('ECUA', '02012008'),
operator(eq),
constant('false')
),
item('No FWE Request',
outvar('ECUA', '010110'),
operator(eq),
constant('false')
),
item('No Slowdown',
outvar('ECUA', '010124'),
operator(eq),
constant('false')
),
item('Cylinder Monitoring Ok',
outvar('SPSU', '0240'),
operator(eq),
constant('true')
),
item('Second Fuel Supply
System Ready',
outvar('SPCU', '600202'),
operator(eq),
constant('true')
)
).
如何编写tis树的谓词??
这些是我的谓词: -
isgroup(G,X):- group(G,X).
isgroup(X,Gname):- group(G,X),
item(X,gname).
isitem(_,item(_)).
isitem(item(_),outvar(_,_)).
isitem(outvar(_,_),operator(_)).
isitem(operator(_),constant(_)).
答案 0 :(得分:2)
IMO,你有点偏离轨道。
我的意思是,SWI-Prolog拥有对SGML(XML所基于的)的一流支持,以及read / write / analyze兼容资源的强大内置功能。</ p>
因此,您最好根据element / 3恢复到正确的XML表示形式。 这可以(大约)使用此代码段
完成term_xml(Struct, element(Tag, [], Elems)) :-
compound(Struct),
Struct =.. [Tag|Args],
maplist(term_xml, Args, Elems).
term_xml(Struct, element(Tag, [], Elems)) :-
var(Struct),
maplist(term_xml, Args, Elems),
Struct =.. [Tag|Args].
term_xml(Term, Term).
例如($ X是SWI-Prolog回忆以前回答X的方式)
?- term_xml(a(b,c(d,e,f(g,h,i),j)),X).
X = element(a, [], [b, element(c, [], [d, e, element(f, [], [g|...]), j])])
?- term_xml(T,$X).
T = a(b, c(d, e, f(g, h, i), j))
请注意,属性(元素/ 3的第二个arg)未处理,因为从先前的转换中丢失了。
获得XML表示后:
?- [library(xpath)].
?- xpath($X,//f,C).
C = element(f, [], [g, h, i]) ;
false.
修改的
无论如何,处理当前数据结构需要一些提示:由于group
具有可变arity(取决于项目数),因此您无法直接从Prolog DB“获取”它。第3条款将有所帮助。假设我们想要计算所有组中有多少项/ 4:
count_items(C) :- aggregate_all(sum(N), (
current_predicate(group/Arity),
length(Args, Arity),
Group =.. [group|Args],
clause(Group, true),
aggregate_all(count, member(item(_,_,_,_), Args), N)
), C).
正如您所看到的,在Prolog中,变量arity术语作为数据结构是一个值得怀疑的选择......