%:- op(1050, xfx, &). %:- op(900, xfx, ==>). :- op(800, xfx, &). :- op(900, xfx, ==>). cong(N, L) :- grammar(Rules), cong_(start, Rules, N, _, L, []). cong_(T, Rules, N, N, [T|Ss], Ss) :- % terminal atom(T), \+ member(T ==> _, Rules), \+ member(T, Rules). cong_(NT, Rules, N0, N, Ss0, Ss) :- member(NT ==> Body, Rules), % non-terminal N0 > 0, N1 is N0 - 1, cong_(Body, Rules, N1, N, Ss0, Ss). cong_(NT, Rules, N0, N, Ss, Ss) :- member(NT, Rules), % non-terminal without body N0 > 0, N is N0 - 1. cong_((A,B), Rules, N0, N, Ss0, Ss) :- cong_(A, Rules, N0, N1, Ss0, Ss1), cong_(B, Rules, N1, N, Ss1, Ss). cong_(A & B, Rules, N0, N, Ss0, Ss) :- cong_(A, Rules, N0, N1, Ss0, Ss), cong_(B, Rules, N1, N, Ss0, Ss).