使用Prolog中的printlist / 1谓词来汇总列表中的所有数字

时间:2016-01-07 18:49:25

标签: list prolog

我正在尝试使用printlist/1谓词来总结列表中的所有数字但有点被卡住....试图为此提出代码但我不断获得{{1} }。

以下是我的想法:

false

我知道这是错的,这可能是最后一部分。任何帮助表示赞赏!

我这样查询:

printlist([]).
printlist([H|T], Totalsum) :- 
   print (H+Totalsum),
   nl,
   printlist(T, Totalsum).

2 个答案:

答案 0 :(得分:2)

正如Paulo所说,你在这里定义了两个谓词,这是不正确的。

以下是解决方案:

printlist([], 0).
printlist([H|T], Sum) :-
   printlist(T, Subsum),
   Sum is Subsum + H.

示例查询:

?- printlist([1,2,3,5], L).
L = 11.

@ Paulo请求),一个尾递归版本:

printlist(L, Sum) :-
   sumac(L, 0, Sum).

sumac([], Acc, Acc).
sumac([H|T], Acc, Sum) :-
   Nacc is Acc + H,
   sumac(T, Nacc, Sum). 

答案 1 :(得分:1)

您定义的不是一个而是两个谓词:printlist/1printlist/2。可能是一个错字。 printlist/2谓词是递归规则,但没有基本情况。将printlist/1子句更改为:

printlist([], _).

但您的代码中还有其他错误。提示:Prolog不是一种功能语言。