Используйте переменные-аккумуляторы и передавайте их в рекурсивных вызовах. Далее А и А1 являются аккумулятором.
digit(0) --> "0".
digit(1) --> "1".
% ...
digit(9) --> "9".
nat(N) --> digit(D), nat(D,N).
nat(N,N) --> [].
nat(A,N) --> digit(D), { A1 is A*10 + D }, nat(A1,N).
Обратите внимание, что первое предложение nat
инициализирует аккумулятор, используя цифру, потому что вы не хотите совпадать с пустой строкой.