Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 帕斯卡';二项系数s三角形_Prolog_Pascals Triangle_Dcg_Clpfd - Fatal编程技术网

Prolog 帕斯卡';二项系数s三角形

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

我必须写一个谓词来计算一行帕斯卡三角形。我试着用二项式系数来写这个。第一次,我通过使用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?-行(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
的原始定义吗?