1%-------------------------------------------------------------
    2% parser RuleML
    3% Marco Gavanelli
    4% 3 May 2006
    5% This is for an old version, I think it's the 0.8, but
    6% I'm not sure
    7%-------------------------------------------------------------
    8
    9:- use_module(parser_utils).   10:- use_module(debug).   11:- use_module(library(xml)).   12
   13ruleml_parse_file(FileName,ICList):-
   14    read_file_to_string(FileName,FileString),
   15    xml_parse(FileString,XML),
   16    ruleml_parse(XML,ICList).
   17
   18ruleml_parse(xml(_,L),ICList):- ruleml_parse(L,ICList).
   19ruleml_parse(element(rulebase,_,L),ICList):- ruleml_parse(L,ICList).
   20ruleml_parse(element(imp,_,[element(head,_,[HeadX]),element(body,_,[BodyX])]),[IC]):-
   21    IC = ic(Body,Head), 
   22    ruleml_conjunct(BodyX,Body),
   23    ruleml_head(HeadX,Head).
   24ruleml_parse(element(imp,_,[element(body,_,[BodyX]),element(head,_,[HeadX])]),[IC]):-
   25    IC = ic(Body,Head), 
   26    ruleml_conjunct(BodyX,Body),
   27    ruleml_head(HeadX,Head).
   28
   29ruleml_parse([X|T],ICList):-
   30    ruleml_parse(X,IC1),
   31    ruleml_parse(T,IC2), append(IC1,IC2,ICList).
   32ruleml_parse([],[]).
   33
   34ruleml_head(element(or,_,L),List):-
   35    ruleml_disjunctlist(L,List).
   36ruleml_head(RuleML,[List]):-
   37    ruleml_conjunct(RuleML,List).
   38
   39ruleml_disjunctlist([],[]).
   40ruleml_disjunctlist([H|T],[A|R]):-
   41    ruleml_conjunct(H,A),
   42    ruleml_disjunctlist(T,R).
   43
   44ruleml_conjunct(element(and,_,L),List):-
   45    ruleml_atomlist(L,List).
   46ruleml_conjunct(RuleML,[Atom]):-
   47    ruleml_atom(RuleML,Atom).
   48
   49
   50ruleml_atomlist([],[]).
   51ruleml_atomlist([H|T],[A|R]):-
   52    ruleml_atom(H,A),
   53    ruleml_atomlist(T,R).
   54
   55ruleml_atom(element(atom,_,[element(opr,_,[element(rel,_,Functor)])|Args]),Atom):-
   56    ruleml_functor(Functor,Fun),
   57    ruleml_termlist(Args,AtomArgs),
   58    Atom =.. [Fun|AtomArgs].
   59
   60ruleml_termlist([],[]).
   61ruleml_termlist([H|T],[A|R]):-
   62    ruleml_term(H,A),
   63    ruleml_termlist(T,R).
   64
   65ruleml_term(element(var,_,[pcdata(String)]),VarName):-
   66    atom_codes(VarName,String).
   67ruleml_term(element(ind,_,[pcdata(String)]),Constant):-
   68    atom_codes(Constant,String).
   69
   70ruleml_functor(Functor,Fconv):-
   71    Functor = [pcdata(F)],
   72    atom_codes(Fun,F),
   73    conv_fun(Fun,Fconv).
   74
   75conv_fun('E',e):- !.
   76conv_fun('EN',en):- !.
   77conv_fun('H',h):- !.
   78conv_fun('!H',noth):- !.
   79conv_fun('!E',note):- !.
   80conv_fun('!EN',noten):- !.
   81conv_fun(X,X)