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)