2016-04-05 1 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?Как реализовать предикаты для кода Xml для доступа к воротам для ech item, outvar и оператора с помощью группы?

это мои предикаты: -

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 совместимыми ресурсами.

Итак, вам лучше вернуться к правильному представлению XML на основе элемента/3. Это может быть сделано (приблизительно) с этим фрагментом

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): не обработанный, т.к. утерян со своего предыдущего преобразования.

После того, как у вас есть представление XML:

?- [library(xpath)]. 

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

редактировать

Во всяком случае, некоторые намеки, требуемые для обработки текущей структуры данных: поскольку group имеет переменную арность (в зависимости от количества элементов) , вы не можете «получить» его непосредственно из базы данных Prolog. пункт 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). 

Как вы можете видеть, в Прологе терминах переменной Arity, как структуры данных сомнительного выбор ...

+0

спасибо за ответ и намеки. – krishn

+0

Я только что заявил с прологом, поэтому спасибо за помощь. – krishn

Смежные вопросы