В библиотеке SWI-Prologs есть предикат, который делает почти то, что вам нужно.Это называется numlist/3
.Вы можете использовать его с нижней и верхней границей:
?- numlist(1, 5, L).
L = [1, 2, 3, 4, 5].
И здесь реализация :
numlist(L, U, Ns) :-
must_be(integer, L),
must_be(integer, U),
L =< U,
numlist_(L, U, Ns).
numlist_(U, U, List) :-
!,
List = [U].
numlist_(L, U, [L|Ns]) :-
L2 is L+1,
numlist_(L2, U, Ns).
Вы можете избавиться от верхней половины этого полностьюи потерять один аргумент (ваш Lower - всего 1).
Если вы немного поиграете с этим, вы сможете понять это.