/*****************************/
/* xg parser and goal clause */
/*****************************/

% *depth_check
'*depth_check'(_,[]) :- !.
'*depth_check'(x(_,_,_,X1),x(_,_,_,X2)) :-
   '*depth_check'(X1,X2).

% goal
goal(G,A,T,S0,S) :-
 ( '**fail_goal'(G,S0),!,fail ; '**wf_goal'(G,S0,_,_,_) ),!,
   '**wf_goal'(G,S0,A,S,T).
goal(G,A,T,S0,S) :-
   dictionary(C,A1,T1,S0,S1),
   Link=..[C,G],
   call(Link),
   P=..[C,G,A1,AA,T1,T,[],[],[],S1,S],
   call(P),
   assertz('**wf_goal'(G,S0,AA,S,T)),
   A=AA.
goal(G,_,T,S0,_) :-
 ( '**wf_goal'(G,S0,_,_,T) ; assertz('**fail_goal'(G,S0)) ),!, fail.

% goal_x
goal_x(G,A,T,X0,X,S0,S) :-
 ( '**fail_goal'(G,S0,X0),!,fail ; '**wf_goal'(G,S0,X0,_,_,_,_)),!,
   '**wf_goal'(G,S0,X0,A,X,S,T).
goal_x(G,A,T,X0,X,S0,S) :-
   dictionary(C,A1,T1,S0,S1),
   Link=..[C,G],
   call(Link),
   P=..[C,G,A1,AA,T1,T,X0,X0,X,S1,S],
   call(P),
   assertz('**wf_goal'(G,S0,X0,AA,X,S,T)),
   A=AA.
goal_x(G,A,T,X0,X,S0,S) :-
   X0=x(XCAT,XARG,XTREE,X1),
   Link=..[XCAT,G],
   call(Link),
   P=..[XCAT,G,XARG,AA,XTREE,T,X0,X1,X,S0,S],
   call(P),
   assertz('**wf_goal'(G,S0,X0,AA,X,S,T)),
   A=AA.
goal_x(G,_,_,X0,_,S0,_) :-
 ( '**wf_goal'(G,S0,X0,_,_,_,_); assertz('**fail_goal'(G,S0,X0)) ),!, fail.

% terminal : enough for English analysis
%terminal(WordList,In,Out) :-
%   '**index'(In,IN),
%   '*append'(WordList,Rest,IN),
%   '**index'(Out,Rest),!.

% terminal (including kanji expanding) : maybe necessary for Japanese analysis
%

terminal(WordList,In,Out) :-
   '*kanjiToChars'(WordList,CharList,[]),
   '**index'(In,IN),
   '*append'(CharList,Rest,IN),
   '**index'(Out,Rest),!.

'*kanjiToChars'([],T,T) :- !.
'*kanjiToChars'([Term|Terms],T0,T2) :-
   name(Term,TERM),
   '*unpackIfKanji'(TERM,T0,T1),
   '*kanjiToChars'(Terms,T1,T2),!.

'*unpackIfKanji'([],T,T).
'*unpackIfKanji'([X,Y|Xs],[Z|T0],T1) :-
   X > 127,!,
   name(Z,[X,Y]),
   '*unpackIfKanji'(Xs,T0,T1),!.
'*unpackIfKanji'(Xs,[Atom|T0],T1) :-
   '*ascii'(Xs,AtomList,Ys),
   name(Atom,AtomList),
   '*unpackIfKanji'(Ys,T0,T1).

'*ascii'([],[],[]) :- !.
'*ascii'([X|Xs],[],[X|Xs]) :-
   X > 127,!.
'*ascii'([X|Xs],[X|Ys],Zs) :-
   '*ascii'(Xs,Ys,Zs).
