我想使用带有4个参数的谓词生成几何级数列表 - 生成进展的列表,此列表的长度,开始元素和进度的乘数.到目前为止我所做的只是一个3参数谓词来生成几何级数而不停止:
gengeom([X],X,_).
gengeom([H|Tail],H,Q):-X is H*Q,gengeom(Tail,X,Q).
Run Code Online (Sandbox Code Playgroud)
此查询为我提供了start元素1和乘数2的所有进度:
?-gengeom(L,1,2),write(L),nl,fail.
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我写一个我真正想要的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.
Run Code Online (Sandbox Code Playgroud)
当然,使用findall/3,Prolog'列表生成器'可以让你更紧凑:
gengeom(L,H,Q,N) :-
findall(V, (between(H,N,M), V is Q**(M-1)), L).
Run Code Online (Sandbox Code Playgroud)
但是这个片段(类似于@ joel76'的帖子)只会建立'最终'列表......
使用SWI-Prolog,您可以编写:
:- use_module(library(lambda)).
gengeom(Len, Start, Multiplier, L) :-
length(L, Len),
foldl(\X^Y^Z^(X = Y,
Z is Y * Multiplier),
L, Start, _).
Run Code Online (Sandbox Code Playgroud)
例如 :
?- gengeom(5, 1, 2, L).
L = [1, 2, 4, 8, 16].
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
307 次 |
| 最近记录: |