1:- module(rtg,[
    2  op(1200, xfx, [::=])
    3]).

Regular Tree Grammer validator generator

Regular Tree Grammer validator generator. */

    9:- op(1200, xfx, [::=]).   10
   11user:term_expansion(A::=B, A_ :- syntax(A_,M,B)) :-
   12  assert(syntax(A)),
   13  apply_expansion(A,[M],A_).
   14user:term_expansion(syntax(A),syntax_ignore) :-
   15  assert(syntax(A)).
   16user:goal_expansion(syntax(_,M,A),B_) :-
   17  syntax_expansion(M,A,B_).
   18
   19apply_expansion(A,M,L) :-
   20  atom(A),
   21  L =.. [A|M].
   22apply_expansion(A,M,L) :-
   23  A=..B,
   24  append(B,M,R),
   25  L =.. R.
   26
   27syntax_expansion(M,A,R) :-
   28  var(A),
   29  apply_expansion(call,[A,M],R).
   30syntax_expansion(M,B|Bs,(B_,!);Bs_) :-
   31  syntax_expansion(M,B,B_),
   32  syntax_expansion(M,Bs,Bs_).
   33syntax_expansion(M,A,R) :-
   34  syntax(A),
   35  apply_expansion(A,[M],R).
   36syntax_expansion(M,A,M=A) :-
   37  atom(A),!.
   38syntax_expansion(M,A,(M=B,B_)) :-
   39  A =.. [A_|Ps],
   40  maplist(syntax_expansion,Ms,Ps,Es),
   41  B =.. [A_|Ms],!,
   42  reverse(Es,Es1),
   43  foldl([A1,B1,(A1,B1)]>>!,Es1,!,B_).
   44
   45syntax(atom).
   46:- user:discontiguous(syntax/1).   47:- user:discontiguous(syntax_ignore/0).