2016-04-05 6 views
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 treeの述部を書き込む方法は?グループを使ってech item、outvar、operatorのアクセスをゲートするためのXMLコードの述語をどのように実装すればよいですか?

これらは私の述語です: -

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

答えて

2

はIMO、あなたは少しオフトラックです。

SWI-Prologは、SGML(XMLのベース)、強力な組み込み関数をread/write/analyzeに対応しています。

したがって、要素/ 3に基づいて適切なXML表現に戻す方がよいです。 これは、(第2引数の要素の属性/

?- 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)) 

ノートは($ Xは、それが以前にXに答えリコールするSWI-Prologの方法です)このスニペットインスタンスの

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). 

で(約)行うことができます3)はであり、が失われているため、前回の変換ではであるため、は処理されません。

あなたはXML表現したら:とにかく

?- [library(xpath)]. 

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

編集

、あなたの現在のデータ構造を処理するために必要に応じていくつかのヒントを:groupは、変数アリティを持っているので、(項目の数に応じて) Prolog DBから直接取り出すことはできません。節/ 3が役立ちます。あなたが見ることができるようにPrologの変数アリティの用語では、

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). 

データ構造は疑問選択であるとして...返信用

+0

感謝:我々は、我々はすべてのグループで持っているどのように多くの項目/ 4カウントするようにしたいとしましょうとヒント。 – krishn

+0

はちょうどプロローグと書かれているので、助けてくれてありがとう。 – krishn

関連する問題