1:- module(rtg,[
2 op(1200, xfx, [::=])
3]).
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).
Regular Tree Grammer validator generator
Regular Tree Grammer validator generator. */