demo_gramm.pl 1.56 KB
:-style_check(-singleton).
expr(A, B, C, D) :-
	goal(terminal(43), B, E, F),
	goal(term(G), E, H, I),
	J is D+G,
	register(expr(J), A, H, e1, [C/expr(D), B, F/terminal(43), E, I/term(G)], K),
	expr(A, H, K, J).

expr(A, B, C, D) :-
	goal(terminal(45), B, E, F),
	goal(term(G), E, H, I),
	J is D-G,
	register(expr(J), A, H, e2, [C/expr(D), B, F/terminal(45), E, I/term(G)], K),
	expr(A, H, K, J).

term(A, B, C, D) :-
	register(expr(D), A, B, e3, [C/term(D)], E),
	expr(A, B, E, D).

term(A, B, C, D) :-
	goal(terminal(42), B, E, F),
	goal(factor(G), E, H, I),
	J is D*G,
	register(term(J), A, H, t1, [C/term(D), B, F/terminal(42), E, I/factor(G)], K),
	term(A, H, K, J).

term(A, B, C, D) :-
	goal(terminal(47), B, E, F),
	goal(factor(G), E, H, I),
	J is D/G,
	register(term(J), A, H, t2, [C/term(D), B, F/terminal(47), E, I/factor(G)], K),
	term(A, H, K, J).

factor(A, B, C, D) :-
	register(term(D), A, B, t3, [C/factor(D)], E),
	term(A, B, E, D).

number(A, B, C, D) :-
	register(factor(D), A, B, f1, [C/number(D)], E),
	factor(A, B, E, D).

number(A, B, C, D) :-
	goal(digit(E), B, F, G),
	H is 10*D+E,
	register(number(H), A, F, n2, [C/number(D), B, G/digit(E)], I),
	number(A, F, I, H).

terminal(A, B, C, 40) :-
	goal(expr(D), B, E, F),
	goal(terminal(41), E, G, H),
	register(factor(D), A, G, f2, [C/terminal(40), B, F/expr(D), E, H/terminal(41)], I),
	factor(A, G, I, D).

terminal(A, B, C, D) :-
	D>=48,
	D=<57,
	E is D-48,
	register(digit(E), A, B, d1, [C/terminal(D)], F),
	digit(A, B, F, E).

digit(A, B, C, D) :-
	register(number(D), A, B, n1, [C/digit(D)], E),
	number(A, B, E, D).