我想使用带有4个参数的谓词生成几何级数列表-生成级数的列表,此列表的长度,起始元素和级数的乘积。到目前为止,我所做的只是只有一个3参数谓词来生成几何级数而不会停止:

gengeom([X],X,_).
gengeom([H|Tail],H,Q):-X is H*Q,gengeom(Tail,X,Q).


这个查询为我提供了开始元素1和乘数2的所有进展:

?-gengeom(L,1,2),write(L),nl,fail.


谁能帮我写出我真正想要的4参数谓词(在列表的长度变为某个数字之后,该谓词将停止生成更多数字)?

最佳答案

只需添加一个倒数参数就可以了,并且可以保留代码的漂亮生成属性:

gengeom([X],X,_,_).
gengeom([H|Tail],H,Q,N) :- N>1, M is N-1, X is H*Q, gengeom(Tail,X,Q,M).

?- gengeom(L,1,2,3).
L = [1] ;
L = [1, 2] ;
L = [1, 2, 4] ;
false.


当然,使用findlog / 3(Prolog的“列表生成器”)可以使结构更紧凑:

gengeom(L,H,Q,N) :-
    findall(V, (between(H,N,M), V is Q**(M-1)), L).


但是此代码段(类似于@ joel76'帖子)将仅构建“最终”列表...

07-26 03:50