Prolog 帕斯卡';二项系数s三角形
我必须写一个谓词来计算一行帕斯卡三角形。我试着用二项式系数来写这个。第一次,我通过使用writeln()显示每个结果来实现这一点。但是我想把它们保存在我的列表L中。我怎么做?多谢各位Prolog 帕斯卡';二项系数s三角形,prolog,pascals-triangle,dcg,clpfd,Prolog,Pascals Triangle,Dcg,Clpfd,我必须写一个谓词来计算一行帕斯卡三角形。我试着用二项式系数来写这个。第一次,我通过使用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
%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]).
结果(浓缩):[debug]124?-行(7,R)。
1.
7.
21
35
35
21
7.
一,
期望结果(不写):[1,71,21,35,21,7,1]
非常简单:当描述一个列表时,总是考虑使用符号。例如:
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中的低级整数算法,因此我实际上建议对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)约束,则通常会获得可用于所有方向的更一般的关系
当然,您也可以在没有DCGs的情况下执行此操作,但是您需要更多的参数和变量,这使得代码更难理解。应该足以删除writeln并修复列表结构
lineT(_,0,[1]).
lineT(N,K,[Z|L]):-
K > 0,
K1 is K-1,
coefficient(N,K,Z),
lineT(N,K1,L).
谢谢你的回答!谢谢你的回答!s(X)。在概括时保持逻辑的可靠性必须是唯一最好的(但仍然被低估的)序言功能!您仍然使用
系数/3
的原始定义吗?