:- module(xdrs2xml,[drs2xml/2,
der2xml/3,
xdrs2xml/2]).
:- use_module(semlib(errors),[warning/2]).
:- use_module(library(lists),[member/2,append/3]).
:- use_module(boxer(betaConversionDRT),[betaConvert/2]).
:- use_module(boxer(alphaConversionDRT),[alphaConvertDRS/2]).
:- use_module(boxer(drs2fdrs),[instDrs/1]).
/*========================================================================
Converting DRSs to XML
========================================================================*/
drs2xml(DRS,Stream):- drs2xml(DRS,Stream,1,[]).
der2xml(Der,I,Stream):-
format(Stream,' ~n',[I]),
deri2xml(Der,Stream,2),
format(Stream,' ~n',[]).
xdrs2xml(XDRS,Stream):-
XDRS=xdrs(Tags,DRS),
write(Stream,' '), nl(Stream),
tokentags2xml(Tags,Stream),
write(Stream,' '), nl(Stream),
drs2xml(DRS,Stream,1,Tags).
/*========================================================================
Converting CCG derivation to XML (with tab insertion)
========================================================================*/
deri2xml(t(Cat,Token,Sem,Att,Index),Stream,Tab):- !,
tab(Stream,Tab), format(Stream,'~n',[Index]),
NewTab is Tab + 2,
symbol(Token,NiceToken),
tab(Stream,Tab), format(Stream,' ~p~n',[NiceToken]),
tags2xml(Att,Stream,Tab),
tab(Stream,Tab), format(Stream,' ~n',[]),
numbervars(Cat,23,_),
cat2xml(Cat,Stream,NewTab),
tab(Stream,Tab), format(Stream,' ~n',[]),
tab(Stream,Tab), format(Stream,' ~n',[]),
betaConvert(Sem,Red),
\+ \+ (instDrs(Red),
drs2xml(Red,Stream,NewTab,[])),
tab(Stream,Tab), format(Stream,' ~n',[]),
tab(Stream,Tab), format(Stream,'~n',[]).
deri2xml(Der,Stream,Tab):-
Der =.. [Rule,Cat,_,Sem,_,Tokens,Under],
member(Rule,[tc,ftr,btr]), !,
NewTab is Tab + 1,
NextTab is Tab + 1,
tab(Stream,Tab), urule2xml(Stream,Rule),
tab(Stream,Tab), format(Stream,' ~n',[]),
numbervars(Cat,23,_),
cat2xml(Cat,Stream,NewTab),
tab(Stream,Tab), format(Stream,' ~n',[]),
tab(Stream,Tab), format(Stream,' ~n',[]),
betaConvert(Sem,Red),
\+ \+ (instDrs(Red),
drs2xml(Red,Stream,NewTab,[])),
tab(Stream,Tab), format(Stream,' ~n',[]),
deri2xml(Under,Stream,NewTab),
tab(Stream,NewTab), format(Stream,'~n',[]),
tokens2xml(Tokens,NextTab,Stream),
tab(Stream,NewTab), format(Stream,'~n',[]),
tab(Stream,Tab), format(Stream,'~n',[]).
deri2xml(Der,Stream,Tab):-
Der =.. [conj,Cat,_,Sem,_,Tokens,Left,Right], !,
NewTab is Tab + 1,
NextTab is Tab + 2,
tab(Stream,Tab), brule2xml(Stream,conj),
tab(Stream,NewTab), format(Stream,'~n',[]),
numbervars(Cat,23,_),
cat2xml(Cat,Stream,NextTab),
tab(Stream,NewTab), format(Stream,'~n',[]),
tab(Stream,NewTab), format(Stream,'~n',[]),
betaConvert(Sem,Red),
\+ \+ (instDrs(Red),
drs2xml(Red,Stream,NewTab,[])),
tab(Stream,NewTab), format(Stream,'~n',[]),
deri2xml(Left,Stream,NewTab),
deri2xml(Right,Stream,NewTab),
tab(Stream,NewTab), format(Stream,'~n',[]),
tokens2xml(Tokens,NextTab,Stream),
tab(Stream,NewTab), format(Stream,'~n',[]),
tab(Stream,Tab), format(Stream,'~n',[]).
deri2xml(Der,Stream,Tab):-
Der =.. [Rule,Cat,Sem,_,Tokens,Left,Right], !,
NewTab is Tab + 1,
NextTab is Tab + 2,
tab(Stream,Tab), brule2xml(Stream,Rule),
tab(Stream,NewTab), format(Stream,'~n',[]),
numbervars(Cat,23,_),
cat2xml(Cat,Stream,NextTab),
tab(Stream,NewTab), format(Stream,'~n',[]),
tab(Stream,NewTab), format(Stream,'~n',[]),
betaConvert(Sem,Red1),
alphaConvertDRS(Red1,Red), % needed for functions introduced by NN compounds...
\+ \+ (instDrs(Red),
drs2xml(Red,Stream,NewTab,[])),
tab(Stream,NewTab), format(Stream,'~n',[]),
deri2xml(Left,Stream,NewTab),
deri2xml(Right,Stream,NewTab),
tab(Stream,NewTab), format(Stream,'~n',[]),
tokens2xml(Tokens,NextTab,Stream),
tab(Stream,NewTab), format(Stream,'~n',[]),
tab(Stream,Tab), format(Stream,'~n',[]).
deri2xml(_,_,_).
/*========================================================================
Producing CCG unary rules in XML
========================================================================*/
urule2xml(Stream,ftr):- !,
format(Stream,'~n',[]).
urule2xml(Stream,btr):- !,
format(Stream,'~n',[]).
urule2xml(Stream,tc):- !,
format(Stream,'~n',[]).
urule2xml(Stream,Type):-
format(Stream,'~n',[Type]).
/*========================================================================
Producing CCG binary rules in XML
========================================================================*/
brule2xml(Stream,Type):- Type = fa, !,
format(Stream,'~n',[Type]).
brule2xml(Stream,Type):- Type = ba, !,
format(Stream,'~n',[Type]).
brule2xml(Stream,Type):- member(Type,[fc,gfc]), !,
format(Stream,'~n',[Type]).
brule2xml(Stream,Type):- member(Type,[bc,gbc]), !,
format(Stream,'~n',[Type]).
brule2xml(Stream,Type):- member(Type,[fxc,gfxc]), !,
format(Stream,'~n',[Type]).
brule2xml(Stream,Type):- member(Type,[bxc,gbxc]), !,
format(Stream,'~n',[Type]).
brule2xml(Stream,Type):- Type = fxs, !,
format(Stream,'~n',[Type]).
brule2xml(Stream,Type):- Type = bxs, !,
format(Stream,'~n',[Type]).
brule2xml(Stream,Type):- Type = fs, !,
format(Stream,'~n',[Type]).
brule2xml(Stream,Type):- Type = bs, !,
format(Stream,'~n',[Type]).
brule2xml(Stream,Type):- Type = conj, !,
format(Stream,'~n',[]).
brule2xml(Stream,Type):-
format(Stream,'~n',[Type]).
/*========================================================================
Converting CCG categories to XML (with tab insertion)
========================================================================*/
cat2xml(Cat,Stream,Tab):-
var(Cat), !,
tab(Stream,Tab), format(Stream,' ~p~n',[Cat]).
cat2xml('/'(L,R),Stream,Tab):- !,
tab(Stream,Tab), format(Stream,'~n',[]),
NewTab is Tab + 1,
cat2xml(L,Stream,NewTab),
cat2xml(R,Stream,NewTab),
tab(Stream,Tab), format(Stream,'~n',[]).
cat2xml('\\'(L,R),Stream,Tab):- !,
tab(Stream,Tab), format(Stream,'~n',[]),
NewTab is Tab + 1,
cat2xml(L,Stream,NewTab),
cat2xml(R,Stream,NewTab),
tab(Stream,Tab), format(Stream,'~n',[]).
cat2xml(Cat:_,Stream,Tab):-
member(Cat,[n,conj]), !, %%% Do not output features on N, conj
cat2xml(Cat,Stream,Tab).
cat2xml(Cat:Feature,Stream,Tab):-
atom(Cat), !,
upcase_atom(Cat,Up),
tab(Stream,Tab), format(Stream,' ~p~n',[Up]).
cat2xml(Cat,Stream,Tab):-
member(Cat:New,[conj:conj,comma:',',semi:';']), !,
tab(Stream,Tab), format(Stream,' ~p~n',[New]).
cat2xml(Cat,Stream,Tab):- !,
upcase_atom(Cat,Up),
tab(Stream,Tab), format(Stream,' ~p~n',[Up]).
/*========================================================================
Guess Sentence ID (a bit of a hack, obviously!)
========================================================================*/
getIDs(L:drs([_:I1:_|Dom],Conds),I3):- append(I1,I2,I3), getIDs(L:drs(Dom,Conds),I2).
getIDs(_:drs([],Conds),I):- getIDs(Conds,I).
getIDs([],[]).
getIDs([_:I1:Cond|Conds],I3):- !, append(I1,I2,I3), getIDs([Cond|Conds],I2).
getIDs([prop(_,B)|Conds],I3):- !, getIDs(B,I1), append(I1,I2,I3), getIDs(Conds,I2).
getIDs([not(B)|Conds],I3):- !, getIDs(B,I1), append(I1,I2,I3), getIDs(Conds,I2).
getIDs([pos(B)|Conds],I3):- !, getIDs(B,I1), append(I1,I2,I3), getIDs(Conds,I2).
getIDs([nec(B)|Conds],I3):- !, getIDs(B,I1), append(I1,I2,I3), getIDs(Conds,I2).
getIDs([or(B1,B2)|Conds],I5):- !, getIDs(B1,I1), getIDs(B2,I2), append(I1,I2,I3), append(I3,I4,I5), getIDs(Conds,I4).
getIDs([imp(B1,B2)|Conds],I5):- !, getIDs(B1,I1), getIDs(B2,I2), append(I1,I2,I3), append(I3,I4,I5), getIDs(Conds,I4).
getIDs([duplex(_,B1,_,B2)|Conds],I5):- !, getIDs(B1,I1), getIDs(B2,I2), append(I1,I2,I3), append(I3,I4,I5), getIDs(Conds,I4).
getIDs([_|Conds],I):- !, getIDs(Conds,I).
getIDs(_,[]).
/*========================================================================
Converting DRSs to XML (with tab insertion)
========================================================================*/
drs2xml(Var,Stream,Tab,_):-
var(Var), !,
tab(Stream,Tab), format(Stream,'~p~n',Var).
drs2xml(Var,Stream,Tab,_):-
atom(Var), !,
tab(Stream,Tab), format(Stream,'~p~n',Var).
drs2xml(Var,Stream,Tab,_):-
Var =.. ['$VAR',_], !,
tab(Stream,Tab), format(Stream,'~p~n',Var).
drs2xml(drs(D,C),Stream,Tab,Words):- !,
drs2xml(l:drs(D,C),Stream,Tab,Words).
drs2xml(Label:drs(D,C),Stream,Tab,[]):- !,
NewTab is Tab + 1,
NextTab is Tab + 2,
tab(Stream,Tab), format(Stream,'~n',[Label]),
tab(Stream,NewTab), format(Stream,'~n',[]),
dom2xml(D,Stream,NextTab),
tab(Stream,NewTab), format(Stream,'~n',[]),
tab(Stream,NewTab), format(Stream,'~n',[]),
conds2xml(C,Stream,NextTab),
tab(Stream,NewTab), format(Stream,'~n',[]),
tab(Stream,Tab), format(Stream,'~n',[]).
drs2xml(Label:drs(D,C),Stream,Tab,Words):- !,
NewTab is Tab + 1,
NextTab is Tab + 2,
tab(Stream,Tab),
format(Stream,'~n',[Label]),
tab(Stream,NewTab), format(Stream,'~n',[]),
getIDs(Label:drs(D,C),IDs),
sort(IDs,SortedIDs),
tokens2xml(SortedIDs,Words,NextTab,Stream),
tab(Stream,NewTab), format(Stream,'~n',[]),
tab(Stream,NewTab), format(Stream,'~n',[]),
dom2xml(D,Stream,NextTab),
tab(Stream,NewTab), format(Stream,'~n',[]),
tab(Stream,NewTab), format(Stream,'~n',[]),
conds2xml(C,Stream,NextTab),
tab(Stream,NewTab), format(Stream,'~n',[]),
tab(Stream,Tab), format(Stream,'~n',[]).
drs2xml(alfa(Type,B1,B2),Stream,Tab,_):- !,
tab(Stream,Tab), format(Stream,'~n',[Type]),
NewTab is Tab + 1,
drs2xml(B1,Stream,NewTab,[]),
drs2xml(B2,Stream,NewTab,[]),
tab(Stream,Tab), format(Stream,'~n',[]).
drs2xml(lam(X,B),Stream,Tab,_):- !,
tab(Stream,Tab), format(Stream,'~n',[]),
NewTab is Tab + 1,
tab(Stream,Tab), format(Stream,' ~p~n',X),
drs2xml(B,Stream,NewTab,[]),
tab(Stream,Tab), format(Stream,'~n',[]).
drs2xml(app(B1,B2),Stream,Tab,_):- !,
tab(Stream,Tab), format(Stream,'~n',[]),
NewTab is Tab + 1,
drs2xml(B1,Stream,NewTab,[]),
drs2xml(B2,Stream,NewTab,[]),
tab(Stream,Tab), format(Stream,'~n',[]).
drs2xml(merge(B1,B2),Stream,Tab,_):- !,
tab(Stream,Tab), format(Stream,'~n',[]),
NewTab is Tab + 1,
drs2xml(B1,Stream,NewTab,[]),
drs2xml(B2,Stream,NewTab,[]),
tab(Stream,Tab), format(Stream,'~n',[]).
drs2xml(sdrs(Labs,Rels),Stream,Tab,Words):- !,
NewTab is Tab + 1,
NewerTab is NewTab + 1,
tab(Stream,Tab), format(Stream,'~n',[]),
tab(Stream,NewTab), format(Stream,'~n',[]),
sdrs2xml(Labs,Stream,NewerTab,Words,Rels),
tab(Stream,NewTab), format(Stream,'~n',[]),
tab(Stream,NewTab), format(Stream,'~n',[]),
relations2xml(Rels,Stream,NewerTab),
tab(Stream,NewTab), format(Stream,'~n',[]),
tab(Stream,Tab), format(Stream,'~n',[]).
drs2xml(Error,_,_,_):- !,
warning('cannot print DRS in XML: ~p',[Error]).
/*========================================================================
Converting SDRS to XML
========================================================================*/
sdrs2xml([],_,_,_,_):- !.
sdrs2xml([lab(K,B)|L],Stream,Tab,Words,Rel):- !,
label2xml(K,B,Stream,Tab,Words),
sdrs2xml(L,Stream,Tab,Words,Rel).
sdrs2xml([sub(lab(K1,B1),lab(K2,B2))|L],Stream,Tab,Words,Rel):-
tab(Stream,Tab), format(Stream,'~n',[]),
label2xml(K1,B1,Stream,Tab,Words),
label2xml(K2,B2,Stream,Tab,Words),
tab(Stream,Tab), format(Stream,'~n',[]),
sdrs2xml(L,Stream,Tab,Words,Rel).
/*========================================================================
Converting SDRS constituent to XML
========================================================================*/
label2xml(K,B,Stream,Tab,Words):-
tab(Stream,Tab), format(Stream,'~n',[K]),
NewTab is Tab + 1,
drs2xml(B,Stream,NewTab,Words),
tab(Stream,Tab), format(Stream,'~n',[]).
/*========================================================================
Converting SDRS relations to XML
========================================================================*/
relations2xml([],_,_).
relations2xml([Index:rel(K1,K2,Rel)|L],Stream,Tab):-
tab(Stream,Tab), format(Stream,'~n',[K1,K2,Rel]),
index2xml(Index,Stream,Tab),
tab(Stream,Tab), format(Stream,'~n',[]),
relations2xml(L,Stream,Tab).
/*========================================================================
Converting DRS-domains to XML (with tab insertion)
========================================================================*/
dom2xml([],_,_).
dom2xml([Label:Index:X|L],Stream,Tab):- !,
tab(Stream,Tab),
format(Stream,'~n',[Label,X]),
index2xml(Index,Stream,Tab),
tab(Stream,Tab),
format(Stream,'~n',[]),
dom2xml(L,Stream,Tab).
dom2xml([Index:X|L],Stream,Tab):- !,
dom2xml([l:Index:X|L],Stream,Tab).
dom2xml([X|L],Stream,Tab):-
warning('cannot print referent in XML: ~p',[X]),
dom2xml(L,Stream,Tab).
/*========================================================================
Converting DRS-conditions to XML (with tab insertion)
========================================================================*/
conds2xml([],_,_).
conds2xml([Label:Index:Cond|L],Stream,Tab):-
tab(Stream,Tab), format(Stream,'~n',[Label]),
NewTab is Tab + 1,
cond2xml(Index:Cond,Stream,NewTab), !,
tab(Stream,Tab), format(Stream,'~n',[]),
conds2xml(L,Stream,Tab).
conds2xml([Index:Cond|L],Stream,Tab):- !,
conds2xml([l:Index:Cond|L],Stream,Tab).
conds2xml([X|L],Stream,Tab):-
warning('cannot print condition in XML: ~p',[X]),
format(Stream,'~n',[]),
conds2xml(L,Stream,Tab).
/*========================================================================
Converting DRS-condition to XML (with tab insertion)
========================================================================*/
cond2xml(Index:not(B),Stream,Tab):- !,
tab(Stream,Tab), format(Stream,'~n',[]),
index2xml(Index,Stream,Tab),
NewTab is Tab + 1,
drs2xml(B,Stream,NewTab,[]),
tab(Stream,Tab), format(Stream,'~n',[]).
cond2xml(Index:nec(B),Stream,Tab):- !,
tab(Stream,Tab), format(Stream,'~n',[]),
index2xml(Index,Stream,Tab),
NewTab is Tab + 1,
drs2xml(B,Stream,NewTab,[]),
tab(Stream,Tab), format(Stream,'~n',[]).
cond2xml(Index:pos(B),Stream,Tab):- !,
tab(Stream,Tab), format(Stream,'~n',[]),
index2xml(Index,Stream,Tab),
NewTab is Tab + 1,
drs2xml(B,Stream,NewTab,[]),
tab(Stream,Tab), format(Stream,'~n',[]).
cond2xml(Index:prop(X,B),Stream,Tab):- !,
tab(Stream,Tab), format(Stream,'~n',[X]),
index2xml(Index,Stream,Tab),
NewTab is Tab + 1,
drs2xml(B,Stream,NewTab,[]),
tab(Stream,Tab), format(Stream,'~n',[]).
cond2xml(Index:or(B1,B2),Stream,Tab):- !,
tab(Stream,Tab), format(Stream,'~n',[]),
index2xml(Index,Stream,Tab),
NewTab is Tab + 1,
drs2xml(B1,Stream,NewTab,[]),
drs2xml(B2,Stream,NewTab,[]),
tab(Stream,Tab), format(Stream,'~n',[]).
cond2xml(Index:imp(B1,B2),Stream,Tab):- !,
tab(Stream,Tab), format(Stream,'~n',[]),
index2xml(Index,Stream,Tab),
NewTab is Tab + 1,
drs2xml(B1,Stream,NewTab,[]),
drs2xml(B2,Stream,NewTab,[]),
tab(Stream,Tab), format(Stream,'~n',[]).
cond2xml(Index:duplex(Type,B1,Var,B2),Stream,Tab):- !,
tab(Stream,Tab), format(Stream,'~n',[Type,Var]),
index2xml(Index,Stream,Tab),
NewTab is Tab + 1,
drs2xml(B1,Stream,NewTab,[]),
drs2xml(B2,Stream,NewTab,[]),
tab(Stream,Tab), format(Stream,'~n',[]).
cond2xml(Index:pred(Arg,X,Type,Sense),Stream,Tab):- !,
symbol(X,Y),
tab(Stream,Tab), format(Stream,'~n',[Arg,Y,Type,Sense]),
index2xml(Index,Stream,Tab),
tab(Stream,Tab), format(Stream,'~n',[]).
cond2xml(Index:role(Arg2,Arg1,X,-1),Stream,Tab):- !,
symbol(X,Y),
tab(Stream,Tab), format(Stream,'~n',[Arg1,Arg2,Y,1]),
index2xml(Index,Stream,Tab),
tab(Stream,Tab),
format(Stream,'~n',[]).
cond2xml(Index:role(Arg1,Arg2,X,1),Stream,Tab):- !,
symbol(X,Y),
tab(Stream,Tab), format(Stream,'~n',[Arg1,Arg2,Y,1]),
index2xml(Index,Stream,Tab),
tab(Stream,Tab),
format(Stream,'~n',[]).
cond2xml(Index:rel(X,Y,Sym,0),Stream,Tab):-
symbol(Sym,=), !,
cond2xml(Index:eq(X,Y),Stream,Tab).
cond2xml(Index:rel(Arg1,Arg2,X,Sense),Stream,Tab):- !,
symbol(X,Y),
tab(Stream,Tab), format(Stream,'~n',[Arg1,Arg2,Y,Sense]),
index2xml(Index,Stream,Tab),
tab(Stream,Tab),
format(Stream,'~n',[]).
cond2xml(Index:named(Arg,X,Class,Type),Stream,Tab):- !,
symbol(X,Y),
tab(Stream,Tab), format(Stream,'~n',[Arg,Y,Class,Type]),
index2xml(Index,Stream,Tab),
tab(Stream,Tab), format(Stream,'~n',[]).
cond2xml(Index:card(X,Y,Type),Stream,Tab):- !,
tab(Stream,Tab), format(Stream,'~n',[X,Y,Type]),
index2xml(Index,Stream,Tab),
tab(Stream,Tab), format(Stream,'~n',[]).
cond2xml(Index:timex(X,Y),Stream,Tab):- !,
tab(Stream,Tab), format(Stream,'~n',[X]),
index2xml(Index,Stream,Tab),
timex2xml(Y,Stream,Tab),
tab(Stream,Tab), format(Stream,'~n',[]).
cond2xml(Index:eq(X,Y),Stream,Tab):- !,
tab(Stream,Tab), format(Stream,'~n',[X,Y]),
index2xml(Index,Stream,Tab),
tab(Stream,Tab), format(Stream,'~n',[]).
/*========================================================================
Timex
========================================================================*/
timex2xml(date(_:A,_:B,_:C),Stream,Tab):- !,
tab(Stream,Tab), format(Stream,'~w~w~w~n',[A,B,C]).
timex2xml(date(_:Z,_:A,_:B,_:C),Stream,Tab):- !,
tab(Stream,Tab), format(Stream,'~w~w~w~w~n',[Z,A,B,C]).
timex2xml(time(_:A,_:B,_:C),Stream,Tab):- !,
tab(Stream,Tab), format(Stream,'~n',[A,B,C]).
timex2xml(X,Stream,Tab):- !,
tab(Stream,Tab), format(Stream,'~p~n',[X]).
/*========================================================================
Tokens (already known)
========================================================================*/
tokens2xml([],_,_).
tokens2xml([Token|L],Tab,Stream):-
symbol(Token,NiceToken),
tab(Stream,Tab), format(Stream,'~w~n',[NiceToken]),
tokens2xml(L,Tab,Stream).
/*========================================================================
Tokens (from list of words)
========================================================================*/
tokens2xml(I,[presup|Words],Tab,Stream):- !, tokens2xml(I,Words,Tab,Stream,presup).
tokens2xml(I,Words,Tab,Stream):- !, tokens2xml(I,Words,Tab,Stream,sentence).
tokens2xml([],_,_,_,_).
tokens2xml([Index],Words,Tab,Stream,_):-
member(Index:[tok:Tok|_],Words), !,
symbol(Tok,NiceToken),
tab(Stream,Tab), format(Stream,'~w~n',[NiceToken]).
tokens2xml([Index1,Index2|L],Words,Tab,Stream,Type):-
Type = presup,
member(Index1:[tok:Tok|_],Words), !,
symbol(Tok,NiceToken),
tab(Stream,Tab), format(Stream,'~w~n',[NiceToken]),
( Dif is Index2 - Index1,
Dif > 1, tab(Stream,Tab), format(Stream,'|~n',[])
; true ),
tokens2xml([Index2|L],Words,Tab,Stream,Type).
tokens2xml([Index1,Index2|L1],Words,Tab,Stream,Type):-
Type = sentence,
member(Index1:[tok:Tok|_],Words), !,
symbol(Tok,NiceToken),
tab(Stream,Tab), format(Stream,'~w~n',[NiceToken]),
( S is Index1-mod(Index1,1000),
S is Index2-mod(Index2,1000),
Dif is Index2 - Index1, Dif > 1, !, Index is Index1 + 1,
L2 = [Index,Index2|L1]
; L2 = [Index2|L1] ),
tokens2xml(L2,Words,Tab,Stream,Type).
tokens2xml([_|L],Words,Tab,Stream,Type):-
tokens2xml(L,Words,Tab,Stream,Type).
/*========================================================================
Check whether word is part of sentence
========================================================================*/
wordInSentence(N1,N2):-
X is (N1-(mod(N1,1000)))/1000,
X is (N2-(mod(N2,1000)))/1000.
/*========================================================================
Token Tags
========================================================================*/
tokentags2xml([],_).
tokentags2xml([Index:Tags|L],Stream):-
format(Stream,' ~n',[Index]),
format(Stream,' ~n',[]),
tags2xml(Tags,Stream,4),
format(Stream,' ~n',[]),
format(Stream,' ~n',[]),
tokentags2xml(L,Stream).
/*========================================================================
Producing tags in XML
========================================================================*/
tags2xml([],_,_):- !.
tags2xml([lemma:Lemma|L],Stream,Tab):- !,
symbol(Lemma,NiceLemma),
tab(Stream,Tab), format(Stream,' ~p~n',[NiceLemma]),
tags2xml(L,Stream,Tab).
tags2xml([tok:Tok|L],Stream,Tab):- !,
symbol(Tok,NiceTok),
tab(Stream,Tab), format(Stream,' ~p~n',[NiceTok]),
tags2xml(L,Stream,Tab).
tags2xml([verbnet:Roles|L],Stream,Tab):- !,
length(Roles,N),
tab(Stream,Tab), format(Stream,' ~p~n',[N,Roles]),
tags2xml(L,Stream,Tab).
tags2xml([Feature:Value|L],Stream,Tab):-
tab(Stream,Tab), format(Stream,' ~p~n',[Feature,Value]),
tags2xml(L,Stream,Tab).
/*========================================================================
Indexes
========================================================================*/
index2xml(I,Stream,Tab):-
tab(Stream,Tab), format(Stream,'~n',[]),
index2xml2(I,Stream,Tab),
tab(Stream,Tab), format(Stream,'~n',[]).
index2xml2([],_,_):- !.
index2xml2([X|L],Stream,Tab):-
number(X), !,
Pos is mod(X,1000),
tab(Stream,Tab), format(Stream,'i~p~n',[Pos,X]),
index2xml2(L,Stream,Tab).
index2xml2([_|L],Stream,Tab):-
index2xml2(L,Stream,Tab).
/*========================================================================
Deal with special symbols
========================================================================*/
symbol(f(_,_,V1),V2):- !, V1 = V2.
symbol(N1,N2):- number(N1), !, N2 = N2.
symbol(S1,S2):- atom_codes(S1,C1), check(C1,C2), atom_codes(S2,C2).
/*========================================================================
Check special characters
========================================================================*/
check([],[]).
%%% Special character &
%%%
check([38|L1],[38,97,109,112,59|L2]):- !,
check(L1,L2).
%%% Special character <
%%%
check([60|L1],[38,108,116,59|L2]):- !,
check(L1,L2).
%%% Special character >
%%%
check([62|L1],[38,103,116,59|L2]):- !,
check(L1,L2).
%%% Special character '
%%%
check([62|L1],[38,97,112,111,115,59|L2]):- !,
check(L1,L2).
%%% Special character "
%%%
check([34|L1],[38,113,117,111,116,59|L2]):- !,
check(L1,L2).
check([X|L1],[X|L2]):-
check(L1,L2).