parse(S) :- atom_chars(S, Chars), list(Chars, []).

list --> ['['], values, [']'].
list --> ['['], [']'].

values --> value.
values --> value, [','], values.

value --> digits(_).
value --> list.

digits(Digit) --> [Digit], {digit(Digit)}.
digits(Digits) --> [Digit], {digit(Digit)},
             digits(More), {concat_atom([Digit,More],Digits)}.

digit('0'). digit('1'). digit('2'). digit('3'). digit('4').
digit('5'). digit('6'). digit('7'). digit('8'). digit('9').
