我必须编写一个谓词来计算一行帕斯卡三角形。我尝试用二项式系数来写这个。第一次,我设法通过使用 writeln() 显示每个结果来做到这一点。但我想将它们保存在我的列表 L 中。我该怎么做?谢谢
%coefficient(+N,+K,-R).
coefficient(_,0,1).
coefficient(N,N,1).
coefficient(N,K,R):-
N>=K,
K>0,
N1 is N-1,
K1 is K-1,
coefficient(N1,K,R1),
coefficient(N1,K1,R2),
R is R1+R2.
/* Get a line from the coeff binomial */
%line(+E,-L)
line(N,L):-
lineT(N,N,L).
lineT(_,0,_):-
writeln(1).
lineT(N,K,L):-
K > 0,
K1 is K-1,
coefficient(N,K,Zs),
writeln(Zs),
lineT(N,K1,[Zs|L]).
结果(压缩):[调试] 124 ?- line(7,R)。 1 7 21 35 35 21 7 1
预期结果(无 writeln):[1,7,21,35,35,21,7,1]
最佳答案
非常简单:描述列表时,始终考虑使用 dcg符号。例如:
line(N, Ls):-
phrase(line_(N, N), Ls).
line_(_, 0) --> [1].
line_(N, K) --> [C],
{ K > 0,
K1 is K-1,
coefficient(N, K, C) },
line_(N, K1).
示例查询:
?- line(3, Ls).
Ls = [1, 3, 3, 1] ;
false.
就我个人而言,我不再愿意在 Prolog 中进行低级整数运算,所以我实际上建议使用 clpfd Prolog 程序中所有整数算术的约束:
:- use_module(library(clpfd)).
line(N,Ls):-
phrase(line_(N, N), Ls).
line_(_, 0) --> [1].
line_(N, K) --> [C],
{ K #> 0,
K1 #= K-1,
coefficient(N, K, C) },
line_(N, K1).
如果您在整个程序中一致地使用 CLP(FD) 约束,您通常会获得可在各个方向使用的更一般的关系。
当然,您也可以在没有 DCG 的情况下执行此操作,但随后您需要更多参数和更多变量,这使得代码有点难以理解。
关于prolog - 具有二项式系数的帕斯卡三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34614482/