/*
	?- listsum('[1,2,[3]]', Sum).
	Sum = 6.
	
	?- listsum('[1,20,[30,[[40]],6,7],[]]', Sum).
	Sum = 104.
*/    

listsum(S,Sum) :- atom_chars(S, Chars), list(Sum,Chars, []), !.

list(Sum) --> ['['], values(Sum), [']'].
list(0) --> ['[', ']'].

values(Sum) --> value(Sum).
values(Sum) --> value(A), [','], values(B), {Sum is A + B}.

value(V) --> digits(Digits), {atom_number(Digits,V)}.
value(Sum) --> list(Sum).

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').
