具有二项式系数的Pascal三角形

时间:2016-01-05 14:48:51

标签: prolog pascals-triangle

我必须编写一个谓词来计算一行Pascal的三角形。我尝试用二项式系数写这个。在第一次,我设法通过使用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]).

结果(浓缩):[debug] 124? - line(7,R)。 1 7 21 35 35 21 7 1

预期结果(不包括):[1,7,21,35,35,21,7,1]

2 个答案:

答案 0 :(得分:2)

非常简单:在描述列表时,请始终考虑使用表示法。例如:

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)约束,通常可以获得可以在所有方向上使用的更一般的关系。

当然,你也可以在没有DCG的情况下做到这一点,但是你需要更多的参数和更多的变量,这使代码更难理解。

答案 1 :(得分:0)

应该足以删除writeln并修复列表构造。

lineT(_,0,[1]).
lineT(N,K,[Z|L]):-
    K > 0,
    K1 is K-1,
    coefficient(N,K,Z),
    lineT(N,K1,L).