-
Notifications
You must be signed in to change notification settings - Fork 6
/
buildrules.pl
47 lines (37 loc) · 1.17 KB
/
buildrules.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
% build rules use dcg in reverse to make clam rules from Prolog rules
% You can use bldrules.pro to convert, for example, the native Prolog
% rules of the birds.pro into clam syntax.
main :-
write($From file: $), read(From),
write($To file: $), read(To),
doit(From,To).
doit(From,To) :-
see(From),
tell(To),
test.
test :-
cntr_set(1,1),
repeat,
read(X),
tran(X,Ans,[]),
write_nice(Ans),nl,
X == '!EOF'.
test :- told,seen,write(done).
xxif(Body) --> [if],xxbody(Body).
xxthen(Head) --> {Head =.. [F,A]},[then,F,is,A].
xxbody((H,T)) --> {!,H =.. [F,A]}, [F,is,A,and], xxbody(T).
xxbody(H) --> {H =.. [F,A]}, [F,is,A].
tran(A,B,C) :- trans(A,B,C),!.
tran(X,X,_).
trans('!EOF','!EOF',_).
trans((Head :- true)) --> {Head =.. [F,A]}, [F,is,A], !.
trans((Head :- Body)) --> {cntr_get(1,ID)}, [rule, ID],
xxif(Body), xxthen(Head), {ID2 is ID + 1, cntr_set(1,ID2)}.
write_nice(X) :- wr_nice(X), !.
wr_nice([]) :- !,write('.'),nl.
wr_nice([if|T]):- !,nl,write(' if '),wr_nice(T).
wr_nice([then|T]):- !,nl,write(' then '),wr_nice(T).
wr_nice([and|T]):- !,write(and),nl,write(' '),
wr_nice(T).
wr_nice([H|T]) :- !,write(H),write(' '),wr_nice(T).
wr_nice(X) :- write(X).