0
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(_)).
4

1 回答 1

2

海事组织,你有点偏离轨道。

我的意思是,SWI-Prolog 对SGML (XML 的基础)具有一流的支持,具有强大的内置功能来读取/写入/分析兼容资源。

因此,您最好恢复到基于 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)) 

请注意,属性(element/3 的第二个参数)没有被处理,因为在您之前的转换中丢失了。

一旦你有了 XML 表示:

?- [library(xpath)].

?- xpath($X,//f,C).
C = element(f, [], [g, h, i]) ;
false.

编辑

无论如何,处理您当前的数据结构所需的一些提示:由于group具有可变的数量(取决于项目的数量),您不能直接从 Prolog DB 中“获取”它。条款/3 会有所帮助。假设我们要计算所有组中有多少 item/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 中,作为数据结构的变量参数是一个值得商榷的选择……

于 2016-04-05T09:47:08.137 回答