My question boils down to: if we do have sequence//2 (and also sequence//3 and sequence//5), how can we get the corresponding det_sequence//2? The naive implementation for the 2-argument version:

```
det_sequence(G, [H|T]) -->
call(G),
!,
det_sequence(G, T).
det_sequence(_, []) --> [].
```

This seems to be a generalization of blanks//0, nonblanks//1, whites//0, digits//1, xdigits//1 from library(dcg/basics). Given that this is not available at the moment, I have been trying to explain it away with â€śit isnâ€™t necessaryâ€ť or â€śit has a fundamental defectâ€ť. Could someone who understands better try to elaborate a bit?

PS: What I *think* I understand now but did miss initially is that the motivation behind the meta-predicates in library(dcg/high_order) was to make it easier to generate from a fully instantiated list, and not parse. For parsing, one can still just cut *after* sequence//2, but with long enough input we might run out of memory before that. I am still not sure if this is a problem. One argument is that even if you donâ€™t run out of memory because of the choice points you eventually run out of memory because of the parsed list?