2016-04-05 8 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') 
     )    
). 

Wie schreibe ich die Prädikate für diesen Baum?Wie implementiere ich die Prädikate für den Xml-Code, um den Zugriff für ech item, outvar und operator über die Gruppe zu steuern?

das sind meine Prädikate: -

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

Antwort

2

IMO, Sie ein bisschen off-Weg sind.

Was ich meine, SWI-Prolog verfügt über erstklassige Unterstützung für SGML (von dem XML-basiert), mit leistungsstarken builtins zu read/Schreiben/analyze konformen Ressourcen.

Sie sollten also lieber auf die richtige XML-Darstellung basierend auf element/3 zurückgreifen. Dies kann mit diesem Code-Schnipsel

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

zum Beispiel ($ X es ist SWI-Prolog Art und Weise zu erinnern, vorher beantwortete 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)) 

Notiz, die Attribute (Zweites Argument des Elements durchgeführt (ungefähr) werden/3) sind nicht behandelt, seit verloren von Ihrer bisherigen Konvertierung.

Sobald Sie haben eine XML-Darstellung:

?- [library(xpath)]. 

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

bearbeitet

Wie auch immer, ein paar Hinweise, wie benötigt, um Ihre aktuelle Datenstruktur zu handhaben: Da group hat variable arity (je nach Anzahl der Elemente) , Sie können es nicht direkt von Prolog DB "holen". Klausel/3 wird helfen. Lassen Sie uns sagen, dass wir, wie viele Artikel zählen möchten/4 wir in allen Gruppen haben:

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

Wie Sie, in Prolog Variable arity Bedingungen sehen können als Datenstrukturen eine fragwürdige Wahl sind ...

+0

Dank für die Antwort und Hinweise. – krishn

+0

bin gerade mit prolog angegeben, also danke für Hilfe. – krishn