好吧,正如您所问的,当列表的长度为 1 时,包括您需要更新停止条件为 true 的长度参数,并且一般子句必须在每一步中递减此长度。
现在gengeom/4 谓词将如下所示:
gengeom([X], X ,_, 1):- !.
gengeom([H|Tail], H, Q, N):-N > 0, X is H * Q, N1 is N - 1, gengeom(Tail, X, Q, N1).
这会找到开始 1、乘数 2 和长度 5 的级数
?- gengeom(L, 1, 2, 5).
L = [1, 2, 4, 8, 16]
您可以使用元谓词findall/3找到从长度1到所选长度的所有解决方案:
findall(L, (member(N, [1,2,3,4,5]), gengeom(L,1,2, N)), R).
这应该是完整的:
gengeom([X], X ,_, 1):- !.
gengeom([H|Tail], H, Q, N):-N > 0, X is H * Q, N1 is N - 1, gengeom(Tail, X, Q, N1).
generate(Start, Step, Stop):- findall(L, (numlist(1,Stop, Len), member(N, Len), gengeom(L,Start,Step, N)), R), writeGen(R).
writeGen([]).
writeGen([H|Tail]):- write(H), nl, writeGen(Tail).
测试
?- generate(1, 2, 5).
[1]
[1, 2]
[1, 2, 4]
[1, 2, 4, 8]
[1, 2, 4, 8, 16]
true