Разве вы не можете рассматривать ваши квадратные скобки как атомы (то есть '['
и ']'
) вместе со всем остальным?
Как насчет примера :
label1(T) --> id(X), label2(Y), {T =.. [X, Y]}.
label2(Y) --> ['['], innerexp(Y), [']'].
id(X) --> [X].
innerexp(Y) --> [Y].
Исполнение:
?- phrase(label1(T), [foo, '[', bar, ']'], Rem).
T = foo(bar),
Rem = [].