ENHANCED: partial_string/3 no longer creates atoms
As a consequence, resulting strings are now quickly reclaimed on
backtracking.
This addresses #2912.
Test case:
:- use_module(library(iso_ext)).
:- use_module(library(lists)).
ab(a).
ab(b).
Sample query:
?- length(Ls, 1_000_000),
maplist(ab, Ls),
partial_string(Ls, Es0, []),
Es0 == Ls.
Ls = "
aaaaaaaaaaaaaaaaaaa ...", Es0 = "
aaaaaaaaaaaaaaaaaaa ..."
; Ls = "
aaaaaaaaaaaaaaaaaaa ...", Es0 = "
aaaaaaaaaaaaaaaaaaa ..."
; Ls = "
aaaaaaaaaaaaaaaaaaa ...", Es0 = "
aaaaaaaaaaaaaaaaaaa ..."
; Ls = "
aaaaaaaaaaaaaaaaaaa ...", Es0 = "
aaaaaaaaaaaaaaaaaaa ..."
; Ls = "
aaaaaaaaaaaaaaaaaaa ...", Es0 = "
aaaaaaaaaaaaaaaaaaa ..."
; ... .
running in constant memory.